shadow_crypt_core/
progress.rs

1use std::sync::Mutex;
2
3pub struct ProgressCounter {
4    current: Mutex<u64>,
5    total: u64,
6}
7impl ProgressCounter {
8    pub fn new(total: u64) -> Self {
9        Self {
10            current: Mutex::new(0),
11            total,
12        }
13    }
14
15    pub fn increment(&self) {
16        let mut current = self.current.lock().unwrap_or_else(|e| e.into_inner());
17        *current += 1;
18    }
19    pub fn get_current(&self) -> u64 {
20        let current = self.current.lock().unwrap_or_else(|e| e.into_inner());
21        *current
22    }
23    pub fn get_total(&self) -> u64 {
24        self.total
25    }
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn test_new() {
34        let counter = ProgressCounter::new(100);
35        assert_eq!(counter.get_current(), 0);
36        assert_eq!(counter.get_total(), 100);
37    }
38
39    #[test]
40    fn test_increment() {
41        let counter = ProgressCounter::new(10);
42        assert_eq!(counter.get_current(), 0);
43        counter.increment();
44        assert_eq!(counter.get_current(), 1);
45        counter.increment();
46        assert_eq!(counter.get_current(), 2);
47    }
48
49    #[test]
50    fn test_get_current_and_total() {
51        let counter = ProgressCounter::new(50);
52        assert_eq!(counter.get_current(), 0);
53        assert_eq!(counter.get_total(), 50);
54        counter.increment();
55        assert_eq!(counter.get_current(), 1);
56        assert_eq!(counter.get_total(), 50);
57    }
58}