From eebb4ca762763b2aeb91bd55a3d52533b807692d Mon Sep 17 00:00:00 2001 From: George Kaklamanos Date: Fri, 24 Nov 2023 18:05:26 +0200 Subject: [PATCH] main: Add cli arguments as a configuration source --- labadoor/Cargo.toml | 1 + labadoor/src/cli.rs | 8 ++++---- labadoor/src/main.rs | 29 +++++++++++++++++++++-------- 3 files changed, 26 insertions(+), 12 deletions(-) diff --git a/labadoor/Cargo.toml b/labadoor/Cargo.toml index a162b47..0a40b5a 100644 --- a/labadoor/Cargo.toml +++ b/labadoor/Cargo.toml @@ -13,6 +13,7 @@ labadoor-auth = { path = "../labadoor-auth", optional = true } labadoor-acl = { path = "../labadoor-acl" } serde = { version = "1.0.164", features = ["derive"] } config = "0.13.3" +toml = "0.8.8" [features] telegram = ["dep:labadoor-telegram"] diff --git a/labadoor/src/cli.rs b/labadoor/src/cli.rs index b543596..cb97039 100644 --- a/labadoor/src/cli.rs +++ b/labadoor/src/cli.rs @@ -1,5 +1,5 @@ use clap::Parser; -use serde::Deserialize; +use serde::{Deserialize, Serialize}; #[derive(Parser, Debug)] pub struct Cli { @@ -20,14 +20,14 @@ pub enum Command { } #[cfg(feature = "telegram")] -#[derive(Deserialize, Parser, Debug)] +#[derive(Serialize, Deserialize, Parser, Debug)] pub struct Telegram { #[clap(short, long)] pub token: Option, } #[cfg(feature = "matrix")] -#[derive(Deserialize, Parser, Debug)] +#[derive(Serialize, Deserialize, Parser, Debug)] pub struct Matrix { #[clap(short, long)] pub username: Option, @@ -38,7 +38,7 @@ pub struct Matrix { } #[cfg(feature = "gpio")] -#[derive(Deserialize, Parser, Debug)] +#[derive(Serialize, Deserialize, Parser, Debug)] pub struct GPIO { #[clap(short, long)] pub device: Option, diff --git a/labadoor/src/main.rs b/labadoor/src/main.rs index 6763a5b..f79134c 100644 --- a/labadoor/src/main.rs +++ b/labadoor/src/main.rs @@ -2,32 +2,45 @@ mod cli; mod to_config; use to_config::ToConfig; +macro_rules! add_cliargs { + ($d:ident,$section:expr,$i:ident) => { + $d.add_source(config::File::from_str( + &format!("[{}]\n{}", $section, toml::to_string($i).unwrap()), + config::FileFormat::Toml, + )) + .build() + .unwrap() + }; +} + fn main() { let cli = cli::parse(); let config = config::Config::builder() - .add_source(config::File::with_name("./config.toml").required(false)) - .add_source(config::Environment::with_prefix("LABADOOR").separator("_")) - .build() - .unwrap(); + .add_source(config::File::with_name(path).required(false)) + .add_source(config::Environment::with_prefix("LABADOOR").separator("_")); match &cli.command { #[cfg(feature = "telegram")] - cli::Command::Telegram(_) => { + cli::Command::Telegram(cliargs) => { + let config = add_cliargs!(config, "telegram", cliargs); let telegram = config.get::("telegram").unwrap().to_config(); labadoor_telegram::telegram(telegram); } #[cfg(feature = "matrix")] - cli::Command::Matrix(_) => { + cli::Command::Matrix(cliargs) => { + let config = add_cliargs!(config, "matrix", cliargs); let matrix = config.get::("matrix").unwrap().to_config(); labadoor_matrix::matrix(matrix); } #[cfg(feature = "gpio")] - cli::Command::GPIO(_) => { + cli::Command::GPIO(cliargs) => { + let config = add_cliargs!(config, "gpio", cliargs); let gpio = config.get::("gpio").unwrap().to_config(); labadoor_gpio::gpio(gpio); } #[cfg(feature = "auth")] cli::Command::Auth(cli) => { - labadoor_auth::auth(cli, config); + let config = config.build().unwrap(); + labadoor_auth::auth(&cli, config); } } }