glues_core/
task.rs

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}