Skip to content

Commit 5ee2a46

Browse files
committed
Address feedback
1 parent e82aeff commit 5ee2a46

File tree

6 files changed

+74
-42
lines changed

6 files changed

+74
-42
lines changed

dsc/tests/dsc_expressions.tests.ps1

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,16 @@ resources:
124124
@{ expression = "[lessOrEquals(3, 5)]"; expected = $true }
125125
@{ expression = "[lessOrEquals(5, 3)]"; expected = $false }
126126
@{ expression = "[lessOrEquals(5, 5)]"; expected = $true }
127+
@{ expression = "[greater('b', 'a')]"; expected = $true }
128+
@{ expression = "[greater('a', 'b')]"; expected = $false }
129+
@{ expression = "[greaterOrEquals('b', 'a')]"; expected = $true }
130+
@{ expression = "[greaterOrEquals('a', 'b')]"; expected = $false }
131+
@{ expression = "[greaterOrEquals('a', 'a')]"; expected = $true }
132+
@{ expression = "[less('a', 'b')]"; expected = $true }
133+
@{ expression = "[less('b', 'a')]"; expected = $false }
134+
@{ expression = "[lessOrEquals('a', 'b')]"; expected = $true }
135+
@{ expression = "[lessOrEquals('b', 'a')]"; expected = $false }
136+
@{ expression = "[lessOrEquals('a', 'a')]"; expected = $true }
127137
@{ expression = "[and(true, true)]"; expected = $true }
128138
@{ expression = "[and(true, false)]"; expected = $false }
129139
@{ expression = "[or(false, true)]"; expected = $true }

dsc_lib/locales/en-us.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,6 +191,7 @@ extensionManifestSchemaDescription = "Defines the JSON Schema the extension mani
191191
[functions]
192192
invalidArgType = "Invalid argument type"
193193
invalidArguments = "Invalid argument(s)"
194+
typeMismatch = "Arguments must be of the same type (both numbers or both strings)"
194195
unknownFunction = "Unknown function '%{name}'"
195196
noArgsAccepted = "Function '%{name}' does not accept arguments"
196197
invalidArgCount = "Function '%{name}' requires exactly %{count} arguments"

dsc_lib/src/functions/greater.rs

Lines changed: 9 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,10 @@
33

44
use crate::DscError;
55
use crate::configure::context::Context;
6-
<<<<<<< HEAD
7-
use crate::functions::{AcceptedArgKind, FunctionCategory};
8-
use rust_i18n::t;
9-
use super::Function;
10-
use serde_json::Value;
11-
=======
126
use crate::functions::{AcceptedArgKind, Function, FunctionCategory};
137
use rust_i18n::t;
148
use serde_json::Value;
159
use tracing::debug;
16-
>>>>>>> a8d3c74f5a4d72e21ff7cd9d0cf618a3608ce111
1710

1811
#[derive(Debug, Default)]
1912
pub struct Greater {}
@@ -40,23 +33,20 @@ impl Function for Greater {
4033
}
4134

4235
fn invoke(&self, args: &[Value], _context: &Context) -> Result<Value, DscError> {
43-
<<<<<<< HEAD
44-
=======
4536
debug!("{}", t!("functions.greater.invoked"));
4637

47-
>>>>>>> a8d3c74f5a4d72e21ff7cd9d0cf618a3608ce111
4838
let first = &args[0];
4939
let second = &args[1];
5040

51-
if let (Some(num1), Some(num2)) = (first.as_f64(), second.as_f64()) {
41+
if let (Some(num1), Some(num2)) = (first.as_i64(), second.as_i64()) {
5242
return Ok(Value::Bool(num1 > num2));
5343
}
5444

5545
if let (Some(str1), Some(str2)) = (first.as_str(), second.as_str()) {
5646
return Ok(Value::Bool(str1 > str2));
5747
}
5848

59-
Ok(Value::Bool(false))
49+
Err(DscError::Parser(t!("functions.typeMismatch").to_string()))
6050
}
6151
}
6252

@@ -85,4 +75,11 @@ mod tests {
8575
let result = parser.parse_and_execute("[greater(1,1)]", &Context::new()).unwrap();
8676
assert_eq!(result, false);
8777
}
78+
79+
#[test]
80+
fn string_greater() {
81+
let mut parser = Statement::new().unwrap();
82+
let result = parser.parse_and_execute("[greater('b','a')]", &Context::new()).unwrap();
83+
assert_eq!(result, true);
84+
}
8885
}

dsc_lib/src/functions/greater_or_equals.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,24 @@ impl Function for GreaterOrEquals {
2929
}
3030

3131
fn accepted_arg_types(&self) -> Vec<AcceptedArgKind> {
32-
vec![AcceptedArgKind::Number, AcceptedArgKind::Number]
32+
vec![AcceptedArgKind::Number, AcceptedArgKind::String]
3333
}
3434

3535
fn invoke(&self, args: &[Value], _context: &Context) -> Result<Value, DscError> {
3636
debug!("{}", t!("functions.greaterOrEquals.invoked"));
3737

38-
let num1 = match &args[0] {
39-
Value::Number(n) => n.as_f64().ok_or_else(|| DscError::Parser(t!("functions.invalidArguments").to_string()))?,
40-
_ => return Err(DscError::Parser(t!("functions.invalidArguments").to_string())),
41-
};
38+
let first = &args[0];
39+
let second = &args[1];
4240

43-
let num2 = match &args[1] {
44-
Value::Number(n) => n.as_f64().ok_or_else(|| DscError::Parser(t!("functions.invalidArguments").to_string()))?,
45-
_ => return Err(DscError::Parser(t!("functions.invalidArguments").to_string())),
46-
};
41+
if let (Some(num1), Some(num2)) = (first.as_i64(), second.as_i64()) {
42+
return Ok(Value::Bool(num1 >= num2));
43+
}
4744

48-
Ok(Value::Bool(num1 >= num2))
45+
if let (Some(str1), Some(str2)) = (first.as_str(), second.as_str()) {
46+
return Ok(Value::Bool(str1 >= str2));
47+
}
48+
49+
Err(DscError::Parser(t!("functions.typeMismatch").to_string()))
4950
}
5051
}
5152

