Skip to main content

microcad_lang/syntax/statement/
assignment_statement.rs

1// Copyright © 2025-2026 The µcad authors <info@microcad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! Assignment statement syntax elements
5
6use std::rc::Rc;
7
8use microcad_lang_base::{SrcRef, SrcReferrer, TreeDisplay, TreeState};
9
10use crate::syntax::*;
11
12/// An assignment statement, e.g. `#[aux] s = Sphere(3.0mm);`.
13#[derive(Clone)]
14pub struct AssignmentStatement {
15    /// List of attributes.
16    pub attribute_list: AttributeList,
17    /// The actual assignment.
18    pub assignment: Rc<Assignment>,
19    /// Source code reference.
20    pub src_ref: SrcRef,
21}
22
23impl SrcReferrer for AssignmentStatement {
24    fn src_ref(&self) -> SrcRef {
25        self.src_ref.clone()
26    }
27}
28
29impl TreeDisplay for AssignmentStatement {
30    fn tree_print(&self, f: &mut std::fmt::Formatter, depth: TreeState) -> std::fmt::Result {
31        writeln!(f, "{:depth$}Assignment {}", "", self.assignment)
32    }
33}
34
35impl std::fmt::Display for AssignmentStatement {
36    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
37        if !self.attribute_list.is_empty() {
38            write!(f, "{} ", self.attribute_list)?;
39        }
40        write!(f, "{};", self.assignment)
41    }
42}
43
44impl std::fmt::Debug for AssignmentStatement {
45    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
46        if !self.attribute_list.is_empty() {
47            write!(f, "{:?} ", self.attribute_list)?;
48        }
49        write!(f, "{:?};", self.assignment)
50    }
51}