Skip to main content

microcad_lang/syntax/
body.rs

1// Copyright © 2025-2026 The µcad authors <info@microcad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! Body syntax element.
5
6use derive_more::Deref;
7use microcad_lang_base::{SrcRef, SrcReferrer, TreeDisplay, TreeState};
8
9use crate::syntax::*;
10
11/// [StatementList] from inside `{}` brackets.
12#[derive(Clone, Default, Deref)]
13pub struct Body {
14    /// Body statements.
15    #[deref]
16    pub statements: StatementList,
17    /// Source code reference.
18    pub src_ref: SrcRef,
19}
20
21impl SrcReferrer for Body {
22    fn src_ref(&self) -> SrcRef {
23        self.src_ref.clone()
24    }
25}
26
27impl std::fmt::Display for Body {
28    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
29        writeln!(f, " {{")?;
30        writeln!(f, "{}", self.statements)?;
31        writeln!(f, "}}")?;
32        Ok(())
33    }
34}
35
36impl std::fmt::Debug for Body {
37    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
38        writeln!(f, " {{")?;
39        writeln!(f, "{:?}", self.statements)?;
40        writeln!(f, "}}")?;
41        Ok(())
42    }
43}
44
45impl TreeDisplay for Body {
46    fn tree_print(&self, f: &mut std::fmt::Formatter, mut depth: TreeState) -> std::fmt::Result {
47        writeln!(f, "{:depth$}Body:", "")?;
48        depth.indent();
49        self.statements
50            .iter()
51            .try_for_each(|s| s.tree_print(f, depth))
52    }
53}