use std::path::Path;
use std::fmt;
use anyhow::Result;
use serde::{Serialize, Deserialize};
use owo_colors::AnsiColors;
use self::Backend as B;
mod full;
mod resized;
mod wal;
mod thumb;
mod fast_resize;
mod kmeans;
#[derive(Debug, PartialEq, Eq, Deserialize, Serialize, Clone, Copy, Default, clap::ValueEnum)]
#[cfg_attr(feature = "doc" , derive(documented::Documented, documented::DocumentedFields))]
#[cfg_attr(feature = "iter", derive(strum::EnumIter))]
#[cfg_attr(feature = "schema" , derive(schemars::JsonSchema))]
#[serde(rename_all = "lowercase")]
pub enum Backend {
Full,
Resized,
Wal,
Thumb,
#[clap(alias = "fast-resize", name = "fastresize")] #[serde(alias = "fast-resize")]
#[default]
FastResize,
Kmeans,
}
impl Backend {
pub fn main(&self) -> fn(&Path) -> Result<Vec<u8>> {
match &self {
B::Full => full::full,
B::Resized => resized::resized,
B::Wal => wal::wal,
B::Thumb => thumb::thumb,
B::FastResize => fast_resize::fast_resize,
B::Kmeans => kmeans::kmeans,
}
}
pub fn col(&self) -> AnsiColors {
match self {
B::Full => AnsiColors::Blue,
B::Resized => AnsiColors::Cyan,
B::Wal => AnsiColors::Red,
B::Thumb => AnsiColors::Magenta,
B::FastResize => AnsiColors::Green,
B::Kmeans => AnsiColors::BrightBlue,
}
}
}
impl fmt::Display for Backend {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
B::Full => write!(f, "Full"),
B::Resized => write!(f, "Resized"),
B::Wal => write!(f, "Wal"),
B::Thumb => write!(f, "Thumb"),
B::FastResize => write!(f, "FastResize"),
B::Kmeans => write!(f, "Kmeans"),
}
}
}