summaryrefslogtreecommitdiff
path: root/src/library
diff options
context:
space:
mode:
Diffstat (limited to 'src/library')
-rw-r--r--src/library/mod.rs1
-rw-r--r--src/library/utility.rs19
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(),
+ ),
}))
}