endpoint_libs/libs/
warn.rs

1use std::collections::HashMap;
2use tracing::warn;
3
4#[derive(Debug)]
5pub struct WarnStats {
6    pub warn_count: u64,
7}
8#[derive(Debug, Default)]
9pub struct WarnManager {
10    warns: HashMap<String, WarnStats>,
11}
12
13impl WarnManager {
14    pub fn new() -> Self {
15        Self { warns: HashMap::new() }
16    }
17
18    pub fn warn(&mut self, s: impl AsRef<str>) {
19        let s = s.as_ref();
20
21        if let Some(stats) = self.warns.get_mut(s) {
22            stats.warn_count += 1;
23        } else {
24            warn!("First warning: {}", s);
25            self.warns.insert(s.to_string(), WarnStats { warn_count: 1 });
26        }
27    }
28    pub fn get_warns(&self) -> &HashMap<String, WarnStats> {
29        &self.warns
30    }
31
32    pub fn dump_stats(&self, mut file: impl std::io::Write) -> std::io::Result<()> {
33        writeln!(file, "Warnings at {}:", chrono::Utc::now())?;
34        for (msg, stats) in &self.warns {
35            writeln!(file, "count={} warn={}", stats.warn_count, msg)?;
36        }
37        Ok(())
38    }
39}