#![warn(missing_docs)]
pub mod formats;
pub mod formatter;
pub use formatter::{Formatter, FormatterConfig};
pub use formats::{
AiFormatter, CsvFormatter, JsonFormatter, JsonlFormatter, StatsFormatter, TableFormatter,
};
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum OutputFormat {
Json,
Jsonl,
Csv,
Table,
Ai,
Stats,
}
#[non_exhaustive]
pub enum DynFormatter {
Json(JsonFormatter),
Jsonl(JsonlFormatter),
Csv(CsvFormatter),
Table(TableFormatter),
Ai(AiFormatter),
Stats(StatsFormatter),
}
impl DynFormatter {
pub fn from_format(format: OutputFormat) -> Self {
match format {
OutputFormat::Json => Self::Json(JsonFormatter::default()),
OutputFormat::Jsonl => Self::Jsonl(JsonlFormatter::default()),
OutputFormat::Csv => Self::Csv(CsvFormatter::default()),
OutputFormat::Table => Self::Table(TableFormatter::default()),
OutputFormat::Ai => Self::Ai(AiFormatter::default()),
OutputFormat::Stats => Self::Stats(StatsFormatter::default()),
}
}
pub fn config(&self) -> &FormatterConfig {
match self {
Self::Json(f) => f.config(),
Self::Jsonl(f) => f.config(),
Self::Csv(f) => f.config(),
Self::Table(f) => f.config(),
Self::Ai(f) => f.config(),
Self::Stats(f) => f.config(),
}
}
pub fn set_config(&mut self, config: FormatterConfig) {
match self {
Self::Json(f) => f.set_config(config),
Self::Jsonl(f) => f.set_config(config),
Self::Csv(f) => f.set_config(config),
Self::Table(f) => f.set_config(config),
Self::Ai(f) => f.set_config(config),
Self::Stats(f) => f.set_config(config),
}
}
}
macro_rules! delegate_formatter {
($($format:ident),*) => {
impl Formatter for DynFormatter {
fn format<W: std::io::Write>(&self, entries: &[cai_core::Entry], writer: &mut W) -> cai_core::Result<()> {
match self {
$(Self::$format(f) => f.format(entries, writer),)*
}
}
fn format_one<W: std::io::Write>(&self, entry: &cai_core::Entry, writer: &mut W) -> cai_core::Result<()> {
match self {
$(Self::$format(f) => f.format_one(entry, writer),)*
}
}
fn config(&self) -> &FormatterConfig {
match self {
$(Self::$format(f) => f.config(),)*
}
}
fn set_config(&mut self, config: FormatterConfig) {
match self {
$(Self::$format(f) => f.set_config(config),)*
}
}
}
}
}
delegate_formatter!(Json, Jsonl, Csv, Table, Ai, Stats);