boseiju/ability_tree/event/
source.rs

1use crate::ability_tree::AbilityTreeNode;
2use crate::ability_tree::MAX_CHILDREN_PER_NODE;
3
4/// Fixme: doc
5#[derive(serde::Serialize, serde::Deserialize)]
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub enum EventSource {
8    AnEffect(EffectEventSource),
9    Player(PlayerEventSource),
10}
11
12impl crate::ability_tree::AbilityTreeNode for EventSource {
13    fn node_id(&self) -> usize {
14        use idris::Idris;
15        crate::ability_tree::NodeKind::EventSource.id()
16    }
17
18    fn children(&self) -> arrayvec::ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE> {
19        let mut children = arrayvec::ArrayVec::new_const();
20        match self {
21            EventSource::AnEffect(child) => children.push(child as &dyn AbilityTreeNode),
22            EventSource::Player(child) => children.push(child as &dyn AbilityTreeNode),
23        }
24        children
25    }
26
27    fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
28        use std::io::Write;
29        match self {
30            Self::AnEffect(source) => source.display(out)?,
31            Self::Player(player) => {
32                write!(out, "event source: ")?;
33                player.display(out)?;
34            }
35        }
36        Ok(())
37    }
38
39    fn node_tag(&self) -> &'static str {
40        "event source"
41    }
42
43    #[cfg(feature = "spanned_tree")]
44    fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
45        match self {
46            Self::AnEffect(child) => child.node_span(),
47            Self::Player(child) => child.node_span(),
48        }
49    }
50}
51
52#[cfg(feature = "parser")]
53impl crate::utils::DummyInit for EventSource {
54    fn dummy_init() -> Self {
55        Self::AnEffect(crate::utils::dummy())
56    }
57}
58
59/// Fixme: doc
60#[derive(serde::Serialize, serde::Deserialize)]
61#[derive(Debug, Clone, PartialEq, Eq)]
62pub struct EffectEventSource {
63    #[cfg(feature = "spanned_tree")]
64    pub span: crate::ability_tree::span::TreeSpan,
65}
66
67impl crate::ability_tree::AbilityTreeNode for EffectEventSource {
68    fn node_id(&self) -> usize {
69        use idris::Idris;
70        crate::ability_tree::NodeKind::EffectEventSource.id()
71    }
72
73    fn children(&self) -> arrayvec::ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE> {
74        arrayvec::ArrayVec::new()
75    }
76
77    fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
78        use std::io::Write;
79        write!(out, "event source: an effect")
80    }
81
82    fn node_tag(&self) -> &'static str {
83        "event source: effect"
84    }
85
86    #[cfg(feature = "spanned_tree")]
87    fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
88        self.span
89    }
90}
91
92#[cfg(feature = "parser")]
93impl crate::utils::DummyInit for EffectEventSource {
94    fn dummy_init() -> Self {
95        Self {
96            #[cfg(feature = "spanned_tree")]
97            span: Default::default(),
98        }
99    }
100}
101
102/// Fixme: doc
103#[derive(serde::Serialize, serde::Deserialize)]
104#[derive(Debug, Clone, PartialEq, Eq)]
105pub struct PlayerEventSource {
106    pub player: crate::ability_tree::player::PlayerSpecifier,
107    #[cfg(feature = "spanned_tree")]
108    pub span: crate::ability_tree::span::TreeSpan,
109}
110
111impl crate::ability_tree::AbilityTreeNode for PlayerEventSource {
112    fn node_id(&self) -> usize {
113        use idris::Idris;
114        crate::ability_tree::NodeKind::PlayerEventSource.id()
115    }
116
117    fn children(&self) -> arrayvec::ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE> {
118        let mut children = arrayvec::ArrayVec::new_const();
119        children.push(&self.player as &dyn AbilityTreeNode);
120        children
121    }
122
123    fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
124        use std::io::Write;
125        write!(out, "event source: player")?;
126        out.push_final_branch()?;
127        self.player.display(out)?;
128        out.pop_branch();
129        Ok(())
130    }
131
132    fn node_tag(&self) -> &'static str {
133        "event source: player"
134    }
135
136    #[cfg(feature = "spanned_tree")]
137    fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
138        self.span
139    }
140}
141
142#[cfg(feature = "parser")]
143impl crate::utils::DummyInit for PlayerEventSource {
144    fn dummy_init() -> Self {
145        Self {
146            player: crate::utils::dummy(),
147            #[cfg(feature = "spanned_tree")]
148            span: Default::default(),
149        }
150    }
151}