1mod echo_bft_binding;
2
3use std::env::args;
4use std::io::Write;
5
6use anyhow::Result;
7
8use clap::Parser;
9
10use crate::echo_bft_binding::EchoBftBinding;
11use bft_bench_core::BftBinding;
12
13#[derive(Parser)]
14#[command(author, version, about, long_about = None)]
15struct Cli {
16 #[arg(short, long, value_name = "FILE.toml")]
17 config: std::path::PathBuf,
18}
19
20#[tokio::main]
21async fn main() -> Result<()> {
22 env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info"))
23 .target(env_logger::Target::Stdout)
24 .format(|buf, record| {
25 let ts = buf.timestamp_micros();
26 writeln!(
27 buf,
28 "[{} {}{}{:#} {:?} {} {}:{}] {}",
29 ts,
30 buf.default_level_style(record.level()),
31 record.level(),
32 buf.default_level_style(record.level()),
33 std::thread::current().id(),
34 record.target(),
35 record.file().unwrap_or("<unknown>"),
36 record.line().unwrap_or(0),
37 record.args()
38 )
39 })
40 .init();
41
42 let cli = Cli::parse();
43
44 let settings = config::Config::builder()
45 .add_source(config::File::from(cli.config))
46 .add_source(config::Environment::with_prefix("BENCH"))
47 .build()?;
48
49 let config = settings.try_deserialize::<bft_bench_core::Config>()?;
50
51 log::info!(
52 "'{}' starting, configuration loaded: {:?}",
53 args().next().unwrap(),
54 config
55 );
56
57 let sc_binding = EchoBftBinding::new(&config);
58
59 log::info!("Starting benchmark");
60
61 log::info!(
62 "Benchmark completed, stats follow: {}",
63 bft_bench_core::run(config, sc_binding).await?
64 );
65
66 Ok(())
67}