Skip to main content

loadsmith_thunderstore/
ext.rs

1use loadsmith_core::PackageId;
2use thunderstore::{PackageIdent, VersionIdent};
3
4use crate::{Error, Result};
5
6/// Conversion between [`PackageId`] and [`PackageIdent`].
7///
8/// # Examples
9///
10/// ```
11/// use loadsmith_core::PackageId;
12/// use loadsmith_thunderstore::PackageIdExt;
13/// use thunderstore::PackageIdent;
14///
15/// let id = PackageId::new("Author-Package");
16/// let ident = id.into_ts_ident().unwrap();
17/// assert_eq!(ident.namespace(), "Author");
18/// assert_eq!(ident.name(), "Package");
19///
20/// let back = PackageId::from_ts_ident(ident);
21/// assert_eq!(back.as_str(), "Author-Package");
22/// ```
23pub trait PackageIdExt {
24    fn into_ts_ident(self) -> Result<PackageIdent>;
25    fn from_ts_ident(ident: PackageIdent) -> Self;
26}
27
28impl PackageIdExt for PackageId {
29    fn into_ts_ident(self) -> Result<PackageIdent> {
30        PackageIdent::try_from(self.into_string()).map_err(Error::InvalidIdent)
31    }
32
33    fn from_ts_ident(ident: PackageIdent) -> Self {
34        PackageId::from(ident.into_string())
35    }
36}
37
38/// Conversion between [`PackageRef`](loadsmith_core::PackageRef) and [`VersionIdent`].
39///
40/// # Examples
41///
42/// ```
43/// use loadsmith_core::{PackageId, PackageRef, Version};
44/// use loadsmith_thunderstore::{PackageIdExt, PackageRefExt};
45/// use thunderstore::VersionIdent;
46///
47/// let package_ref = PackageRef::new(
48///     PackageId::new("Author-Package"),
49///     Version::new(1, 2, 3),
50/// );
51///
52/// let ident = package_ref.into_ts_ident().unwrap();
53/// assert_eq!(ident.to_string(), "Author-Package-1.2.3");
54///
55/// let back = PackageRef::from_ts_ident(ident);
56/// assert_eq!(back.to_string(), "Author-Package@1.2.3");
57/// ```
58pub trait PackageRefExt {
59    fn into_ts_ident(self) -> Result<VersionIdent>;
60    fn from_ts_ident(ident: VersionIdent) -> Self;
61}
62
63impl PackageRefExt for loadsmith_core::PackageRef {
64    fn into_ts_ident(self) -> Result<VersionIdent> {
65        let (id, version) = self.into_split();
66
67        id.into_ts_ident()
68            .map(|package| package.with_version(version.to_string()))
69    }
70
71    fn from_ts_ident(ident: VersionIdent) -> Self {
72        Self::new(
73            PackageId::from_ts_ident(ident.package_id()),
74            ident.parsed_version(),
75        )
76    }
77}
78
79#[cfg(test)]
80mod tests {
81    use super::*;
82
83    #[test]
84    fn package_id_into_ts_ident() {
85        let package_id = PackageId::new("Author-Name");
86        let ts_ident = package_id.into_ts_ident().unwrap();
87        assert_eq!(ts_ident.namespace(), "Author");
88        assert_eq!(ts_ident.name(), "Name");
89        assert_eq!(ts_ident.as_str(), "Author-Name");
90    }
91
92    #[test]
93    fn package_id_into_ts_ident_hyphen_in_namespace() {
94        let package_id = PackageId::new("Author-Name-Hyphen");
95        let ts_ident = package_id.into_ts_ident().unwrap();
96        assert_eq!(ts_ident.namespace(), "Author-Name");
97        assert_eq!(ts_ident.name(), "Hyphen");
98        assert_eq!(ts_ident.as_str(), "Author-Name-Hyphen");
99    }
100
101    #[test]
102    fn package_id_from_ts_ident() {
103        let ts_ident = PackageIdent::new("Author", "Name");
104        let package_id = PackageId::from_ts_ident(ts_ident);
105        assert_eq!(package_id.as_str(), "Author-Name");
106    }
107}