hdim-core 0.1.0

Core logic and image manipulation algorithms for HDIM.
Documentation
use exif::{Exif, Field, In, Tag, Value};

pub fn get_ascii(field: Option<&Field>) -> Option<String> {
    match &field?.value {
        Value::Ascii(values) => values
            .first()
            .and_then(|bytes| String::from_utf8(bytes.clone()).ok()),
        _ => None,
    }
}

pub fn get_ascii_from_exif(exif: &Exif, tag: Tag, image_file_directory: In) -> Option<String> {
    let field = exif.get_field(tag, image_file_directory);
    get_ascii(field)
}

pub fn get_rational(field: Option<&Field>) -> Option<f64> {
    match &field?.value {
        Value::Rational(values) => values.first().map(|rational| rational.to_f64()),
        _ => None,
    }
}

pub fn get_rational_from_exif(exif: &Exif, tag: Tag, image_file_directory: In) -> Option<f64> {
    let field = exif.get_field(tag, image_file_directory);
    get_rational(field)
}

pub fn get_rational_vec(field: Option<&Field>) -> Option<Vec<f64>> {
    match &field?.value {
        Value::Rational(values) => Some(values.iter().map(|rational| rational.to_f64()).collect()),
        _ => None,
    }
}

pub fn get_rational_vec_from_exif(
    exif: &Exif,
    tag: Tag,
    image_file_directory: In,
) -> Option<Vec<f64>> {
    let field = exif.get_field(tag, image_file_directory);
    get_rational_vec(field)
}

pub fn get_u16_from_exif(exif: &Exif, tag: Tag, image_file_directory: In) -> Option<u16> {
    exif.get_field(tag, image_file_directory)
        .and_then(|field| field.value.get_uint(0).map(|value| value as u16))
}

pub fn get_u32_from_exif(exif: &Exif, tag: Tag, image_file_directory: In) -> Option<u32> {
    exif.get_field(tag, image_file_directory)
        .and_then(|field| field.value.get_uint(0))
}