Skip to content

Commit 04602e5

Browse files
authored
Merge pull request #770 from SteveL-MSFT/equals-function
Add `equals()` function
2 parents 8a2b9c0 + 56457ad commit 04602e5

File tree

2 files changed

+76
-0
lines changed

2 files changed

+76
-0
lines changed

dsc_lib/src/functions/equals.rs

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
// Copyright (c) Microsoft Corporation.
2+
// Licensed under the MIT License.
3+
4+
use crate::DscError;
5+
use crate::configure::context::Context;
6+
use crate::functions::AcceptedArgKind;
7+
use super::Function;
8+
use serde_json::Value;
9+
10+
#[derive(Debug, Default)]
11+
pub struct Equals {}
12+
13+
impl Function for Equals {
14+
fn accepted_arg_types(&self) -> Vec<AcceptedArgKind> {
15+
vec![AcceptedArgKind::Number, AcceptedArgKind::String, AcceptedArgKind::Array, AcceptedArgKind::Object]
16+
}
17+
18+
fn min_args(&self) -> usize {
19+
2
20+
}
21+
22+
fn max_args(&self) -> usize {
23+
2
24+
}
25+
26+
fn invoke(&self, args: &[Value], _context: &Context) -> Result<Value, DscError> {
27+
Ok(Value::Bool(args[0] == args[1]))
28+
}
29+
}
30+
31+
#[cfg(test)]
32+
mod tests {
33+
use crate::configure::context::Context;
34+
use crate::parser::Statement;
35+
use serde_json::Value;
36+
37+
#[test]
38+
fn int_equal() {
39+
let mut parser = Statement::new().unwrap();
40+
let result = parser.parse_and_execute("[equals(1,1)]", &Context::new()).unwrap();
41+
assert_eq!(result, Value::Bool(true));
42+
}
43+
44+
#[test]
45+
fn int_notequal() {
46+
let mut parser = Statement::new().unwrap();
47+
let result = parser.parse_and_execute("[equals(1,2]", &Context::new()).unwrap();
48+
assert_eq!(result, Value::Bool(false));
49+
}
50+
51+
#[test]
52+
fn string_equal() {
53+
let mut parser = Statement::new().unwrap();
54+
let result = parser.parse_and_execute("[equals('test','test')]", &Context::new()).unwrap();
55+
assert_eq!(result, Value::Bool(true));
56+
}
57+
58+
#[test]
59+
fn string_notequal() {
60+
let mut parser = Statement::new().unwrap();
61+
let result = parser.parse_and_execute("[equals('test','TEST')]", &Context::new()).unwrap();
62+
assert_eq!(result, Value::Bool(false));
63+
}
64+
65+
#[test]
66+
fn different_types() {
67+
let mut parser = Statement::new().unwrap();
68+
let result = parser.parse_and_execute("[equals(1,'string')]", &Context::new()).unwrap();
69+
assert_eq!(result, Value::Bool(false));
70+
}
71+
72+
// TODO: Add tests for arrays once `createArray()` is implemented
73+
// TODO: Add tests for objects once `createObject()` is implemented
74+
}

dsc_lib/src/functions/mod.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ pub mod concat;
1414
pub mod create_array;
1515
pub mod div;
1616
pub mod envvar;
17+
pub mod equals;
1718
pub mod int;
1819
pub mod max;
1920
pub mod min;
@@ -73,6 +74,7 @@ impl FunctionDispatcher {
7374
functions.insert("createArray".to_string(), Box::new(create_array::CreateArray{}));
7475
functions.insert("div".to_string(), Box::new(div::Div{}));
7576
functions.insert("envvar".to_string(), Box::new(envvar::Envvar{}));
77+
functions.insert("equals".to_string(), Box::new(equals::Equals{}));
7678
functions.insert("int".to_string(), Box::new(int::Int{}));
7779
functions.insert("max".to_string(), Box::new(max::Max{}));
7880
functions.insert("min".to_string(), Box::new(min::Min{}));

0 commit comments

Comments
 (0)