use crate::jobs::*;
use crate::options::SharedOptions;
use di::{injectable, Ref};
use rogue_logging::Verbosity;
pub struct Publisher {
subscribers: Vec<Ref<dyn Subscriber + Send + Sync>>,
}
#[injectable]
impl Publisher {
#[must_use]
pub fn new(
options: Ref<SharedOptions>,
debug_subscriber: Ref<DebugSubscriber>,
progress_bar_subscriber: Ref<ProgressBarSubscriber>,
) -> Self {
let subscriber: Ref<dyn Subscriber + Send + Sync> =
if options.verbosity.expect("verbosity should be set").as_num()
>= Verbosity::Trace.as_num()
{
debug_subscriber
} else {
progress_bar_subscriber
};
Self {
subscribers: vec![subscriber],
}
}
}
impl Subscriber for Publisher {
fn start(&self, scope_id: &str) {
for subscriber in &self.subscribers {
subscriber.start(scope_id);
}
}
fn finish(&self, scope_id: &str) {
for subscriber in &self.subscribers {
subscriber.finish(scope_id);
}
}
fn update(&self, command_id: &str, status: Status) {
for subscriber in &self.subscribers {
subscriber.update(command_id, status.clone());
}
}
}