microcad_lang/parse/
parameter.rs1use 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}