extern crate cshannon;
use std::path::PathBuf;
use anyhow::Result;
use clap::{Parser, Subcommand};
use cshannon::{Command, CompressArgs, DecompressArgs, EncodingScheme, TokenizationScheme};
use env_logger::Env;
#[derive(Parser)]
#[command(version, about, long_about=None, author)]
#[command(propagate_version = true)]
struct Cli {
#[arg(short, long)]
input_file: PathBuf,
#[arg(short, long)]
output_file: PathBuf,
#[command(subcommand)]
command: Commands,
}
#[derive(Subcommand)]
enum Commands {
Compress {
#[arg(short, long)]
tokenization: TokenizationSchemeArg,
#[arg(short, long)]
encoding: EncodingSchemeArg,
},
Decompress,
}
#[derive(clap::ValueEnum, Clone, Debug)]
enum TokenizationSchemeArg {
Byte,
Word,
Grapheme,
}
#[derive(clap::ValueEnum, Clone, Debug)]
enum EncodingSchemeArg {
BalancedTree,
Fano,
Shannon,
Huffman,
}
fn main() -> Result<()> {
env_logger::Builder::from_env(Env::default().default_filter_or("warn")).init();
let cli = Cli::parse();
let command = match &cli.command {
Commands::Compress {
encoding,
tokenization,
} => Command::Compress(CompressArgs {
encoding_scheme: to_encoding_scheme(&encoding),
tokenization_scheme: to_tokenization_scheme(tokenization),
}),
Commands::Decompress => Command::Decompress(DecompressArgs {}),
};
cshannon::run(cshannon::Args {
command,
input_file: &cli.input_file,
output_file: &cli.output_file,
})?;
println!("Success");
Ok(())
}
fn to_encoding_scheme(encoding: &EncodingSchemeArg) -> EncodingScheme {
match encoding {
EncodingSchemeArg::BalancedTree => EncodingScheme::BalancedTree,
EncodingSchemeArg::Fano => EncodingScheme::Fano,
EncodingSchemeArg::Shannon => EncodingScheme::Shannon,
EncodingSchemeArg::Huffman => EncodingScheme::Huffman,
}
}
fn to_tokenization_scheme(tokenization: &TokenizationSchemeArg) -> TokenizationScheme {
match tokenization {
TokenizationSchemeArg::Byte => TokenizationScheme::Byte,
TokenizationSchemeArg::Grapheme => TokenizationScheme::Grapheme,
TokenizationSchemeArg::Word => TokenizationScheme::Word,
}
}