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