use crate::{
model::ProgressEvent,
reporter::ProgressReporter,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct LoggerProgressReporter {
target: String,
level: log::Level,
}
impl LoggerProgressReporter {
#[inline]
pub fn new(target: &str) -> Self {
Self {
target: target.to_owned(),
level: log::Level::Info,
}
}
#[inline]
pub const fn with_level(mut self, level: log::Level) -> Self {
self.level = level;
self
}
#[inline]
pub fn target(&self) -> &str {
self.target.as_str()
}
#[inline]
pub const fn level(&self) -> log::Level {
self.level
}
#[inline]
fn log_line(&self, message: &str) {
log::log!(target: self.target.as_str(), self.level, "{message}");
}
}
impl Default for LoggerProgressReporter {
#[inline]
fn default() -> Self {
Self::new("qubit_progress")
}
}
impl ProgressReporter for LoggerProgressReporter {
#[inline]
fn report(&self, event: &ProgressEvent) {
self.log_line(&format_event(event));
}
}
fn format_event(event: &ProgressEvent) -> String {
let counters = event.counters();
let progress = match counters.progress_percent() {
Some(percent) => format!("{percent:.2}%"),
None => "unknown".to_owned(),
};
match event.stage() {
Some(stage) => format!(
"progress phase={}, stage={}, completed={}, total={:?}, active={}, failed={}, progress={}",
event.phase(),
stage.name(),
counters.completed_count(),
counters.total_count(),
counters.active_count(),
counters.failed_count(),
progress,
),
None => format!(
"progress phase={}, completed={}, total={:?}, active={}, failed={}, progress={}",
event.phase(),
counters.completed_count(),
counters.total_count(),
counters.active_count(),
counters.failed_count(),
progress,
),
}
}