use std::io::Write;
use mago_database::ReadDatabase;
use crate::IssueCollection;
use crate::Level;
use crate::color::ColorChoice;
use crate::error::ReportingError;
pub mod ariadne;
pub mod checkstyle;
pub mod code_count;
pub mod count;
pub mod emacs;
pub mod github;
pub mod gitlab;
pub mod json;
pub mod medium;
pub mod rich;
pub mod sarif;
pub mod short;
pub mod utils;
#[derive(Debug, Clone)]
pub struct FormatterConfig {
pub color_choice: ColorChoice,
pub sort: bool,
pub minimum_level: Option<Level>,
pub filter_fixable: bool,
pub editor_url: Option<String>,
}
pub trait Formatter {
fn format(
&self,
writer: &mut dyn Write,
issues: &IssueCollection,
database: &ReadDatabase,
config: &FormatterConfig,
) -> Result<(), ReportingError>;
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumString, strum::VariantNames, Default)]
#[strum(serialize_all = "kebab-case")]
pub enum ReportingFormat {
#[default]
Rich,
Medium,
Short,
Ariadne,
Github,
Gitlab,
Json,
Count,
CodeCount,
Checkstyle,
Emacs,
Sarif,
}
pub(crate) fn dispatch_format(
format: ReportingFormat,
writer: &mut dyn Write,
issues: &IssueCollection,
database: &ReadDatabase,
config: &FormatterConfig,
) -> Result<(), ReportingError> {
match format {
ReportingFormat::Rich => rich::RichFormatter.format(writer, issues, database, config),
ReportingFormat::Medium => medium::MediumFormatter.format(writer, issues, database, config),
ReportingFormat::Short => short::ShortFormatter.format(writer, issues, database, config),
ReportingFormat::Ariadne => ariadne::AriadneFormatter.format(writer, issues, database, config),
ReportingFormat::Json => json::JsonFormatter.format(writer, issues, database, config),
ReportingFormat::Github => github::GithubFormatter.format(writer, issues, database, config),
ReportingFormat::Gitlab => gitlab::GitlabFormatter.format(writer, issues, database, config),
ReportingFormat::Checkstyle => checkstyle::CheckstyleFormatter.format(writer, issues, database, config),
ReportingFormat::Emacs => emacs::EmacsFormatter.format(writer, issues, database, config),
ReportingFormat::Count => count::CountFormatter.format(writer, issues, database, config),
ReportingFormat::CodeCount => code_count::CodeCountFormatter.format(writer, issues, database, config),
ReportingFormat::Sarif => sarif::SarifFormatter.format(writer, issues, database, config),
}
}