microcad_lang/parse/
lang_type.rs1use std::collections::{HashMap, HashSet};
5use crate::{parse::*, parser::*, syntax::*, ty::*};
6use microcad_syntax::ast;
7
8impl FromAst for TupleType {
9 type AstNode = ast::TupleType;
10
11 fn from_ast(node: &Self::AstNode, context: &ParseContext) -> Result<Self, ParseError> {
12 Ok(TupleType {
13 named: node
14 .inner
15 .iter()
16 .filter_map(|(name, value)| name.as_ref().map(|name| (name, value)))
17 .map(|(name, value)| {
18 let name = Identifier::from_ast(name, context)?;
19 let value = Type::from_ast(value, context)?;
20 Ok((name, value))
21 })
22 .collect::<Result<HashMap<_, _>, _>>()?,
23 unnamed: node
24 .inner
25 .iter()
26 .filter_map(|(name, value)| name.is_none().then_some(value))
27 .map(|value| Type::from_ast(value, context))
28 .collect::<Result<HashSet<_>, _>>()?,
29 })
30 }
31}