wasmer_config/package/
package_id.rs

1use std::borrow::Cow;
2
3use super::PackageHash;
4
5#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
6pub struct NamedPackageId {
7    pub full_name: String,
8    pub version: semver::Version,
9}
10
11impl NamedPackageId {
12    pub fn try_new(
13        name: impl Into<String>,
14        version: impl AsRef<str>,
15    ) -> Result<Self, semver::Error> {
16        Ok(Self {
17            full_name: name.into(),
18            version: version.as_ref().parse()?,
19        })
20    }
21}
22
23impl std::fmt::Display for NamedPackageId {
24    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
25        write!(f, "{}@{}", self.full_name, self.version)
26    }
27}
28
29#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Hash)]
30pub enum PackageId {
31    Hash(PackageHash),
32    Named(NamedPackageId),
33}
34
35impl PackageId {
36    pub fn new_named(name: impl Into<String>, version: semver::Version) -> Self {
37        Self::Named(NamedPackageId {
38            full_name: name.into(),
39            version,
40        })
41    }
42
43    pub fn as_named(&self) -> Option<&NamedPackageId> {
44        if let Self::Named(v) = self {
45            Some(v)
46        } else {
47            None
48        }
49    }
50
51    pub fn as_hash(&self) -> Option<&PackageHash> {
52        if let Self::Hash(v) = self {
53            Some(v)
54        } else {
55            None
56        }
57    }
58}
59
60impl From<NamedPackageId> for PackageId {
61    fn from(value: NamedPackageId) -> Self {
62        Self::Named(value)
63    }
64}
65
66impl From<PackageHash> for PackageId {
67    fn from(value: PackageHash) -> Self {
68        Self::Hash(value)
69    }
70}
71
72impl std::fmt::Display for PackageId {
73    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
74        match self {
75            Self::Named(n) => n.fmt(f),
76            Self::Hash(h) => h.fmt(f),
77        }
78    }
79}
80
81impl schemars::JsonSchema for PackageId {
82    fn schema_name() -> Cow<'static, str> {
83        Cow::Borrowed("PackageIdent")
84    }
85
86    fn json_schema(generator: &mut schemars::SchemaGenerator) -> schemars::Schema {
87        String::json_schema(generator)
88    }
89
90    fn inline_schema() -> bool {
91        false
92    }
93
94    fn schema_id() -> std::borrow::Cow<'static, str> {
95        Self::schema_name()
96    }
97}