use crate::exif::png_text::PngTextChunks;
mod sealed {
pub trait Sealed {}
}
pub trait ExifRepr: sealed::Sealed {}
impl sealed::Sealed for crate::Exif {}
impl ExifRepr for crate::Exif {}
impl sealed::Sealed for crate::ExifIter {}
impl ExifRepr for crate::ExifIter {}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ImageMetadata<E: ExifRepr = crate::Exif> {
pub exif: Option<E>,
pub format: Option<ImageFormatMetadata>,
}
impl<E: ExifRepr> Default for ImageMetadata<E> {
fn default() -> Self {
ImageMetadata {
exif: None,
format: None,
}
}
}
impl From<ImageMetadata<crate::ExifIter>> for ImageMetadata<crate::Exif> {
fn from(m: ImageMetadata<crate::ExifIter>) -> Self {
ImageMetadata {
exif: m.exif.map(Into::into),
format: m.format,
}
}
}
#[derive(Debug, Clone)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[non_exhaustive]
pub enum ImageFormatMetadata {
Png(PngTextChunks),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn default_is_empty() {
let m: ImageMetadata = ImageMetadata::default();
assert!(m.exif.is_none());
assert!(m.format.is_none());
}
#[test]
fn generic_explicit_lazy_form() {
let m: ImageMetadata<crate::ExifIter> = ImageMetadata {
exif: None,
format: None,
};
assert!(m.exif.is_none());
}
#[test]
fn from_lazy_to_eager_compiles() {
let lazy: ImageMetadata<crate::ExifIter> = ImageMetadata::default();
let _eager: ImageMetadata<crate::Exif> = lazy.into();
}
#[test]
fn format_metadata_png_variant() {
let png_text = PngTextChunks::default();
let fm = ImageFormatMetadata::Png(png_text);
match fm {
ImageFormatMetadata::Png(t) => assert!(t.is_empty()),
}
}
}