aboutsummaryrefslogtreecommitdiff
path: root/src/output/aggregators.rs
blob: 9934fb39abc394cf3dcb49727e860e4d9eddee0c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//! Different aggregators for output.
//!
//! An aggregator is something that "controls the order" of the output. Aggregators can either save
//! all items that they're and output them once the search is finished, or write them straight
//! to the output stream.
//!
//! Aggregators must be shareable across threads, as the search will be multi-threaded. This is why
//! an Aggregator must make sure that the data is protected by a mutex or similar.
use super::{super::LogResult, formats::Format};

use std::{io::Write, sync::Mutex};

pub trait Aggregator: Sync {
    fn push_item(&self, item: &LogResult, format: &Format, stream: &mut Write);
    fn finish(self, format: &Format, stream: &mut Write);
}


/// An aggregator that just pushes through each item to the output stream without any sorting or
/// whatsoever.
pub struct WriteThrough;


impl Aggregator for WriteThrough {
    fn push_item(&self, item: &LogResult, format: &Format, stream: &mut Write) {
        let text = format.format_result(item);
        println!("Aggregator::push_item {:?}", text);
        stream.write_all(text.as_bytes()).unwrap();
    }

    fn finish(self, format: &Format, stream: &mut Write) {}
}