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