pub mod read {
    use image::{io::Reader as ImageReader, DynamicImage};
    use ir::instruction::read::{Read, SourceType};

    pub fn read(Read { source }: Read) -> DynamicImage {
        // TODO: actual error handling
        let img = ImageReader::open(match source {
            SourceType::File(path) => path,
        })
        .expect("something went wrong :(((");

        img.decode().expect("couldn't decode image")
    }
}

pub mod write {
    use image::{DynamicImage, ImageFormat};
    use ir::instruction::write::{TargetFormat, TargetType, Write};

    pub fn write(Write { target, format }: Write, input_data: &DynamicImage) {
        // TODO: actual error handling
        input_data
            .save_with_format(
                match target {
                    TargetType::File(path) => path,
                },
                match format {
                    TargetFormat::Jpeg => ImageFormat::Jpeg,
                    TargetFormat::Png => ImageFormat::Png,
                },
            )
            .expect("couldn't save file");
    }
}

pub mod filters {
    pub mod invert {
        use image::DynamicImage;

        pub fn invert(mut input_data: DynamicImage) -> DynamicImage {
            input_data.invert();
            input_data
        }
    }
}
