poke_data/models/pokemon/
moveset.rs

1use crate::data::link_context::LinkContext;
2use crate::data::linkable::Linkable;
3use crate::models::pokemon_move::{PokemonMove, PokemonMoveId};
4use crate::models::pokemon_move_method::{PokemonMoveMethod, PokemonMoveMethodId};
5use crate::models::version_group::VersionGroupId;
6use serde::{Deserialize, Serialize};
7use std::collections::HashMap;
8use std::sync::Arc;
9
10#[derive(Debug)]
11pub struct Moveset(HashMap<VersionGroupId, Vec<MovesetEntry>>);
12
13impl Moveset {
14    pub fn get_moves(&self, version_group_id: VersionGroupId) -> Option<&Vec<MovesetEntry>> {
15        self.0.get(&version_group_id)
16    }
17}
18
19#[derive(Debug)]
20pub struct MovesetEntry {
21    pub pokemon_move: Arc<PokemonMove>,
22    pub move_method: Arc<PokemonMoveMethod>,
23    pub level: u8,
24    pub order: Option<u8>,
25    pub mastery: Option<u8>,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
29pub struct UnlinkedMoveset(HashMap<VersionGroupId, Vec<UnlinkedMovesetEntry>>);
30
31impl UnlinkedMoveset {
32    pub fn new(entries: HashMap<VersionGroupId, Vec<UnlinkedMovesetEntry>>) -> Self {
33        Self(entries)
34    }
35}
36
37impl Linkable for UnlinkedMoveset {
38    type Linked = Moveset;
39
40    fn link(&self, context: &LinkContext) -> Self::Linked {
41        let entries = self
42            .0
43            .iter()
44            .map(|(version_group_id, entry)| (*version_group_id, entry.link(context)))
45            .collect();
46        Moveset(entries)
47    }
48}
49
50#[derive(Debug, Clone, Serialize, Deserialize)]
51pub struct UnlinkedMovesetEntry {
52    pub move_id: PokemonMoveId,
53    pub move_method_id: PokemonMoveMethodId,
54    pub level: u8,
55    pub order: Option<u8>,
56    pub mastery: Option<u8>,
57}
58
59impl Linkable for UnlinkedMovesetEntry {
60    type Linked = MovesetEntry;
61
62    fn link(&self, context: &LinkContext) -> Self::Linked {
63        let pokemon_move = context
64            .moves
65            .get(&self.move_id)
66            .unwrap_or_else(|| panic!("No move '{}' found for pokemon moveset", self.move_id))
67            .clone();
68
69        let move_method = context
70            .move_methods
71            .get(&self.move_method_id)
72            .unwrap_or_else(|| {
73                panic!(
74                    "No move method '{}' found for pokemon moveset",
75                    self.move_method_id
76                )
77            })
78            .clone();
79
80        MovesetEntry {
81            pokemon_move,
82            move_method,
83            level: self.level,
84            order: self.order,
85            mastery: self.mastery,
86        }
87    }
88}