microcad_lang/syntax/
init_definition.rs1use crate::{src_ref::*, syntax::*};
7
8#[derive(Clone)]
18pub struct InitDefinition {
19 pub keyword_ref: SrcRef,
21 pub doc: Option<DocBlock>,
23 pub parameters: ParameterList,
25 pub body: Body,
27 pub src_ref: SrcRef,
29}
30
31impl Doc for InitDefinition {
32 fn doc(&self) -> Option<DocBlock> {
33 self.doc.clone()
34 }
35}
36
37impl SrcReferrer for InitDefinition {
38 fn src_ref(&self) -> SrcRef {
39 self.src_ref.clone()
40 }
41}
42
43impl std::fmt::Display for InitDefinition {
44 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
45 write!(f, "init({parameters}) ", parameters = self.parameters)?;
46 write!(f, "{body}", body = self.body)
47 }
48}
49
50impl std::fmt::Debug for InitDefinition {
51 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
52 write!(f, "init({parameters:?}) ", parameters = self.parameters)?;
53 write!(f, "{body:?}", body = self.body)
54 }
55}
56
57impl TreeDisplay for InitDefinition {
58 fn tree_print(&self, f: &mut std::fmt::Formatter, mut depth: TreeState) -> std::fmt::Result {
59 writeln!(f, "{:depth$}InitDefinition:", "")?;
60 depth.indent();
61 if let Some(doc) = &self.doc {
62 doc.tree_print(f, depth)?;
63 }
64 self.parameters.tree_print(f, depth)?;
65 self.body.tree_print(f, depth)
66 }
67}
68
69pub struct Inits<'a>(std::slice::Iter<'a, Statement>);
71
72pub trait Initialized<'a> {
74 fn statements(&'a self) -> std::slice::Iter<'a, Statement>;
76
77 fn inits(&'a self) -> Inits<'a>
79 where
80 Self: std::marker::Sized,
81 {
82 Inits::new(self)
83 }
84}
85
86impl<'a> Inits<'a> {
87 pub fn new(def: &'a impl Initialized<'a>) -> Self {
89 Self(def.statements())
90 }
91}
92
93impl<'a> Iterator for Inits<'a> {
94 type Item = &'a InitDefinition;
95
96 fn next(&mut self) -> Option<Self::Item> {
97 for statement in self.0.by_ref() {
98 match statement {
99 Statement::Init(init_definition) => {
100 return Some(init_definition);
101 }
102 _ => continue,
103 }
104 }
105
106 None
107 }
108}