From bd879100beaf6d62220ad813c32cc0e0d78c320e Mon Sep 17 00:00:00 2001 From: Andrew Phillips Date: Tue, 26 Aug 2025 18:23:02 -0300 Subject: [PATCH] feat: add finalization state tracking to meta plugins Co-authored-by: aider (openai/andrew/openrouter/qwen/qwen3-coder) --- src/meta_plugin.rs | 13 +++++++++++++ src/meta_plugin/binary.rs | 31 +++++++++++++++++++++++++++++++ src/services/meta_service.rs | 32 ++++++++++++++++++++++++++++++++ 3 files changed, 76 insertions(+) diff --git a/src/meta_plugin.rs b/src/meta_plugin.rs index a65f1d9..4bdbf3d 100644 --- a/src/meta_plugin.rs +++ b/src/meta_plugin.rs @@ -161,6 +161,14 @@ pub trait MetaPlugin { true } + // Check if the plugin is already finalized + fn is_finalized(&self) -> bool { + false + } + + // Set the finalized state (only for plugins that can track this) + fn set_finalized(&mut self, _finalized: bool) {} + // Update the meta plugin with new data fn update(&mut self, _data: &[u8]) -> MetaPluginResponse { // Default implementation does nothing @@ -250,6 +258,11 @@ pub trait MetaPlugin { self.configure_outputs(outputs)?; Ok(()) } + + // Method to downcast to concrete type (for checking finalization state) + fn as_any_mut(&mut self) -> &mut dyn std::any::Any { + self + } } pub fn get_meta_plugin(meta_plugin_type: MetaPluginType) -> Box { diff --git a/src/meta_plugin/binary.rs b/src/meta_plugin/binary.rs index 5be8710..3d0365d 100644 --- a/src/meta_plugin/binary.rs +++ b/src/meta_plugin/binary.rs @@ -6,6 +6,7 @@ use crate::meta_plugin::{MetaPlugin, MetaPluginResponse}; pub struct BinaryMetaPlugin { buffer: Vec, max_buffer_size: usize, + is_finalized: bool, base: crate::meta_plugin::BaseMetaPlugin, } @@ -31,6 +32,7 @@ impl BinaryMetaPlugin { BinaryMetaPlugin { buffer: Vec::new(), max_buffer_size, + is_finalized: false, base, } } @@ -41,8 +43,23 @@ impl BinaryMetaPlugin { } impl MetaPlugin for BinaryMetaPlugin { + fn is_finalized(&self) -> bool { + self.is_finalized + } + + fn set_finalized(&mut self, finalized: bool) { + self.is_finalized = finalized; + } fn update(&mut self, data: &[u8]) -> MetaPluginResponse { + // If already finalized, don't process more data + if self.is_finalized { + return MetaPluginResponse { + metadata: Vec::new(), + is_finalized: true, + }; + } + // Calculate how much data we can still accept let remaining_capacity = self.max_buffer_size.saturating_sub(self.buffer.len()); if remaining_capacity > 0 { @@ -67,6 +84,9 @@ impl MetaPlugin for BinaryMetaPlugin { ) { metadata.push(meta_data); } + + // Mark as finalized + self.is_finalized = true; } let is_finalized = !metadata.is_empty(); @@ -77,6 +97,14 @@ impl MetaPlugin for BinaryMetaPlugin { } fn finalize(&mut self) -> MetaPluginResponse { + // If already finalized, don't process again + if self.is_finalized { + return MetaPluginResponse { + metadata: Vec::new(), + is_finalized: true, + }; + } + let mut metadata = Vec::new(); // Save the binary detection result when finalizing @@ -91,6 +119,9 @@ impl MetaPlugin for BinaryMetaPlugin { ) { metadata.push(meta_data); } + + // Mark as finalized + self.is_finalized = true; MetaPluginResponse { metadata, diff --git a/src/services/meta_service.rs b/src/services/meta_service.rs index 34697c3..417ac85 100644 --- a/src/services/meta_service.rs +++ b/src/services/meta_service.rs @@ -125,15 +125,47 @@ impl MetaService { item_id: i64, ) { for meta_plugin in plugins.iter_mut() { + // Skip plugins that are already finalized + if let Some(internal_plugin) = meta_plugin.as_any_mut().downcast_mut::() { + if internal_plugin.is_finalized() { + continue; + } + } + // Add similar checks for other internal plugin types as needed + let response = meta_plugin.update(chunk); self.process_plugin_response(conn, item_id, meta_plugin, response); + + // Set finalized flag if response indicates finalization + if response.is_finalized { + if let Some(internal_plugin) = meta_plugin.as_any_mut().downcast_mut::() { + internal_plugin.set_finalized(true); + } + // Add similar checks for other internal plugin types as needed + } } } pub fn finalize_plugins(&self, plugins: &mut [Box], conn: &Connection, item_id: i64) { for meta_plugin in plugins.iter_mut() { + // Skip plugins that are already finalized + if let Some(internal_plugin) = meta_plugin.as_any_mut().downcast_mut::() { + if internal_plugin.is_finalized() { + continue; + } + } + // Add similar checks for other internal plugin types as needed + let response = meta_plugin.finalize(); self.process_plugin_response(conn, item_id, meta_plugin, response); + + // Set finalized flag if response indicates finalization + if response.is_finalized { + if let Some(internal_plugin) = meta_plugin.as_any_mut().downcast_mut::() { + internal_plugin.set_finalized(true); + } + // Add similar checks for other internal plugin types as needed + } } }