poke_data/models/
ability.rs

1use crate::data::link_context::LinkContext;
2use crate::data::linkable::Linkable;
3use crate::models::flavor_texts::FlavorTexts;
4use crate::models::generation::{Generation, GenerationId};
5use crate::models::language::LanguageId;
6use crate::models::localized_effects::LocalizedEffects;
7use crate::models::localized_names::LocalizedStrings;
8use crate::models::version_group::VersionGroupId;
9use crate::traits::has_identifier::HasIdentifier;
10use crate::traits::has_localized_names::HasLocalizedNames;
11use serde::{Deserialize, Serialize};
12use std::collections::HashMap;
13use std::sync::Arc;
14
15pub type AbilityId = u16;
16
17#[derive(Debug)]
18pub struct Ability {
19    pub id: AbilityId,
20    pub identifier: String,
21    pub names: LocalizedStrings,
22    pub flavor_texts: FlavorTexts,
23    pub effects: LocalizedEffects,
24    pub changelog: AbilityChangelog,
25    pub generation: Arc<Generation>,
26    pub is_main_series: bool,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize)]
30pub struct AbilityChangelog(HashMap<VersionGroupId, Vec<AbilityChangelogEntry>>);
31
32impl AbilityChangelog {
33    pub fn new(changelogs: HashMap<VersionGroupId, Vec<AbilityChangelogEntry>>) -> Self {
34        Self(changelogs)
35    }
36}
37
38#[derive(Debug, Clone, Serialize, Deserialize)]
39pub struct AbilityChangelogEntry {
40    pub language: LanguageId,
41    pub effect: String,
42}
43
44#[derive(Debug, Clone, Serialize, Deserialize)]
45pub struct UnlinkedAbility {
46    pub id: AbilityId,
47    pub identifier: String,
48    pub names: LocalizedStrings,
49    pub flavor_texts: FlavorTexts,
50    pub effects: LocalizedEffects,
51    pub changelog: AbilityChangelog,
52    pub generation_id: GenerationId,
53    pub is_main_series: bool,
54}
55
56impl Linkable for UnlinkedAbility {
57    type Linked = Arc<Ability>;
58
59    fn link(&self, context: &LinkContext) -> Self::Linked {
60        let generation = context
61            .generations
62            .get(&self.generation_id)
63            .unwrap_or_else(|| {
64                panic!(
65                    "No generation '{}' found for ability '{}'",
66                    self.generation_id, self.id
67                )
68            })
69            .clone();
70
71        let ability = Ability {
72            id: self.id,
73            identifier: self.identifier.clone(),
74            names: self.names.clone(),
75            flavor_texts: self.flavor_texts.clone(),
76            effects: self.effects.clone(),
77            changelog: self.changelog.clone(),
78            generation,
79            is_main_series: self.is_main_series,
80        };
81
82        Arc::new(ability)
83    }
84}
85
86impl HasIdentifier for Ability {
87    fn identifier(&self) -> &str {
88        &self.identifier
89    }
90}
91
92impl HasLocalizedNames for Ability {
93    fn localized_names(&self) -> &LocalizedStrings {
94        &self.names
95    }
96}