userd 0.2.0

A user daemon, managing services and regular running of jobs, in user space.
use futures::{StreamExt, stream::FuturesUnordered};

use crate::prelude::*;

pub(crate) struct Task {
    triggers: Vec<triggers::TriggerBox>,
    activity: Activity,
}

impl Task {
    pub(crate) fn new(config: config::Task) -> Result<Self> {
        Ok(Self {
            triggers: triggers::build_triggers(config.triggers)?,
            activity: Activity::new(config.name.clone(), config.command)?,
        })
    }
    pub(crate) async fn start(self) {
        utils::log_error("task: start activity", self.activity.start_activity().await);
        loop {
            let mut futs = self
                .triggers
                .iter()
                .map(|t| tokio::spawn(t.wait_for()))
                .collect::<FuturesUnordered<_>>();
            let result = futs.next().await;
            if let Some(Err(e)) = result {
                log::error!("An error occured in a trigger: {}", e);
            } else {
                utils::log_error("task: start activity", self.activity.start_activity().await);
            }
        }
    }
}