machin 0.5.1

Machin is a cli program that simplifies file conversions and batch processing. It's inspired from filter/map/reduce
use std::error::Error;

use crate::errors::InputFileUnsupportedError;

pub mod errors;
pub mod image_input;

use crate::machconvert::image_input::InputTo;
use image_input::ImageInputFile;

#[derive(PartialEq)]
pub enum ConvertColor {
    Grayscale,
}

#[derive(PartialEq)]
pub enum ConvertFlip {
    Horizontal,
    Vertical,
}

pub struct ConvertArgs<'a> {
    pub color: Option<ConvertColor>,
    pub flip: Option<ConvertFlip>,
    pub rotate: Option<&'a str>,
}

pub struct InputsFiles<'a> {
    pub input_file: &'a str,
    pub output_file: &'a str,
    pub image_mime_type: Vec<&'a str>,
}

impl<'a> InputsFiles<'a> {
    pub fn new(input_file: &'a str, output_file: &'a str) -> InputsFiles<'a> {
        InputsFiles {
            input_file,
            output_file,
            image_mime_type: vec!["image/png", "image/jpeg"],
        }
    }

    pub fn convert(&self, args: &ConvertArgs) -> Result<String, Box<dyn Error + 'a>> {
        let input_mime = mime_guess::from_path(self.input_file);

        let input_e = InputFileUnsupportedError {
            input_file: self.input_file,
        };

        match &input_mime.first_raw() {
            Some(i_mime) => {
                if self.image_mime_type.contains(i_mime) {
                    return self.image_convert(args);
                }
                return Err(Box::new(input_e));
            }
            None => {
                return Err(Box::new(input_e));
            }
        };
    }

    pub fn image_convert(&self, args: &ConvertArgs) -> Result<String, Box<dyn Error + 'a>> {
        let image = ImageInputFile::new(self.input_file, self.output_file);
        image.convert(args)
    }
}