logisheets_controller/calc_engine/calculator/funcs/
ifs.rs

1use crate::calc_engine::connector::Connector;
2
3use super::utils::{get_condition_result, ConditionResult};
4use super::CalcVertex;
5use logisheets_parser::ast;
6
7pub fn calc<C>(args: Vec<CalcVertex>, fetcher: &mut C) -> CalcVertex
8where
9    C: Connector,
10{
11    assert_or_return!(args.len() % 2 == 0, ast::Error::Unspecified);
12    let mut args_iter = args.into_iter();
13    let mut condition = args_iter.next();
14    while condition.is_some() {
15        let cond = condition.unwrap();
16        let value = fetcher.get_calc_value(cond);
17        let cond_res = get_condition_result(value);
18        match cond_res {
19            ConditionResult::True => {
20                return args_iter.next().unwrap();
21            }
22            ConditionResult::False => {
23                args_iter.next();
24                condition = args_iter.next();
25            }
26            ConditionResult::Error(e) => {
27                return CalcVertex::from_error(e);
28            }
29        }
30    }
31    CalcVertex::from_error(ast::Error::Na)
32}