boseiju/ability_tree/object/object_specifiers/
control_specifier.rs

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