diff --git a/src/meta_plugin/text.rs b/src/meta_plugin/text.rs index e7f9828..4d1d579 100644 --- a/src/meta_plugin/text.rs +++ b/src/meta_plugin/text.rs @@ -185,16 +185,20 @@ impl MetaPlugin for TextMetaPlugin { // If we haven't determined if content is binary yet, build buffer and check if self.is_binary_content.is_none() { - if let Some(buffer) = &mut self.buffer { + let should_finalize = if let Some(ref mut buffer) = self.buffer { // Add data to our buffer up to max_buffer_size let remaining_capacity = self.max_buffer_size.saturating_sub(buffer.len()); let bytes_to_take = std::cmp::min(data.len(), remaining_capacity); buffer.extend_from_slice(&data[..bytes_to_take]); // 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 (binary_metadata, is_binary) = self.perform_binary_detection(buffer); + let buffer_len = buffer.len(); + if buffer_len >= std::cmp::min(1024, self.max_buffer_size) { + // Clone the buffer data for binary detection to avoid borrowing conflicts + let buffer_clone = buffer.clone(); + let (binary_metadata, is_binary) = self.perform_binary_detection(&buffer_clone); metadata.extend(binary_metadata); + self.is_binary_content = Some(is_binary); // If it's binary, we're done with this plugin if is_binary { @@ -210,14 +214,27 @@ impl MetaPlugin for TextMetaPlugin { self.count_text_stats(&data[..bytes_to_take]); // If we've reached our buffer limit, drop the buffer and finalize - if buffer.len() >= self.max_buffer_size { + if buffer_len >= self.max_buffer_size { self.buffer = None; // Drop the buffer self.is_finalized = true; + true + } else { + false } } else { // Still building up buffer, count words and lines for this chunk self.count_text_stats(&data[..bytes_to_take]); + false } + } else { + false + }; + + if should_finalize { + return MetaPluginResponse { + metadata, + is_finalized: true, + }; } } else if self.is_binary_content == Some(false) { // We've already determined it's text, just count words and lines @@ -253,8 +270,11 @@ impl MetaPlugin for TextMetaPlugin { if self.is_binary_content.is_none() { if let Some(buffer) = &self.buffer { if !buffer.is_empty() { - let (binary_metadata, is_binary) = self.perform_binary_detection(buffer); + // Clone the buffer data for binary detection to avoid borrowing conflicts + let buffer_clone = buffer.clone(); + let (binary_metadata, is_binary) = self.perform_binary_detection(&buffer_clone); metadata.extend(binary_metadata); + self.is_binary_content = Some(is_binary); // If it's binary, we're done if is_binary {