tracing_loki/
level_map.rs1use 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}