diff --git a/crates/rustern-core/src/pipeline/jq_evaluate.rs b/crates/rustern-core/src/pipeline/jq_evaluate.rs index ddbee0f..40882b2 100644 --- a/crates/rustern-core/src/pipeline/jq_evaluate.rs +++ b/crates/rustern-core/src/pipeline/jq_evaluate.rs @@ -1,10 +1,11 @@ -use std::sync::Arc; - -use futures::stream::{Stream, StreamExt}; use jaq_core::data::JustLut; use jaq_core::load::{Arena, File, Loader}; use jaq_core::{Compiler, Ctx, Filter, Vars}; use jaq_json::Val; +use std::fmt::Write as _; +use std::sync::Arc; + +use futures::stream::{Stream, StreamExt}; use crate::source::{LogEvent, LogSourceError}; @@ -23,6 +24,17 @@ pub enum QueryMode { Filter, } +fn format_outputs_joined(outputs: &[Val]) -> String { + let mut rendered = String::new(); + for (i, v) in outputs.iter().enumerate() { + if i > 0 { + rendered.push('\n'); + } + let _ = write!(rendered, "{v}"); + } + rendered +} + #[derive(Clone)] pub struct CompiledFilter { inner: Arc>>, @@ -105,21 +117,13 @@ where } QueryMode::Replace => { ev.structured = None; - let rendered = outputs - .iter() - .map(|v| format!("{v}")) - .collect::>() - .join("\n"); + let rendered = format_outputs_joined(&outputs); ev.message = Arc::from(rendered.as_str()); Some(Ok(ev)) } QueryMode::Append => { ev.structured = None; - let rendered = outputs - .iter() - .map(|v| format!("{v}")) - .collect::>() - .join("\n"); + let rendered = format_outputs_joined(&outputs); ev.message = Arc::from(format!("{} | {}", ev.message, rendered).as_str()); Some(Ok(ev))