Skip to main content

gitkit_cli/
worker.rs

1use std::{sync::mpsc, thread};
2
3use crate::{
4    git::kit::KitRepo,
5    metrics::{cadence::CadenceData, silo::SiloData},
6    tui::page::HomeData,
7};
8
9pub struct DataPayload {
10    pub home_data: HomeData,
11    pub cadence_data: CadenceData,
12    pub silo_data: SiloData,
13}
14
15pub enum WorkerCommand {
16    Refresh,
17    Quit,
18}
19
20pub struct Worker {
21    cmd_tx: mpsc::Sender<WorkerCommand>,
22    pub payload_rx: mpsc::Receiver<DataPayload>,
23}
24
25impl Worker {
26    pub fn start(repo_path: std::path::PathBuf) -> Self {
27        let (cmd_tx, cmd_rx) = mpsc::channel::<WorkerCommand>();
28        let (payload_tx, payload_rx) = mpsc::channel::<DataPayload>();
29
30        thread::spawn(move || {
31            let thread_repo = KitRepo::open(&repo_path).unwrap();
32
33            // blocking check for msgs
34            while let Ok(cmd) = cmd_rx.recv() {
35                match cmd {
36                    WorkerCommand::Refresh => {
37                        let payload = DataPayload {
38                            home_data: HomeData::new(&thread_repo),
39                            cadence_data: CadenceData::new(&thread_repo),
40                            silo_data: SiloData::new(&thread_repo),
41                        };
42                        let _ = payload_tx.send(payload); // send new data
43                    }
44                    WorkerCommand::Quit => break,
45                }
46            }
47        });
48
49        Self { cmd_tx, payload_rx }
50    }
51
52    // send refresh msg
53    pub fn trigger_refresh(&self) {
54        let _ = self.cmd_tx.send(WorkerCommand::Refresh);
55    }
56
57    pub fn quit(&self) {
58        let _ = self.cmd_tx.send(WorkerCommand::Quit);
59    }
60}