use color_parser::{
ColorParserError, parse_hex_to_rgba, parse_rgb_to_cmyk, parse_rgb_to_hsl, parse_rgb_to_hsv,
};
use owo_colors::OwoColorize;
use std::{env, process};
fn main() {
if let Err(e) = run() {
eprintln!("{} {}", "❌ Error:".red(), e.to_string().red()); process::exit(1); }
}
fn run() -> Result<(), Box<dyn std::error::Error>> {
let color_hex = get_color_argument()?;
let rgba_color = parse_hex_to_rgba(&color_hex)?;
let hsl_color = parse_rgb_to_hsl(&rgba_color)?;
let hsv_color = parse_rgb_to_hsv(&rgba_color)?;
let cmyk_color = parse_rgb_to_cmyk(&rgba_color)?;
let color_preview = " ".on_truecolor(rgba_color.red, rgba_color.green, rgba_color.blue);
println!("\n Hex Input: #{color}\n", color = color_hex.to_uppercase());
println!("🎨 Color: {}", color_preview);
println!(
"\n🌈 RGBA: rgba({}, {}, {})",
rgba_color.red, rgba_color.green, rgba_color.blue
);
println!(" → Red: {}", rgba_color.red);
println!(" → Green: {}", rgba_color.green);
println!(" → Blue: {}", rgba_color.blue);
println!(" → Alpha: {}", rgba_color.alpha);
println!(
"\n🌈 HSL: hsl({}°, {}%, {}%)",
hsl_color.hue.round(),
hsl_color.saturation.round(),
hsl_color.lightness.round()
);
println!(" → Hue: {}°", hsl_color.hue.round());
println!(" → Saturation: {}%", hsl_color.saturation.round());
println!(" → Lightness: {}%", hsl_color.lightness.round());
println!(
"\n🌈 HSV: hsv({}°, {}%, {}%)",
hsv_color.hue.round(),
hsv_color.saturation.round(),
hsv_color.value.round()
);
println!(" → Hue: {}°", hsv_color.hue.round());
println!(" → Saturation: {}%", hsv_color.saturation.round());
println!(" → value: {}%", hsv_color.value.round());
println!(
"\n🌈 CMYK: CMYK({}%, {}%, {}%, {}%)",
cmyk_color.cyan.round(),
cmyk_color.magenta.round(),
cmyk_color.yellow.round(),
cmyk_color.black.round(),
);
println!(" → Cyan: {}%", cmyk_color.cyan.round());
println!(" → Magenta: {}%", cmyk_color.magenta.round());
println!(" → Yellow: {}%", cmyk_color.yellow.round());
println!(" → Black: {}%", cmyk_color.black.round());
println!();
Ok(())
}
fn get_color_argument() -> Result<String, ColorParserError> {
let args: Vec<String> = env::args().collect();
if args.len() != 2 {
eprintln!("Usage: {} <hex-color>", args[0]); eprintln!("Example: {} fff or {} #ffcc00", args[0], args[0]);
std::process::exit(1); }
Ok(args[1].clone())
}