use clap::Parser;
use miette::{IntoDiagnostic, Result};
use std::env;
use worterbuch::{Args, Config, run_worterbuch};
fn main() -> Result<()> {
if env::var("WORTERBUCH_SINGLE_THREADED")
.map(|v| v.to_ascii_lowercase())
.as_deref()
== Ok("true")
{
run_single_threaded()
} else {
run_multi_threaded()
}
}
fn run_single_threaded() -> Result<()> {
tokio::runtime::Builder::new_current_thread()
.enable_all()
.build()
.into_diagnostic()?
.block_on(start())?;
Ok(())
}
fn run_multi_threaded() -> Result<()> {
tokio::runtime::Builder::new_multi_thread()
.enable_all()
.build()
.into_diagnostic()?
.block_on(start())?;
Ok(())
}
async fn start() -> Result<()> {
dotenvy::dotenv().ok();
let args = Args::parse();
let config = Config::new(Some(args.clone())).await?;
#[cfg(feature = "telemetry")]
let shutdown_telemetry = {
use worterbuch::telemetry;
let hostname = hostname::get().into_diagnostic()?;
let cluster_role = if args.leader {
Some("leader".to_owned())
} else if args.follower {
Some("follower".to_owned())
} else {
None
};
let drop_guard = telemetry::init(
args.instance_name
.unwrap_or_else(|| hostname.to_string_lossy().into_owned()),
cluster_role,
)
.await?;
move || drop(drop_guard)
};
#[cfg(not(feature = "telemetry"))]
let shutdown_telemetry = {
use worterbuch::logging;
logging::init()?;
move || {
}
};
let cfg = config.clone();
let mut root_builder =
tosub::build_default_root("worterbuch").with_timeout(cfg.shutdown_timeout);
if cfg.follower || cfg.leader || cfg.exit_on_stdin_close {
root_builder = root_builder.shutdown_on_stdin_close();
}
root_builder
.start(async |s| run_worterbuch(s, config).await)
.await?;
shutdown_telemetry();
Ok(())
}