boseiju/ability_tree/ability/keyword/
keyword_to_abilities.rs

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}