rsynko_media/
observation.rs1use crate::MediaSorts;
2use alux_ext::ext;
3use ambassador::delegatable_trait;
4
5#[delegatable_trait]
7pub trait MetadataAlg: MediaSorts {
8 fn empty_metadata(&self) -> Self::Metadata;
10 fn null_metadata(&self) -> Self::Value;
12 fn boolean_metadata(&self, value: bool) -> Self::Value;
14 fn integer_metadata(&self, value: i64) -> Self::Value;
16 fn float_metadata(&self, value: f64) -> Self::Value;
18 fn string_metadata(&self, value: impl Into<String>) -> Self::Value;
20 fn list_metadata(&self, values: impl IntoIterator<Item = Self::Value>) -> Self::Value;
22 fn record_metadata(&self, record: Self::Metadata) -> Self::Value;
24 fn metadata(&self, fields: impl IntoIterator<Item = (String, Self::Value)>) -> Self::Metadata;
26}
27
28#[delegatable_trait]
33pub trait MetadataViewAlg: MediaSorts {
34 fn metadata_text<'a>(&self, metadata: &'a Self::Metadata, key: &str) -> Option<&'a str>;
36 fn metadata_number(&self, metadata: &Self::Metadata, key: &str) -> Option<i64>;
38}
39
40#[ext(name = MetadataExt)]
42pub impl<This> This
43where
44 This: MetadataAlg,
45{
46 fn text_metadata(&self, key: impl Into<String>, value: impl Into<String>) -> This::Metadata {
48 self.metadata([(key.into(), self.string_metadata(value))])
49 }
50}