1use pokeapi_macro::pokeapi_struct;
4
5use crate::{
6 APIResource, BerryFlavor, Description, Effect, EvolutionChain, FlavorText, Generation,
7 GenerationGameIndex, Item, Language, LocationArea, Move, MoveBattleStyle, MoveDamageClass,
8 MoveLearnMethod, Name, NamedAPIResource, PalParkArea, Pokedex, VerboseEffect, Version,
9 VersionEncounterDetail, VersionGameIndex, VersionGroup,
10};
11
12#[pokeapi_struct]
13struct Ability {
14 id: i32,
15 name: String,
16 is_main_series: bool,
17 generation: NamedAPIResource<Generation>,
18 names: Vec<Name>,
19 effect_entries: Vec<VerboseEffect>,
20 effect_changes: Vec<AbilityEffectChange>,
21 flavor_text_entries: Vec<AbilityFlavorText>,
22 pokemon: Vec<AbilityPokemon>,
23}
24
25#[pokeapi_struct]
26struct AbilityEffectChange {
27 effect_entries: Vec<Effect>,
28 version_group: NamedAPIResource<VersionGroup>,
29}
30
31#[pokeapi_struct]
32struct AbilityFlavorText {
33 flavor_text: String,
34 language: NamedAPIResource<Language>,
35 version_group: NamedAPIResource<VersionGroup>,
36}
37
38#[pokeapi_struct]
39struct AbilityPokemon {
40 is_hidden: bool,
41 slot: i32,
42 pokemon: NamedAPIResource<Pokemon>,
43}
44
45#[pokeapi_struct]
46struct Characteristic {
47 id: i32,
48 gene_modulo: i32,
49 possible_values: i32,
50}
51
52#[pokeapi_struct]
53struct EggGroup {
54 id: i32,
55 name: String,
56 names: Vec<Name>,
57 pokemon_species: Vec<NamedAPIResource<PokemonSpecies>>,
58}
59
60#[pokeapi_struct]
61struct Gender {
62 id: i32,
63 name: String,
64 pokemon_species_details: Vec<PokemonSpeciesGender>,
65 required_for_evolution: Vec<NamedAPIResource<PokemonSpecies>>,
66}
67
68#[pokeapi_struct]
69struct PokemonSpeciesGender {
70 rate: i32,
71 pokemon_species: NamedAPIResource<PokemonSpecies>,
72}
73
74#[pokeapi_struct]
75struct GrowthRate {
76 id: i32,
77 name: String,
78 formula: String,
79 descriptions: Vec<Description>,
80 levels: Vec<GrowthRateExperienceLevel>,
81 pokemon_species: Vec<NamedAPIResource<PokemonSpecies>>,
82}
83
84#[pokeapi_struct]
85struct GrowthRateExperienceLevel {
86 level: i32,
87 experience: i32,
88}
89
90#[pokeapi_struct]
91struct Nature {
92 id: i32,
93 name: String,
94 decreased_stat: NamedAPIResource<Stat>,
95 increased_stat: NamedAPIResource<Stat>,
96 hates_flavor: NamedAPIResource<BerryFlavor>,
97 likes_flavor: NamedAPIResource<BerryFlavor>,
98 pokeathlon_stat_changes: Vec<NatureStatChange>,
99 move_battle_style_preferences: Vec<MoveBattleStylePreference>,
100 names: Vec<Name>,
101}
102
103#[pokeapi_struct]
104struct NatureStatChange {
105 max_change: i32,
106 pokeathlon_stat: NamedAPIResource<PokeathlonStat>,
107}
108
109#[pokeapi_struct]
110struct MoveBattleStylePreference {
111 low_hp_preference: i32,
112 high_hp_preference: i32,
113 move_battle_style: NamedAPIResource<MoveBattleStyle>,
114}
115
116#[pokeapi_struct]
117struct PokeathlonStat {
118 id: i32,
119 name: String,
120 names: Vec<Name>,
121 affecting_natures: NaturePokeathlonStatAffectSets,
122}
123
124#[pokeapi_struct]
125struct NaturePokeathlonStatAffectSets {
126 increase: Vec<NaturePokeathlonStatAffect>,
127 decrease: Vec<NaturePokeathlonStatAffect>,
128}
129
130#[pokeapi_struct]
131struct NaturePokeathlonStatAffect {
132 max_change: i32,
133 nature: NamedAPIResource<Nature>,
134}
135
136#[pokeapi_struct]
137struct Pokemon {
138 id: i32,
139 name: String,
140 base_experience: i32,
141 height: i32,
142 is_default: bool,
143 order: i32,
144 weight: i32,
145 abilities: Vec<PokemonAbility>,
146 forms: Vec<NamedAPIResource<PokemonForm>>,
147 game_indices: Vec<VersionGameIndex>,
148 held_items: Vec<PokemonHeldItem>,
149 location_area_encounters: String,
150 moves: Vec<PokemonMove>,
151 sprites: PokemonSprites,
152 species: NamedAPIResource<PokemonSpecies>,
153 stats: Vec<PokemonStat>,
154 types: Vec<PokemonType>,
155}
156
157#[pokeapi_struct]
158struct PokemonAbility {
159 is_hidden: bool,
160 slot: i32,
161 ability: NamedAPIResource<Ability>,
162}
163
164#[pokeapi_struct]
165struct PokemonType {
166 slot: i32,
167 #[serde(rename = "type")]
168 type_: NamedAPIResource<Type>,
169}
170
171#[pokeapi_struct]
172struct PokemonHeldItem {
173 item: NamedAPIResource<Item>,
174 version_details: Vec<PokemonHeldItemVersion>,
175}
176
177#[pokeapi_struct]
178struct PokemonHeldItemVersion {
179 version: NamedAPIResource<Version>,
180 rarity: i32,
181}
182
183#[pokeapi_struct]
184struct PokemonMove {
185 #[serde(rename = "move")]
186 move_: NamedAPIResource<Move>,
187 version_group_details: Vec<PokemonMoveVersion>,
188}
189
190#[pokeapi_struct]
191struct PokemonMoveVersion {
192 move_learn_method: NamedAPIResource<MoveLearnMethod>,
193 version_group: NamedAPIResource<VersionGroup>,
194 level_learned_at: i32,
195}
196
197#[pokeapi_struct]
198struct PokemonStat {
199 stat: NamedAPIResource<Stat>,
200 effort: i32,
201 base_stat: i32,
202}
203
204#[pokeapi_struct]
205struct PokemonSprites {
206 front_default: String,
207 front_shiny: String,
208 front_female: String,
209 front_shiny_female: String,
210 back_default: String,
211 back_shiny: String,
212 back_female: String,
213 back_shiny_female: String,
214}
215
216#[pokeapi_struct]
217struct LocationAreaEncounter {
218 location_area: NamedAPIResource<LocationArea>,
219 version_details: Vec<VersionEncounterDetail>,
220}
221
222#[pokeapi_struct]
223struct PokemonColor {
224 id: i32,
225 name: String,
226 names: Vec<Name>,
227 pokemon_species: Vec<NamedAPIResource<PokemonSpecies>>,
228}
229
230#[pokeapi_struct]
231struct PokemonForm {
232 id: i32,
233 name: String,
234 order: i32,
235 form_order: i32,
236 is_default: bool,
237 is_battle_only: bool,
238 is_mega: bool,
239 form_name: String,
240 pokemon: NamedAPIResource<Pokemon>,
241 sprites: PokemonFormSprites,
242 version_group: NamedAPIResource<VersionGroup>,
243 names: Vec<Name>,
244 form_names: Vec<Name>,
245}
246
247#[pokeapi_struct]
248struct PokemonFormSprites {
249 front_default: String,
250 front_shiny: String,
251 back_default: String,
252 back_shiny: String,
253}
254
255#[pokeapi_struct]
256struct PokemonHabitat {
257 id: i32,
258 name: String,
259 names: Vec<Name>,
260 pokemon_species: Vec<NamedAPIResource<PokemonSpecies>>,
261}
262
263#[pokeapi_struct]
264struct PokemonShape {
265 id: i32,
266 name: String,
267 awesome_names: Vec<AwesomeName>,
268 names: Vec<Name>,
269 pokemon_species: Vec<NamedAPIResource<PokemonSpecies>>,
270}
271
272#[pokeapi_struct]
273struct AwesomeName {
274 awesome_name: String,
275 language: NamedAPIResource<Language>,
276}
277
278#[pokeapi_struct]
279struct PokemonSpecies {
280 id: i32,
281 name: String,
282 order: i32,
283 gender_rate: i32,
284 capture_rate: i32,
285 base_happiness: i32,
286 is_baby: bool,
287 is_legendary: bool,
288 is_mythical: bool,
289 hatch_counter: i32,
290 has_gender_differences: bool,
291 forms_switchable: bool,
292 growth_rate: NamedAPIResource<GrowthRate>,
293 pokedex_numbers: Vec<PokemonSpeciesDexEntry>,
294 egg_groups: NamedAPIResource<EggGroup>,
295 color: NamedAPIResource<PokemonColor>,
296 shape: NamedAPIResource<PokemonShape>,
297 evolves_from_species: NamedAPIResource<EvolutionChain>,
298 evolution_chain: APIResource<EvolutionChain>,
299 habitat: NamedAPIResource<PokemonHabitat>,
300 generation: NamedAPIResource<Generation>,
301 names: Vec<Name>,
302 pal_park_encounters: Vec<PalParkEncounterArea>,
303 flavor_text_entries: Vec<FlavorText>,
304 form_descriptions: Vec<Description>,
305 genera: Vec<Genus>,
306 varieties: Vec<PokemonSpeciesVariety>,
307}
308
309#[pokeapi_struct]
310struct Genus {
311 genus: String,
312 language: NamedAPIResource<Language>,
313}
314
315#[pokeapi_struct]
316struct PokemonSpeciesDexEntry {
317 entry_number: i32,
318 pokedex: NamedAPIResource<Pokedex>,
319}
320
321#[pokeapi_struct]
322struct PalParkEncounterArea {
323 base_score: i32,
324 rate: i32,
325 area: NamedAPIResource<PalParkArea>,
326}
327
328#[pokeapi_struct]
329struct PokemonSpeciesVariety {
330 is_default: bool,
331 pokemon: NamedAPIResource<Pokemon>,
332}
333
334#[pokeapi_struct]
335struct Stat {
336 id: i32,
337 name: String,
338 game_index: i32,
339 is_battle_only: bool,
340 affecting_moves: MoveStatAffectSets,
341 affecting_natures: NatureStatAffectSets,
342 characteristics: Vec<APIResource<Characteristic>>,
343 move_damage_class: NamedAPIResource<MoveDamageClass>,
344 names: Vec<Name>,
345}
346
347#[pokeapi_struct]
348struct MoveStatAffectSets {
349 increase: Vec<MoveStatAffect>,
350 decrease: Vec<MoveStatAffect>,
351}
352
353#[pokeapi_struct]
354struct MoveStatAffect {
355 change: i32,
356 #[serde(rename = "move")]
357 move_: NamedAPIResource<Move>,
358}
359
360#[pokeapi_struct]
361struct NatureStatAffectSets {
362 increase: Vec<NamedAPIResource<Nature>>,
363 decrease: Vec<NamedAPIResource<Nature>>,
364}
365
366#[pokeapi_struct]
367struct Type {
368 id: i32,
369 name: String,
370 damage_relations: TypeRelations,
371 game_indices: Vec<GenerationGameIndex>,
372 generation: NamedAPIResource<Generation>,
373 move_damage_class: NamedAPIResource<MoveDamageClass>,
374 names: Vec<Name>,
375 pokemon: Vec<TypePokemon>,
376 moves: Vec<NamedAPIResource<Move>>,
377}
378
379#[pokeapi_struct]
380struct TypePokemon {
381 slot: i32,
382 pokemon: NamedAPIResource<Pokemon>,
383}
384
385#[pokeapi_struct]
386struct TypeRelations {
387 no_damage_to: Vec<NamedAPIResource<Type>>,
388 half_damage_to: Vec<NamedAPIResource<Type>>,
389 double_damage_to: Vec<NamedAPIResource<Type>>,
390 no_damage_from: Vec<NamedAPIResource<Type>>,
391 half_damage_from: Vec<NamedAPIResource<Type>>,
392 double_damage_from: Vec<NamedAPIResource<Type>>,
393}