diff options
| author | Laurenz <laurmaedje@gmail.com> | 2021-10-05 19:37:38 +0200 |
|---|---|---|
| committer | Laurenz <laurmaedje@gmail.com> | 2021-10-05 19:37:38 +0200 |
| commit | 0a23bfbc23ec68ed229b78c8f9995928c133c4a6 (patch) | |
| tree | b3f4c13e634e387a2133a31cf7094dd6f56dd33d /src/library | |
| parent | 58d1cc68d92b2b81ea402bd33389ecbcacf1d755 (diff) | |
Add `assert` function
Diffstat (limited to 'src/library')
| -rw-r--r-- | src/library/mod.rs | 1 | ||||
| -rw-r--r-- | src/library/utility.rs | 19 |
2 files changed, 18 insertions, 2 deletions
diff --git a/src/library/mod.rs b/src/library/mod.rs index 13c8fd5c..1fcd0581 100644 --- a/src/library/mod.rs +++ b/src/library/mod.rs @@ -57,6 +57,7 @@ pub fn new() -> Scope { std.def_func("circle", circle); // Utility. + std.def_func("assert", assert); std.def_func("type", type_); std.def_func("repr", repr); std.def_func("join", join); diff --git a/src/library/utility.rs b/src/library/utility.rs index e6d5476f..5de67464 100644 --- a/src/library/utility.rs +++ b/src/library/utility.rs @@ -4,6 +4,17 @@ use std::str::FromStr; use super::*; use crate::color::{Color, RgbaColor}; +/// `assert`: Ensure that a condition is fulfilled. +pub fn assert(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { + let Spanned { v, span } = args.expect("condition")?; + match v { + Value::Bool(true) => {} + Value::Bool(false) => bail!(span, "assertion failed"), + v => bail!(span, "expected boolean, found {}", v.type_name()), + } + Ok(Value::None) +} + /// `type`: The name of a value's type. pub fn type_(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { Ok(args.expect::<Value>("value")?.type_name().into()) @@ -86,7 +97,7 @@ pub fn abs(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { Value::Relative(v) => Value::Relative(v.abs()), Value::Fractional(v) => Value::Fractional(v.abs()), Value::Linear(_) => bail!(span, "cannot take absolute value of a linear"), - _ => bail!(span, "expected numeric value"), + v => bail!(span, "expected numeric value, found {}", v.type_name()), }) } @@ -157,7 +168,11 @@ pub fn len(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> { Value::Str(v) => v.len(), Value::Array(v) => v.len(), Value::Dict(v) => v.len(), - _ => bail!(span, "expected string, array or dictionary"), + v => bail!( + span, + "expected string, array or dictionary, found {}", + v.type_name(), + ), })) } |
