Len function for strings, arrays and dictionaries

This commit is contained in:
Laurenz 2021-06-18 10:50:08 +02:00
parent 2e87808cdd
commit 6967c6c80a
4 changed files with 32 additions and 1 deletions

View File

@ -31,6 +31,20 @@ pub fn repr(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value {
}
}
/// `len`: The length of a string, an array or a dictionary.
pub fn len(ctx: &mut EvalContext, args: &mut FuncArgs) -> Value {
match args.eat_expect::<Spanned<Value>>(ctx, "collection") {
Some(Spanned { v: Value::Str(v), .. }) => Value::Int(v.len() as i64),
Some(Spanned { v: Value::Array(v), .. }) => Value::Int(v.len() as i64),
Some(Spanned { v: Value::Dict(v), .. }) => Value::Int(v.len() as i64),
Some(other) if other.v != Value::Error => {
ctx.diag(error!(other.span, "expected string, array or dictionary"));
Value::Error
}
_ => Value::Error,
}
}
/// `rgb`: Create an RGB(A) color.
///
/// # Positional parameters

View File

@ -56,6 +56,7 @@ pub fn new() -> Scope {
std.def_func("h", h);
std.def_func("image", image);
std.def_func("lang", lang);
std.def_func("len", len);
std.def_func("max", max);
std.def_func("min", min);
std.def_func("overline", overline);

View File

@ -0,0 +1,16 @@
// Test basic functions.
// Ref: false
---
// Test the `len` function.
#test(len(()), 0)
#test(len(("A", "B", "C")), 3)
#test(len("Hello World!"), 12)
#test(len((a: 1, b: 2)), 2)
// Error: 6 missing argument: collection
#len()
// Error: 6-10 expected string, array or dictionary
#len(12pt)

View File

@ -1,4 +1,4 @@
// Test basic calculation functions.
// Test math functions.
// Ref: false
---