boseiju/ability_tree/terminals/
step.rs1use 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}