mod args;
mod config;
mod model;
mod parse;
mod print;
mod resolver;
mod result;
mod run;
mod trace;
#[cfg(test)]
mod tests;
use crate::{args::Args, run::RunError};
use std::{
io::{stderr, Write},
process,
};
const PROGRAM_NAME: &str = env!("CARGO_BIN_NAME");
#[tokio::main(flavor = "current_thread")]
async fn main() {
let args = match Args::parse() {
Ok(args) => args,
Err(e) => {
let _ = writeln!(stderr(), "{PROGRAM_NAME}: {e}");
process::exit(1);
}
};
let Args { config, sender, ip } = args;
if let Err(e) = run::run_trace(config, sender, ip, None).await {
match e {
RunError::Boxed(e) => {
let _ = writeln!(stderr(), "{PROGRAM_NAME}: {e}");
process::exit(1);
}
RunError::Internal(e) => {
let _ = writeln!(stderr(), "{PROGRAM_NAME}: internal error: {e}");
process::exit(2);
}
}
}
}