diff --git a/src/function/builtin.rs b/src/function/builtin.rs index b4d6cab..7194da1 100644 --- a/src/function/builtin.rs +++ b/src/function/builtin.rs @@ -121,6 +121,11 @@ pub fn builtin_function(identifier: &str) -> Option { Ok(Value::Float(max_float)) } })), + "if" => Some(Function::new(|argument| { + let mut arguments = argument.as_fixed_len_tuple(3)?; + let result_index = if arguments[0].as_boolean()? { 1 } else { 2 }; + Ok(arguments.swap_remove(result_index)) + })), "len" => Some(Function::new(|argument| { if let Ok(subject) = argument.as_string() { Ok(Value::from(subject.len() as i64)) diff --git a/src/lib.rs b/src/lib.rs index 967a48c..f136143 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -327,6 +327,7 @@ //! | `floor` | 1 | Numeric | Returns the largest integer less than or equal to a number | //! | `round` | 1 | Numeric | Returns the nearest integer to a number. Rounds half-way cases away from 0.0 | //! | `ceil` | 1 | Numeric | Returns the smallest integer greater than or equal to a number | +//! | `if` | 3 | Boolean, Any, Any | If the first argument is true, returns the second argument, otherwise, returns the third | //! | `math::ln` | 1 | Numeric | Returns the natural logarithm of the number | //! | `math::log` | 2 | Numeric, Numeric | Returns the logarithm of the number with respect to an arbitrary base | //! | `math::log2` | 1 | Numeric | Returns the base 2 logarithm of the number | diff --git a/tests/integration.rs b/tests/integration.rs index d93c235..945f000 100644 --- a/tests/integration.rs +++ b/tests/integration.rs @@ -408,6 +408,12 @@ fn test_builtin_functions() { assert_eq!(eval("shl(-6, 5)"), Ok(Value::Int(-192))); assert_eq!(eval("shr(5, 1)"), Ok(Value::Int(2))); assert_eq!(eval("shr(-6, 5)"), Ok(Value::Int(-1))); + assert_eq!(eval("if(true, -6, 5)"), Ok(Value::Int(-6))); + assert_eq!(eval("if(false, -6, 5)"), Ok(Value::Int(5))); + assert_eq!( + eval("if(2-1==1, \"good\", 0)"), + Ok(Value::String(String::from("good"))) + ); } #[test] @@ -459,6 +465,12 @@ fn test_no_panic() { IntType::max_value() )) .is_ok()); + assert!(eval("if").is_err()); + assert!(eval("if()").is_err()); + assert!(eval("if(true, 1)").is_err()); + assert!(eval("if(false, 2)").is_err()); + assert!(eval("if(1,1,1)").is_err()); + assert!(eval("if(true,1,1,1)").is_err()); } #[test]