use std::sync::Arc;
use crate::core::tracing::pipeline::Processor;
use crate::core::tracing::processors::{DropEmpty, DropOps, TruncateIO};
use crate::core::tracing::trace_filter::TraceFilter;
pub fn trace_filter_to_processors(tf: &TraceFilter) -> Vec<Arc<dyn Processor>> {
let mut chain: Vec<Arc<dyn Processor>> = Vec::new();
if !tf.exclude_ops.is_empty() {
chain.push(Arc::new(DropOps::new(tf.exclude_ops.iter().cloned())));
}
if tf.skip_empty {
chain.push(Arc::new(DropEmpty));
}
if tf.max_io_size > 0 {
chain.push(Arc::new(TruncateIO::new(tf.max_io_size)));
}
chain
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_filter_produces_empty_chain() {
let tf = TraceFilter::default();
let chain = trace_filter_to_processors(&tf);
assert!(chain.is_empty());
}
#[test]
fn exclude_ops_adds_drop_ops() {
let mut tf = TraceFilter::default();
tf.exclude_ops.push("picker".to_string());
let chain = trace_filter_to_processors(&tf);
assert_eq!(chain.len(), 1);
assert_eq!(chain[0].name(), "DropOps");
}
#[test]
fn skip_empty_plus_max_io_size_compose() {
let mut tf = TraceFilter::default();
tf.skip_empty = true;
tf.max_io_size = 500;
let chain = trace_filter_to_processors(&tf);
assert_eq!(chain.len(), 2);
assert_eq!(chain[0].name(), "DropEmpty");
assert_eq!(chain[1].name(), "TruncateIO");
}
}