use std::io::Write;
use std::sync::Arc;
use tabnas_alchemy::shared::{
CsvOptions, Fail, JoinOut, JsonOptions, Limits, Metrics, Renderers, Sink, TableSink, TextOut,
};
use crate::csv::CsvRenderer;
use crate::json::JsonRenderer;
use crate::records::RecordsToJson;
use crate::text::{Join, ReplaceText, WriteOut};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub struct RenderRenderers;
pub fn renderers() -> RenderRenderers {
RenderRenderers
}
impl Renderers for RenderRenderers {
fn json(&self, out: Box<dyn TextOut + Send>, options: JsonOptions) -> Box<dyn Sink + Send> {
Box::new(JsonRenderer::new(out, options))
}
fn csv(
&self,
out: Box<dyn TextOut + Send>,
options: CsvOptions,
) -> Result<Box<dyn TableSink + Send>, Fail> {
Ok(Box::new(CsvRenderer::new(out, options)?))
}
fn records_to_json(&self, sink: Box<dyn Sink + Send>) -> Box<dyn TableSink + Send> {
Box::new(RecordsToJson::new(sink))
}
fn join<'a>(
&self,
out: Box<dyn TextOut + Send + 'a>,
separator: &str,
) -> Box<dyn JoinOut + Send + 'a> {
Box::new(Join::new(out, separator))
}
fn replace_text<'a>(
&self,
out: Box<dyn TextOut + Send + 'a>,
from: &str,
to: &str,
) -> Box<dyn TextOut + Send + 'a> {
Box::new(ReplaceText::new(out, from, to))
}
fn write_out(
&self,
writer: Box<dyn Write + Send>,
limits: &Limits,
metrics: Arc<Metrics>,
) -> Box<dyn TextOut + Send> {
Box::new(
WriteOut::new(writer)
.with_limits(limits)
.with_metrics(metrics),
)
}
}