From d56e61eaf490530baaea3dbf5ab3f73c9a628607 Mon Sep 17 00:00:00 2001 From: J Robert Ray Date: Fri, 27 Sep 2024 16:07:52 -0700 Subject: [PATCH] Create an ident::AsVersion trait This is useful for code that is generic over Ident to be able to require that the Ident can represent itself as a VersionIdent. Signed-off-by: J Robert Ray --- crates/spk-schema/crates/ident/src/ident.rs | 15 +++++++++++++++ .../spk-schema/crates/ident/src/ident_version.rs | 8 +++++++- crates/spk-schema/crates/ident/src/lib.rs | 2 +- 3 files changed, 23 insertions(+), 2 deletions(-) diff --git a/crates/spk-schema/crates/ident/src/ident.rs b/crates/spk-schema/crates/ident/src/ident.rs index fd91eef7a7..63f6899c15 100644 --- a/crates/spk-schema/crates/ident/src/ident.rs +++ b/crates/spk-schema/crates/ident/src/ident.rs @@ -7,6 +7,8 @@ use std::str::FromStr; use serde::{Deserialize, Deserializer, Serialize, Serializer}; +use crate::VersionIdent; + #[cfg(test)] #[path = "./ident_test.rs"] mod ident_test; @@ -201,3 +203,16 @@ where deserializer.deserialize_str(IdentVisitor(PhantomData)) } } + +/// Idents that can be turned into a [`VersionIdent`] can implement this trait. +pub trait AsVersion { + /// Return a borrowed version of this ident converted into a + /// [`VersionIdent`]. + fn as_version(&self) -> &VersionIdent; +} + +impl AsVersion for Ident { + fn as_version(&self) -> &VersionIdent { + self.base().as_version() + } +} diff --git a/crates/spk-schema/crates/ident/src/ident_version.rs b/crates/spk-schema/crates/ident/src/ident_version.rs index 27ae02089f..b043e12a36 100644 --- a/crates/spk-schema/crates/ident/src/ident_version.rs +++ b/crates/spk-schema/crates/ident/src/ident_version.rs @@ -11,7 +11,7 @@ use spk_schema_foundation::ident_ops::{TagPath, TagPathStrategy}; use spk_schema_foundation::name::{PkgName, PkgNameBuf}; use spk_schema_foundation::version::Version; -use crate::{parsing, AnyIdent, BuildIdent, Ident, Result, ToAnyWithoutBuild}; +use crate::{parsing, AnyIdent, AsVersion, BuildIdent, Ident, Result, ToAnyWithoutBuild}; /// Identifies a package name and number version. pub type VersionIdent = Ident; @@ -58,6 +58,12 @@ impl VersionIdent { } } +impl AsVersion for VersionIdent { + fn as_version(&self) -> &VersionIdent { + self + } +} + macro_rules! version_ident_methods { ($Ident:ty $(, .$($access:ident).+)?) => { impl $Ident { diff --git a/crates/spk-schema/crates/ident/src/lib.rs b/crates/spk-schema/crates/ident/src/lib.rs index 9d557c4924..04c2434899 100644 --- a/crates/spk-schema/crates/ident/src/lib.rs +++ b/crates/spk-schema/crates/ident/src/lib.rs @@ -15,7 +15,7 @@ mod request; mod satisfy; pub use error::{Error, Result}; -pub use ident::Ident; +pub use ident::{AsVersion, Ident}; pub use ident_any::{parse_ident, AnyIdent, ToAnyWithoutBuild}; pub use ident_build::{parse_build_ident, BuildIdent}; pub use ident_located::{LocatedBuildIdent, LocatedVersionIdent};