boseiju/ability_tree/terminals/
spell_property.rs

1use crate::lexer::IntoToken;
2
3#[derive(idris_derive::Idris)]
4#[derive(serde::Serialize, serde::Deserialize)]
5#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
6pub enum SpellProperty {
7    Countered {
8        #[cfg(feature = "spanned_tree")]
9        span: crate::ability_tree::span::TreeSpan,
10    },
11    Kicked {
12        #[cfg(feature = "spanned_tree")]
13        span: crate::ability_tree::span::TreeSpan,
14    },
15}
16
17#[cfg(feature = "spanned_tree")]
18impl SpellProperty {
19    pub fn span(&self) -> crate::ability_tree::span::TreeSpan {
20        match self {
21            Self::Countered { span } => *span,
22            Self::Kicked { span } => *span,
23        }
24    }
25}
26
27impl std::fmt::Display for SpellProperty {
28    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
29        match self {
30            SpellProperty::Countered { .. } => write!(f, "countered"),
31            SpellProperty::Kicked { .. } => write!(f, "kicked"),
32        }
33    }
34}
35
36#[cfg(feature = "lexer")]
37impl IntoToken for SpellProperty {
38    fn try_from_span(span: &crate::lexer::Span) -> Option<Self> {
39        match span.text {
40            "countered" => Some(SpellProperty::Countered {
41                #[cfg(feature = "spanned_tree")]
42                span: span.into(),
43            }),
44            "kicked" => Some(SpellProperty::Kicked {
45                #[cfg(feature = "spanned_tree")]
46                span: span.into(),
47            }),
48            _ => None,
49        }
50    }
51}