poke_data/models/
version_group.rs1use crate::data::link_context::LinkContext;
2use crate::data::linkable::Linkable;
3use crate::models::generation::{Generation, GenerationId};
4use crate::models::pokemon_move_method::PokemonMoveMethodId;
5use crate::models::region::{Region, RegionId};
6use serde::{Deserialize, Serialize};
7use std::sync::Arc;
8
9pub type VersionGroupId = u8;
10
11#[derive(Debug)]
12pub struct VersionGroup {
13 pub id: VersionGroupId,
14 pub identifier: String,
15 pub generation: Arc<Generation>,
16 pub regions: Vec<Arc<Region>>,
17 pub move_method_ids: Vec<PokemonMoveMethodId>,
18 pub order: u8,
19}
20
21#[derive(Debug, Default, Serialize, Deserialize)]
22pub struct UnlinkedVersionGroup {
23 pub id: VersionGroupId,
24 pub identifier: String,
25 pub generation_id: GenerationId,
26 pub region_ids: Vec<RegionId>,
27 pub move_method_ids: Vec<PokemonMoveMethodId>,
28 pub order: u8,
29}
30
31impl Linkable for UnlinkedVersionGroup {
32 type Linked = Arc<VersionGroup>;
33
34 fn link(&self, context: &LinkContext) -> Self::Linked {
35 let generation = context
36 .generations
37 .get(&self.generation_id)
38 .unwrap_or_else(|| {
39 panic!(
40 "No generation '{}' found for version group '{}'",
41 self.generation_id, self.id
42 )
43 })
44 .clone();
45
46 let regions = self
47 .region_ids
48 .iter()
49 .map(|region_id| {
50 context
51 .regions
52 .get(region_id)
53 .unwrap_or_else(|| {
54 panic!(
55 "No region '{}' found for version group '{}'",
56 region_id, self.id
57 )
58 })
59 .clone()
60 })
61 .collect();
62
63 let version_group = VersionGroup {
64 id: self.id,
65 identifier: self.identifier.clone(),
66 generation,
67 regions,
68 move_method_ids: self.move_method_ids.clone(),
69 order: self.order,
70 };
71
72 Arc::new(version_group)
73 }
74}