use std::path::PathBuf;
use clap::{CommandFactory, Parser, Subcommand};
use clap_complete::{Shell, generate};
use crate::commands::{command_axml, command_extract, command_repack, command_show};
#[global_allocator]
static GLOBAL_ALLOC: mimalloc::MiMalloc = mimalloc::MiMalloc;
mod commands;
#[derive(Parser)]
#[command(version, about, arg_required_else_help(true))]
struct Cli {
#[command(subcommand)]
commands: Option<Commands>,
}
#[derive(Subcommand)]
enum Commands {
Show {
#[arg(required = true)]
paths: Vec<PathBuf>,
#[arg(
short,
long,
default_value_t = false,
help = "Show information about signatures"
)]
sigs: bool,
#[arg(short, long, default_value_t = false, help = "Show output as jsonl")]
json: bool,
},
#[command(visible_alias = "x")]
Extract {
#[arg(required = true)]
paths: Vec<PathBuf>,
#[arg(short, long)]
output: Option<PathBuf>,
#[arg(short, long)]
files: Vec<String>,
#[arg(short, long, default_value_t = false)]
verbose: bool,
#[arg(short, long, default_value_t = false)]
resources: bool,
#[arg(short, long, default_value_t = false)]
list: bool,
},
Axml {
#[arg(required = true)]
path: PathBuf,
},
Repack {
#[arg(required = true)]
paths: Vec<PathBuf>,
#[arg(short, long, value_name = "FILE")]
output: Option<PathBuf>,
#[arg(short = 'd', long, value_name = "DIR")]
output_dir: Option<PathBuf>,
},
Completion {
#[arg(value_enum)]
shell: Shell,
},
}
fn main() {
env_logger::init();
let cli = Cli::parse();
let result = match &cli.commands {
Some(Commands::Show { paths, sigs, json }) => command_show(paths, sigs, json),
Some(Commands::Extract {
paths,
output,
files,
verbose,
resources,
list,
}) => command_extract(paths, output, files, *verbose, *resources, *list),
Some(Commands::Axml { path }) => command_axml(path),
Some(Commands::Repack {
paths,
output,
output_dir,
}) => command_repack(paths, output, output_dir),
Some(Commands::Completion { shell }) => {
let mut cmd = Cli::command();
let name = cmd.get_name().to_string();
generate(*shell, &mut cmd, name, &mut std::io::stdout());
Ok(())
}
None => Ok(()),
};
if let Err(err) = result {
eprintln!("{:#}", err);
std::process::exit(1);
}
}