use std::path::PathBuf;
use coreminer::debugger::Debugger;
use coreminer::errors::DebuggerError;
use coreminer::ui::cli::CliUi;
use clap::Parser;
use tracing::trace;
#[derive(Parser, Debug)]
#[command(
author,
version,
about,
long_about,
help_template = r#"{about-section}
{usage-heading} {usage}
{all-args}{tab}
{name}: v{version}
Authors: {author-with-newline}
"#
)]
struct Args {
default_executable: Option<PathBuf>,
#[arg(short, long)]
quiet: bool,
#[arg(long)]
logfile: Option<PathBuf>,
}
fn main() -> Result<(), DebuggerError> {
let args = Args::parse();
if !args.quiet {
setup(args.logfile);
}
let ui = CliUi::build(args.default_executable.as_deref())?;
let mut debug: Debugger<CliUi> = Debugger::build(ui)?;
debug.run_debugger()?;
debug.cleanup()?;
Ok(())
}
fn setup(logfile: Option<PathBuf>) {
human_panic::setup_panic!();
if let Some(lf) = logfile {
let file = match std::fs::File::options().create(true).append(true).open(lf) {
Ok(f) => f,
Err(e) => {
eprintln!("could not setup logfile: {e}");
std::process::exit(1);
}
};
let subscriber = tracing_subscriber::fmt()
.with_max_level(
#[cfg(debug_assertions)]
tracing::Level::TRACE,
#[cfg(not(debug_assertions))]
tracing::Level::INFO,
)
.without_time()
.with_file(false)
.with_target(false)
.with_writer(file)
.finish();
tracing::subscriber::set_global_default(subscriber).expect("could not setup logger");
} else {
let subscriber = tracing_subscriber::fmt()
.with_max_level(
#[cfg(debug_assertions)]
tracing::Level::TRACE,
#[cfg(not(debug_assertions))]
tracing::Level::INFO,
)
.without_time()
.with_file(false)
.with_target(false)
.with_writer(std::io::stderr)
.finish();
tracing::subscriber::set_global_default(subscriber).expect("could not setup logger");
}
trace!("set up the logger");
}