poke_data/models/
version_group.rs

1use 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}