boseiju/ability_tree/object/
previously_mentionned.rs

1use super::*;
2use crate::ability_tree::AbilityTreeNode;
3use crate::ability_tree::MAX_CHILDREN_PER_NODE;
4
5/// Anything from "that permanent", "those counters", "that card", etc.
6#[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}