From 25c62578cd802c7940129f6b224263a7e1c7b845 Mon Sep 17 00:00:00 2001 From: Tyr Chen Date: Sat, 30 Mar 2024 10:41:52 -0700 Subject: [PATCH] feature: support rw lock & display --- examples/metrics.rs | 2 +- src/metrics.rs | 21 ++++++++++++++++----- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/examples/metrics.rs b/examples/metrics.rs index 9f7fce4..e6d312e 100644 --- a/examples/metrics.rs +++ b/examples/metrics.rs @@ -23,7 +23,7 @@ fn main() -> Result<()> { loop { thread::sleep(Duration::from_secs(2)); - println!("{:?}", metrics.snapshot()); + println!("{}", metrics); } } diff --git a/src/metrics.rs b/src/metrics.rs index 7c1a09e..fbb43c7 100644 --- a/src/metrics.rs +++ b/src/metrics.rs @@ -4,12 +4,13 @@ use anyhow::{anyhow, Result}; use std::{ collections::HashMap, - sync::{Arc, Mutex}, + fmt, + sync::{Arc, RwLock}, }; #[derive(Debug, Clone)] pub struct Metrics { - data: Arc>>, + data: Arc>>, } impl Default for Metrics { @@ -21,12 +22,12 @@ impl Default for Metrics { impl Metrics { pub fn new() -> Self { Metrics { - data: Arc::new(Mutex::new(HashMap::new())), + data: Arc::new(RwLock::new(HashMap::new())), } } pub fn inc(&self, key: impl Into) -> Result<()> { - let mut data = self.data.lock().map_err(|e| anyhow!(e.to_string()))?; + let mut data = self.data.write().map_err(|e| anyhow!(e.to_string()))?; let counter = data.entry(key.into()).or_insert(0); *counter += 1; Ok(()) @@ -35,8 +36,18 @@ impl Metrics { pub fn snapshot(&self) -> Result> { Ok(self .data - .lock() + .read() .map_err(|e| anyhow!(e.to_string()))? .clone()) } } + +impl fmt::Display for Metrics { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let data = self.data.read().map_err(|_e| fmt::Error {})?; + for (key, value) in data.iter() { + writeln!(f, "{}: {}", key, value)?; + } + Ok(()) + } +}