boseiju/ability_tree/event/
source.rs1use crate::ability_tree::AbilityTreeNode;
2use crate::ability_tree::MAX_CHILDREN_PER_NODE;
3
4#[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#[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#[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}