logisheets_controller/calc_engine/calculator/funcs/
ifs.rs1use 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}