43 lines
1.0 KiB
Rust
43 lines
1.0 KiB
Rust
mod tracer;
|
|
|
|
use std::path::PathBuf;
|
|
|
|
use clap::{Parser, Subcommand};
|
|
|
|
#[derive(Parser, Debug)]
|
|
struct Cli {
|
|
#[command(subcommand)]
|
|
cmd: Subcommands,
|
|
}
|
|
|
|
#[derive(Subcommand, Debug, Clone)]
|
|
enum Subcommands {
|
|
Run {
|
|
#[arg(short, long)]
|
|
output: Option<PathBuf>,
|
|
cmd: Vec<String>,
|
|
}
|
|
}
|
|
|
|
fn main() {
|
|
env_logger::init();
|
|
let cli = Cli::parse();
|
|
match cli.cmd {
|
|
Subcommands::Run { output, cmd } => {
|
|
let fp: Box<dyn std::io::Write> = if let Some(output) = &output {
|
|
Box::new(std::fs::File::options().write(true).create(true).open(output).unwrap())
|
|
} else {
|
|
Box::new(std::io::stdout())
|
|
};
|
|
let mut t = tracer::Tracer::new().unwrap();
|
|
t.start_root_process(cmd).unwrap();
|
|
|
|
if output.is_none() {
|
|
serde_json::to_writer_pretty(fp, &t.log).unwrap();
|
|
} else {
|
|
serde_json::to_writer(fp, &t.log).unwrap();
|
|
}
|
|
}
|
|
}
|
|
}
|