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