1use crate::ability_tree::ability::Ability;
2use crate::ability_tree::ability::KeywordAbility;
3use crate::ability_tree::ability::keyword::ExpandedKeywordAbility;
4use crate::ability_tree::ability::keyword::StandaloneKeywordAbility;
5use crate::ability_tree::ability::spell::SpellAbility;
6use crate::ability_tree::terminals;
7use crate::lexer::tokens::intermediates;
8
9pub fn keyword_to_abilities(keyword: intermediates::KeywordAbility) -> Result<KeywordAbility, &'static str> {
10 let keyword_ability = match keyword.keyword_ability {
11 mtg_data::KeywordAbility::Absorb => terminals::StandaloneKeywordAbility::Absorb,
12 mtg_data::KeywordAbility::Affinity => terminals::StandaloneKeywordAbility::Affinity,
13 mtg_data::KeywordAbility::Afflict => terminals::StandaloneKeywordAbility::Afflict,
14 mtg_data::KeywordAbility::Afterlife => terminals::StandaloneKeywordAbility::Afterlife,
15 mtg_data::KeywordAbility::Aftermath => terminals::StandaloneKeywordAbility::Aftermath,
16 mtg_data::KeywordAbility::Amplify => terminals::StandaloneKeywordAbility::Amplify,
17 mtg_data::KeywordAbility::Annihilator => terminals::StandaloneKeywordAbility::Annihilator,
18 mtg_data::KeywordAbility::Ascend => terminals::StandaloneKeywordAbility::Ascend,
19 mtg_data::KeywordAbility::Assist => terminals::StandaloneKeywordAbility::Assist,
20 mtg_data::KeywordAbility::Augment => terminals::StandaloneKeywordAbility::Augment,
21 mtg_data::KeywordAbility::AuraSwap => terminals::StandaloneKeywordAbility::AuraSwap,
22 mtg_data::KeywordAbility::Awaken => terminals::StandaloneKeywordAbility::Awaken,
23 mtg_data::KeywordAbility::Backup => terminals::StandaloneKeywordAbility::Backup,
24 mtg_data::KeywordAbility::Banding => terminals::StandaloneKeywordAbility::Banding,
25 mtg_data::KeywordAbility::Bargain => terminals::StandaloneKeywordAbility::Bargain,
26 mtg_data::KeywordAbility::BasicLandcycling => terminals::StandaloneKeywordAbility::BasicLandcycling,
27 mtg_data::KeywordAbility::BattleCry => terminals::StandaloneKeywordAbility::BattleCry,
28 mtg_data::KeywordAbility::Bestow => terminals::StandaloneKeywordAbility::Bestow,
29 mtg_data::KeywordAbility::Blitz => terminals::StandaloneKeywordAbility::Blitz,
30 mtg_data::KeywordAbility::Bloodthirst => terminals::StandaloneKeywordAbility::Bloodthirst,
31 mtg_data::KeywordAbility::Boast => terminals::StandaloneKeywordAbility::Boast,
32 mtg_data::KeywordAbility::Bushido => terminals::StandaloneKeywordAbility::Bushido,
33 mtg_data::KeywordAbility::Buyback => terminals::StandaloneKeywordAbility::Buyback,
34 mtg_data::KeywordAbility::Cascade => terminals::StandaloneKeywordAbility::Cascade,
35 mtg_data::KeywordAbility::Casualty => terminals::StandaloneKeywordAbility::Casualty,
36 mtg_data::KeywordAbility::Champion => terminals::StandaloneKeywordAbility::Champion,
37 mtg_data::KeywordAbility::Changeling => terminals::StandaloneKeywordAbility::Changeling,
38 mtg_data::KeywordAbility::ChooseABackground => terminals::StandaloneKeywordAbility::ChooseABackground,
39 mtg_data::KeywordAbility::Cipher => terminals::StandaloneKeywordAbility::Cipher,
40 mtg_data::KeywordAbility::Cleave => terminals::StandaloneKeywordAbility::Cleave,
41 mtg_data::KeywordAbility::CommanderNinjutsu => terminals::StandaloneKeywordAbility::CommanderNinjutsu,
42 mtg_data::KeywordAbility::Companion => terminals::StandaloneKeywordAbility::Companion,
43 mtg_data::KeywordAbility::Compleated => terminals::StandaloneKeywordAbility::Compleated,
44 mtg_data::KeywordAbility::Conspire => terminals::StandaloneKeywordAbility::Conspire,
45 mtg_data::KeywordAbility::Convoke => terminals::StandaloneKeywordAbility::Convoke,
46 mtg_data::KeywordAbility::Craft => terminals::StandaloneKeywordAbility::Craft,
47 mtg_data::KeywordAbility::Crew => terminals::StandaloneKeywordAbility::Crew,
48 mtg_data::KeywordAbility::CumulativeUpkeep => terminals::StandaloneKeywordAbility::CumulativeUpkeep,
49 mtg_data::KeywordAbility::Cycling => terminals::StandaloneKeywordAbility::Cycling,
50 mtg_data::KeywordAbility::Dash => terminals::StandaloneKeywordAbility::Dash,
51 mtg_data::KeywordAbility::Daybound => terminals::StandaloneKeywordAbility::Daybound,
52 mtg_data::KeywordAbility::Deathtouch => terminals::StandaloneKeywordAbility::Deathtouch,
53 mtg_data::KeywordAbility::Decayed => terminals::StandaloneKeywordAbility::Decayed,
54 mtg_data::KeywordAbility::Defender => terminals::StandaloneKeywordAbility::Defender,
55 mtg_data::KeywordAbility::Delve => terminals::StandaloneKeywordAbility::Delve,
56 mtg_data::KeywordAbility::Demonstrate => terminals::StandaloneKeywordAbility::Demonstrate,
57 mtg_data::KeywordAbility::Desertwalk => terminals::StandaloneKeywordAbility::Desertwalk,
58 mtg_data::KeywordAbility::Dethrone => terminals::StandaloneKeywordAbility::Dethrone,
59 mtg_data::KeywordAbility::Devoid => terminals::StandaloneKeywordAbility::Devoid,
60 mtg_data::KeywordAbility::Devour => terminals::StandaloneKeywordAbility::Devour,
61 mtg_data::KeywordAbility::Disguise => terminals::StandaloneKeywordAbility::Disguise,
62 mtg_data::KeywordAbility::Disturb => terminals::StandaloneKeywordAbility::Disturb,
63 mtg_data::KeywordAbility::DoctorsCompanion => terminals::StandaloneKeywordAbility::DoctorsCompanion,
64 mtg_data::KeywordAbility::DoubleAgenda => terminals::StandaloneKeywordAbility::DoubleAgenda,
65 mtg_data::KeywordAbility::DoubleStrike => terminals::StandaloneKeywordAbility::DoubleStrike,
66 mtg_data::KeywordAbility::DoubleTeam => terminals::StandaloneKeywordAbility::DoubleTeam,
67 mtg_data::KeywordAbility::Dredge => terminals::StandaloneKeywordAbility::Dredge,
68 mtg_data::KeywordAbility::Echo => terminals::StandaloneKeywordAbility::Echo,
69 mtg_data::KeywordAbility::Embalm => terminals::StandaloneKeywordAbility::Embalm,
70 mtg_data::KeywordAbility::Emerge => terminals::StandaloneKeywordAbility::Emerge,
71 mtg_data::KeywordAbility::Encore => terminals::StandaloneKeywordAbility::Encore,
72 mtg_data::KeywordAbility::Enlist => terminals::StandaloneKeywordAbility::Enlist,
73 mtg_data::KeywordAbility::Entwine => terminals::StandaloneKeywordAbility::Entwine,
74 mtg_data::KeywordAbility::Epic => terminals::StandaloneKeywordAbility::Epic,
75 mtg_data::KeywordAbility::Equip => terminals::StandaloneKeywordAbility::Equip,
76 mtg_data::KeywordAbility::Escalate => terminals::StandaloneKeywordAbility::Escalate,
77 mtg_data::KeywordAbility::Escape => terminals::StandaloneKeywordAbility::Escape,
78 mtg_data::KeywordAbility::Eternalize => terminals::StandaloneKeywordAbility::Eternalize,
79 mtg_data::KeywordAbility::Evoke => terminals::StandaloneKeywordAbility::Evoke,
80 mtg_data::KeywordAbility::Evolve => terminals::StandaloneKeywordAbility::Evolve,
81 mtg_data::KeywordAbility::Exalted => terminals::StandaloneKeywordAbility::Exalted,
82 mtg_data::KeywordAbility::Exhaust => terminals::StandaloneKeywordAbility::Exhaust,
83 mtg_data::KeywordAbility::Exploit => terminals::StandaloneKeywordAbility::Exploit,
84 mtg_data::KeywordAbility::Extort => terminals::StandaloneKeywordAbility::Extort,
85 mtg_data::KeywordAbility::Fabricate => terminals::StandaloneKeywordAbility::Fabricate,
86 mtg_data::KeywordAbility::Fading => terminals::StandaloneKeywordAbility::Fading,
87 mtg_data::KeywordAbility::Fear => terminals::StandaloneKeywordAbility::Fear,
88 mtg_data::KeywordAbility::FirstStrike => terminals::StandaloneKeywordAbility::FirstStrike,
89 mtg_data::KeywordAbility::Flanking => terminals::StandaloneKeywordAbility::Flanking,
90 mtg_data::KeywordAbility::Flash => terminals::StandaloneKeywordAbility::Flash,
91 mtg_data::KeywordAbility::Flashback => terminals::StandaloneKeywordAbility::Flashback,
92 mtg_data::KeywordAbility::Flying => terminals::StandaloneKeywordAbility::Flying,
93 mtg_data::KeywordAbility::ForMirrodin => terminals::StandaloneKeywordAbility::ForMirrodin,
94 mtg_data::KeywordAbility::Forecast => terminals::StandaloneKeywordAbility::Forecast,
95 mtg_data::KeywordAbility::Forestcycling => terminals::StandaloneKeywordAbility::Forestcycling,
96 mtg_data::KeywordAbility::Forestwalk => terminals::StandaloneKeywordAbility::Forestwalk,
97 mtg_data::KeywordAbility::Foretell => terminals::StandaloneKeywordAbility::Foretell,
98 mtg_data::KeywordAbility::Fortify => terminals::StandaloneKeywordAbility::Fortify,
99 mtg_data::KeywordAbility::Freerunning => terminals::StandaloneKeywordAbility::Freerunning,
100 mtg_data::KeywordAbility::Frenzy => terminals::StandaloneKeywordAbility::Frenzy,
101 mtg_data::KeywordAbility::FriendsForever => terminals::StandaloneKeywordAbility::FriendsForever,
102 mtg_data::KeywordAbility::Fuse => terminals::StandaloneKeywordAbility::Fuse,
103 mtg_data::KeywordAbility::Gift => terminals::StandaloneKeywordAbility::Gift,
104 mtg_data::KeywordAbility::Graft => terminals::StandaloneKeywordAbility::Graft,
105 mtg_data::KeywordAbility::Gravestorm => terminals::StandaloneKeywordAbility::Gravestorm,
106 mtg_data::KeywordAbility::Harmonize => terminals::StandaloneKeywordAbility::Harmonize,
107 mtg_data::KeywordAbility::Haste => terminals::StandaloneKeywordAbility::Haste,
108 mtg_data::KeywordAbility::Haunt => terminals::StandaloneKeywordAbility::Haunt,
109 mtg_data::KeywordAbility::Hexproof => terminals::StandaloneKeywordAbility::Hexproof,
110 mtg_data::KeywordAbility::HexproofFrom => terminals::StandaloneKeywordAbility::HexproofFrom,
111 mtg_data::KeywordAbility::HiddenAgenda => terminals::StandaloneKeywordAbility::HiddenAgenda,
112 mtg_data::KeywordAbility::Hideaway => terminals::StandaloneKeywordAbility::Hideaway,
113 mtg_data::KeywordAbility::Horsemanship => terminals::StandaloneKeywordAbility::Horsemanship,
114 mtg_data::KeywordAbility::Impending => terminals::StandaloneKeywordAbility::Impending,
115 mtg_data::KeywordAbility::Improvise => terminals::StandaloneKeywordAbility::Improvise,
116 mtg_data::KeywordAbility::Indestructible => terminals::StandaloneKeywordAbility::Indestructible,
117 mtg_data::KeywordAbility::Infect => terminals::StandaloneKeywordAbility::Infect,
118 mtg_data::KeywordAbility::Ingest => terminals::StandaloneKeywordAbility::Ingest,
119 mtg_data::KeywordAbility::Intensity => terminals::StandaloneKeywordAbility::Intensity,
120 mtg_data::KeywordAbility::Intimidate => terminals::StandaloneKeywordAbility::Intimidate,
121 mtg_data::KeywordAbility::Islandcycling => terminals::StandaloneKeywordAbility::Islandcycling,
122 mtg_data::KeywordAbility::Islandwalk => terminals::StandaloneKeywordAbility::Islandwalk,
123 mtg_data::KeywordAbility::JobSelect => terminals::StandaloneKeywordAbility::JobSelect,
124 mtg_data::KeywordAbility::JumpStart => terminals::StandaloneKeywordAbility::JumpStart,
125 mtg_data::KeywordAbility::Kicker => terminals::StandaloneKeywordAbility::Kicker,
126 mtg_data::KeywordAbility::Landcycling => terminals::StandaloneKeywordAbility::Landcycling,
127 mtg_data::KeywordAbility::Landwalk => terminals::StandaloneKeywordAbility::Landwalk,
128 mtg_data::KeywordAbility::LegendaryLandwalk => terminals::StandaloneKeywordAbility::LegendaryLandwalk,
129 mtg_data::KeywordAbility::LevelUp => terminals::StandaloneKeywordAbility::LevelUp,
130 mtg_data::KeywordAbility::Lifelink => terminals::StandaloneKeywordAbility::Lifelink,
131 mtg_data::KeywordAbility::LivingMetal => terminals::StandaloneKeywordAbility::LivingMetal,
132 mtg_data::KeywordAbility::LivingWeapon => terminals::StandaloneKeywordAbility::LivingWeapon,
133 mtg_data::KeywordAbility::Madness => terminals::StandaloneKeywordAbility::Madness,
134 mtg_data::KeywordAbility::MaxSpeed => terminals::StandaloneKeywordAbility::MaxSpeed,
135 mtg_data::KeywordAbility::Mayhem => terminals::StandaloneKeywordAbility::Mayhem,
136 mtg_data::KeywordAbility::Megamorph => terminals::StandaloneKeywordAbility::Megamorph,
137 mtg_data::KeywordAbility::Melee => terminals::StandaloneKeywordAbility::Melee,
138 mtg_data::KeywordAbility::Menace => terminals::StandaloneKeywordAbility::Menace,
139 mtg_data::KeywordAbility::Mentor => terminals::StandaloneKeywordAbility::Mentor,
140 mtg_data::KeywordAbility::Miracle => terminals::StandaloneKeywordAbility::Miracle,
141 mtg_data::KeywordAbility::Mobilize => terminals::StandaloneKeywordAbility::Mobilize,
142 mtg_data::KeywordAbility::Modular => terminals::StandaloneKeywordAbility::Modular,
143 mtg_data::KeywordAbility::MoreThanMeetsTheEye => terminals::StandaloneKeywordAbility::MoreThanMeetsTheEye,
144 mtg_data::KeywordAbility::Morph => terminals::StandaloneKeywordAbility::Morph,
145 mtg_data::KeywordAbility::Mountaincycling => terminals::StandaloneKeywordAbility::Mountaincycling,
146 mtg_data::KeywordAbility::Mountainwalk => terminals::StandaloneKeywordAbility::Mountainwalk,
147 mtg_data::KeywordAbility::Multikicker => terminals::StandaloneKeywordAbility::Multikicker,
148 mtg_data::KeywordAbility::Mutate => terminals::StandaloneKeywordAbility::Mutate,
149 mtg_data::KeywordAbility::Myriad => terminals::StandaloneKeywordAbility::Myriad,
150 mtg_data::KeywordAbility::Nightbound => terminals::StandaloneKeywordAbility::Nightbound,
151 mtg_data::KeywordAbility::Ninjutsu => terminals::StandaloneKeywordAbility::Ninjutsu,
152 mtg_data::KeywordAbility::NonbasicLandwalk => terminals::StandaloneKeywordAbility::NonbasicLandwalk,
153 mtg_data::KeywordAbility::Offering => terminals::StandaloneKeywordAbility::Offering,
154 mtg_data::KeywordAbility::Offspring => terminals::StandaloneKeywordAbility::Offspring,
155 mtg_data::KeywordAbility::Outlast => terminals::StandaloneKeywordAbility::Outlast,
156 mtg_data::KeywordAbility::Overload => terminals::StandaloneKeywordAbility::Overload,
157 mtg_data::KeywordAbility::Partner => terminals::StandaloneKeywordAbility::Partner,
158 mtg_data::KeywordAbility::PartnerWith => terminals::StandaloneKeywordAbility::PartnerWith,
159 mtg_data::KeywordAbility::Persist => terminals::StandaloneKeywordAbility::Persist,
160 mtg_data::KeywordAbility::Phasing => terminals::StandaloneKeywordAbility::Phasing,
161 mtg_data::KeywordAbility::Plainscycling => terminals::StandaloneKeywordAbility::Plainscycling,
162 mtg_data::KeywordAbility::Plainswalk => terminals::StandaloneKeywordAbility::Plainswalk,
163 mtg_data::KeywordAbility::Poisonous => terminals::StandaloneKeywordAbility::Poisonous,
164 mtg_data::KeywordAbility::Protection => terminals::StandaloneKeywordAbility::Protection,
165 mtg_data::KeywordAbility::Prototype => terminals::StandaloneKeywordAbility::Prototype,
166 mtg_data::KeywordAbility::Provoke => terminals::StandaloneKeywordAbility::Provoke,
167 mtg_data::KeywordAbility::Prowess => terminals::StandaloneKeywordAbility::Prowess,
168 mtg_data::KeywordAbility::Prowl => terminals::StandaloneKeywordAbility::Prowl,
169 mtg_data::KeywordAbility::Rampage => terminals::StandaloneKeywordAbility::Rampage,
170 mtg_data::KeywordAbility::Ravenous => terminals::StandaloneKeywordAbility::Ravenous,
171 mtg_data::KeywordAbility::Reach => terminals::StandaloneKeywordAbility::Reach,
172 mtg_data::KeywordAbility::ReadAhead => terminals::StandaloneKeywordAbility::ReadAhead,
173 mtg_data::KeywordAbility::Rebound => terminals::StandaloneKeywordAbility::Rebound,
174 mtg_data::KeywordAbility::Reconfigure => terminals::StandaloneKeywordAbility::Reconfigure,
175 mtg_data::KeywordAbility::Recover => terminals::StandaloneKeywordAbility::Recover,
176 mtg_data::KeywordAbility::Reinforce => terminals::StandaloneKeywordAbility::Reinforce,
177 mtg_data::KeywordAbility::Renown => terminals::StandaloneKeywordAbility::Renown,
178 mtg_data::KeywordAbility::Replicate => terminals::StandaloneKeywordAbility::Replicate,
179 mtg_data::KeywordAbility::Retrace => terminals::StandaloneKeywordAbility::Retrace,
180 mtg_data::KeywordAbility::Riot => terminals::StandaloneKeywordAbility::Riot,
181 mtg_data::KeywordAbility::Ripple => terminals::StandaloneKeywordAbility::Ripple,
182 mtg_data::KeywordAbility::Saddle => terminals::StandaloneKeywordAbility::Saddle,
183 mtg_data::KeywordAbility::Scavenge => terminals::StandaloneKeywordAbility::Scavenge,
184 mtg_data::KeywordAbility::Shadow => terminals::StandaloneKeywordAbility::Shadow,
185 mtg_data::KeywordAbility::Shroud => terminals::StandaloneKeywordAbility::Shroud,
186 mtg_data::KeywordAbility::Skulk => terminals::StandaloneKeywordAbility::Skulk,
187 mtg_data::KeywordAbility::Slivercycling => terminals::StandaloneKeywordAbility::Slivercycling,
188 mtg_data::KeywordAbility::Soulbond => terminals::StandaloneKeywordAbility::Soulbond,
189 mtg_data::KeywordAbility::Soulshift => terminals::StandaloneKeywordAbility::Soulshift,
190 mtg_data::KeywordAbility::Specialize => terminals::StandaloneKeywordAbility::Specialize,
191 mtg_data::KeywordAbility::Spectacle => terminals::StandaloneKeywordAbility::Spectacle,
192 mtg_data::KeywordAbility::Splice => terminals::StandaloneKeywordAbility::Splice,
193 mtg_data::KeywordAbility::SplitSecond => terminals::StandaloneKeywordAbility::SplitSecond,
194 mtg_data::KeywordAbility::Spree => terminals::StandaloneKeywordAbility::Spree,
195 mtg_data::KeywordAbility::Squad => terminals::StandaloneKeywordAbility::Squad,
196 mtg_data::KeywordAbility::Station => terminals::StandaloneKeywordAbility::Station,
197 mtg_data::KeywordAbility::Storm => terminals::StandaloneKeywordAbility::Storm,
198 mtg_data::KeywordAbility::Sunburst => terminals::StandaloneKeywordAbility::Sunburst,
199 mtg_data::KeywordAbility::Surge => terminals::StandaloneKeywordAbility::Surge,
200 mtg_data::KeywordAbility::Suspend => terminals::StandaloneKeywordAbility::Suspend,
201 mtg_data::KeywordAbility::Swampcycling => terminals::StandaloneKeywordAbility::Swampcycling,
202 mtg_data::KeywordAbility::Swampwalk => terminals::StandaloneKeywordAbility::Swampwalk,
203 mtg_data::KeywordAbility::Toxic => terminals::StandaloneKeywordAbility::Toxic,
204 mtg_data::KeywordAbility::Training => terminals::StandaloneKeywordAbility::Training,
205 mtg_data::KeywordAbility::Trample => terminals::StandaloneKeywordAbility::Trample,
206 mtg_data::KeywordAbility::Transfigure => terminals::StandaloneKeywordAbility::Transfigure,
207 mtg_data::KeywordAbility::Transmute => terminals::StandaloneKeywordAbility::Transmute,
208 mtg_data::KeywordAbility::Tribute => terminals::StandaloneKeywordAbility::Tribute,
209 mtg_data::KeywordAbility::Typecycling => terminals::StandaloneKeywordAbility::Typecycling,
210 mtg_data::KeywordAbility::UmbraArmor => terminals::StandaloneKeywordAbility::UmbraArmor,
211 mtg_data::KeywordAbility::Undaunted => terminals::StandaloneKeywordAbility::Undaunted,
212 mtg_data::KeywordAbility::Undying => terminals::StandaloneKeywordAbility::Undying,
213 mtg_data::KeywordAbility::Unearth => terminals::StandaloneKeywordAbility::Unearth,
214 mtg_data::KeywordAbility::Unleash => terminals::StandaloneKeywordAbility::Unleash,
215 mtg_data::KeywordAbility::Vanishing => terminals::StandaloneKeywordAbility::Vanishing,
216 mtg_data::KeywordAbility::Vigilance => terminals::StandaloneKeywordAbility::Vigilance,
217 mtg_data::KeywordAbility::Warp => terminals::StandaloneKeywordAbility::Warp,
218 mtg_data::KeywordAbility::WebSlinging => terminals::StandaloneKeywordAbility::WebSlinging,
219 mtg_data::KeywordAbility::Wither => terminals::StandaloneKeywordAbility::Wither,
220 mtg_data::KeywordAbility::Wizardcycling => terminals::StandaloneKeywordAbility::Wizardcycling,
221 _ => return Err("provided keyword is not a valid keyword ability on its own"),
222 };
223 Ok(KeywordAbility {
224 keyword: ExpandedKeywordAbility::Standalone(StandaloneKeywordAbility {
225 keyword_ability,
226 #[cfg(feature = "spanned_tree")]
227 span: keyword.span,
228 }),
229 ability: Ability::Spell(SpellAbility {
230 effects: crate::utils::HeapArrayVec::new(),
231 #[cfg(feature = "spanned_tree")]
232 span: keyword.span,
233 }),
234 #[cfg(feature = "spanned_tree")]
235 span: keyword.span,
236 })
237}