mirror of
https://github.com/typst/typst
synced 2025-05-14 17:15:28 +08:00
Add assert
function
This commit is contained in:
parent
58d1cc68d9
commit
0a23bfbc23
@ -57,6 +57,7 @@ pub fn new() -> Scope {
|
|||||||
std.def_func("circle", circle);
|
std.def_func("circle", circle);
|
||||||
|
|
||||||
// Utility.
|
// Utility.
|
||||||
|
std.def_func("assert", assert);
|
||||||
std.def_func("type", type_);
|
std.def_func("type", type_);
|
||||||
std.def_func("repr", repr);
|
std.def_func("repr", repr);
|
||||||
std.def_func("join", join);
|
std.def_func("join", join);
|
||||||
|
@ -4,6 +4,17 @@ use std::str::FromStr;
|
|||||||
use super::*;
|
use super::*;
|
||||||
use crate::color::{Color, RgbaColor};
|
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.
|
/// `type`: The name of a value's type.
|
||||||
pub fn type_(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> {
|
pub fn type_(_: &mut EvalContext, args: &mut Args) -> TypResult<Value> {
|
||||||
Ok(args.expect::<Value>("value")?.type_name().into())
|
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::Relative(v) => Value::Relative(v.abs()),
|
||||||
Value::Fractional(v) => Value::Fractional(v.abs()),
|
Value::Fractional(v) => Value::Fractional(v.abs()),
|
||||||
Value::Linear(_) => bail!(span, "cannot take absolute value of a linear"),
|
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::Str(v) => v.len(),
|
||||||
Value::Array(v) => v.len(),
|
Value::Array(v) => v.len(),
|
||||||
Value::Dict(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(),
|
||||||
|
),
|
||||||
}))
|
}))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,22 @@
|
|||||||
// Test basic functions.
|
// Test basic functions.
|
||||||
// Ref: false
|
// Ref: false
|
||||||
|
|
||||||
|
---
|
||||||
|
// Test the `assert` function.
|
||||||
|
#assert(1 + 1 == 2)
|
||||||
|
#assert(2..5 == (2, 3, 4))
|
||||||
|
#assert(not false)
|
||||||
|
|
||||||
|
---
|
||||||
|
// Test failing assertions.
|
||||||
|
// Error: 9-15 assertion failed
|
||||||
|
#assert(1 == 2)
|
||||||
|
|
||||||
|
---
|
||||||
|
// Test failing assertions.
|
||||||
|
// Error: 9-15 expected boolean, found string
|
||||||
|
#assert("true")
|
||||||
|
|
||||||
---
|
---
|
||||||
// Test the `type` function.
|
// Test the `type` function.
|
||||||
#test(type(1), "integer")
|
#test(type(1), "integer")
|
||||||
|
Loading…
x
Reference in New Issue
Block a user