@@ -74,4 +75,11 @@ mod tests {
7475
let result = parser.parse_and_execute("[greaterOrEquals(5,5)]", &Context::new()).unwrap();
7576
assert_eq!(result, true);
7677
}
78+
79+
#[test]
80+
fn string_greater_or_equals() {
81+
let mut parser = Statement::new().unwrap();
82+
let result = parser.parse_and_execute("[greaterOrEquals('b','a')]", &Context::new()).unwrap();
83+
assert_eq!(result, true);
84+
}
7785
}

dsc_lib/src/functions/less.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,24 @@ impl Function for Less {
2929
}
3030

3131
fn accepted_arg_types(&self) -> Vec<AcceptedArgKind> {
32-
vec![AcceptedArgKind::Number, AcceptedArgKind::Number]
32+
vec![AcceptedArgKind::Number, AcceptedArgKind::String]
3333
}
3434

3535
fn invoke(&self, args: &[Value], _context: &Context) -> Result<Value, DscError> {
3636
debug!("{}", t!("functions.less.invoked"));
3737

38-
let num1 = match &args[0] {
39-
Value::Number(n) => n.as_f64().ok_or_else(|| DscError::Parser(t!("functions.invalidArguments").to_string()))?,
40-
_ => return Err(DscError::Parser(t!("functions.invalidArguments").to_string())),
41-
};
38+
let first = &args[0];
39+
let second = &args[1];
4240

43-
let num2 = match &args[1] {
44-
Value::Number(n) => n.as_f64().ok_or_else(|| DscError::Parser(t!("functions.invalidArguments").to_string()))?,
45-
_ => return Err(DscError::Parser(t!("functions.invalidArguments").to_string())),
46-
};
41+
if let (Some(num1), Some(num2)) = (first.as_i64(), second.as_i64()) {
42+
return Ok(Value::Bool(num1 < num2));
43+
}
4744

48-
Ok(Value::Bool(num1 < num2))
45+
if let (Some(str1), Some(str2)) = (first.as_str(), second.as_str()) {
46+
return Ok(Value::Bool(str1 < str2));
47+
}
48+
49+
Err(DscError::Parser(t!("functions.typeMismatch").to_string()))
4950
}
5051
}
5152

@@ -74,4 +75,11 @@ mod tests {
7475
let result = parser.parse_and_execute("[less(5,5)]", &Context::new()).unwrap();
7576
assert_eq!(result, false);
7677
}
78+
79+
#[test]
80+
fn string_less() {
81+
let mut parser = Statement::new().unwrap();
82+
let result = parser.parse_and_execute("[less('a','b')]", &Context::new()).unwrap();
83+
assert_eq!(result, true);
84+
}
7785
}

dsc_lib/src/functions/less_or_equals.rs

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -29,23 +29,24 @@ impl Function for LessOrEquals {
2929
}
3030

3131
fn accepted_arg_types(&self) -> Vec<AcceptedArgKind> {
32-
vec![AcceptedArgKind::Number, AcceptedArgKind::Number]
32+
vec![AcceptedArgKind::Number, AcceptedArgKind::String]
3333
}
3434

3535
fn invoke(&self, args: &[Value], _context: &Context) -> Result<Value, DscError> {
3636
debug!("{}", t!("functions.lessOrEquals.invoked"));
3737

38-
let num1 = match &args[0] {
39-
Value::Number(n) => n.as_f64().ok_or_else(|| DscError::Parser(t!("functions.invalidArguments").to_string()))?,
40-
_ => return Err(DscError::Parser(t!("functions.invalidArguments").to_string())),
41-
};
38+
let first = &args[0];
39+
let second = &args[1];
4240

43-
let num2 = match &args[1] {
44-
Value::Number(n) => n.as_f64().ok_or_else(|| DscError::Parser(t!("functions.invalidArguments").to_string()))?,
45-
_ => return Err(DscError::Parser(t!("functions.invalidArguments").to_string())),
46-
};
41+
if let (Some(num1), Some(num2)) = (first.as_i64(), second.as_i64()) {
42+
return Ok(Value::Bool(num1 <= num2));
43+
}
4744

48-
Ok(Value::Bool(num1 <= num2))
45+
if let (Some(str1), Some(str2)) = (first.as_str(), second.as_str()) {
46+
return Ok(Value::Bool(str1 <= str2));
47+
}
48+
49+
Err(DscError::Parser(t!("functions.typeMismatch").to_string()))
4950
}
5051
}
5152

@@ -74,4 +75,11 @@ mod tests {
7475
let result = parser.parse_and_execute("[lessOrEquals(5,5)]", &Context::new()).unwrap();
7576
assert_eq!(result, true);
7677
}
78+
79+
#[test]
80+
fn string_less_or_equals() {
81+
let mut parser = Statement::new().unwrap();
82+
let result = parser.parse_and_execute("[lessOrEquals('a','b')]", &Context::new()).unwrap();
83+
assert_eq!(result, true);
84+
}
7785
}

0 commit comments

Comments
 (0)