use crate::connection::AnyConnection;
use crate::connection::Connection;
use crate::triggers::Trigger;
use std::time::Duration;
#[derive(Debug)]
pub struct PeriodicTrigger {
interval: Duration,
message: String,
}
impl Trigger for PeriodicTrigger {
async fn run(&self, connection: AnyConnection) -> Result<(), anyhow::Error> {
loop {
tokio::time::sleep(self.interval).await;
connection.send_trigger_notification(&self.message).await?;
}
}
}
pub fn every(interval: Duration, message: impl Into<String>) -> PeriodicTrigger {
PeriodicTrigger {
interval,
message: message.into(),
}
}
#[cfg(test)]
mod tests {
#![allow(clippy::unwrap_used, clippy::expect_used, clippy::panic)]
use super::*;
#[test]
fn test_every_construction() {
let trigger = every(Duration::from_secs(10), "heartbeat");
assert_eq!(trigger.interval, Duration::from_secs(10));
assert_eq!(trigger.message, "heartbeat");
}
#[test]
fn test_every_with_string() {
let msg = String::from("custom message");
let trigger = every(Duration::from_millis(500), msg);
assert_eq!(trigger.interval, Duration::from_millis(500));
assert_eq!(trigger.message, "custom message");
}
}