From 21f3b0959193fa064eaedd2e1978ea164d3f97b8 Mon Sep 17 00:00:00 2001 From: chodak166 Date: Wed, 31 Dec 2025 19:27:53 +0100 Subject: [PATCH] WIP: refactor --- app/src/app.rs | 17 +++--- app/src/config.rs | 86 +++++++++++++++++----------- lib/src/presentation/cli/defaults.rs | 47 +++++++++------ 3 files changed, 91 insertions(+), 59 deletions(-) diff --git a/app/src/app.rs b/app/src/app.rs index 0067796..6eaf573 100644 --- a/app/src/app.rs +++ b/app/src/app.rs @@ -38,22 +38,23 @@ impl Application { pub async fn run(self) -> Result<()> { match self.command { Command::Server(_) => { - commands::server::run(self.config.server, Self::wait_for_shutdown_signal()).await; + let config = self.config.server.expect("Server config not set"); + commands::server::run(config, Self::wait_for_shutdown_signal()).await; } Command::Decode(_) => { - commands::decode::run(self.config.decoder).await; + let config = self.config.decoder.expect("Decoder config not set"); + commands::decode::run(config).await; } Command::Encode(_) => { + let config = self.config.encoder.expect("Encoder config not set"); let repo = self.container.create_dict_repo("demo_pl").await?; - commands::encode::run(self.config.encoder, repo.as_ref()).await; + commands::encode::run(config, repo.as_ref()).await; } Command::ImportDict(_) => { - let importer = self - .container - .create_dict_importer(&self.config.import_dict.name) - .await?; - commands::import_dict::run(self.config.import_dict, importer).await?; + let config = self.config.import_dict.expect("ImportDict config not set"); + let importer = self.container.create_dict_importer(&config.name).await?; + commands::import_dict::run(config, importer).await?; } } Ok(()) diff --git a/app/src/config.rs b/app/src/config.rs index 28c5a16..5c5e46d 100644 --- a/app/src/config.rs +++ b/app/src/config.rs @@ -2,15 +2,19 @@ use anyhow::{Context, Result}; use config::{Config, Environment, File}; use serde::Deserialize; -use applib::cli::{Command, GlobalArgs, defaults::set_defaults}; +use applib::cli::{Command, GlobalArgs, defaults::set_command_defaults}; use applib::config::*; #[derive(Debug, Deserialize, Clone)] pub struct AppConfig { - pub server: ServerConfig, - pub decoder: DecoderConfig, - pub encoder: EncoderConfig, - pub import_dict: ImportDictConfig, + #[serde(default)] + pub server: Option, + #[serde(default)] + pub decoder: Option, + #[serde(default)] + pub encoder: Option, + #[serde(default)] + pub import_dict: Option, pub log_level: String, } @@ -18,8 +22,8 @@ impl AppConfig { pub fn build(args: &GlobalArgs, command: &Command) -> Result { let mut builder = Config::builder(); - // Defaults - builder = set_defaults(builder)?; + // Command-specific defaults + builder = set_command_defaults(builder, command)?; // File Layer let config_path = &args.config; @@ -31,33 +35,7 @@ impl AppConfig { builder = builder.add_source(Environment::with_prefix("APP").separator("_")); // CLI Overrides Layer - if let Some(ref level) = args.log_level { - builder = builder.set_override("log_level", level.clone())?; - } - - match command { - Command::Server(cmd_args) => { - if let Some(port) = cmd_args.port { - builder = builder.set_override("server.port", port)?; - } - } - Command::Decode(cmd_args) => { - if let Some(name) = &cmd_args.system { - builder = builder.set_override("decoder.system", name.as_str())?; - } - builder = builder.set_override("decoder.input", cmd_args.input.clone())?; - } - Command::Encode(cmd_args) => { - if let Some(name) = &cmd_args.system { - builder = builder.set_override("encoder.system", name.as_str())?; - } - builder = builder.set_override("encoder.input", cmd_args.input.clone())?; - } - Command::ImportDict(cmd_args) => { - builder = builder.set_override("import_dict.name", cmd_args.name.clone())?; - builder = builder.set_override("import_dict.path", cmd_args.path.clone())?; - } - } + builder = apply_cli_overrides(builder, args, command)?; builder .build() @@ -66,3 +44,43 @@ impl AppConfig { .context("Failed to deserialize Config") } } + +fn apply_cli_overrides( + builder: config::ConfigBuilder, + args: &GlobalArgs, + command: &Command, +) -> Result> { + let mut builder = builder; + + // Global log level override + if let Some(ref level) = args.log_level { + builder = builder.set_override("log_level", level.clone())?; + } + + // Command-specific overrides + match command { + Command::Server(cmd_args) => { + if let Some(port) = cmd_args.port { + builder = builder.set_override("server.port", port)?; + } + } + Command::Decode(cmd_args) => { + if let Some(name) = &cmd_args.system { + builder = builder.set_override("decoder.system", name.as_str())?; + } + builder = builder.set_override("decoder.input", cmd_args.input.clone())?; + } + Command::Encode(cmd_args) => { + if let Some(name) = &cmd_args.system { + builder = builder.set_override("encoder.system", name.as_str())?; + } + builder = builder.set_override("encoder.input", cmd_args.input.clone())?; + } + Command::ImportDict(cmd_args) => { + builder = builder.set_override("import_dict.name", cmd_args.name.clone())?; + builder = builder.set_override("import_dict.path", cmd_args.path.clone())?; + } + } + + Ok(builder) +} diff --git a/lib/src/presentation/cli/defaults.rs b/lib/src/presentation/cli/defaults.rs index e4cce72..5048cc3 100644 --- a/lib/src/presentation/cli/defaults.rs +++ b/lib/src/presentation/cli/defaults.rs @@ -3,6 +3,8 @@ pub use config::ConfigBuilder; use const_format::formatcp; +use crate::cli::Command; + pub const HOST: &str = "127.0.0.1"; pub const PORT: u16 = 8080; pub const LOG_LEVEL: &str = "info"; @@ -19,23 +21,34 @@ pub const HELP_ENC_INPUT: &str = formatcp!("Number to encode"); pub const HELP_IMPORT_DICT_NAME: &str = formatcp!("Dictionary name"); pub const HELP_IMPORT_DICT_INPUT: &str = formatcp!("Dictionary file path"); -pub fn set_defaults( +pub fn set_command_defaults( builder: ConfigBuilder, + command: &Command, ) -> Result> { - builder - .set_default("log_level", LOG_LEVEL)? - // Server - .set_default("server.host", HOST)? - .set_default("server.port", PORT)? - // Decoder - .set_default("decoder.system", SYSTEM_NAME)? - .set_default("decoder.input", "")? - // Encoder - .set_default("encoder.system", SYSTEM_NAME)? - .set_default("encoder.input", "")? - // Import Dict - .set_default("import_dict.name", IMPORT_DICT_NAME)? - .set_default("import_dict.path", IMPORT_DICT_PATH) - // Wrapping in Result - .map_err(|e| e.into()) + let mut builder = builder.set_default("log_level", LOG_LEVEL)?; + + match command { + Command::Server(_) => { + builder = builder + .set_default("server.host", HOST)? + .set_default("server.port", PORT)?; + } + Command::Decode(_) => { + builder = builder + .set_default("decoder.system", SYSTEM_NAME)? + .set_default("decoder.input", "")?; + } + Command::Encode(_) => { + builder = builder + .set_default("encoder.system", SYSTEM_NAME)? + .set_default("encoder.input", "")?; + } + Command::ImportDict(_) => { + builder = builder + .set_default("import_dict.name", IMPORT_DICT_NAME)? + .set_default("import_dict.path", IMPORT_DICT_PATH)?; + } + } + + Ok(builder) }