channel 0.2.1

Rust advanced queue library
Documentation
use std::collections::HashMap;
use std::panic::Location;

#[derive(Debug)]
pub enum HolderType {
    Sender,
    Receiver,
}

#[derive(Debug)]
pub struct MetricsManager {
    caller_locs: Vec<String>,
    caller_holder_types: Vec<HolderType>,
    index_metrics: HashMap<usize, usize>,
}

impl MetricsManager {
    pub fn new() -> Self {
        Self {
            caller_locs: vec![],
            caller_holder_types: vec![],
            index_metrics: HashMap::new(),
        }
    }

    pub fn new_metrics_index(
        &mut self,
        caller: &'static Location<'static>,
        holder_type: HolderType,
    ) -> usize {
        let caller = format!("{}:{}", caller.file(), caller.line());
        let index = self.caller_locs.len();
        self.caller_locs.push(caller);
        self.caller_holder_types.push(holder_type);
        self.index_metrics.insert(index, 0);
        index
    }

    pub fn record(&mut self, index: usize, count: usize) {
        *self.index_metrics.entry(index).or_insert(0) += count;
    }

    pub fn get_result(&mut self, clear: bool) -> MetricsResult {
        let mut sender_counts = HashMap::new();
        let mut receiver_counts = HashMap::new();
        for (index, value) in self.index_metrics.iter_mut() {
            let caller_str = self.caller_locs[*index].clone();
            match self.caller_holder_types[*index] {
                HolderType::Sender => sender_counts.insert(caller_str, *value),
                HolderType::Receiver => receiver_counts.insert(caller_str, *value),
            };
            if clear {
                *value = 0;
            }
        }
        MetricsResult {
            sender_counts,
            receiver_counts,
        }
    }
}

#[derive(Debug)]
pub struct MetricsResult {
    pub sender_counts: HashMap<String, usize>,
    pub receiver_counts: HashMap<String, usize>,
}