pub(crate) mod json;
pub(crate) mod text;
use std::io;
use vernier_core::{ParityMode, Summary};
use crate::cli::IouTypeArg;
use crate::error::CliError;
pub(crate) struct FormatContext<'a> {
pub(crate) iou_type: IouTypeArg,
pub(crate) parity_mode: ParityMode,
pub(crate) max_dets: &'a [usize],
pub(crate) use_cats: bool,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub(crate) enum FormatName {
Text,
Json,
}
impl FormatName {
pub(crate) fn lookup(name: &str) -> Option<Self> {
registry().iter().find(|f| f.name() == name).map(|f| f.id())
}
pub(crate) fn known_names_joined() -> String {
let names: Vec<&str> = registry().iter().map(|f| f.name()).collect();
names.join(", ")
}
}
pub(crate) trait Formatter: Send + Sync {
fn name(&self) -> &'static str;
fn id(&self) -> FormatName;
fn render(
&self,
summary: &Summary,
ctx: &FormatContext<'_>,
out: &mut dyn io::Write,
) -> Result<(), CliError>;
}
pub(crate) fn registry() -> &'static [&'static dyn Formatter] {
static TEXT: text::Text = text::Text;
static JSON: json::Json = json::Json;
static REGISTRY: &[&dyn Formatter] = &[&TEXT, &JSON];
REGISTRY
}