poke_data/models/pokemon/
ability.rs

1use 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}