Skip to main content

ganit_core/
lib.rs

1// ganit-core: spreadsheet formula parser and evaluator
2
3pub mod display;
4pub mod eval;
5pub mod parser;
6pub mod types;
7
8pub use display::display_number;
9pub use parser::{parse, validate, Expr};
10pub use types::{ErrorKind, ParseError, Value};
11
12pub use eval::functions::{FunctionMeta, Registry};
13
14use std::collections::HashMap;
15use eval::{evaluate_expr, Context, EvalCtx};
16
17/// Evaluate a formula string with named variables.
18///
19/// Returns `Value::Error(ErrorKind::Value)` on parse failure.
20///
21/// Note: constructs a fresh `Registry` on every call. For bulk evaluation
22/// across many formulas, consider reusing a `Registry` via the lower-level
23/// `eval::evaluate_expr` API.
24pub fn evaluate(formula: &str, variables: &HashMap<String, Value>) -> Value {
25    match parse(formula) {
26        Err(_) => Value::Error(ErrorKind::Value),
27        Ok(expr) => {
28            let ctx = Context::new(variables.clone());
29            let registry = Registry::new();
30            let mut eval_ctx = EvalCtx::new(ctx, &registry);
31            evaluate_expr(&expr, &mut eval_ctx)
32        }
33    }
34}