use ntime::Format;
use std::io;
use crate::attributes::Map;
use crate::attributes::value::Value;
use crate::console::Color;
use crate::constant::{ATTRIBUTE_KEY_ERROR, DEFAULT_LOG_DELIMITER_STRING};
use crate::format::compact;
use crate::format::{FormatterConfig, OutputFormat};
use crate::level::Level;
use crate::sink::LogUpdate;
pub fn default_format_config() -> FormatterConfig {
FormatterConfig {
format: OutputFormat::ColorCompact,
time_format: ntime::Format::LocalMillisDateTime,
delimiter: DEFAULT_LOG_DELIMITER_STRING.into(),
}
}
pub fn write_value<T: io::Write>(out: &mut T, attrs: &Map, val: &Value) -> io::Result<()> {
compact::write_value(out, attrs, val)
}
pub fn write<T: io::Write>(out: &mut T, time_format: &Format, update: &LogUpdate, attrs: &Map) -> io::Result<()> {
let msg_color = if Level::Debug.includes(&update.level) { Color::Default } else { Color::BrightWhite };
let level_color = update.level.color();
update.when.write(out, time_format)?;
write!(
out,
" {level_open}{level}{level_close} {msg_open}{msg}{msg_close}",
level_open = level_color.to_escape_str(),
level = update.level.as_short_str(),
level_close = Color::Default.to_escape_str(),
msg_open = msg_color.to_escape_str(),
msg = update.msg,
msg_close = Color::Default.to_escape_str(),
)?;
for (key, val) in attrs.iter() {
write!(
out,
" {key_open}{key}{key_close}={vals_open}",
key_open = Color::Cyan.to_escape_str(),
key_close = Color::Default.to_escape_str(),
vals_open = if key == ATTRIBUTE_KEY_ERROR { Color::BrightRed.to_escape_str() } else { "" }
)?;
write_value(out, attrs, &val)?;
write!(out, "{vals_close}", vals_close = Color::Default.to_escape_str())?;
}
Ok(())
}
#[cfg(test)]
mod tests {
use super::*;
use crate::attributes::{Scalar, Value};
#[test]
fn serialize_value() {
for tc in [
(Value::from(true), "true"),
(Value::from(89801234567890123 as usize), "0x13f09bf3ecf84cb"),
(
Value::from(&[
Scalar::from(false),
Scalar::from("abcd 1234"),
Scalar::from(-123),
Scalar::from(89801234567890123 as usize),
Scalar::from(5678901.2345),
]),
"[false, \"abcd 1234\", -123, 0x13f09bf3ecf84cb, 5678901.2345]",
),
(
Value::from((
&[Scalar::from("key_a"), Scalar::from("key_b"), Scalar::from("key_c")],
&[Scalar::from(false), Scalar::from(-123), Scalar::from(456.789)],
)),
"{\"key_a\": false, \"key_b\": -123, \"key_c\": 456.789}",
),
] {
let (v, want): (Value, &str) = tc;
let mut out = Vec::new();
let attrs = Map::new();
assert!(write_value(&mut out, &attrs, &v).is_ok());
assert_eq!(String::from_utf8(out).unwrap(), want);
}
}
}