boseiju/ability_tree/terminals/
named_tokens.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 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 }), _ => 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}