boseiju/ability_tree/object/
previously_mentionned.rs1use super::*;
2use crate::ability_tree::AbilityTreeNode;
3use crate::ability_tree::MAX_CHILDREN_PER_NODE;
4
5#[derive(serde::Serialize, serde::Deserialize)]
7#[derive(Debug, Clone, PartialEq, Eq)]
8pub struct PreviouslyMentionnedObject {
9 pub kind: Option<ObjectKind>,
10 #[cfg(feature = "spanned_tree")]
11 pub span: crate::ability_tree::span::TreeSpan,
12}
13
14impl AbilityTreeNode for PreviouslyMentionnedObject {
15 fn node_id(&self) -> usize {
16 use idris::Idris;
17 crate::ability_tree::NodeKind::PreviouslyMentionnedObject.id()
18 }
19
20 fn children(&self) -> arrayvec::ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE> {
21 use crate::ability_tree::dummy_terminal::TreeNodeDummyTerminal;
22
23 let mut children = arrayvec::ArrayVec::new_const();
24 match self.kind.as_ref() {
25 Some(child) => children.push(child as &dyn AbilityTreeNode),
26 None => children.push(TreeNodeDummyTerminal::none_node() as &dyn AbilityTreeNode),
27 }
28 children
29 }
30
31 fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
32 use std::io::Write;
33 write!(out, "previously mentionned object:")?;
34 out.push_final_branch()?;
35 write!(out, "object kind:")?;
36 match self.kind.as_ref() {
37 Some(kind) => kind.display(out)?,
38 None => write!(out, "any")?,
39 }
40 out.pop_branch();
41 Ok(())
42 }
43
44 fn node_tag(&self) -> &'static str {
45 "previously mentionned object"
46 }
47
48 #[cfg(feature = "spanned_tree")]
49 fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
50 self.span
51 }
52}
53
54#[cfg(feature = "parser")]
55impl crate::utils::DummyInit for PreviouslyMentionnedObject {
56 fn dummy_init() -> Self {
57 Self {
58 kind: crate::utils::dummy(),
59 #[cfg(feature = "spanned_tree")]
60 span: Default::default(),
61 }
62 }
63}