use chrono::{Duration, Utc};
use tokio::time::sleep;
use crate::{ControllerGroup, Emitter};
pub struct Runtime {
emitter: Option<Emitter>,
group: ControllerGroup,
interval: Duration,
}
impl Runtime {
pub fn new(group: ControllerGroup, interval: Duration) -> Self {
Self {
emitter: None,
group,
interval,
}
}
pub fn build_emitter<S>(mut self, url: S) -> Self
where S: Into<String>
{
let emitter = Emitter::new(url);
self.emitter = Some(emitter);
self
}
pub fn has_emitter(&self) -> bool {
self.emitter.is_some()
}
pub async fn run(&mut self) {
let mut next_execution_time = Utc::now() + self.interval;
loop {
let now = Utc::now();
if now >= next_execution_time {
let messages = self.group.poll(now);
if !messages.is_empty() {
if let Some(emitter) = &self.emitter {
emitter.emit(messages).await.unwrap();
}
}
next_execution_time = now + self.interval;
}
sleep(std::time::Duration::from_millis(100)).await
}
}
}