Newer
Older
use clap::{Parser, Subcommand};
use serde::{Deserialize, Serialize};
// use crate::commands::{calculate_mapping, execute_pipeline, extrude, flip, palette, remap_image, rescale, rotate, write_palette, FlipDirection, RotateDegree, Rotate};
use crate::commands::{Extrude, Flip, Palette, Pipeline, Remap, Rotate, Scale};
use crate::format::PaletteFormat;
use crate::{load_image, Format};
/// Crunch is a set of utilities for quickly and easily processing a batch of files, either directly
/// or by defining pipelines
#[derive(Parser, Debug, Clone, Serialize, Deserialize)]
#[clap(author = "Louis Capitanchik <louis@microhacks.co.uk>")]
#[clap(about, long_about = None)]
#[serde(tag = "command", content = "params")]
pub enum Args {
#[clap(name = "rotate")]
#[serde(alias = "rotate")]
Rotate(Rotate),
#[clap(name = "extrude")]
#[serde(alias = "extrude")]
Extrude(Extrude),
#[clap(name = "palette")]
#[serde(alias = "palette")]
Palette(Palette),
#[clap(name = "scale")]
#[serde(alias = "scale")]
Scale(Scale),
#[clap(name = "flip")]
#[serde(alias = "flip")]
Flip(Flip),
#[clap(name = "remap")]
#[serde(alias = "remap")]
Remap(Remap),
#[clap(name = "remap")]
#[serde(alias = "remap")]
Pipeline(Pipeline),
}
impl Args {
pub fn run(&self) -> anyhow::Result<()> {
match &self {
Args::Rotate(rotate) => {
let image = load_image(&rotate.input, None)?;
let output = rotate.run(&image)?;
output
.save(rotate.output.as_str())
.map_err(anyhow::Error::from)
Args::Extrude(extrude) => {
let image = load_image(&extrude.input, None)?;
let output = extrude.run(&image)?;
output
.save(extrude.output.as_str())
.map_err(anyhow::Error::from)
Args::Palette(palette) => {
let image = load_image(&palette.input, None)?;
palette.run(&image)
Args::Scale(scale) => {
let image = load_image(&scale.input, None)?;
let output = scale.run(&image)?;
output
.save(scale.output.as_str())
.map_err(anyhow::Error::from)
Args::Flip(flip) => {
let image = load_image(&flip.input, None)?;
let output = flip.run(&image)?;
output
.save(flip.output.as_str())
.map_err(anyhow::Error::from)
Args::Remap(remap) => {
let image_data = load_image(&remap.input, None)?;
let palette_data = load_image(&remap.palette, None)?;
let image_palette = Palette::extract_from(&image_data)?;
let target_palette = Palette::extract_from(&palette_data)?;
let mappings = Palette::calculate_mapping(&image_palette, &target_palette);
let output = Remap::remap_image(image_data, mappings)?;
output.save(&remap.output).map_err(anyhow::Error::from)
Args::Pipeline(pipeline) => pipeline.execute(),