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 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); }
44 WorkerCommand::Quit => break,
45 }
46 }
47 });
48
49 Self { cmd_tx, payload_rx }
50 }
51
52 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}