use qubit_function::ArcConsumer;
use super::json_progress_reporter::JsonProgressReporter;
use crate::{
model::ProgressEvent,
reporter::ProgressReporter,
};
pub struct JsonLoggerProgressReporter {
target: String,
level: log::Level,
inner: JsonProgressReporter,
}
impl JsonLoggerProgressReporter {
#[inline]
pub fn new(target: &str) -> Self {
Self::with_target_and_level(target, log::Level::Info)
}
#[inline]
#[must_use]
pub fn with_level(self, level: log::Level) -> Self {
Self::with_target_and_level(self.target.as_str(), level)
}
#[inline]
pub fn target(&self) -> &str {
self.target.as_str()
}
#[inline]
pub const fn level(&self) -> log::Level {
self.level
}
fn with_target_and_level(target: &str, level: log::Level) -> Self {
let target = target.to_owned();
let log_target = target.clone();
let consumer = ArcConsumer::new(move |line: &String| {
log::log!(target: log_target.as_str(), level, "{line}");
});
Self {
target,
level,
inner: JsonProgressReporter::new(consumer),
}
}
}
impl Default for JsonLoggerProgressReporter {
#[inline]
fn default() -> Self {
Self::new("qubit_progress")
}
}
impl ProgressReporter for JsonLoggerProgressReporter {
#[inline]
fn report(&self, event: &ProgressEvent) {
self.inner.report(event);
}
}