Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions dsc_lib/src/functions/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ pub mod base64;
pub mod concat;
pub mod create_array;
pub mod envvar;
pub mod mul;
pub mod parameters;
pub mod resource_id;

Expand Down Expand Up @@ -58,6 +59,7 @@ impl FunctionDispatcher {
functions.insert("concat".to_string(), Box::new(concat::Concat{}));
functions.insert("createArray".to_string(), Box::new(create_array::CreateArray{}));
functions.insert("envvar".to_string(), Box::new(envvar::Envvar{}));
functions.insert("mul".to_string(), Box::new(mul::Mul{}));
functions.insert("parameters".to_string(), Box::new(parameters::Parameters{}));
functions.insert("resourceId".to_string(), Box::new(resource_id::ResourceId{}));
Self {
Expand Down
73 changes: 73 additions & 0 deletions dsc_lib/src/functions/mul.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
// 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 Mul {}

impl Function for Mul {
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!("mul function");
let value = args[0].as_i64().unwrap() * args[1].as_i64().unwrap();
Ok(Value::Number(value.into()))
}
}

#[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("[mul(2, 3)]", &Context::new()).unwrap();
assert_eq!(result, 6);
}

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

#[test]
fn invalid_one_parameter() {
let mut parser = Statement::new().unwrap();
let result = parser.parse_and_execute("[mul(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("[mul(9223372036854775807, 2)]", &Context::new());
assert!(result.is_err());
}

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