boseiju/ability_tree/terminals/
order.rs

1use crate::ability_tree::AbilityTreeNode;
2use crate::ability_tree::MAX_CHILDREN_PER_NODE;
3use crate::lexer::IntoToken;
4
5/// Fixme: doc
6#[derive(idris_derive::Idris)]
7#[derive(serde::Serialize, serde::Deserialize)]
8#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
9pub enum Order {
10    RandomOrder {
11        #[cfg(feature = "spanned_tree")]
12        span: crate::ability_tree::span::TreeSpan,
13    },
14    ChosenOrder {
15        #[cfg(feature = "spanned_tree")]
16        span: crate::ability_tree::span::TreeSpan,
17    },
18}
19
20#[cfg(feature = "spanned_tree")]
21impl Order {
22    pub fn span(&self) -> crate::ability_tree::span::TreeSpan {
23        match self {
24            Self::RandomOrder { span } => *span,
25            Self::ChosenOrder { span } => *span,
26        }
27    }
28}
29
30impl AbilityTreeNode for Order {
31    fn node_id(&self) -> usize {
32        use crate::ability_tree::tree_node::TerminalNodeKind;
33        use idris::Idris;
34        crate::ability_tree::NodeKind::Terminal(TerminalNodeKind::OrderIdMarker).id()
35    }
36
37    fn children(&self) -> arrayvec::ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE> {
38        use crate::ability_tree::NodeKind;
39        use crate::ability_tree::tree_node::TerminalNodeKind;
40        use idris::Idris;
41
42        let mut children = arrayvec::ArrayVec::new_const();
43        let child_id = NodeKind::Terminal(TerminalNodeKind::Order(*self)).id();
44        let child = crate::ability_tree::dummy_terminal::TreeNodeDummyTerminal::new(child_id);
45        children.push(child as &dyn AbilityTreeNode);
46        children
47    }
48
49    fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
50        use std::io::Write;
51        write!(out, "{self}")
52    }
53
54    fn node_tag(&self) -> &'static str {
55        "order"
56    }
57
58    #[cfg(feature = "spanned_tree")]
59    fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
60        match self {
61            Self::RandomOrder { span } => *span,
62            Self::ChosenOrder { span } => *span,
63        }
64    }
65}
66
67impl std::fmt::Display for Order {
68    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
69        match self {
70            Order::RandomOrder { .. } => write!(f, "a random order"),
71            Order::ChosenOrder { .. } => write!(f, "any order"),
72        }
73    }
74}
75
76#[cfg(feature = "lexer")]
77impl IntoToken for Order {
78    fn try_from_span(span: &crate::lexer::Span) -> Option<Self> {
79        match span.text {
80            "a random order" => Some(Order::RandomOrder {
81                #[cfg(feature = "spanned_tree")]
82                span: span.into(),
83            }),
84            "any order" => Some(Order::ChosenOrder {
85                #[cfg(feature = "spanned_tree")]
86                span: span.into(),
87            }),
88            _ => None,
89        }
90    }
91}