powerfx/functions/
text.rs1use 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}