diff options
Diffstat (limited to 'src/eval/function.rs')
| -rw-r--r-- | src/eval/function.rs | 29 |
1 files changed, 8 insertions, 21 deletions
diff --git a/src/eval/function.rs b/src/eval/function.rs index 28a62873..72722230 100644 --- a/src/eval/function.rs +++ b/src/eval/function.rs @@ -81,22 +81,14 @@ impl FuncArgs { T: Cast<Spanned<Value>>, { (0 .. self.items.len()).find_map(|index| { - let slot = &mut self.items[index]; - if slot.name.is_some() { - return None; - } - - let value = std::mem::replace(&mut slot.value, Spanned::zero(Value::None)); - match T::cast(value) { - Ok(t) => { - self.items.remove(index); - Some(t) - } - Err(value) => { - slot.value = value; - None + let slot = self.items.get_mut(index)?; + if slot.name.is_none() { + if T::is(&slot.value) { + let value = self.items.remove(index).value; + return T::cast(value).ok(); } } + None }) } @@ -137,13 +129,8 @@ impl FuncArgs { match T::cast(value) { Ok(t) => Some(t), - Err(value) => { - ctx.diag(error!( - span, - "expected {}, found {}", - T::TYPE_NAME, - value.v.type_name(), - )); + Err(msg) => { + ctx.diag(error!(span, "{}", msg)); None } } |
