bulletty 0.1.2

a terminal feed (RSS+ATOM) reader
Documentation
use std::{
    sync::{
        Arc, Mutex,
        atomic::{AtomicBool, AtomicU16, Ordering::Relaxed},
    },
    thread::{self, JoinHandle},
};

use tracing::{error, info};

use crate::core::library::{feedcategory::FeedCategory, feedlibrary::FeedLibrary};

pub struct Updater {
    pub last_completed: Arc<Mutex<String>>,
    pub total_completed: Arc<AtomicU16>,
    pub finished: Arc<AtomicBool>,

    _thread: Option<JoinHandle<()>>,
}

impl Updater {
    pub fn new(feedcategories: Vec<FeedCategory>) -> Self {
        let completed = Arc::new(Mutex::new(String::from("Working...")));
        let finished = Arc::new(AtomicBool::new(false));
        let total_completed = Arc::new(AtomicU16::new(0));

        let completed_clone = Arc::clone(&completed);
        let finished_clone = Arc::clone(&finished);
        let total_completed_clone = Arc::clone(&total_completed);

        let handle = Some(thread::spawn(move || {
            info!("Starting updater");
            let library = FeedLibrary::new();

            for category in feedcategories.iter() {
                for feed in category.feeds.iter() {
                    if let Err(e) = library.data.update_feed_entries(category, feed, None) {
                        error!("Something happened when updating {}: {:?}", &feed.title, e);
                        return;
                    }

                    info!("Updated {}", &feed.title);

                    total_completed_clone.fetch_add(1, Relaxed);
                    *completed_clone.lock().unwrap() = feed.title.clone();
                }
            }

            finished_clone.store(true, Relaxed);
        }));

        Self {
            last_completed: completed,
            total_completed,
            _thread: handle,
            finished,
        }
    }
}