use std::io::{self, Write};
#[cfg(feature = "color")]
use super::WriteStyle;
use super::{Formatter, StyledValue};
#[cfg(feature = "color")]
use anstyle::Style;
use log::kv::{Error, Key, Source, Value, VisitSource};
pub(crate) type KvFormatFn = dyn Fn(&mut Formatter, &dyn Source) -> io::Result<()> + Sync + Send;
pub fn hidden_kv_format(_formatter: &mut Formatter, _fields: &dyn Source) -> io::Result<()> {
Ok(())
}
pub fn default_kv_format(formatter: &mut Formatter, fields: &dyn Source) -> io::Result<()> {
fields
.visit(&mut DefaultVisitSource(formatter))
.map_err(|e| io::Error::new(io::ErrorKind::Other, e))
}
struct DefaultVisitSource<'a>(&'a mut Formatter);
impl<'a, 'kvs> VisitSource<'kvs> for DefaultVisitSource<'a> {
fn visit_pair(&mut self, key: Key, value: Value<'kvs>) -> Result<(), Error> {
write!(self.0, " {}={}", self.style_key(key), value)?;
Ok(())
}
}
impl DefaultVisitSource<'_> {
fn style_key<'k>(&self, text: Key<'k>) -> StyledValue<Key<'k>> {
#[cfg(feature = "color")]
{
StyledValue {
style: if self.0.write_style == WriteStyle::Never {
Style::new()
} else {
Style::new().italic()
},
value: text,
}
}
#[cfg(not(feature = "color"))]
{
text
}
}
}