ime 1.0.0

A fast, lightweight CLI for reading, writing, and wiping metadata from image files.
use crate::model::Output;
use nom_exif::{MediaParser, MediaSource};
use std::fs::File;

pub fn extract(path: &str, parser: &mut MediaParser) -> Result<Output, Box<dyn std::error::Error>> {
    let mut out = Output::new();

    let ms = MediaSource::<File>::open(path)?;

    match ms.kind() {
        nom_exif::MediaKind::Image => {
            if let Ok(meta) = parser.parse_image_metadata(ms) {
                if let Some(exif) = meta.exif {
                    for entry in exif {
                        if let Some(val) = entry.value() {
                            let dir_name = format!("{:?}", entry.ifd_kind());
                            let tag_name = entry.tag().to_string();
                            out.entry(dir_name)
                                .or_default()
                                .insert(tag_name, val.to_string());
                        }
                    }
                }

                if let Some(nom_exif::ImageFormatMetadata::Png(chunks)) = meta.format {
                    for (k, v) in chunks.iter() {
                        out.entry("PngText".to_string())
                            .or_default()
                            .insert(k.to_string(), v.to_string());
                    }
                }
            }
        }
        nom_exif::MediaKind::Track => {
            if let Ok(track) = parser.parse_track(ms) {
                for (tag, value) in track.iter() {
                    out.entry("Track".to_string())
                        .or_default()
                        .insert(tag.to_string(), value.to_string());
                }
            }
        }
    }

    Ok(out)
}