Skip to main content

microcad_lang/eval/
function.rs

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