texted 1.2.1

A markdown blog platform that lets you in control of your data
Documentation
use crate::metrics::metric_sender::MetricSender;
use crate::metrics::metric_types::MetricEvent;
use crate::metrics::metric_writer::MetricWriter;
use spdlog::{error, info, trace};
use tokio::sync::mpsc;
use tokio::sync::mpsc::Sender;
use tokio::task::JoinHandle;

pub struct MetricHandler {
    _receiver_task: JoinHandle<()>,
    sender: Sender<MetricEvent>,
}

impl MetricHandler {
    pub fn new(mut metrics: MetricWriter) -> Self {
        let (tx, mut rx) = mpsc::channel::<MetricEvent>(64);

        let receiver_task = tokio::spawn(async move {
            info!("Starting metrics receiver");
            loop {
                match tokio::time::timeout(std::time::Duration::from_secs(1), rx.recv()).await {
                    Ok(Some(event)) => {
                        if let Err(e) = metrics.add_event(event) {
                            error!("Error writing access metric: {}", e);
                        }
                    }
                    Ok(None) => break,
                    Err(_timeout) => {
                        if let Err(e) = metrics.flush() {
                            error!("Error flushing access metric: {}", e);
                        }
                        trace!("Timeout - flushing metrics");
                    }
                }
            }
        });

        Self {
            _receiver_task: receiver_task,
            sender: tx,
        }
    }

    pub fn new_sender(&self) -> MetricSender {
        MetricSender::new(self.sender.clone())
    }

    pub fn no_op() -> MetricSender {
        MetricSender::no_op()
    }
}