boseiju/ability_tree/terminals/
step.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 Step {
7    Untap {
8        #[cfg(feature = "spanned_tree")]
9        span: crate::ability_tree::span::TreeSpan,
10    },
11    Upkeep {
12        #[cfg(feature = "spanned_tree")]
13        span: crate::ability_tree::span::TreeSpan,
14    },
15    Draw {
16        #[cfg(feature = "spanned_tree")]
17        span: crate::ability_tree::span::TreeSpan,
18    },
19    BeginningOfCombat {
20        #[cfg(feature = "spanned_tree")]
21        span: crate::ability_tree::span::TreeSpan,
22    },
23    DeclareAttackers {
24        #[cfg(feature = "spanned_tree")]
25        span: crate::ability_tree::span::TreeSpan,
26    },
27    DeclareBlockers {
28        #[cfg(feature = "spanned_tree")]
29        span: crate::ability_tree::span::TreeSpan,
30    },
31    FirstStrikeDamage {
32        #[cfg(feature = "spanned_tree")]
33        span: crate::ability_tree::span::TreeSpan,
34    },
35    Damage {
36        #[cfg(feature = "spanned_tree")]
37        span: crate::ability_tree::span::TreeSpan,
38    },
39    LastStrikeDamage {
40        #[cfg(feature = "spanned_tree")]
41        span: crate::ability_tree::span::TreeSpan,
42    },
43    EndOfCombat {
44        #[cfg(feature = "spanned_tree")]
45        span: crate::ability_tree::span::TreeSpan,
46    },
47    End {
48        #[cfg(feature = "spanned_tree")]
49        span: crate::ability_tree::span::TreeSpan,
50    },
51    Cleanup {
52        #[cfg(feature = "spanned_tree")]
53        span: crate::ability_tree::span::TreeSpan,
54    },
55}
56
57#[cfg(feature = "spanned_tree")]
58impl Step {
59    pub fn span(&self) -> crate::ability_tree::span::TreeSpan {
60        match self {
61            Self::Untap { span } => *span,
62            Self::Upkeep { span } => *span,
63            Self::Draw { span } => *span,
64            Self::BeginningOfCombat { span } => *span,
65            Self::DeclareAttackers { span } => *span,
66            Self::DeclareBlockers { span } => *span,
67            Self::FirstStrikeDamage { span } => *span,
68            Self::Damage { span } => *span,
69            Self::LastStrikeDamage { span } => *span,
70            Self::EndOfCombat { span } => *span,
71            Self::End { span } => *span,
72            Self::Cleanup { span } => *span,
73        }
74    }
75}
76
77impl std::fmt::Display for Step {
78    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
79        match self {
80            Step::Untap { .. } => write!(f, "untap"),
81            Step::Upkeep { .. } => write!(f, "upkeep"),
82            Step::Draw { .. } => write!(f, "draw"),
83            Step::BeginningOfCombat { .. } => write!(f, "beginning of combat"),
84            Step::DeclareAttackers { .. } => write!(f, "declaration of attackers"),
85            Step::DeclareBlockers { .. } => write!(f, "declaration of blockers"),
86            Step::FirstStrikeDamage { .. } => write!(f, "first strike damage step"),
87            Step::Damage { .. } => write!(f, "damage step"),
88            Step::LastStrikeDamage { .. } => write!(f, "last strike damage step"),
89            Step::EndOfCombat { .. } => write!(f, "end of combat"),
90            Step::End { .. } => write!(f, "end step"),
91            Step::Cleanup { .. } => write!(f, "cleanup"),
92        }
93    }
94}
95
96#[cfg(feature = "lexer")]
97impl IntoToken for Step {
98    fn try_from_span(span: &crate::lexer::Span) -> Option<Self> {
99        match span.text {
100            "untap step" => Some(Step::Untap {
101                #[cfg(feature = "spanned_tree")]
102                span: span.into(),
103            }),
104            "upkeep" => Some(Step::Upkeep {
105                #[cfg(feature = "spanned_tree")]
106                span: span.into(),
107            }),
108            "draw step" => Some(Step::Draw {
109                #[cfg(feature = "spanned_tree")]
110                span: span.into(),
111            }),
112            "beginning of combat" => Some(Step::BeginningOfCombat {
113                #[cfg(feature = "spanned_tree")]
114                span: span.into(),
115            }),
116            "declaration of attackers" => Some(Step::DeclareAttackers {
117                #[cfg(feature = "spanned_tree")]
118                span: span.into(),
119            }),
120            "declaration of blockers" => Some(Step::DeclareBlockers {
121                #[cfg(feature = "spanned_tree")]
122                span: span.into(),
123            }),
124            "first strike damage step" => Some(Step::FirstStrikeDamage {
125                #[cfg(feature = "spanned_tree")]
126                span: span.into(),
127            }),
128            "damage step" => Some(Step::Damage {
129                #[cfg(feature = "spanned_tree")]
130                span: span.into(),
131            }),
132            "last strike damage step" => Some(Step::LastStrikeDamage {
133                #[cfg(feature = "spanned_tree")]
134                span: span.into(),
135            }),
136            "end of combat" => Some(Step::EndOfCombat {
137                #[cfg(feature = "spanned_tree")]
138                span: span.into(),
139            }),
140            "end step" => Some(Step::End {
141                #[cfg(feature = "spanned_tree")]
142                span: span.into(),
143            }),
144            "cleanup" => Some(Step::Cleanup {
145                #[cfg(feature = "spanned_tree")]
146                span: span.into(),
147            }),
148            _ => None,
149        }
150    }
151}