Skip to main content

microcad_lang/lower/ir/parameter/
mod.rs

1// Copyright © 2024-2026 The µcad authors <info@microcad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! µcad parameter syntax elements
5
6mod parameter_list;
7
8use crate::lower::ir;
9
10use microcad_lang_base::{Identifier, OrdMapValue, SrcRef};
11use microcad_lang_proc_macros::{Identifiable, SrcReferrer};
12pub use parameter_list::*;
13
14/// A parameter of a parameter list.
15#[derive(Clone, Debug, Default, SrcReferrer, Identifiable)]
16pub struct Parameter {
17    /// Name of the parameter
18    pub(crate) id: Identifier,
19    /// Type of the parameter or `None`
20    pub specified_type: Option<ir::TypeAnnotation>,
21    /// default value of the parameter or `None`
22    pub default_value: Option<ir::Expression>,
23    /// Source code reference
24    pub src_ref: SrcRef,
25}
26
27impl OrdMapValue<Identifier> for Parameter {
28    fn key(&self) -> Option<Identifier> {
29        Some(self.id.clone())
30    }
31}
32
33impl std::fmt::Display for Parameter {
34    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
35        match (&self.specified_type, &self.default_value) {
36            (Some(t), Some(v)) => write!(f, "{}: {t} = {v}", self.id),
37            (Some(t), None) => write!(f, "{}: {t}", self.id),
38            (None, Some(v)) => write!(f, "{} = {v}", self.id),
39            _ => Ok(()),
40        }
41    }
42}