diff --git a/backend/src/evaluator.rs b/backend/src/evaluator.rs index 6bc64cf..f54dc99 100644 --- a/backend/src/evaluator.rs +++ b/backend/src/evaluator.rs @@ -1,7 +1,7 @@ use crate::cell::{Cell, CellRef}; use crate::parser::*; use crate::tokenizer::Literal; -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::fmt; #[derive(Debug, PartialEq, Clone)] @@ -34,15 +34,17 @@ impl Evaluator { } let eval: Eval; + let deps: HashSet; if let Some(c) = raw_val.chars().nth(0) && c == '=' { - eval = self.evaluate(raw_val[1..].to_owned())?; + (eval, deps) = self.evaluate(raw_val[1..].to_owned())?; + // for dep in deps {} } else { match self.evaluate(raw_val.to_owned()) { Ok(e) => { - eval = e; + (eval, deps) = e; } Err(_) => eval = Eval::Literal(Literal::String(raw_val.to_owned())), } @@ -61,14 +63,28 @@ impl Evaluator { Ok((cell.raw(), cell.eval())) } + pub fn add_cell_dep(&mut self, cell_ref: CellRef, dep_ref: CellRef) -> Result<(), String> { + if !self.cells.contains_key(&cell_ref) { + return Err(format!("Cell at {:?} not found.", cell_ref)); + } - pub fn evaluate(&mut self, str: String) -> Result { - let (mut expr, mut deps) = parse(&str)?; + if let Some(cell) = self.cells.get_mut(&cell_ref) { + cell.add_i_dep(dep_ref); + } - self.evaluate_expr(&mut expr) + Ok(()) } - fn evaluate_expr(&mut self, expr: &mut Expr) -> Result { + pub fn evaluate(&mut self, str: String) -> Result<(Eval, HashSet), String> { + let (expr, deps) = parse(&str)?; + + match self.evaluate_expr(&expr) { + Ok(it) => Ok((it, deps)), + Err(it) => Err(it), + } + } + + fn evaluate_expr(&mut self, expr: &Expr) -> Result { let res = match expr { Expr::Literal(lit) => Eval::Literal(lit.clone()), Expr::CellRef(re) => self.get_cell(re.to_owned())?.1, diff --git a/frontend/src/App.svelte b/frontend/src/App.svelte index f152fec..d02da0f 100644 --- a/frontend/src/App.svelte +++ b/frontend/src/App.svelte @@ -1,43 +1,30 @@
- +
{ - scrollTop = e.currentTarget.scrollTop; - scrollLeft = e.currentTarget.scrollLeft; + const el = e.currentTarget as HTMLElement; + scrollTop = el.scrollTop; + scrollLeft = el.scrollLeft; }} > - +
-
- - {#if gridData} -
- -
+ +
- -
- {#each visibleCols as j (j)} -
- {columnLabels[j]} -
- {/each} -
+ +
+ {#each visibleCols as j (j)} +
+ {columnLabels[j]} +
+ {/each} +
- -
- {#each visibleRows as i (i)} -
- {i + 1} -
- {/each} -
+ +
+ {#each visibleRows as i (i)} +
+ {i + 1} +
+ {/each} +
- + + {#if gridData}
{#each visibleRows as i (i)} {#each visibleCols as j (j)}
- + (gridData[i][j] = ( + e.currentTarget as HTMLInputElement + ).value)} on:focus={() => (activeCell = [i, j])} on:blur={() => handleCellBlur(i, j)} /> - {#if activeCell && activeCell[0] === i && activeCell[1] === j}
@@ -208,50 +215,39 @@ {/each} {/each}
-
- {/if} + {/if} +