#![forbid(unsafe_code)]
use clap::Parser;
use miette::ErrorHook;
use cedar_policy_cli::{
authorize, check_parse, evaluate, format_policies, language_version, link, new,
partial_authorize, run_tests, symcc, tpe, translate_policy, translate_schema, validate,
visualize, CedarExitCode, Cli, Commands, ErrorFormat,
};
fn main() -> CedarExitCode {
let cli = Cli::parse();
let err_hook: Option<ErrorHook> = match cli.err_fmt {
ErrorFormat::Human => None, ErrorFormat::Plain => Some(Box::new(|_| {
Box::new(miette::NarratableReportHandler::new())
})),
ErrorFormat::Json => Some(Box::new(|_| Box::new(miette::JSONReportHandler::new()))),
};
if let Some(err_hook) = err_hook {
#[expect(
clippy::expect_used,
reason = "`set_hook` returns an error if a hook has already been installed. We have just entered `main`, so we know a hook has not been installed"
)]
miette::set_hook(err_hook).expect("failed to install error-reporting hook");
}
match cli.command {
Commands::Authorize(args) => authorize(&args),
Commands::Evaluate(args) => evaluate(&args).0,
Commands::CheckParse(args) => check_parse(&args),
Commands::Validate(args) => validate(&args),
Commands::Format(args) => format_policies(&args),
Commands::Link(args) => link(&args),
Commands::TranslatePolicy(args) => translate_policy(&args),
Commands::Visualize(args) => visualize(&args),
Commands::TranslateSchema(args) => translate_schema(&args),
Commands::New(args) => new(&args),
Commands::PartiallyAuthorize(args) => partial_authorize(&args),
Commands::Tpe(args) => tpe(&args),
Commands::RunTests(args) => run_tests(&args),
Commands::Symcc(args) => symcc(&args),
Commands::LanguageVersion => language_version(),
}
}