boseiju/ability_tree/imperative/
gain_life.rs

1use crate::ability_tree::AbilityTreeNode;
2use crate::ability_tree::MAX_CHILDREN_PER_NODE;
3
4/// Imperative to draw cards or make a player draw cards.
5#[derive(serde::Serialize, serde::Deserialize)]
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct GainLifeImperative {
8    pub amount: crate::ability_tree::number::Number,
9    #[cfg(feature = "spanned_tree")]
10    pub span: crate::ability_tree::span::TreeSpan,
11}
12
13impl crate::ability_tree::AbilityTreeNode for GainLifeImperative {
14    fn node_id(&self) -> usize {
15        use idris::Idris;
16        crate::ability_tree::NodeKind::GainLifeImperative.id()
17    }
18
19    fn children(&self) -> arrayvec::ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE> {
20        let mut children = arrayvec::ArrayVec::new_const();
21        children.push(&self.amount as &dyn AbilityTreeNode);
22        children
23    }
24
25    fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
26        use std::io::Write;
27        write!(out, "gain life:")?;
28        out.push_final_branch()?;
29        write!(out, "amount:")?;
30        out.push_final_branch()?;
31        self.amount.display(out)?;
32        out.pop_branch();
33        out.pop_branch();
34        Ok(())
35    }
36
37    fn node_tag(&self) -> &'static str {
38        "gain life imperative"
39    }
40
41    #[cfg(feature = "spanned_tree")]
42    fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
43        self.span
44    }
45}
46
47#[cfg(feature = "parser")]
48impl crate::utils::DummyInit for GainLifeImperative {
49    fn dummy_init() -> Self {
50        Self {
51            amount: crate::utils::dummy(),
52            #[cfg(feature = "spanned_tree")]
53            span: Default::default(),
54        }
55    }
56}