From 09e1f9c330ec99de06c834b2de95c378bc6d00d3 Mon Sep 17 00:00:00 2001 From: Daniel Date: Fri, 28 Aug 2020 15:49:12 +0200 Subject: add --count/-n flag --- src/output/aggregators.rs | 30 +++++++++++++++++++++++++++++- 1 file changed, 29 insertions(+), 1 deletion(-) (limited to 'src/output/aggregators.rs') diff --git a/src/output/aggregators.rs b/src/output/aggregators.rs index 83171eb..34ecea4 100644 --- a/src/output/aggregators.rs +++ b/src/output/aggregators.rs @@ -8,7 +8,11 @@ //! an Aggregator must make sure that the data is protected by a mutex or similar. use super::{super::LogResult, formats::Format, sorting::Sorting}; -use std::{io::Write, sync::Mutex}; +use std::{ + io::Write, + sync::atomic::{AtomicU32, Ordering}, + sync::Mutex, +}; pub trait Aggregator: Sync { fn push_item(&self, item: LogResult, format: &dyn Format, stream: &mut dyn Write); @@ -62,3 +66,27 @@ impl Aggregator for SortedOutput { stream.flush().unwrap(); } } + +/// An aggregator that just counts how many logs have been found. +#[derive(Debug)] +pub struct CountingOutput { + counter: AtomicU32, +} + +impl CountingOutput { + pub fn new() -> Self { + CountingOutput { + counter: AtomicU32::new(0), + } + } +} + +impl Aggregator for CountingOutput { + fn push_item(&self, _: LogResult, _: &dyn Format, _: &mut dyn Write) { + self.counter.fetch_add(1, Ordering::SeqCst); + } + + fn finish(self: Box, _: &dyn Format, stream: &mut dyn Write) { + writeln!(stream, "{}", self.counter.into_inner()).unwrap(); + } +} -- cgit v1.2.3