use std::{io, time::Duration};
use log::{Level, Record};
pub mod file;
pub mod stdout;
pub trait Target {
fn level(&self) -> Level;
fn ignore(&self, record: &Record) -> bool;
fn write(&self, record: &Record, duration_since_start: Duration) -> io::Result<()>;
fn flush(&self) -> io::Result<()>;
}
pub fn create_timestamp(duration_since_start: Duration) -> String {
let minutes = duration_since_start.as_secs() / 60;
let seconds = duration_since_start.as_secs() % 60;
let millis = duration_since_start.subsec_millis();
format!("+{:0>3}:{:0>2}.{:0>4}", minutes, seconds, millis)
}
pub fn create_log_line(record: &Record, duration_since_start: Duration) -> String {
format!(
"[{}][{}] ({}) {}",
create_timestamp(duration_since_start),
record.level(),
record.target(),
record.args()
)
}
pub struct IgnoreList {
patterns: Vec<String>
}
impl IgnoreList {
pub fn new(patterns: Vec<String>) -> Self { IgnoreList { patterns } }
pub fn ignore(&self, record: &Record) -> bool {
self.patterns.iter().any(|p| record.target().contains(p))
}
}
impl From<Vec<String>> for IgnoreList {
fn from(v: Vec<String>) -> Self { IgnoreList::new(v) }
}
impl Default for IgnoreList {
fn default() -> Self { IgnoreList { patterns: Vec::new() } }
}