poke_data/models/
version.rs

1use crate::data::link_context::LinkContext;
2use crate::data::linkable::Linkable;
3use crate::models::localized_names::LocalizedStrings;
4use crate::models::version_group::{VersionGroup, VersionGroupId};
5use crate::traits::has_identifier::HasIdentifier;
6use crate::traits::has_localized_names::HasLocalizedNames;
7use serde::{Deserialize, Serialize};
8use std::sync::Arc;
9
10pub type VersionId = u16;
11
12#[derive(Debug)]
13pub struct Version {
14    pub id: VersionId,
15    pub identifier: String,
16    pub names: LocalizedStrings,
17    pub version_group: Arc<VersionGroup>,
18}
19
20#[derive(Debug, Clone, Serialize, Deserialize)]
21pub struct UnlinkedVersion {
22    pub id: VersionId,
23    pub identifier: String,
24    pub names: LocalizedStrings,
25    pub version_group_id: VersionGroupId,
26}
27
28impl Linkable for UnlinkedVersion {
29    type Linked = Arc<Version>;
30
31    fn link(&self, context: &LinkContext) -> Self::Linked {
32        let version_group = context
33            .version_groups
34            .get(&self.version_group_id)
35            .unwrap_or_else(|| {
36                panic!(
37                    "No version group '{}' found for version '{}'",
38                    self.version_group_id, self.id
39                )
40            })
41            .clone();
42
43        let version = Version {
44            id: self.id,
45            identifier: self.identifier.clone(),
46            names: self.names.clone(),
47            version_group,
48        };
49
50        Arc::new(version)
51    }
52}
53
54impl HasLocalizedNames for Version {
55    fn localized_names(&self) -> &LocalizedStrings {
56        &self.names
57    }
58}
59
60impl HasIdentifier for Version {
61    fn identifier(&self) -> &str {
62        &self.identifier
63    }
64}