diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/eval/function.rs | 15 | ||||
| -rw-r--r-- | src/library/utility.rs | 8 |
2 files changed, 13 insertions, 10 deletions
diff --git a/src/eval/function.rs b/src/eval/function.rs index 205690df..d9f79adf 100644 --- a/src/eval/function.rs +++ b/src/eval/function.rs @@ -93,16 +93,21 @@ impl Args { None } - /// Find and consume the first castable positional argument, returning a - /// `missing argument: {what}` error if no match was found. + /// Try to cast the first positional argument ir returning a `missing + /// argument: {what}` error if no positional argument is left. pub fn expect<T>(&mut self, what: &str) -> TypResult<T> where T: Cast<Spanned<Value>>, { - match self.eat() { - Some(found) => Ok(found), - None => bail!(self.span, "missing argument: {}", what), + for (i, slot) in self.items.iter().enumerate() { + if slot.name.is_none() { + let value = self.items.remove(i).value; + let span = value.span; + return T::cast(value).at(span); + } } + + bail!(self.span, "missing argument: {}", what); } /// Find and consume all castable positional arguments. diff --git a/src/library/utility.rs b/src/library/utility.rs index 5de67464..3a2f49b7 100644 --- a/src/library/utility.rs +++ b/src/library/utility.rs @@ -6,11 +6,9 @@ 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()), + let Spanned { v, span } = args.expect::<Spanned<bool>>("condition")?; + if !v { + bail!(span, "assertion failed"); } Ok(Value::None) } |
