use clap::Parser;
use tracing::{debug, info};
use tracing_subscriber::{filter::LevelFilter, EnvFilter, FmtSubscriber};
use ledger_sim::*;
#[derive(Clone, Debug, PartialEq, Parser)]
pub struct Args {
app: String,
#[clap(long, value_enum, default_value = "docker")]
driver: DriverMode,
#[clap(flatten)]
speculos_opts: Options,
#[clap(long, default_value = "debug")]
log_level: LevelFilter,
}
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let args = Args::parse();
info!("Launching speculos...");
let filter = EnvFilter::from_default_env()
.add_directive("bollard=warn".parse()?)
.add_directive(args.log_level.into());
let _ = FmtSubscriber::builder()
.compact()
.without_time()
.with_max_level(args.log_level)
.with_env_filter(filter)
.try_init();
match args.driver {
DriverMode::Local => {
let d = LocalDriver::new();
run_simulator(d, &args.app, args.speculos_opts).await?;
}
DriverMode::Docker => {
let d = DockerDriver::new()?;
run_simulator(d, &args.app, args.speculos_opts).await?;
}
}
Ok(())
}
async fn run_simulator<D: Driver>(driver: D, app: &str, opts: Options) -> anyhow::Result<()> {
let mut h = driver.run(app, opts).await?;
tokio::select!(
_ = driver.wait(&mut h) => {
debug!("Complete!");
}
_ = tokio::signal::ctrl_c() => {
debug!("Exit!");
driver.exit(h).await?;
},
);
Ok(())
}