poke_data/models/
ability.rs1use 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}