use crate::reference::CapabilityRef;
pub trait IntoCapability {
fn into_capability(self) -> CapabilitySpec;
}
#[derive(Clone, Debug)]
pub struct CapabilitySpec {
reference: CapabilityRef,
#[cfg(feature = "definition")]
definition: Option<crate::definition::Definition>,
}
impl CapabilitySpec {
pub fn reference(reference: CapabilityRef) -> Self {
Self {
reference,
#[cfg(feature = "definition")]
definition: None,
}
}
#[cfg(feature = "definition")]
pub fn definition(definition: crate::definition::Definition) -> Self {
Self {
reference: CapabilityRef::new(definition.id()),
definition: Some(definition),
}
}
pub fn capability_ref(&self) -> &CapabilityRef {
&self.reference
}
pub fn into_parts(self) -> CapabilitySpecParts {
CapabilitySpecParts {
reference: self.reference,
#[cfg(feature = "definition")]
definition: self.definition,
}
}
}
#[derive(Clone, Debug)]
#[non_exhaustive]
pub struct CapabilitySpecParts {
pub reference: CapabilityRef,
#[cfg(feature = "definition")]
pub definition: Option<crate::definition::Definition>,
}
impl From<CapabilityRef> for CapabilitySpec {
fn from(reference: CapabilityRef) -> Self {
Self::reference(reference)
}
}
impl IntoCapability for CapabilitySpec {
fn into_capability(self) -> CapabilitySpec {
self
}
}
impl IntoCapability for CapabilityRef {
fn into_capability(self) -> CapabilitySpec {
self.into()
}
}
impl IntoCapability for &str {
fn into_capability(self) -> CapabilitySpec {
CapabilityRef::new(self).into()
}
}
impl IntoCapability for String {
fn into_capability(self) -> CapabilitySpec {
CapabilityRef::new(self).into()
}
}
impl IntoCapability for &String {
fn into_capability(self) -> CapabilitySpec {
CapabilityRef::new(self.as_str()).into()
}
}
#[cfg(feature = "definition")]
impl From<crate::definition::Definition> for CapabilitySpec {
fn from(definition: crate::definition::Definition) -> Self {
Self::definition(definition)
}
}
#[cfg(feature = "definition")]
impl IntoCapability for crate::definition::Definition {
fn into_capability(self) -> CapabilitySpec {
self.into()
}
}