use clap::builder::styling::{AnsiColor, Effects, Styles};
use clap::{Parser, Subcommand};
fn styles() -> Styles {
Styles::styled()
.header(AnsiColor::Red.on_default() | Effects::BOLD)
.usage(AnsiColor::Red.on_default() | Effects::BOLD)
.literal(AnsiColor::Blue.on_default() | Effects::BOLD)
.error(AnsiColor::Red.on_default() | Effects::BOLD)
.placeholder(AnsiColor::Green.on_default())
}
#[derive(Parser, Debug)]
#[command(
author = "Mahmoud Harmouch",
version,
about = "\x1b[38;5;214mThe ultimate steganography swiss knife army tool.\x1b[0m",
name = "stegano",
propagate_version = true,
styles = styles()
)]
pub struct Cli {
#[command(subcommand)]
pub command: Option<SteganoCommands>,
}
#[derive(Subcommand, Debug)]
pub enum SteganoCommands {
Encrypt(EncryptCmd),
Decrypt(DecryptCmd),
ShowMeta(ShowMetaCmd),
}
#[derive(Parser, Debug)]
pub struct EncryptCmd {
#[arg(short = 'i', long = "input")]
pub input: String,
#[arg(short = 'o', long = "output", default_value_t = String::from("output.png"))]
pub output: String,
#[arg(short = 'k', long = "key", default_value_t = String::from("key"))]
pub key: String,
#[arg(short = 's', long = "suppress", default_value_t = false)]
pub suppress: bool,
#[arg(short = 'f', long = "offset", default_value_t = 9999999999)]
pub offset: usize,
#[arg(short = 'p', long = "payload", default_value_t = String::from("hello"))]
pub payload: String,
#[arg(short = 't', long = "type", default_value_t = String::from("PNG"))]
pub r#type: String,
#[arg(short = 'a', long = "algo", default_value_t = String::from("aes"))]
pub algorithm: String,
}
#[derive(Parser, Debug)]
pub struct DecryptCmd {
#[arg(short = 'i', long = "input")]
pub input: String,
#[arg(short = 'o', long = "output", default_value_t = String::from("output.png"))]
pub output: String,
#[arg(short = 'k', long = "key", default_value_t = String::from("key"))]
pub key: String,
#[arg(short = 's', long = "suppress", default_value_t = false)]
pub suppress: bool,
#[arg(short = 'f', long = "offset", default_value_t = 9999999999)]
pub offset: usize,
#[arg(short = 'p', long = "payload", default_value_t = String::from("hello"))]
pub payload: String,
#[arg(short = 't', long = "type", default_value_t = String::from("PNG"))]
pub r#type: String,
#[arg(short = 'a', long = "algo", default_value_t = String::from("aes"))]
pub algorithm: String,
}
#[derive(Parser, Debug)]
pub struct ShowMetaCmd {
#[arg(short = 'i', long = "input")]
pub input: String,
#[arg(short = 'n', long = "nb-chunks", default_value_t = 100)]
pub nb_chunks: usize,
#[arg(short = 's', long = "start", default_value_t = 0)]
pub start_chunk: usize,
#[arg(short = 'e', long = "end", default_value_t = 100)]
pub end_chunk: usize,
#[arg(short = 'r', long = "suppress", default_value_t = false)]
pub suppress: bool,
#[arg(short = 't', long = "type", default_value_t = String::from("PNG"))]
pub r#type: String,
#[arg(short = 'z', long = "read-end", default_value_t = false)]
pub read_end: bool,
}