use crate::MediaSorts;
use alux_ext::ext;
use ambassador::delegatable_trait;
#[delegatable_trait]
pub trait MetadataAlg: MediaSorts {
fn empty_metadata(&self) -> Self::Metadata;
fn null_metadata(&self) -> Self::Value;
fn boolean_metadata(&self, value: bool) -> Self::Value;
fn integer_metadata(&self, value: i64) -> Self::Value;
fn float_metadata(&self, value: f64) -> Self::Value;
fn string_metadata(&self, value: impl Into<String>) -> Self::Value;
fn list_metadata(&self, values: impl IntoIterator<Item = Self::Value>) -> Self::Value;
fn record_metadata(&self, record: Self::Metadata) -> Self::Value;
fn metadata(&self, fields: impl IntoIterator<Item = (String, Self::Value)>) -> Self::Metadata;
}
#[delegatable_trait]
pub trait MetadataViewAlg: MediaSorts {
fn metadata_text<'a>(&self, metadata: &'a Self::Metadata, key: &str) -> Option<&'a str>;
fn metadata_number(&self, metadata: &Self::Metadata, key: &str) -> Option<i64>;
}
#[ext(name = MetadataExt)]
pub impl<This> This
where
This: MetadataAlg,
{
fn text_metadata(&self, key: impl Into<String>, value: impl Into<String>) -> This::Metadata {
self.metadata([(key.into(), self.string_metadata(value))])
}
}