boseiju/ability_tree/terminals/
order.rs1use crate::ability_tree::AbilityTreeNode;
2use crate::ability_tree::MAX_CHILDREN_PER_NODE;
3use crate::lexer::IntoToken;
4
5#[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}