use std::path::PathBuf;
use betamax_core::runner::{RunOptions, Runner};
use betamax_core::tape::Tape;
use clap_stdin::FileOrStdin;
use miette::{IntoDiagnostic, Result};
const ANSI_RESET: &str = "\x1b[0m";
const ANSI_BLUE: &str = "\x1b[34m";
#[derive(Debug, clap::Parser)]
pub struct Run {
input: FileOrStdin,
#[arg(long, short)]
publish: bool,
#[arg(long, short, value_name = "FILE")]
output: Option<PathBuf>,
#[arg(long, short)]
quiet: bool,
}
impl Run {
pub fn run(&self) -> Result<()> {
if !self.quiet {
println!("{ANSI_BLUE}running {}{ANSI_RESET}", self.input.filename());
}
let source = self.input.clone().contents().into_diagnostic()?;
let mut tape = Tape::parse(&source)?;
if let Some(output) = &self.output {
tape.add_output(output.clone());
}
let options = RunOptions {
publish: self.publish,
quiet: self.quiet,
};
Runner::new(options).run(&tape)?;
Ok(())
}
}