tracing_loki/
level_map.rs

1use std::fmt;
2use std::ops;
3use std::slice;
4use tracing_core::Level;
5
6#[derive(Default)]
7pub struct LevelMap<T> {
8    map: [T; 5],
9}
10
11fn level_index(level: Level) -> usize {
12    match level {
13        Level::TRACE => 0,
14        Level::DEBUG => 1,
15        Level::INFO => 2,
16        Level::WARN => 3,
17        Level::ERROR => 4,
18    }
19}
20
21impl<T> LevelMap<T> {
22    pub fn from_fn<F: FnMut(Level) -> T>(mut f: F) -> LevelMap<T> {
23        LevelMap {
24            map: [
25                f(Level::TRACE),
26                f(Level::DEBUG),
27                f(Level::INFO),
28                f(Level::WARN),
29                f(Level::ERROR),
30            ],
31        }
32    }
33    pub fn values(&self) -> slice::Iter<'_, T> {
34        self.map.iter()
35    }
36    pub fn values_mut(&mut self) -> slice::IterMut<'_, T> {
37        self.map.iter_mut()
38    }
39}
40
41impl<T: fmt::Debug> fmt::Debug for LevelMap<T> {
42    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
43        f.debug_map()
44            .entry(&Level::TRACE, &self[Level::TRACE])
45            .entry(&Level::DEBUG, &self[Level::DEBUG])
46            .entry(&Level::INFO, &self[Level::INFO])
47            .entry(&Level::WARN, &self[Level::WARN])
48            .entry(&Level::ERROR, &self[Level::ERROR])
49            .finish()
50    }
51}
52
53impl<T> ops::Index<Level> for LevelMap<T> {
54    type Output = T;
55    fn index(&self, index: Level) -> &T {
56        &self.map[level_index(index)]
57    }
58}
59
60impl<T> ops::IndexMut<Level> for LevelMap<T> {
61    fn index_mut(&mut self, index: Level) -> &mut T {
62        &mut self.map[level_index(index)]
63    }
64}