//! File-mode command-line interface for Inkfinite documents. use std::io; use clap::Parser; use inkfinite_cli::cli; use tracing_subscriber::EnvFilter; use tracing_subscriber::fmt::format::FmtSpan; fn main() { init_tracing(); let arguments = std::env::args_os().collect::>(); let json_output = arguments.iter().any(|argument| argument == "--json"); let cli = match cli::Cli::try_parse_from(arguments) { Ok(cli) => cli, Err(error) if json_output && error.exit_code() != 0 => { let diagnostic = serde_json::json!({ "error": { "code": "invalid_usage", "message": error.to_string(), "details": null, "retryable": false, "suggestion": "Run the command with --help to inspect its accepted arguments." } }); eprintln!("{diagnostic}"); std::process::exit(error.exit_code()); } Err(error) => error.exit(), }; let mut stdout = io::stdout().lock(); if let Err(error) = cli::run(cli.command, cli.json, &mut stdout) { if cli.json { eprintln!("{}", error.diagnostic()); } else { eprintln!("inkfinite: {:#}", error.source); } std::process::exit(error.exit_code()); } } fn init_tracing() { let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("off")); let _ = tracing_subscriber::fmt() .with_env_filter(filter) .with_span_events(FmtSpan::CLOSE) .with_writer(std::io::stderr) .try_init(); }