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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
// a counter holds counts of events

use std::fmt::Display;
use std::collections::HashMap;
use std::hash::Hash;
use std::marker::PhantomData;

use receiver::Percentile;

#[derive(Clone)]
pub struct Meters<T> {
    pub data: HashMap<String, u64>,
    pub combined: HashMap<String, u64>,
    resource_type: PhantomData<T>,
}

impl<T: Hash + Eq> Default for Meters<T> {
    fn default() -> Meters<T> {
        Meters {
            data: HashMap::new(),
            combined: HashMap::new(),
            resource_type: PhantomData::<T>,
        }
    }
}

impl<T: Hash + Eq + Send + Display + Clone> Meters<T> {
    pub fn new() -> Meters<T> {
        Default::default()
    }

    pub fn set_count(&mut self, channel: T, value: u64) {
        let key = format!("{}_count", channel);
        self.data.insert(key, value);
    }

    pub fn set_combined_count(&mut self, value: u64) {
        let key = "count".to_owned();
        self.combined.insert(key, value);
    }

    pub fn set_percentile(&mut self, channel: T, percentile: Percentile, value: u64) {
        let key = format!("{}_{}_nanoseconds", channel, percentile.0);
        self.data.insert(key, value);
    }

    pub fn set_combined_percentile(&mut self, percentile: Percentile, value: u64) {
        let key = format!("{}_nanoseconds", percentile.0);
        self.combined.insert(key, value);
    }

    pub fn get_count(&self, channel: &T) -> Option<&u64> {
        let key = format!("{}_count", channel);
        self.data.get(&key)
    }

    pub fn get_combined_count(&self) -> Option<&u64> {
        let key = "count".to_owned();
        self.combined.get(&key)
    }

    pub fn get_percentile(&self, channel: &T, percentile: Percentile) -> Option<&u64> {
        let key = format!("{}_{}_nanoseconds", channel, percentile.0);
        self.data.get(&key)
    }

    pub fn get_combined_percentile(&self, percentile: Percentile) -> Option<&u64> {
        let key = format!("{}_nanoseconds", percentile.0);
        self.combined.get(&key)
    }
}