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);
}
}
}
}