boseiju/ability_tree/ability/statik/continuous_effect/
continuous_effect_kind.rs

1pub mod modify_object;
2pub mod replacement_effect;
3
4pub use modify_object::ContinuousEffectModifyObject;
5pub use replacement_effect::ContinuousEffectReplacementEvent;
6
7use crate::ability_tree::AbilityTreeNode;
8use crate::ability_tree::MAX_CHILDREN_PER_NODE;
9
10/// All kinds of continuous effects
11///
12/// See also <https://mtg.fandom.com/wiki/Continuous_effect>
13#[derive(serde::Serialize, serde::Deserialize)]
14#[derive(Debug, Clone, PartialEq, Eq)]
15pub enum ContinuousEffectKind {
16    ModifyObjectAbilities(ContinuousEffectModifyObject),
17    ReplacementEffect(ContinuousEffectReplacementEvent),
18}
19
20#[cfg(feature = "spanned_tree")]
21impl ContinuousEffectKind {
22    pub fn span(&self) -> crate::ability_tree::span::TreeSpan {
23        match self {
24            Self::ModifyObjectAbilities(child) => child.span,
25            Self::ReplacementEffect(child) => child.span,
26        }
27    }
28}
29
30impl AbilityTreeNode for ContinuousEffectKind {
31    fn node_id(&self) -> usize {
32        use idris::Idris;
33        crate::ability_tree::NodeKind::ContinuousEffectKind.id()
34    }
35
36    fn children(&self) -> arrayvec::ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE> {
37        let mut children = arrayvec::ArrayVec::new_const();
38        match self {
39            Self::ModifyObjectAbilities(child) => children.push(child as &dyn AbilityTreeNode),
40            Self::ReplacementEffect(child) => children.push(child as &dyn AbilityTreeNode),
41        }
42        children
43    }
44
45    fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
46        use std::io::Write;
47        write!(out, "continuous effect kind")?;
48        out.push_final_branch()?;
49        match self {
50            Self::ModifyObjectAbilities(child) => child.display(out)?,
51            Self::ReplacementEffect(child) => child.display(out)?,
52        }
53        out.pop_branch();
54        Ok(())
55    }
56
57    fn node_tag(&self) -> &'static str {
58        "continuous effect kind"
59    }
60
61    #[cfg(feature = "spanned_tree")]
62    fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
63        match self {
64            Self::ModifyObjectAbilities(child) => child.node_span(),
65            Self::ReplacementEffect(child) => child.node_span(),
66        }
67    }
68}
69
70#[cfg(feature = "parser")]
71impl crate::utils::DummyInit for ContinuousEffectKind {
72    fn dummy_init() -> Self {
73        Self::ModifyObjectAbilities(crate::utils::dummy())
74    }
75}