Skip to main content

microcad_lang/parse/
lang_type.rs

1// Copyright © 2025-2026 The µcad authors <info@ucad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4use 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}