loadsmith_thunderstore/
ext.rs1use loadsmith_core::PackageId;
2use thunderstore::{PackageIdent, VersionIdent};
3
4use crate::{Error, Result};
5
6pub 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
38pub 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}