aboutsummaryrefslogtreecommitdiff
path: root/src/background_loader.rs
blob: ea9d331d9e799c8627fd289c5bf0439d14b689e8 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use std::{
    sync::mpsc::{Receiver, channel},
    thread,
};

use crate::gentoo::{package::Package, portage_loader::load_available_packages};

pub enum LoaderMessage {
    Loading,
    Complete(Vec<Package>),
    Error(String),
}

#[derive(Debug)]
pub struct PackageLoader {
    receiver: Receiver<LoaderMessage>,
    thread_handle: thread::JoinHandle<()>,
}

impl PackageLoader {
    pub fn spawn() -> Self {
        let (tx, rx) = channel();
        let thread_handle = thread::spawn(move || {
            let _ = tx.send(LoaderMessage::Loading);

            match load_available_packages() {
                Ok(packages) => {
                    let _ = tx.send(LoaderMessage::Complete(packages));
                }
                Err(e) => {
                    let _ = tx.send(LoaderMessage::Error(e.to_string()));
                }
            }
        });

        PackageLoader {
            receiver: rx,
            thread_handle,
        }
    }

    pub fn try_recv(&self) -> Option<LoaderMessage> {
        self.receiver.try_recv().ok()
    }

    //TODO: join thread back to main thread after packages were loaded
}