From d5c36155e322b1fddcdb9bd17ca3c04092987dfb Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Thu, 28 Aug 2025 16:57:04 -0300 Subject: [PATCH] feat: add unified status service implementation Co-authored-by: aider (openai/andrew/openrouter/deepseek/deepseek-chat-v3.1) --- src/modes/server/api/status.rs | 17 ++------- src/modes/status.rs | 26 +++----------- src/services/status_service.rs | 64 ++++++++++++++++++++++++++++++++++ 3 files changed, 72 insertions(+), 35 deletions(-) diff --git a/src/modes/server/api/status.rs b/src/modes/server/api/status.rs index 192bab1..b99c58a 100644 --- a/src/modes/server/api/status.rs +++ b/src/modes/server/api/status.rs @@ -33,22 +33,11 @@ pub async fn handle_status( // Get database path let db_path = state.db.lock().await.path().unwrap_or("unknown").to_string(); - // Get all meta plugin types that are supported - let supported_meta_plugins: Vec = MetaPluginType::iter() - .filter(|mpt| { - let plugin = crate::meta_plugin::get_meta_plugin((*mpt).clone(), None, None); - plugin.is_supported() - }) - .collect(); - - // Default to LZ4 compression for the API status endpoint - let enabled_compression_type = Some(CompressionType::LZ4); - - let status_info = generate_status_info( + // Use the status service to generate status info showing all supported plugins + let status_service = crate::services::status_service::StatusService::new(); + let status_info = status_service.generate_supported_status( state.data_dir.clone(), db_path.into(), - &supported_meta_plugins, - enabled_compression_type, ); let response = ApiResponse { diff --git a/src/modes/status.rs b/src/modes/status.rs index 3dc4ff0..e977188 100644 --- a/src/modes/status.rs +++ b/src/modes/status.rs @@ -340,34 +340,18 @@ fn build_meta_plugin_table(meta_plugin_info: &Vec) -> Table { } pub fn mode_status( - _cmd: &mut Command, + cmd: &mut Command, settings: &config::Settings, data_path: PathBuf, db_path: PathBuf, ) -> Result<(), anyhow::Error> { debug!("STATUS: Starting mode_status function"); - // Determine which meta plugins would be enabled for a save operation - debug!("STATUS: Getting meta plugin types from settings"); - let mut meta_plugin_types: Vec = crate::modes::common::settings_meta_plugin_types(_cmd, settings); - debug!("STATUS: Got {} meta plugin types", meta_plugin_types.len()); - - // Always add the Digest plugin if not present - if !meta_plugin_types.contains(&MetaPluginType::Digest) { - meta_plugin_types.push(MetaPluginType::Digest); - } - - // Determine which compression type would be enabled for a save operation - 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()) - }; - + let status_service = crate::services::status_service::StatusService::new(); let output_format = crate::modes::common::settings_output_format(settings); - debug!("STATUS: About to call generate_status_info"); - let status_info = generate_status_info(data_path, db_path, &meta_plugin_types, enabled_compression_type); - debug!("STATUS: generate_status_info completed successfully"); + debug!("STATUS: About to generate status info"); + let status_info = status_service.generate_status(cmd, settings, data_path, db_path); + debug!("STATUS: Status info generated successfully"); match output_format { OutputFormat::Table => { diff --git a/src/services/status_service.rs b/src/services/status_service.rs index e69de29..22ac512 100644 --- a/src/services/status_service.rs +++ b/src/services/status_service.rs @@ -0,0 +1,64 @@ +use crate::common::status::{generate_status_info, StatusInfo}; +use crate::config::Settings; +use crate::meta_plugin::MetaPluginType; +use crate::compression_engine::CompressionType; +use clap::Command; +use std::path::PathBuf; + +pub struct StatusService; + +impl StatusService { + pub fn new() -> Self { + Self + } + + pub fn generate_status( + &self, + cmd: &mut Command, + settings: &Settings, + data_path: PathBuf, + db_path: PathBuf, + ) -> StatusInfo { + // Determine which meta plugins would be enabled for a save operation + let mut meta_plugin_types: Vec = crate::modes::common::settings_meta_plugin_types(cmd, settings); + + // Always add the Digest plugin if not present + if !meta_plugin_types.contains(&MetaPluginType::Digest) { + meta_plugin_types.push(MetaPluginType::Digest); + } + + // Determine which compression type would be enabled for a save operation + 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()) + }; + + generate_status_info(data_path, db_path, &meta_plugin_types, enabled_compression_type) + } + + pub fn generate_supported_status( + &self, + data_path: PathBuf, + db_path: PathBuf, + ) -> StatusInfo { + // Get all meta plugin types that are supported + let supported_meta_plugins: Vec = MetaPluginType::iter() + .filter(|mpt| { + let plugin = crate::meta_plugin::get_meta_plugin((*mpt).clone(), None, None); + plugin.is_supported() + }) + .collect(); + + // Default to LZ4 compression for the API status endpoint + let enabled_compression_type = Some(CompressionType::LZ4); + + generate_status_info(data_path, db_path, &supported_meta_plugins, enabled_compression_type) + } +} + +impl Default for StatusService { + fn default() -> Self { + Self::new() + } +}