#![allow(clippy::needless_pass_by_value)]
use std::sync::Arc;
use tokio::sync::broadcast::error::RecvError;
use super::events::EventBus;
use crate::runner::OutputRenderer;
#[must_use]
pub fn spawn(
bus: Arc<EventBus>,
mut renderer: Box<dyn OutputRenderer>,
) -> tokio::task::JoinHandle<()> {
let mut rx = bus.subscribe();
tokio::spawn(async move {
loop {
match rx.recv().await {
Ok(event) => {
let is_end = event.is_build_end();
renderer.on_event(&event);
if is_end {
return;
}
}
Err(RecvError::Closed) => return,
Err(RecvError::Lagged(n)) => {
tracing::warn!("output: dropped {n} events");
}
}
}
})
}