bft_bench_echo/
main.rs

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}