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