petpet 2.4.3

Pet-pet generator in Rust. Translated from https://github.com/camprevail/pet-pet-gif.
Documentation
use std::env;

fn main() {
    #[cfg(not(any(feature = "encode_to_gif", feature = "encode_to_apng")))]
    compile_error!("petpet-cli requires encode_to_gif/encode_to_apng");

    let mut args = env::args();
    args.next();

    let input = args.next().expect("input file is required!");
    let output = args.next().expect("output file is required!");
    let speed = args.next().expect("speed is required!").parse().unwrap();

    #[cfg(feature = "encode_to_gif")]
    encode_petpet_gif(&input, &output, speed, petpet::FilterType::Lanczos3).unwrap();
    #[cfg(feature = "encode_to_apng")]
    encode_petpet_apng(
        &input,
        &output.replace(".gif", ".png"),
        petpet::FilterType::Lanczos3,
        petpet::png::FilterType::NoFilter,
    )
    .unwrap();
}

#[cfg(feature = "encode_to_gif")]
pub fn encode_petpet_gif(
    input: impl AsRef<std::path::Path>,
    output: impl AsRef<std::path::Path>,
    speed: i32,
    filter: petpet::FilterType,
) -> Result<(), Box<dyn std::error::Error>> {
    use petpet::{encode_gif, generate};
    use std::fs::File;

    let input_image = image::open(&input)?.to_rgba8();
    let frames = generate(input_image, filter, None)?;
    let output = File::create(output)?;
    encode_gif(frames, output, speed)?;
    Ok(())
}

#[cfg(feature = "encode_to_apng")]
pub fn encode_petpet_apng(
    input: impl AsRef<std::path::Path>,
    output: impl AsRef<std::path::Path>,
    filter: petpet::FilterType,
    png_filter: petpet::png::FilterType,
) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
    use petpet::{encode_apng, generate};
    use std::fs::File;

    let input_image = image::open(&input)?.to_rgba8();
    let frames = generate(input_image, filter, None)?;
    let output = File::create(output)?;

    encode_apng(frames, output, png_filter, 1, 50)?;
    Ok(())
}