Skip to content

Commit

Permalink
Merge 7522df1 into a1bfe7c
Browse files Browse the repository at this point in the history
  • Loading branch information
lovasoa authored Mar 14, 2022
2 parents a1bfe7c + 7522df1 commit a1cf9d0
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 0 deletions.
8 changes: 8 additions & 0 deletions src/function/builtin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -121,6 +121,14 @@ pub fn builtin_function(identifier: &str) -> Option<Function> {
Ok(Value::Float(max_float))
}
})),
"if" => Some(Function::new(|argument| {
let arguments = &argument.as_fixed_len_tuple(3)?;
Ok(if arguments[0].as_boolean()? {
arguments[1].clone()
} else {
arguments[2].clone()
})
})),
"len" => Some(Function::new(|argument| {
if let Ok(subject) = argument.as_string() {
Ok(Value::from(subject.len() as i64))
Expand Down
1 change: 1 addition & 0 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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, return 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 |
Expand Down
12 changes: 12 additions & 0 deletions tests/integration.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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]
Expand Down Expand Up @@ -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]
Expand Down

0 comments on commit a1cf9d0

Please sign in to comment.