use crate::commands::{ClapArgs, Configurable, Executable}; use crate::config::AppConfig; use crate::container::Container; use anyhow::Result; use async_trait::async_trait; use config::ConfigBuilder; use config::builder::DefaultState; use serde::Deserialize; #[derive(Debug, Deserialize, Clone)] pub struct Config { pub name: String, pub path: String, } #[derive(ClapArgs, Debug, Clone)] pub struct ImportDictCmd { #[arg(long, help = defaults::HELP_IMPORT_DICT_NAME)] pub name: String, #[arg(long, help = defaults::HELP_IMPORT_DICT_INPUT)] pub path: String, } impl Configurable for ImportDictCmd { fn apply_defaults( &self, builder: ConfigBuilder, ) -> Result> { builder .set_default("import_dict.name", defaults::IMPORT_DICT_NAME)? .set_default("import_dict.path", defaults::IMPORT_DICT_PATH) .map_err(Into::into) } fn apply_overrides( &self, builder: ConfigBuilder, ) -> Result> { builder .set_override("import_dict.name", self.name.clone())? .set_override("import_dict.path", self.path.clone()) .map_err(Into::into) } } #[async_trait] impl Executable for ImportDictCmd { async fn execute(&self, config: &AppConfig, container: &Container) -> Result<()> { let config = config .import_dict .as_ref() .expect("ImportDict config not set"); let importer = container.create_dict_importer(&config.name).await?; // Importer expects an impl DictSource // We need to create a DictSource from the path use applib::JsonFileDictSource; let source = JsonFileDictSource::new(&config.path)?; importer.import(source).await?; Ok(()) } } mod defaults { use const_format::formatcp; pub const IMPORT_DICT_NAME: &str = ""; pub const IMPORT_DICT_PATH: &str = ""; pub const HELP_IMPORT_DICT_NAME: &str = formatcp!("Dictionary name"); pub const HELP_IMPORT_DICT_INPUT: &str = formatcp!("Dictionary file path"); }