use grep_printer::{
ColorSpecs, Standard, StandardBuilder, Summary, SummaryBuilder, SummaryKind, JSON, JSONBuilder,
};
use termcolor::Buffer;
use crate::escape::Escaped;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Mode {
Standard,
Count,
FilesWithMatches,
Quiet,
Json,
}
pub struct PrintOpts {
pub only_matching: bool,
pub column: bool,
pub mode: Mode,
pub color: bool,
pub escape: bool,
}
impl Default for PrintOpts {
fn default() -> Self {
Self {
only_matching: false,
column: false,
mode: Mode::Standard,
color: false,
escape: false,
}
}
}
pub enum Printer<'a> {
Standard(Standard<Escaped<&'a mut Buffer>>),
Summary(Summary<Escaped<&'a mut Buffer>>),
Json(JSON<Escaped<&'a mut Buffer>>),
}
pub fn build<'a>(o: &PrintOpts, buf: &'a mut Buffer) -> Printer<'a> {
let specs =
if o.color { ColorSpecs::default_with_color() } else { ColorSpecs::default() };
let buf = Escaped::new(buf, o.escape);
match o.mode {
Mode::Standard => Printer::Standard(
StandardBuilder::new()
.path(true)
.heading(false)
.only_matching(o.only_matching)
.column(o.column)
.stats(false)
.color_specs(specs)
.build(buf),
),
Mode::Json => Printer::Json(JSONBuilder::new().build(buf.into_json())),
Mode::Count | Mode::FilesWithMatches | Mode::Quiet => {
let kind = match o.mode {
Mode::Count => SummaryKind::Count,
Mode::FilesWithMatches => SummaryKind::PathWithMatch,
_ => SummaryKind::QuietWithMatch,
};
Printer::Summary(
SummaryBuilder::new()
.kind(kind)
.path(true)
.stats(false)
.color_specs(specs)
.build(buf),
)
}
}
}