pokeapi_model/
pokemon.rs

1//! Pokémon types.
2
3use 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}