use std::sync::Arc;
use tracing::Level;
use super::model::{JobId, RunId};
use super::store::Store;
#[derive(Clone)]
pub struct LogWriter {
job_id: JobId,
run_id: RunId,
kind: Arc<str>,
store: Arc<dyn Store>,
}
impl LogWriter {
pub fn new(job_id: JobId, run_id: RunId, kind: Arc<str>, store: Arc<dyn Store>) -> Self {
Self {
job_id,
run_id,
kind,
store,
}
}
pub fn job_id(&self) -> JobId {
self.job_id
}
pub async fn info(&self, line: impl Into<String>) {
self.write(Level::INFO, line.into()).await;
}
pub async fn warn(&self, line: impl Into<String>) {
self.write(Level::WARN, line.into()).await;
}
pub async fn error(&self, line: impl Into<String>) {
self.write(Level::ERROR, line.into()).await;
}
async fn write(&self, level: Level, line: String) {
match level {
Level::ERROR => tracing::error!(
job_id = %self.job_id,
run_id = %self.run_id,
kind = %self.kind,
"{}",
line
),
Level::WARN => tracing::warn!(
job_id = %self.job_id,
run_id = %self.run_id,
kind = %self.kind,
"{}",
line
),
_ => tracing::info!(
job_id = %self.job_id,
run_id = %self.run_id,
kind = %self.kind,
"{}",
line
),
}
let _ = self.store.append_log(self.job_id, &line).await;
}
}