use loadsmith_core::PackageId;
use thunderstore::{PackageIdent, VersionIdent};
use crate::{Error, Result};
pub trait PackageIdExt {
fn into_ts_ident(self) -> Result<PackageIdent>;
fn from_ts_ident(ident: PackageIdent) -> Self;
}
impl PackageIdExt for PackageId {
fn into_ts_ident(self) -> Result<PackageIdent> {
PackageIdent::try_from(self.into_string()).map_err(Error::InvalidIdent)
}
fn from_ts_ident(ident: PackageIdent) -> Self {
PackageId::from(ident.into_string())
}
}
pub trait PackageRefExt {
fn into_ts_ident(self) -> Result<VersionIdent>;
fn from_ts_ident(ident: VersionIdent) -> Self;
}
impl PackageRefExt for loadsmith_core::PackageRef {
fn into_ts_ident(self) -> Result<VersionIdent> {
let (id, version) = self.into_split();
id.into_ts_ident()
.map(|package| package.with_version(version.to_string()))
}
fn from_ts_ident(ident: VersionIdent) -> Self {
Self::new(
PackageId::from_ts_ident(ident.package_id()),
ident.parsed_version(),
)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn package_id_into_ts_ident() {
let package_id = PackageId::new("Author-Name");
let ts_ident = package_id.into_ts_ident().unwrap();
assert_eq!(ts_ident.namespace(), "Author");
assert_eq!(ts_ident.name(), "Name");
assert_eq!(ts_ident.as_str(), "Author-Name");
}
#[test]
fn package_id_into_ts_ident_hyphen_in_namespace() {
let package_id = PackageId::new("Author-Name-Hyphen");
let ts_ident = package_id.into_ts_ident().unwrap();
assert_eq!(ts_ident.namespace(), "Author-Name");
assert_eq!(ts_ident.name(), "Hyphen");
assert_eq!(ts_ident.as_str(), "Author-Name-Hyphen");
}
#[test]
fn package_id_from_ts_ident() {
let ts_ident = PackageIdent::new("Author", "Name");
let package_id = PackageId::from_ts_ident(ts_ident);
assert_eq!(package_id.as_str(), "Author-Name");
}
}