poke_data/models/pokemon/
ability.rs1use crate::data::link_context::LinkContext;
2use crate::data::linkable::Linkable;
3use crate::models::ability::{Ability, AbilityId};
4use crate::models::generation::GenerationId;
5use serde::{Deserialize, Serialize};
6use std::collections::HashMap;
7use std::sync::Arc;
8
9#[derive(Debug, Clone)]
10pub struct PokemonAbility {
11 pub ability: Arc<Ability>,
12 pub is_hidden: bool,
13 pub slot: u8,
14}
15
16#[derive(Debug, Clone, Serialize, Deserialize)]
17pub struct UnlinkedPokemonAbility {
18 pub ability_id: AbilityId,
19 pub is_hidden: bool,
20 pub slot: u8,
21}
22
23impl Linkable for UnlinkedPokemonAbility {
24 type Linked = PokemonAbility;
25
26 fn link(&self, context: &LinkContext) -> Self::Linked {
27 PokemonAbility {
28 ability: context.abilities.get(&self.ability_id).unwrap().clone(),
29 is_hidden: self.is_hidden,
30 slot: self.slot,
31 }
32 }
33}
34
35#[derive(Debug, Clone)]
36pub struct PokemonAbilityPast {
37 pub ability: Option<Arc<Ability>>,
38 pub is_hidden: bool,
39 pub slot: u8,
40}
41
42impl PokemonAbilityPast {
43 pub fn to_ability(&self) -> Option<PokemonAbility> {
44 self.ability.clone().map(|ability| PokemonAbility {
45 ability,
46 is_hidden: self.is_hidden,
47 slot: self.slot,
48 })
49 }
50}
51
52#[derive(Debug, Clone, Serialize, Deserialize)]
53pub struct UnlinkedPokemonAbilityPast {
54 pub ability_id: Option<AbilityId>,
55 pub is_hidden: bool,
56 pub slot: u8,
57}
58
59impl Linkable for UnlinkedPokemonAbilityPast {
60 type Linked = PokemonAbilityPast;
61
62 fn link(&self, context: &LinkContext) -> Self::Linked {
63 PokemonAbilityPast {
64 ability: self
65 .ability_id
66 .map(|ability_id| context.abilities.get(&ability_id).unwrap().clone()),
67 is_hidden: self.is_hidden,
68 slot: self.slot,
69 }
70 }
71}
72
73#[derive(Debug)]
74pub struct PokemonAbilitiesPast(HashMap<GenerationId, Vec<PokemonAbilityPast>>);
75
76impl PokemonAbilitiesPast {
77 pub fn is_empty(&self) -> bool {
78 self.0.is_empty()
79 }
80
81 pub fn get_abilities(&self, generation_id: &GenerationId) -> Option<&Vec<PokemonAbilityPast>> {
82 self.0.get(generation_id)
83 }
84
85 pub fn get_map(&self) -> &HashMap<GenerationId, Vec<PokemonAbilityPast>> {
86 &self.0
87 }
88}
89
90#[derive(Debug, Clone, Serialize, Deserialize)]
91pub struct UnlinkedPokemonAbilitiesPast(HashMap<GenerationId, Vec<UnlinkedPokemonAbilityPast>>);
92
93impl UnlinkedPokemonAbilitiesPast {
94 pub fn new(abilities: HashMap<GenerationId, Vec<UnlinkedPokemonAbilityPast>>) -> Self {
95 Self(abilities)
96 }
97}
98
99impl Linkable for UnlinkedPokemonAbilitiesPast {
100 type Linked = PokemonAbilitiesPast;
101
102 fn link(&self, context: &LinkContext) -> Self::Linked {
103 let abilities = self
104 .0
105 .iter()
106 .map(|(generation_id, abilities)| {
107 (
108 *generation_id,
109 abilities
110 .iter()
111 .map(|ability| ability.link(context))
112 .collect(),
113 )
114 })
115 .collect();
116 PokemonAbilitiesPast(abilities)
117 }
118}