diff --git a/src/config.rs b/src/config.rs index 55e9110..0be5adf 100644 --- a/src/config.rs +++ b/src/config.rs @@ -3,7 +3,7 @@ use std::fs; use anyhow::{Result, Context}; use serde::{Deserialize, Serialize}; use log::debug; -use crate::args::{Args, KeyValue}; +use crate::args::{Args}; #[derive(Debug, Clone, Deserialize, Serialize)] pub struct ColumnConfig { @@ -87,7 +87,7 @@ impl Settings { ColumnConfig { name, label } }) .collect(); - config_builder = config_builder.set_override("list_format", columns)?; + config_builder = config_builder.set_override("list_format", serde_json::to_value(columns)?)?; } if args.options.human_readable { @@ -95,7 +95,7 @@ impl Settings { } if let Some(output_format) = &args.options.output_format { - config_builder = config_builder.set_override("output_format", output_format)?; + config_builder = config_builder.set_override("output_format", output_format.as_str())?; } if args.options.verbose > 0 { @@ -111,15 +111,15 @@ impl Settings { } if let Some(server_password) = &args.options.server_password { - config_builder = config_builder.set_override("server.password", server_password)?; + config_builder = config_builder.set_override("server.password", server_password.as_str())?; } if let Some(server_password_hash) = &args.options.server_password_hash { - config_builder = config_builder.set_override("server.password_hash", server_password_hash)?; + config_builder = config_builder.set_override("server.password_hash", server_password_hash.as_str())?; } if let Some(server_address) = &args.mode.server_address { - config_builder = config_builder.set_override("server.address", server_address)?; + config_builder = config_builder.set_override("server.address", server_address.as_str())?; } if let Some(server_port) = args.mode.server_port { @@ -127,11 +127,11 @@ impl Settings { } if let Some(compression) = &args.item.compression { - config_builder = config_builder.set_override("compression_plugin.name", compression)?; + config_builder = config_builder.set_override("compression_plugin.name", compression.as_str())?; } if let Some(digest) = &args.item.digest { - config_builder = config_builder.set_override("digest", digest)?; + config_builder = config_builder.set_override("digest", digest.as_str())?; } if !args.item.meta_plugins.is_empty() { @@ -139,7 +139,7 @@ impl Settings { .iter() .map(|name| MetaPluginConfig { name: name.clone() }) .collect(); - config_builder = config_builder.set_override("meta_plugins", meta_plugins)?; + config_builder = config_builder.set_override("meta_plugins", serde_json::to_value(meta_plugins)?)?; } let config = config_builder.build()?; diff --git a/src/main.rs b/src/main.rs index c12efe9..4f84d73 100644 --- a/src/main.rs +++ b/src/main.rs @@ -21,7 +21,6 @@ pub mod db; pub mod plugins; pub mod meta_plugin; pub mod common; -//pub mod item; extern crate term; extern crate serde_json; @@ -29,7 +28,7 @@ extern crate serde_yaml; extern crate serde; use args::{Args, NumberOrString}; -use config::{Config, Settings}; +use config::Settings; /** * Main function to handle command-line arguments and execute the appropriate mode. @@ -138,7 +137,7 @@ fn main() -> Result<(), Error> { } // Validate server password usage - if settings.server_password.is_some() && mode != KeepModes::Server { + if settings.server_password().is_some() && mode != KeepModes::Server { cmd.error( ErrorKind::InvalidValue, "--server-password can only be used with --server mode" @@ -160,44 +159,4 @@ fn main() -> Result<(), Error> { db_path.push("keep-1.db"); debug!("MAIN: Data directory: {:?}", data_path); - debug!("MAIN: DB file: {:?}", db_path); - - fs::create_dir_all(data_path.clone()).context("Problem creating data directory")?; - debug!("MAIN: Data directory created or already exists"); - - let mut conn = db::open(db_path.clone()).context("Problem opening database")?; - debug!("MAIN: DB opened successfully"); - - match mode { - KeepModes::Save => { - crate::modes::save::mode_save(&mut cmd, &settings, &config, ids, tags, &mut conn, data_path)? - } - KeepModes::Get => { - crate::modes::get::mode_get(&mut cmd, &settings, &config, ids, tags, &mut conn, data_path)? - } - KeepModes::Diff => { - crate::modes::diff::mode_diff(&mut cmd, &settings, &config, ids, tags, &mut conn, data_path)? - } - KeepModes::List => { - crate::modes::list::mode_list(&mut cmd, &settings, &config, ids, tags, &mut conn, data_path)? - } - KeepModes::Update => { - crate::modes::update::mode_update(&mut cmd, &settings, &config, ids, tags, &mut conn, data_path)? - } - KeepModes::Info => { - crate::modes::info::mode_info(&mut cmd, &settings, &config, ids, tags, &mut conn, data_path)? - } - KeepModes::Delete => { - crate::modes::delete::mode_delete(&mut cmd, &settings, &config, ids, tags, &mut conn, data_path)? - } - KeepModes::Status => { - crate::modes::status::mode_status(&mut cmd, &settings, &config, data_path, db_path)? - } - KeepModes::Server => { - crate::modes::server::mode_server(&mut cmd, &settings, &config, &mut conn, data_path)? - } - KeepModes::Unknown => todo!(), - } - - Ok(()) -} + debug!("MAIN: DB file: {:?}", db_path); \ No newline at end of file diff --git a/src/modes/get.rs b/src/modes/get.rs index f603444..a86df32 100644 --- a/src/modes/get.rs +++ b/src/modes/get.rs @@ -12,7 +12,6 @@ use is_terminal::IsTerminal; pub fn mode_get( cmd: &mut Command, settings: &config::Settings, - _config: &config::Settings, ids: &mut Vec, tags: &mut Vec, conn: &mut rusqlite::Connection, @@ -25,9 +24,12 @@ pub fn mode_get( } let mut meta: std::collections::HashMap = std::collections::HashMap::new(); - for item in settings.meta.iter() { - let item = item.clone(); - meta.insert(item.key, item.value); + // Collect metadata from environment variables + for (key, value) in std::env::vars() { + if key.starts_with("KEEP_META_") && key != "KEEP_META_PLUGINS" { + let meta_name = key.strip_prefix("KEEP_META_").unwrap(); + meta.insert(meta_name.to_string(), value); + } } let item_maybe = match tags.is_empty() && meta.is_empty() { diff --git a/src/modes/info.rs b/src/modes/info.rs index b1a4d78..38a89f7 100644 --- a/src/modes/info.rs +++ b/src/modes/info.rs @@ -21,7 +21,6 @@ use prettytable::{Attr, Cell, Row, Table}; pub fn mode_info( cmd: &mut Command, settings: &config::Settings, - _config: &config::Settings, ids: &mut Vec, tags: &mut Vec, conn: &mut rusqlite::Connection, @@ -34,9 +33,12 @@ pub fn mode_info( } let mut meta: std::collections::HashMap = std::collections::HashMap::new(); - for item in settings.meta.iter() { - let item = item.clone(); - meta.insert(item.key, item.value); + // Collect metadata from environment variables + for (key, value) in std::env::vars() { + if key.starts_with("KEEP_META_") && key != "KEEP_META_PLUGINS" { + let meta_name = key.strip_prefix("KEEP_META_").unwrap(); + meta.insert(meta_name.to_string(), value); + } } let item_maybe = match tags.is_empty() && meta.is_empty() { diff --git a/src/modes/list.rs b/src/modes/list.rs index b70f741..3843a55 100644 --- a/src/modes/list.rs +++ b/src/modes/list.rs @@ -29,7 +29,6 @@ struct ListItem { pub fn mode_list( cmd: &mut clap::Command, settings: &config::Settings, - _config: &config::Config, ids: &mut Vec, tags: &Vec, conn: &mut rusqlite::Connection, @@ -44,9 +43,12 @@ pub fn mode_list( } let mut meta: std::collections::HashMap = std::collections::HashMap::new(); - for item in settings.meta.iter() { - let item = item.clone(); - meta.insert(item.key, item.value); + // Collect metadata from environment variables + for (key, value) in std::env::vars() { + if key.starts_with("KEEP_META_") && key != "KEEP_META_PLUGINS" { + let meta_name = key.strip_prefix("KEEP_META_").unwrap(); + meta.insert(meta_name.to_string(), value); + } } let items = match tags.is_empty() && meta.is_empty() { diff --git a/src/modes/save.rs b/src/modes/save.rs index 68d3079..b273fb3 100644 --- a/src/modes/save.rs +++ b/src/modes/save.rs @@ -139,10 +139,8 @@ fn collect_item_meta(settings: &config::Settings) -> std::collections::HashMap, tags: &mut Vec, conn: &mut rusqlite::Connection, diff --git a/src/modes/server.rs b/src/modes/server.rs index 820b064..7b90e69 100644 --- a/src/modes/server.rs +++ b/src/modes/server.rs @@ -3,7 +3,7 @@ use axum::{ Router, }; use clap::Command; -use log::{debug, info, warn}; +use log::{debug, info}; use std::net::SocketAddr; use std::path::PathBuf; use std::sync::Arc; @@ -22,23 +22,22 @@ pub use common::{ServerConfig, AppState, logging_middleware, create_auth_middlew pub fn mode_server( _cmd: &mut Command, settings: &config::Settings, - config: &config::Settings, conn: &mut rusqlite::Connection, data_path: PathBuf, ) -> Result<()> { // Get server address from args or config with default - let server_address = if let Some(addr) = &settings.server_address { + let server_address = if let Some(addr) = &settings.server_address() { addr.clone() - } else if let Some(server_config) = &config.server { + } else if let Some(server_config) = &settings.server { server_config.address.clone().unwrap_or_else(|| "127.0.0.1".to_string()) } else { "127.0.0.1".to_string() }; // Get server port from args or config with default - let server_port = if let Some(port) = settings.server_port { + let server_port = if let Some(port) = settings.server_port() { port - } else if let Some(server_config) = &config.server { + } else if let Some(server_config) = &settings.server { server_config.port.unwrap_or(21080) } else { 21080 @@ -47,8 +46,8 @@ pub fn mode_server( let server_config = common::ServerConfig { address: server_address, port: Some(server_port), - password: settings.server_password.clone(), - password_hash: settings.server_password_hash.clone(), + password: settings.server_password(), + password_hash: settings.server_password_hash(), }; // We need to move the connection into the async runtime diff --git a/src/modes/status.rs b/src/modes/status.rs index f8b9ae3..1b5f43d 100644 --- a/src/modes/status.rs +++ b/src/modes/status.rs @@ -123,7 +123,6 @@ fn build_meta_plugin_table(meta_plugin_info: &Vec) -> Table { pub fn mode_status( _cmd: &mut Command, settings: &config::Settings, - _config: &config::Settings, data_path: PathBuf, db_path: PathBuf, ) -> Result<(), anyhow::Error> { @@ -145,7 +144,7 @@ pub fn mode_status( } // Determine which compression type would be enabled for a save operation - let enabled_compression_type = if let Some(compression_name) = &settings.compression { + let enabled_compression_type = if let Some(compression_name) = &settings.compression() { CompressionType::from_str(compression_name).ok() } else { Some(crate::compression_engine::default_compression_type()) diff --git a/src/modes/update.rs b/src/modes/update.rs index a867d58..427a50b 100644 --- a/src/modes/update.rs +++ b/src/modes/update.rs @@ -15,7 +15,6 @@ use rusqlite::Connection; pub fn mode_update( cmd: &mut Command, settings: &config::Settings, - _config: &config::Settings, ids: &mut Vec, tags: &mut Vec, conn: &mut Connection, @@ -117,9 +116,6 @@ pub fn mode_update( } } - // Meta data is now in args.item.meta, not settings - // This functionality seems to have been moved elsewhere or removed - // Commit the transaction tx.commit()?;