summaryrefslogtreecommitdiff
path: root/src/eval/function.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval/function.rs')
-rw-r--r--src/eval/function.rs29
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
}
}