melodium_repository/technical/
package.rs

1use super::Type;
2use melodium_common::descriptor::{PackageRequirement, Version, VersionReq};
3use serde::{Deserialize, Deserializer, Serialize, Serializer};
4use std::path::PathBuf;
5
6#[derive(Clone, Debug, Serialize, Deserialize)]
7pub struct Package {
8    pub name: String,
9    pub version: Version,
10    #[serde(
11        serialize_with = "serialize_vec_requirement",
12        deserialize_with = "deserialize_vec_requirement"
13    )]
14    pub requirements: Vec<PackageRequirement>,
15    pub r#type: Type,
16}
17
18impl Package {
19    pub fn get_path(&self) -> PathBuf {
20        let mut path = PathBuf::from(self.name.clone());
21        path.push(self.version.to_string());
22        path
23    }
24}
25
26impl PartialEq for Package {
27    fn eq(&self, other: &Self) -> bool {
28        self.name == other.name && self.version == other.version
29    }
30}
31
32#[derive(Clone, Debug, Serialize, Deserialize)]
33pub struct PackageRequirementDef {
34    pub package: String,
35    pub version_requirement: VersionReq,
36}
37
38impl From<&PackageRequirement> for PackageRequirementDef {
39    fn from(value: &PackageRequirement) -> Self {
40        Self {
41            package: value.package.clone(),
42            version_requirement: value.version_requirement.clone(),
43        }
44    }
45}
46
47impl Into<PackageRequirement> for PackageRequirementDef {
48    fn into(self) -> PackageRequirement {
49        PackageRequirement {
50            package: self.package,
51            version_requirement: self.version_requirement,
52        }
53    }
54}
55
56pub(crate) fn serialize_vec_requirement<S>(
57    vec_requirement: &Vec<PackageRequirement>,
58    s: S,
59) -> Result<S::Ok, S::Error>
60where
61    S: Serializer,
62{
63    let vec_requirement: Vec<PackageRequirementDef> = vec_requirement
64        .iter()
65        .map(PackageRequirementDef::from)
66        .collect();
67
68    vec_requirement.serialize(s)
69}
70
71pub(crate) fn deserialize_vec_requirement<'a, D>(d: D) -> Result<Vec<PackageRequirement>, D::Error>
72where
73    D: Deserializer<'a>,
74{
75    let vec_requirement: Vec<PackageRequirementDef> = Deserialize::deserialize(d)?;
76
77    Ok(vec_requirement.into_iter().map(|pr| pr.into()).collect())
78}