Skip to main content

microcad_lang/syntax/statement/
return_statement.rs

1// Copyright © 2025-2026 The µcad authors <info@microcad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4//! Return statement syntax elements.
5
6use microcad_lang_base::{SrcRef, SrcReferrer, TreeDisplay, TreeState};
7
8use crate::syntax::*;
9
10/// Return statement.
11#[derive(Clone)]
12pub struct ReturnStatement {
13    /// SrcRef of the `return` keyword.
14    pub keyword_ref: SrcRef,
15    /// Return value.
16    pub result: Option<Expression>,
17    /// Source code reference.
18    pub src_ref: SrcRef,
19}
20
21impl SrcReferrer for ReturnStatement {
22    fn src_ref(&self) -> SrcRef {
23        self.src_ref.clone()
24    }
25}
26
27impl std::fmt::Display for ReturnStatement {
28    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
29        if let Some(result) = &self.result {
30            write!(f, "{result}")
31        } else {
32            write!(f, microcad_lang_base::invalid_no_ansi!(RESULT))
33        }
34    }
35}
36
37impl std::fmt::Debug for ReturnStatement {
38    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
39        if let Some(result) = &self.result {
40            write!(f, "{result:?}")
41        } else {
42            write!(f, microcad_lang_base::invalid!(RESULT))
43        }
44    }
45}
46
47impl TreeDisplay for ReturnStatement {
48    fn tree_print(&self, f: &mut std::fmt::Formatter, mut depth: TreeState) -> std::fmt::Result {
49        writeln!(f, "{:depth$}ReturnStatement:", "")?;
50        depth.indent();
51        if let Some(result) = &self.result {
52            result.tree_print(f, depth)?;
53        }
54        Ok(())
55    }
56}