Skip to main content

pagers_core/
events.rs

1//! Events emitted during file processing for UI consumption.
2
3use std::sync::Mutex;
4use std::sync::mpsc::Sender;
5
6use crate::mincore::DefaultPageMap;
7
8#[derive(Debug, Clone, PartialEq)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10pub enum Event<PM = DefaultPageMap> {
11    /// A file has started processing. Includes initial residency snapshot.
12    FileStart {
13        path: String,
14        total_pages: usize,
15        residency: PM,
16    },
17    /// Residency update during touch/lock polling.
18    FileProgress {
19        path: String,
20        page_offset: usize,
21        pages_walked: usize,
22        resident: bool,
23    },
24    /// File processing complete.
25    FileDone {
26        path: String,
27    },
28    AllDone,
29}
30
31/// `Sync` wrapper around `Sender<Event>` for use with rayon.
32pub struct EventSink<PM>(Mutex<Sender<Event<PM>>>);
33
34impl<PM> EventSink<PM> {
35    pub fn new(sender: Sender<Event<PM>>) -> Self {
36        Self(Mutex::new(sender))
37    }
38
39    pub fn send(&self, event: Event<PM>) {
40        let _ = self.0.lock().unwrap().send(event);
41    }
42}