Skip to main content

microcad_lang/syntax/parameter/
parameter_list.rs

1// Copyright © 2024-2026 The µcad authors <info@microcad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! Parameter list syntax element
5
6use crate::{ord_map::*, syntax::*};
7use derive_more::{Deref, DerefMut};
8use microcad_lang_base::{Refer, SrcRef, SrcReferrer, TreeDisplay, TreeState};
9
10/// Parameter list
11#[derive(Clone, Default, Deref, DerefMut)]
12pub struct ParameterList(pub Refer<OrdMap<Identifier, Parameter>>);
13
14impl ParameterList {
15    /// Return ids of all parameters
16    pub fn ids(&self) -> impl Iterator<Item = Identifier> {
17        self.keys().cloned()
18    }
19
20    /// Return if given identifier is in parameter list
21    pub fn contains_key(&self, id: &Identifier) -> bool {
22        self.iter().any(|p| *id == p.id)
23    }
24}
25
26impl SrcReferrer for ParameterList {
27    fn src_ref(&self) -> SrcRef {
28        self.0.src_ref.clone()
29    }
30}
31
32impl std::fmt::Display for ParameterList {
33    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
34        write!(
35            f,
36            "{}",
37            self.0
38                .iter()
39                .map(|p| p.to_string())
40                .collect::<Vec<_>>()
41                .join(", ")
42        )
43    }
44}
45
46impl std::fmt::Debug for ParameterList {
47    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
48        write!(
49            f,
50            "{}",
51            self.0
52                .iter()
53                .map(|p| format!("{p:?}"))
54                .collect::<Vec<_>>()
55                .join(", ")
56        )
57    }
58}
59
60impl TreeDisplay for ParameterList {
61    fn tree_print(&self, f: &mut std::fmt::Formatter, mut depth: TreeState) -> std::fmt::Result {
62        writeln!(f, "{:depth$}ParameterList:", "")?;
63        depth.indent();
64        self.0.iter().try_for_each(|p| p.tree_print(f, depth))
65    }
66}