pub mod args;
pub mod diff;
pub mod handlers;
pub mod report;
pub mod utils;
use args::Command;
use std::io;
pub fn main() -> io::Result<()> {
report::install_handler()
.map_err(|e| io::Error::other(format!("Failed to install error handler: {e}")))?;
let all_args: Vec<String> = std::env::args().collect();
if all_args.iter().any(|arg| arg == "-h" || arg == "--help") {
args::print_usage();
return Ok(());
}
if all_args.len() < 2 {
eprintln!("Error: No command specified");
args::print_usage();
std::process::exit(1);
}
let command_name = &all_args[1];
let subcommand_args: Vec<&str> = all_args[2..]
.iter()
.map(std::string::String::as_str)
.collect();
let command = match command_name.as_str() {
"replace" => {
let replace_args: args::ReplaceArgs = match facet_args::from_slice(&subcommand_args) {
Ok(args) => args,
Err(e) => {
eprintln!("{}", report::DiagnosticDisplay(&e));
std::process::exit(1);
}
};
Command::Replace(replace_args)
}
"delete" => {
let delete_args: args::DeleteArgs = match facet_args::from_slice(&subcommand_args) {
Ok(args) => args,
Err(e) => {
eprintln!("{}", report::DiagnosticDisplay(&e));
std::process::exit(1);
}
};
Command::Delete(delete_args)
}
"apply" => {
let apply_args: args::ApplyArgs = match facet_args::from_slice(&subcommand_args) {
Ok(args) => args,
Err(e) => {
eprintln!("{}", report::DiagnosticDisplay(&e));
std::process::exit(1);
}
};
Command::Apply(apply_args)
}
_ => {
eprintln!("Error: Unknown command '{command_name}'");
args::print_usage();
std::process::exit(1);
}
};
match command {
Command::Replace(ref replace_args) => handlers::handle_replace(replace_args),
Command::Delete(ref delete_args) => handlers::handle_delete(delete_args),
Command::Apply(ref apply_args) => handlers::handle_apply(apply_args),
}
}