diff --git a/src/meta_plugin/text.rs b/src/meta_plugin/text.rs index ed15dc9..0aa4404 100644 --- a/src/meta_plugin/text.rs +++ b/src/meta_plugin/text.rs @@ -111,6 +111,66 @@ impl MetaPlugin for TextMetaPlugin { self.is_finalized = finalized; } + /// Helper method to perform binary detection and return appropriate metadata + /// Returns (metadata, should_finalize) tuple + fn perform_binary_detection(&mut self, buffer: &[u8]) -> (Vec, bool) { + let mut metadata = Vec::new(); + let is_binary_result = is_binary(buffer); + self.is_binary_content = Some(is_binary_result); + + // Output text and binary status + let text_value = if is_binary_result { "false".to_string() } else { "true".to_string() }; + let binary_value = if is_binary_result { "true".to_string() } else { "false".to_string() }; + + // Use process_metadata_outputs to handle output mapping + if let Some(meta_data) = crate::meta_plugin::process_metadata_outputs( + "text", + text_value, + self.base.outputs() + ) { + metadata.push(meta_data); + } + + if let Some(meta_data) = crate::meta_plugin::process_metadata_outputs( + "binary", + binary_value, + self.base.outputs() + ) { + metadata.push(meta_data); + } + + (metadata, is_binary_result) + } + + /// Helper method to output word and line counts + fn output_word_line_counts(&mut self) -> Vec { + let mut metadata = Vec::new(); + + // Process any remaining data in utf8_buffer + if !self.utf8_buffer.is_empty() { + self.count_text_stats(&[]); + } + + // Output word and line counts + if let Some(meta_data) = crate::meta_plugin::process_metadata_outputs( + "text_word_count", + self.word_count.to_string(), + self.base.outputs() + ) { + metadata.push(meta_data); + } + + if let Some(meta_data) = crate::meta_plugin::process_metadata_outputs( + "text_line_count", + self.line_count.to_string(), + self.base.outputs() + ) { + metadata.push(meta_data); + } + + metadata + } + fn update(&mut self, data: &[u8]) -> MetaPluginResponse { // If already finalized, don't process more data if self.is_finalized { @@ -132,32 +192,11 @@ impl MetaPlugin for TextMetaPlugin { // If we have enough data to make a binary determination, do it now if buffer.len() >= std::cmp::min(1024, self.max_buffer_size) { - let is_binary_result = is_binary(buffer); - self.is_binary_content = Some(is_binary_result); - - // Output text and binary status - let text_value = if is_binary_result { "false".to_string() } else { "true".to_string() }; - let binary_value = if is_binary_result { "true".to_string() } else { "false".to_string() }; - - // Use process_metadata_outputs to handle output mapping - if let Some(meta_data) = crate::meta_plugin::process_metadata_outputs( - "text", - text_value, - self.base.outputs() - ) { - metadata.push(meta_data); - } - - if let Some(meta_data) = crate::meta_plugin::process_metadata_outputs( - "binary", - binary_value, - self.base.outputs() - ) { - metadata.push(meta_data); - } + let (binary_metadata, is_binary) = self.perform_binary_detection(buffer); + metadata.extend(binary_metadata); // If it's binary, we're done with this plugin - if is_binary_result { + if is_binary { self.buffer = None; // Drop the buffer self.is_finalized = true; return MetaPluginResponse { @@ -213,31 +252,11 @@ impl MetaPlugin for TextMetaPlugin { if self.is_binary_content.is_none() { if let Some(buffer) = &self.buffer { if !buffer.is_empty() { - let is_binary_result = is_binary(buffer); - self.is_binary_content = Some(is_binary_result); - - // Output text and binary status - let text_value = if is_binary_result { "false".to_string() } else { "true".to_string() }; - let binary_value = if is_binary_result { "true".to_string() } else { "false".to_string() }; - - if let Some(meta_data) = crate::meta_plugin::process_metadata_outputs( - "text", - text_value, - self.base.outputs() - ) { - metadata.push(meta_data); - } - - if let Some(meta_data) = crate::meta_plugin::process_metadata_outputs( - "binary", - binary_value, - self.base.outputs() - ) { - metadata.push(meta_data); - } + let (binary_metadata, is_binary) = self.perform_binary_detection(buffer); + metadata.extend(binary_metadata); // If it's binary, we're done - if is_binary_result { + if is_binary { self.buffer = None; // Drop the buffer self.is_finalized = true; return MetaPluginResponse { @@ -251,27 +270,8 @@ impl MetaPlugin for TextMetaPlugin { // If content is text, output word and line counts if self.is_binary_content == Some(false) { - // Process any remaining data in utf8_buffer - if !self.utf8_buffer.is_empty() { - self.count_text_stats(&[]); - } - - // Output word and line counts - if let Some(meta_data) = crate::meta_plugin::process_metadata_outputs( - "text_word_count", - self.word_count.to_string(), - self.base.outputs() - ) { - metadata.push(meta_data); - } - - if let Some(meta_data) = crate::meta_plugin::process_metadata_outputs( - "text_line_count", - self.line_count.to_string(), - self.base.outputs() - ) { - metadata.push(meta_data); - } + let word_line_metadata = self.output_word_line_counts(); + metadata.extend(word_line_metadata); } // Drop the buffer since we're done with it