powerfx/functions/
text.rs

1use crate::ast::{self, Expression};
2use crate::evaluator::{EvaluationError, ExpressionEvaluator};
3
4use crate::models::DataValue;
5
6use crate::evaluator::Session;
7
8use crate::function_registry::ScalarFunction;
9
10use std::sync::Arc;
11
12pub struct Lower {
13    pub(crate) evaluator: Arc<ExpressionEvaluator>,
14}
15
16impl Lower {
17    pub fn new(evaluator: Arc<ExpressionEvaluator>) -> Self {
18        Self {
19            evaluator,
20        }
21    }
22}
23
24impl ScalarFunction for Lower {
25    fn call(&self, context: &mut Session, args: &Vec<Expression>) -> Result<DataValue, EvaluationError> {
26    
27        if args.len() != 1 {
28            return Err(EvaluationError::InvalidArgumentCount(format!("Expected 1 arguments, found {}", args.len())));
29        }
30
31        let value = match self.evaluator.evaluate_expression(context, &args[0])? {
32            DataValue::Text(t) => t.to_lowercase(),
33            _ => return Err(EvaluationError::InvalidArgument(format!("Expected text, found {:?}", args[0]))),
34        };
35
36        Ok(DataValue::Text(value.into()))
37    }
38}
39
40pub struct Upper {
41    pub(crate) evaluator: Arc<ExpressionEvaluator>,
42}
43
44impl Upper {
45    pub fn new(evaluator: Arc<ExpressionEvaluator>) -> Self {
46        Self {
47            evaluator,
48        }
49    }
50}
51
52impl ScalarFunction for Upper {
53    fn call(&self, context: &mut Session, args: &Vec<Expression>) -> Result<DataValue, EvaluationError> {
54    
55        if args.len() != 1 {
56            return Err(EvaluationError::InvalidArgumentCount(format!("Expected 1 arguments, found {}", args.len())));
57        }
58
59        let value = match self.evaluator.evaluate_expression(context, &args[0])? {
60            DataValue::Text(t) => t.to_uppercase(),
61            _ => return Err(EvaluationError::InvalidArgument(format!("Expected text, found {:?}", args[0]))),
62        };
63
64        Ok(DataValue::Text(value.into()))
65    }
66}
67
68
69pub struct Left {
70    pub(crate) evaluator: Arc<ExpressionEvaluator>,
71}
72
73impl Left {
74    pub fn new(evaluator: Arc<ExpressionEvaluator>) -> Self {
75        Self {
76            evaluator,
77        }
78    }
79}
80
81impl ScalarFunction for Left {
82    fn call(&self, context: &mut Session, args: &Vec<Expression>) -> Result<DataValue, EvaluationError> {
83    
84        if args.len() != 2 {
85            return Err(EvaluationError::InvalidArgumentCount(format!("Expected 2 arguments, found {}", args.len())));
86        }
87
88        let text = match self.evaluator.evaluate_expression(context, &args[0])? {
89            DataValue::Text(t) => t,
90            _ => return Err(EvaluationError::InvalidArgument(format!("Expected text, found {:?}", args[0]))),
91        };
92
93        let count = match self.evaluator.evaluate_expression(context, &args[1])? {
94            DataValue::Number(n) => n as usize,
95            _ => return Err(EvaluationError::InvalidArgument(format!("Expected number, found {:?}", args[1]))),
96        };
97
98        let value = text.chars().take(count).collect::<String>();
99
100        Ok(DataValue::Text(value.into()))
101    }
102}
103
104pub struct Right {
105    pub(crate) evaluator: Arc<ExpressionEvaluator>,
106}
107
108impl Right {
109    pub fn new(evaluator: Arc<ExpressionEvaluator>) -> Self {
110        Self {
111            evaluator,
112        }
113    }
114}
115
116impl ScalarFunction for Right {
117    fn call(&self, context: &mut Session, args: &Vec<Expression>) -> Result<DataValue, EvaluationError> {
118    
119        if args.len() != 2 {
120            return Err(EvaluationError::InvalidArgumentCount(format!("Expected 2 arguments, found {}", args.len())));
121        }
122
123        let text = match self.evaluator.evaluate_expression(context, &args[0])? {
124            DataValue::Text(t) => t,
125            _ => return Err(EvaluationError::InvalidArgument(format!("Expected text, found {:?}", args[0]))),
126        };
127
128        let count = match self.evaluator.evaluate_expression(context, &args[1])? {
129            DataValue::Number(n) => n as usize,
130            _ => return Err(EvaluationError::InvalidArgument(format!("Expected number, found {:?}", args[1]))),
131        };
132
133        let value = text.chars().rev().take(count).collect::<String>().chars().rev().collect::<String>();
134
135        Ok(DataValue::Text(value.into()))
136    }
137}
138
139pub struct Mid {
140    pub(crate) evaluator: Arc<ExpressionEvaluator>,
141}
142
143impl Mid {
144    pub fn new(evaluator: Arc<ExpressionEvaluator>) -> Self {
145        Self {
146            evaluator,
147        }
148    }
149}
150
151impl ScalarFunction for Mid {
152    fn call(&self, context: &mut Session, args: &Vec<Expression>) -> Result<DataValue, EvaluationError> {
153    
154        if args.len() < 2 {
155            return Err(EvaluationError::InvalidArgumentCount(format!("Expected 2 arguments or more, found {}", args.len())));
156        }
157
158        let text = match self.evaluator.evaluate_expression(context, &args[0])? {
159            DataValue::Text(t) => t,
160            _ => return Err(EvaluationError::InvalidArgument(format!("Expected text, found {:?}", args[0]))),
161        };
162
163        let start = match self.evaluator.evaluate_expression(context, &args[1])? {
164            DataValue::Number(n) => n as usize,
165            _ => return Err(EvaluationError::InvalidArgument(format!("Expected number, found {:?}", args[1]))),
166        };
167
168        let count = if args.len() == 3 {
169            match self.evaluator.evaluate_expression(context, &args[2])? {
170                DataValue::Number(n) => n as usize,
171                _ => return Err(EvaluationError::InvalidArgument(format!("Expected number, found {:?}", args[2]))),
172            }
173        } else {
174            text.len()
175        };
176
177        let value = text.chars().skip(start - 1).take(count).collect::<String>();
178
179        Ok(DataValue::Text(value.into()))
180    }
181}