use crate::channels::notification::{NotificationLevel, TaskNotification};
use crate::channels::transport::Transport;
use crate::engine::events::TaskEvent;
use std::sync::Arc;
use tokio::sync::broadcast;
pub fn spawn(mut rx: broadcast::Receiver<TaskEvent>, transport: Arc<Transport>) {
let level = NotificationLevel::from_config();
tokio::spawn(async move {
loop {
match rx.recv().await {
Ok(event) => {
if !level.should_notify(&event.new_status) {
continue;
}
let notification = TaskNotification {
task_id: event.task_id.clone(),
title: event.title.unwrap_or_default(),
status: event.new_status.clone(),
agent: event.agent.unwrap_or_default(),
duration_seconds: event.duration_seconds.unwrap_or(0.0),
summary: event.summary.unwrap_or_default(),
repo: Some(event.repo.clone()),
notify_target: None,
pr_number: event.pr_number.clone(),
};
transport.push_notification(notification);
}
Err(broadcast::error::RecvError::Lagged(n)) => {
tracing::debug!(n, "notify subscriber lagged");
}
Err(_) => break, }
}
});
}