From 3cbeb5a2ad51cc2774ca10cf604eb9bb3f6f05cf Mon Sep 17 00:00:00 2001 From: Lloyd Date: Mon, 8 Sep 2025 03:12:03 +1000 Subject: [PATCH] =?UTF-8?q?=F0=9F=99=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/src/evaluator.rs | 5 ++++- backend/src/main.rs | 8 +------- backend/src/messages.rs | 4 ++-- frontend/src/lib/components/grid/grid.svelte | 4 ++-- frontend/src/lib/components/grid/messages.ts | 11 ++++++++++- frontend/src/lib/components/grid/utils.ts | 8 ++++++++ 6 files changed, 27 insertions(+), 13 deletions(-) diff --git a/backend/src/evaluator.rs b/backend/src/evaluator.rs index 007a069..e72555b 100644 --- a/backend/src/evaluator.rs +++ b/backend/src/evaluator.rs @@ -1,3 +1,5 @@ +use serde::{Deserialize, Serialize}; + use crate::cell::CellRef; use crate::grid::Grid; use crate::parser::*; @@ -5,7 +7,8 @@ use crate::tokenizer::Literal; use std::collections::HashSet; use std::fmt; -#[derive(Debug, PartialEq, Clone)] +#[derive(Debug, PartialEq, Clone, Deserialize, Serialize)] +#[serde(rename_all = "lowercase")] pub enum Eval { Literal(Literal), CellRef { eval: Box, reference: CellRef }, diff --git a/backend/src/main.rs b/backend/src/main.rs index 7bdd329..3bf4e67 100644 --- a/backend/src/main.rs +++ b/backend/src/main.rs @@ -11,10 +11,8 @@ use std::{env, io::Error}; use tokio::net::{TcpListener, TcpStream}; use crate::{ - evaluator::Eval, grid::Grid, messages::{LeadMsg, MsgType}, - tokenizer::Literal, }; #[tokio::main] @@ -70,15 +68,11 @@ async fn accept_connection(stream: TcpStream) { for update in &updates { if let Ok(cell) = grid.get_cell(*update) { - let Eval::Literal(lit) = cell.eval() else { - continue; - }; - msgs.push(LeadMsg { msg_type: MsgType::Set, cell: Some(*update), raw: Some(cell.raw()), - eval: Some(lit), + eval: Some(cell.eval()), bulk_msgs: None, }); } diff --git a/backend/src/messages.rs b/backend/src/messages.rs index f3a26e6..a07dab6 100644 --- a/backend/src/messages.rs +++ b/backend/src/messages.rs @@ -1,6 +1,6 @@ use serde::{Deserialize, Serialize}; -use crate::{cell::CellRef, tokenizer::Literal}; +use crate::{cell::CellRef, evaluator::Eval}; #[derive(Serialize, Deserialize)] #[serde(rename_all = "lowercase")] @@ -16,6 +16,6 @@ pub struct LeadMsg { pub msg_type: MsgType, pub cell: Option, pub raw: Option, - pub eval: Option, + pub eval: Option, pub bulk_msgs: Option>, } diff --git a/frontend/src/lib/components/grid/grid.svelte b/frontend/src/lib/components/grid/grid.svelte index cbc130b..399c228 100644 --- a/frontend/src/lib/components/grid/grid.svelte +++ b/frontend/src/lib/components/grid/grid.svelte @@ -3,7 +3,7 @@ import Cell from '$lib/components/grid/cell.svelte'; import { onDestroy, onMount } from 'svelte'; import CellHeader from './cell-header.svelte'; - import { colToStr, refToStr, type CellT } from './utils'; + import { colToStr, getEvalLiteral, refToStr, type CellT } from './utils'; import clsx from 'clsx'; let { @@ -44,7 +44,7 @@ console.error('Expected cell value for SET msgponse from server.'); return; } - setCellVal(msg.cell.row, msg.cell.col, msg.eval.value); + setCellVal(msg.cell.row, msg.cell.col, getEvalLiteral(msg.eval)); break; } case 'bulk': { diff --git a/frontend/src/lib/components/grid/messages.ts b/frontend/src/lib/components/grid/messages.ts index 5523d4b..bc032cf 100644 --- a/frontend/src/lib/components/grid/messages.ts +++ b/frontend/src/lib/components/grid/messages.ts @@ -2,7 +2,7 @@ interface LeadMsg { msg_type: 'set' | 'get' | 'error' | 'bulk'; cell?: CellRef; raw?: string; - eval?: Literal; + eval?: Eval; bulk_msgs?: Array; } @@ -13,8 +13,17 @@ interface CellRef { type LiteralType = 'Number' | 'Boolean' | 'String'; type LiteralValue = number | string | boolean; +type EvalRange = Array; interface Literal { type: LiteralType; value: LiteralValue; } + +interface EvalCellRef { + eval: Eval; + reference: CellRef; +} + +// Tagged union +type Eval = { literal: Literal } | { cellref: EvalCellRef } | { range: Range } | 'unset'; diff --git a/frontend/src/lib/components/grid/utils.ts b/frontend/src/lib/components/grid/utils.ts index bf5b806..4dc24ac 100644 --- a/frontend/src/lib/components/grid/utils.ts +++ b/frontend/src/lib/components/grid/utils.ts @@ -42,3 +42,11 @@ export function colToStr(col: number): string { export function refToStr(row: number, col: number): string { return colToStr(col) + (row + 1).toString(); } + +export function getEvalLiteral(value: Eval): LiteralValue { + if (value === 'unset') return ''; + if ('literal' in value) return value.literal.value; + if ('cellref' in value) return getEvalLiteral(value.cellref.eval); + // if ('range' in value) return 'err'; + return 'todo!'; +}