#![allow(missing_docs)]
use anyhow::Result;
use clap::{Parser, Subcommand};
use serde::{Deserialize, Serialize};
#[derive(Debug, Deserialize, Serialize)]
#[serde(default)]
struct Config {
log_level: librebar::config::LogLevel,
greeting: String,
name: String,
}
impl Default for Config {
fn default() -> Self {
Self {
log_level: librebar::config::LogLevel::Info,
greeting: "hello".to_string(),
name: "world".to_string(),
}
}
}
#[derive(Parser)]
#[command(name = "minimal", about = "Smallest idiomatic librebar app")]
struct Cli {
#[command(flatten)]
common: librebar::cli::CommonArgs,
#[command(subcommand)]
command: Option<Command>,
}
#[derive(Subcommand)]
enum Command {
Hello,
Info,
}
fn main() -> Result<()> {
let cli = Cli::parse();
cli.common.apply_color();
cli.common.apply_chdir()?;
let app = librebar::init("minimal")
.with_version(env!("CARGO_PKG_VERSION"))
.with_cli(cli.common)
.config::<Config>()
.logging()
.start()?;
let config = app.config();
match cli.command.unwrap_or(Command::Info) {
Command::Hello => {
tracing::info!(
greeting = %config.greeting,
name = %config.name,
"greeted",
);
println!("{}, {}!", config.greeting, config.name);
}
Command::Info => {
tracing::debug!("reporting app state");
println!("app: {} v{}", app.app_name(), app.version());
println!("sources: {:?}", app.config_sources());
println!(
"log dir: {:?}",
librebar::logging::platform_log_dir(app.app_name())
);
println!(
"config: greeting={:?} name={:?}",
config.greeting, config.name
);
}
}
Ok(())
}