microcad_lang/syntax/statement/
return_statement.rs

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