Skip to content

Commit

Permalink
Merge pull request #352 from tgauth/add-add-function
Browse files Browse the repository at this point in the history
implement add function
  • Loading branch information
SteveL-MSFT authored Mar 7, 2024
2 parents 28cfb87 + e41a7ff commit 152b0cd
Show file tree
Hide file tree
Showing 2 changed files with 78 additions and 0 deletions.
76 changes: 76 additions & 0 deletions dsc_lib/src/functions/add.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,76 @@
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.

use crate::DscError;
use crate::configure::context::Context;
use crate::functions::{AcceptedArgKind, Function};
use serde_json::Value;
use tracing::debug;

#[derive(Debug, Default)]
pub struct Add {}

impl Function for Add {
fn min_args(&self) -> usize {
2
}

fn max_args(&self) -> usize {
2
}

fn accepted_arg_types(&self) -> Vec<AcceptedArgKind> {
vec![AcceptedArgKind::Number]
}

fn invoke(&self, args: &[Value], _context: &Context) -> Result<Value, DscError> {
debug!("add function");
if let (Some(arg1), Some(arg2)) = (args[0].as_i64(), args[1].as_i64()) {
Ok(Value::Number((arg1 + arg2).into()))
} else {
Err(DscError::Parser("Invalid argument(s)".to_string()))
}
}
}

#[cfg(test)]
mod tests {
use crate::configure::context::Context;
use crate::parser::Statement;

#[test]
fn numbers() {
let mut parser = Statement::new().unwrap();
let result = parser.parse_and_execute("[add(2, 3)]", &Context::new()).unwrap();
assert_eq!(result, 5);
}

#[test]
fn nested() {
let mut parser = Statement::new().unwrap();
let result = parser.parse_and_execute("[add(2, add(3, 4))]", &Context::new()).unwrap();
assert_eq!(result, 9);
}

#[test]
fn invalid_one_parameter() {
let mut parser = Statement::new().unwrap();
let result = parser.parse_and_execute("[add(5)]", &Context::new());
assert!(result.is_err());
}

#[test]
fn overflow_result() {
let mut parser = Statement::new().unwrap();
// max value for i64 is 2^63 -1 (or 9,223,372,036,854,775,807)
let result = parser.parse_and_execute("[add(9223372036854775807, 2)]", &Context::new());
assert!(result.is_err());
}

#[test]
fn overflow_input() {
let mut parser = Statement::new().unwrap();
let result = parser.parse_and_execute("[add(9223372036854775808, 2)]", &Context::new());
assert!(result.is_err());
}
}
2 changes: 2 additions & 0 deletions dsc_lib/src/functions/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ use crate::DscError;
use crate::configure::context::Context;
use serde_json::Value;

pub mod add;
pub mod base64;
pub mod concat;
pub mod create_array;
Expand Down Expand Up @@ -57,6 +58,7 @@ impl FunctionDispatcher {
#[must_use]
pub fn new() -> Self {
let mut functions: HashMap<String, Box<dyn Function>> = HashMap::new();
functions.insert("add".to_string(), Box::new(add::Add{}));
functions.insert("base64".to_string(), Box::new(base64::Base64{}));
functions.insert("concat".to_string(), Box::new(concat::Concat{}));
functions.insert("createArray".to_string(), Box::new(create_array::CreateArray{}));
Expand Down

0 comments on commit 152b0cd

Please sign in to comment.