1use {
2 crate::{Result, Transition},
3 gluesql::gluesql_git_storage::{GitStorage, StorageType},
4 std::{
5 collections::VecDeque,
6 path::PathBuf,
7 sync::{Arc, Mutex, mpsc::Receiver},
8 thread::{JoinHandle, spawn},
9 },
10};
11
12#[derive(Clone, Debug)]
13pub enum Task {
14 GitSync {
15 path: PathBuf,
16 remote: String,
17 branch: String,
18 },
19}
20
21pub fn handle_tasks(
22 task_rx: Receiver<Task>,
23 transition_queue: &Arc<Mutex<VecDeque<Transition>>>,
24) -> JoinHandle<()> {
25 spawn({
26 let transition_queue = Arc::clone(transition_queue);
27
28 move || {
29 while let Ok(task) = task_rx.recv() {
30 let transition = match handle_task(task) {
31 Ok(transition) => transition,
32 Err(error) => Transition::Error(error.to_string()),
33 };
34
35 transition_queue
36 .lock()
37 .expect("failed to acquire transition queue")
38 .push_back(transition);
39 }
40 }
41 })
42}
43
44fn handle_task(task: Task) -> Result<Transition> {
45 match task {
46 Task::GitSync {
47 path,
48 remote,
49 branch,
50 } => {
51 let mut storage = GitStorage::open(path, StorageType::File)?;
52 storage.set_remote(remote);
53 storage.set_branch(branch);
54 storage.pull()?;
55 storage.push()?;
56
57 Ok(Transition::Log(
58 "Sync complete. Your notes are up to date.".to_owned(),
59 ))
60 }
61 }
62}