use std::fmt::Display;
use bytes::BytesMut;
use serde::Deserialize;
mod columns;
mod formatting;
mod logfmt;
mod patterns;
mod sourced;
use logfmt::*;
use patterns::*;
pub use sourced::SourcedLine;
pub trait PrettyPrintable
where
Self: Display,
{
fn write(&self, buffer: &mut BytesMut) -> usize;
fn cells(&self) -> Vec<String>;
}
#[derive(Debug, Clone, Deserialize)]
#[serde(untagged, bound(deserialize = "'de: 'a"))]
pub enum Printable<'a> {
Canonical(Box<Canonical<'a>>),
Java(Box<Java<'a>>),
Message(Box<Message<'a>>),
TimeOnly(Timestamped),
Json(GenericJson),
Logfmt(LogfmtLine),
Text(String),
}
impl<'a> PrettyPrintable for Printable<'a> {
fn write(&self, buffer: &mut BytesMut) -> usize {
match self {
Printable::Canonical(canonical) => canonical.as_ref().write(buffer),
Printable::Java(java) => java.as_ref().write(buffer),
Printable::Message(message) => message.as_ref().write(buffer),
Printable::TimeOnly(timestamped) => timestamped.write(buffer),
Printable::Json(generic) => generic.write(buffer),
Printable::Logfmt(logfmt) => logfmt.write(buffer),
Printable::Text(text) => {
buffer.extend_from_slice(text.as_bytes());
buffer.len()
}
}
}
fn cells(&self) -> Vec<String> {
match self {
Printable::Canonical(canonical) => canonical.as_ref().cells(),
Printable::Java(java) => java.as_ref().cells(),
Printable::Message(message) => message.as_ref().cells(),
Printable::TimeOnly(timestamped) => timestamped.cells(),
Printable::Json(generic) => generic.cells(),
Printable::Logfmt(logfmt) => logfmt.cells(),
Printable::Text(_) => Vec::new(),
}
}
}
impl<'a> Display for Printable<'a> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Printable::Canonical(canonical) => canonical.fmt(f),
Printable::Java(java) => java.fmt(f),
Printable::Message(message) => message.fmt(f),
Printable::TimeOnly(timestamped) => timestamped.fmt(f),
Printable::Json(generic) => generic.fmt(f),
Printable::Logfmt(logfmt) => logfmt.fmt(f),
Printable::Text(text) => text.fmt(f),
}
}
}