aboutsummaryrefslogtreecommitdiff
path: root/src/background_loader.rs
blob: 111c943e0401805ff59c6d9bee7e0c47eda4f0a8 (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
48
49
50
51
52
53
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: Option<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: Some(thread_handle),
        }
    }

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

impl Drop for PackageLoader {
    fn drop(&mut self) {
        if let Some(handle) = self.thread_handle.take() {
            _ = handle.join();
        }
    }
}