microcad_lang/eval/
function.rs

1// Copyright © 2025 The µcad authors <info@ucad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! µcad Function call evaluation
5
6use crate::{eval::*, syntax::*, value::*};
7
8impl CallTrait for FunctionDefinition {
9    fn call(&self, args: &ArgumentValueList, context: &mut EvalContext) -> EvalResult<Value> {
10        match ArgumentMatch::find_multi_match(args, &self.signature.parameters.eval(context)?) {
11            Ok(matches) => {
12                let mut result: Vec<Value> = Vec::new();
13                for args in matches {
14                    let value: Value = context.scope(
15                        StackFrame::Function(self.id.clone(), args.into()),
16                        |context| self.body.statements.eval(context),
17                    )?;
18                    result.push(value.un_return());
19                }
20                if result.len() == 1 {
21                    Ok(result.first().expect("one result item").clone())
22                } else {
23                    Ok(Value::Array(result.into_iter().collect()))
24                }
25            }
26
27            Err(err) => {
28                context.error(args, err)?;
29                Ok(Value::None)
30            }
31        }
32    }
33}