frequenz_microgrid_formula_engine/
formula_engine.rs1use crate::traits::NumberLike;
5use std::collections::{HashMap, HashSet};
6use std::fmt::Debug;
7use std::str::FromStr;
8
9use crate::{error::FormulaError, expression::Expr, parser};
10
11#[derive(Debug)]
14pub struct FormulaEngine<T> {
15 expr: Expr<T>,
16 components: HashSet<u64>,
17}
18
19impl<T: FromStr + NumberLike<T> + PartialOrd> FormulaEngine<T>
20where
21 <T as FromStr>::Err: Debug,
22{
23 pub fn try_new(s: &str) -> Result<Self, FormulaError> {
25 let expr = parser::parse(s)?;
26
27 let components = expr.components();
28
29 Ok(Self { expr, components })
30 }
31
32 pub fn components(&self) -> &HashSet<u64> {
34 &self.components
35 }
36
37 pub fn calculate(&self, values: &HashMap<u64, Option<T>>) -> Result<Option<T>, FormulaError> {
39 self.expr.calculate(values)
40 }
41}