logisheets_controller/calc_engine/calculator/funcs/
scalar_text.rs

1use crate::calc_engine::connector::Connector;
2
3use super::{CalcValue, CalcVertex, Value};
4use logisheets_parser::ast;
5
6pub fn calc<C, F>(args: Vec<CalcVertex>, fetcher: &mut C, func: F) -> CalcVertex
7where
8    C: Connector,
9    F: 'static + Fn(&str) -> String,
10{
11    if args.len() != 1 {
12        return CalcVertex::from_error(ast::Error::Unspecified);
13    }
14    let arg = args.into_iter().next().unwrap();
15    let value = fetcher.get_calc_value(arg);
16    let v = match value {
17        CalcValue::Scalar(s) => CalcValue::Scalar(call(&s, &func)),
18        CalcValue::Range(r) => {
19            let vec2d = r.map(move |v| call(v, &func));
20            CalcValue::Range(vec2d)
21        }
22        CalcValue::Cube(_) => CalcValue::Scalar(Value::Error(ast::Error::Ref)),
23        CalcValue::Union(u) => {
24            if u.len() == 1 {
25                let arg = *u.into_iter().next().unwrap();
26                let v = vec![CalcVertex::Value(arg)];
27                if let CalcVertex::Value(value) = calc(v, fetcher, func) {
28                    value
29                } else {
30                    CalcValue::Scalar(Value::Error(ast::Error::Value))
31                }
32            } else {
33                CalcValue::Scalar(Value::Error(ast::Error::Value))
34            }
35        }
36    };
37    CalcVertex::Value(v)
38}
39
40fn call<F>(value: &Value, func: &F) -> Value
41where
42    F: Fn(&str) -> String,
43{
44    match value {
45        Value::Blank => Value::Text(func("")),
46        Value::Number(n) => Value::Text(func(&n.to_string())),
47        Value::Text(t) => Value::Text(func(t)),
48        Value::Boolean(b) => {
49            if *b {
50                Value::Text(func("TRUE"))
51            } else {
52                Value::Text(func("FALSE"))
53            }
54        }
55        Value::Error(e) => Value::Text(func(e.get_err_str())),
56    }
57}
58
59pub fn calc_trim<C>(args: Vec<CalcVertex>, fetcher: &mut C) -> CalcVertex
60where
61    C: Connector,
62{
63    calc(args, fetcher, |a| a.trim().to_string())
64}
65
66pub fn calc_upper<C>(args: Vec<CalcVertex>, fetcher: &mut C) -> CalcVertex
67where
68    C: Connector,
69{
70    calc(args, fetcher, |a| a.to_uppercase().to_string())
71}
72
73pub fn calc_lower<C>(args: Vec<CalcVertex>, fetcher: &mut C) -> CalcVertex
74where
75    C: Connector,
76{
77    calc(args, fetcher, |a| a.to_lowercase().to_string())
78}