Skip to main content

supreme_fs/
events.rs

1//! Progress/log events emitted while snapshots are uploaded or downloaded.
2
3/// Event emitted during snapshot operations
4#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
5pub enum SnapshotEvent {
6    Log(String),
7    SetStatus(String),
8    InitProgress(usize),
9    IncrementProgress,
10    Perf(String, String, u128), // Operation, Target, Duration_ms
11}
12
13#[cfg(test)]
14mod tests {
15    use super::*;
16
17    #[test]
18    fn snapshot_event_round_trips_through_json() {
19        let events = vec![
20            SnapshotEvent::Log("hello".to_string()),
21            SnapshotEvent::SetStatus("uploading".to_string()),
22            SnapshotEvent::InitProgress(5),
23            SnapshotEvent::IncrementProgress,
24            SnapshotEvent::Perf("upload".to_string(), "content".to_string(), 42),
25        ];
26
27        for event in events {
28            let json = serde_json::to_string(&event).expect("serialize");
29            let round_tripped: SnapshotEvent = serde_json::from_str(&json).expect("deserialize");
30            // Compare via Debug since SnapshotEvent doesn't derive PartialEq.
31            assert_eq!(format!("{event:?}"), format!("{round_tripped:?}"));
32        }
33    }
34
35    #[test]
36    fn snapshot_event_debug_output_contains_payload() {
37        let event = SnapshotEvent::Perf("hash".to_string(), "file.dat".to_string(), 123);
38        let debug = format!("{event:?}");
39        assert!(debug.contains("hash"));
40        assert!(debug.contains("file.dat"));
41        assert!(debug.contains("123"));
42    }
43}