melodium_repository/technical/
package.rs1use 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}