Skip to main content

microcad_lang/parse/
parameter.rs

1// Copyright © 2025-2026 The µcad authors <info@ucad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4use crate::{ord_map::*, parse::*, parser::*};
5use microcad_syntax::ast;
6
7impl FromAst for Parameter {
8    type AstNode = ast::ArgumentDefinition;
9
10    fn from_ast(node: &Self::AstNode, context: &ParseContext) -> Result<Self, ParseError> {
11        Ok(Parameter {
12            src_ref: context.src_ref(&node.span),
13            id: Identifier::from_ast(&node.name, context)?,
14            specified_type: node
15                .ty
16                .as_ref()
17                .map(|ty| TypeAnnotation::from_ast(ty, context))
18                .transpose()?,
19            default_value: node
20                .default
21                .as_ref()
22                .map(|def| Expression::from_ast(def, context))
23                .transpose()?,
24        })
25    }
26}
27
28impl FromAst for ParameterList {
29    type AstNode = ast::ArgumentsDefinition;
30
31    fn from_ast(node: &Self::AstNode, context: &ParseContext) -> Result<Self, ParseError> {
32        let mut parameters: OrdMap<_, _> = Default::default();
33
34        for param in &node.arguments {
35            let param = Parameter::from_ast(param, context)?;
36            parameters
37                .try_push(param)
38                .map_err(ParseError::DuplicateIdentifier)?;
39        }
40        Ok(ParameterList(Refer::new(
41            parameters,
42            context.src_ref(&node.span),
43        )))
44    }
45}