boseiju/ability_tree/ability/statik/
continuous_effect.rs

1mod continuous_effect_kind;
2
3pub use continuous_effect_kind::*;
4
5use crate::ability_tree::AbilityTreeNode;
6use crate::ability_tree::MAX_CHILDREN_PER_NODE;
7
8/// A continuous effect, from the comprehensive rules:
9///
10/// An effect that modifies characteristics of objects,
11/// modifies control of objects, or affects players or the rules of the game,
12/// for a fixed or indefinite period. See rule 611, “Continuous Effects”.
13///
14/// See also <https://mtg.fandom.com/wiki/Continuous_effect>
15#[derive(serde::Serialize, serde::Deserialize)]
16#[derive(Debug, Clone, PartialEq, Eq)]
17pub struct ContinuousEffect {
18    pub effect: continuous_effect_kind::ContinuousEffectKind,
19    #[cfg(feature = "spanned_tree")]
20    pub span: crate::ability_tree::span::TreeSpan,
21}
22
23impl crate::ability_tree::AbilityTreeNode for ContinuousEffect {
24    fn node_id(&self) -> usize {
25        use idris::Idris;
26        crate::ability_tree::NodeKind::ContinuousEffect.id()
27    }
28
29    fn children(&self) -> arrayvec::ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE> {
30        let mut children = arrayvec::ArrayVec::new_const();
31        children.push(&self.effect as &dyn AbilityTreeNode);
32        children
33    }
34
35    fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
36        use std::io::Write;
37        write!(out, "continuous effect:")?;
38        out.push_final_branch()?;
39        write!(out, "effect:")?;
40        out.push_final_branch()?;
41        self.effect.display(out)?;
42        out.pop_branch();
43        out.pop_branch();
44        Ok(())
45    }
46
47    fn node_tag(&self) -> &'static str {
48        "continuous effect"
49    }
50
51    #[cfg(feature = "spanned_tree")]
52    fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
53        self.span
54    }
55}
56
57#[cfg(feature = "parser")]
58impl crate::utils::DummyInit for ContinuousEffect {
59    fn dummy_init() -> Self {
60        Self {
61            effect: crate::utils::dummy(),
62            #[cfg(feature = "spanned_tree")]
63            span: Default::default(),
64        }
65    }
66}