use super::logger::RecordInfo;
use super::ser::{Serialize, SerdeSerializer};
use super::Level;
use super::{BorrowedKeyValue,OwnedKeyValue};
use std::fmt::Write;
use serde_json;
use ansi_term::Colour;
pub trait Format : Send+Sync+Sized {
fn format(&self, info : &RecordInfo, logger_values : &[OwnedKeyValue], record_values : &[BorrowedKeyValue]) -> String;
}
pub struct Json {
newlines : bool,
}
impl Json {
pub fn new() -> Self {
Json {
newlines : true,
}
}
pub fn new_nonewline() -> Self {
Json {
newlines : false,
}
}
}
impl Format for Json {
fn format(&self, info : &RecordInfo, logger_values : &[OwnedKeyValue], record_values : &[BorrowedKeyValue]) -> String {
let mut serializer = serde_json::Serializer::new(vec!());
{
let mut serializer = &mut SerdeSerializer(&mut serializer);
info.level.as_str().serialize("level", serializer);
info.msg.serialize("msg", serializer);
for &(ref k, ref v) in logger_values.iter() {
v.serialize(k, serializer);
}
for &(ref k, ref v) in record_values.iter() {
v.serialize(k, serializer);
}
}
let ts = info.ts.to_rfc3339();
let formatted = if self.newlines {
format!("{{\"ts\":{}{}}}\n", ts, String::from_utf8_lossy(&serializer.into_inner()))
} else {
format!("{{\"ts\":{}{}}}", ts, String::from_utf8_lossy(&serializer.into_inner()))
};
formatted
}
}
pub struct Terminal {
color : bool,
}
impl Terminal {
pub fn colored() -> Self {
Terminal {
color: true,
}
}
pub fn plain() -> Self {
Terminal {
color: false,
}
}
}
fn severity_to_color(lvl : Level) -> u8 {
match lvl {
Level::Critical => 35,
Level::Error => 31,
Level::Warning => 33,
Level::Info => 32,
Level::Debug => 36,
Level::Trace => 0,
}
}
impl Format for Terminal {
fn format(&self, info : &RecordInfo, logger_values : &[OwnedKeyValue], values : &[BorrowedKeyValue]) -> String {
let color = Colour::Fixed(severity_to_color(info.level));
let mut s = String::new();
let _ = write!(s, "{:?}[{}] {}",
info.ts,
if self.color {
color.paint(info.level.as_str()).to_string()
} else {
info.level.as_str().to_owned()
},
info.msg
);
for &(ref k, ref v) in logger_values {
let _ = write!(s, ", ");
v.serialize(k, &mut s);
}
for &(k,v) in values {
let _ = write!(s, ", ");
v.serialize(k, &mut s);
}
s.push_str("\n");
s
}
}