boseiju/ability_tree/terminals/
named_tokens.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 NamedToken {
10    KomasCoil {
11        #[cfg(feature = "spanned_tree")]
12        span: crate::ability_tree::span::TreeSpan,
13    },
14}
15
16#[cfg(feature = "spanned_tree")]
17impl NamedToken {
18    pub fn span(&self) -> crate::ability_tree::span::TreeSpan {
19        match self {
20            Self::KomasCoil { span } => *span,
21        }
22    }
23}
24
25impl AbilityTreeNode for NamedToken {
26    fn node_id(&self) -> usize {
27        use crate::ability_tree::NodeKind;
28        use crate::ability_tree::tree_node::TerminalNodeKind;
29        use idris::Idris;
30
31        NodeKind::Terminal(TerminalNodeKind::NamedTokenIdMarker).id()
32    }
33
34    fn children(&self) -> arrayvec::ArrayVec<&dyn AbilityTreeNode, MAX_CHILDREN_PER_NODE> {
35        use crate::ability_tree::NodeKind;
36        use crate::ability_tree::tree_node::TerminalNodeKind;
37        use idris::Idris;
38
39        let mut children = arrayvec::ArrayVec::new_const();
40        let child_id = NodeKind::Terminal(TerminalNodeKind::NamedToken(*self)).id();
41        let child = crate::ability_tree::dummy_terminal::TreeNodeDummyTerminal::new(child_id);
42        children.push(child as &dyn AbilityTreeNode);
43        children
44    }
45
46    fn display(&self, out: &mut crate::utils::TreeFormatter<'_>) -> std::io::Result<()> {
47        use std::io::Write;
48        write!(out, "{self}")
49    }
50
51    fn node_tag(&self) -> &'static str {
52        "named token"
53    }
54
55    #[cfg(feature = "spanned_tree")]
56    fn node_span(&self) -> crate::ability_tree::span::TreeSpan {
57        match self {
58            Self::KomasCoil { span } => *span,
59        }
60    }
61}
62
63#[cfg(feature = "lexer")]
64impl IntoToken for NamedToken {
65    fn try_from_span(span: &crate::lexer::Span) -> Option<Self> {
66        match span.text {
67            "koma's coil" => Some(Self::KomasCoil {
68                #[cfg(feature = "spanned_tree")]
69                span: span.into(),
70            }),
71            "~'s coil" => Some(Self::KomasCoil {
72                #[cfg(feature = "spanned_tree")]
73                span: span.into(),
74            }), /* Weird case for koma creating koma's coil */
75            _ => None,
76        }
77    }
78}
79
80impl std::fmt::Display for NamedToken {
81    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
82        match self {
83            Self::KomasCoil { .. } => write!(f, "koma's coil"),
84        }
85    }
86}
87
88#[cfg(feature = "parser")]
89impl crate::utils::DummyInit for NamedToken {
90    fn dummy_init() -> Self {
91        Self::KomasCoil {
92            #[cfg(feature = "spanned_tree")]
93            span: Default::default(),
94        }
95    }
96}