mago_reporting/formatter/
mod.rs1use std::io::Write;
2
3use mago_database::ReadDatabase;
4
5use crate::IssueCollection;
6use crate::Level;
7use crate::color::ColorChoice;
8use crate::error::ReportingError;
9
10pub mod ariadne;
11pub mod checkstyle;
12pub mod code_count;
13pub mod count;
14pub mod emacs;
15pub mod github;
16pub mod gitlab;
17pub mod json;
18pub mod medium;
19pub mod rich;
20pub mod sarif;
21pub mod short;
22pub mod utils;
23
24#[derive(Debug, Clone)]
26pub struct FormatterConfig {
27 pub color_choice: ColorChoice,
29 pub sort: bool,
31 pub minimum_level: Option<Level>,
33 pub filter_fixable: bool,
35 pub editor_url: Option<String>,
40}
41
42pub trait Formatter {
44 fn format(
57 &self,
58 writer: &mut dyn Write,
59 issues: &IssueCollection,
60 database: &ReadDatabase,
61 config: &FormatterConfig,
62 ) -> Result<(), ReportingError>;
63}
64
65#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumString, strum::VariantNames, Default)]
67#[strum(serialize_all = "kebab-case")]
68pub enum ReportingFormat {
69 #[default]
71 Rich,
72 Medium,
74 Short,
76 Ariadne,
78 Github,
80 Gitlab,
82 Json,
84 Count,
86 CodeCount,
88 Checkstyle,
90 Emacs,
92 Sarif,
94}
95
96pub(crate) fn dispatch_format(
100 format: ReportingFormat,
101 writer: &mut dyn Write,
102 issues: &IssueCollection,
103 database: &ReadDatabase,
104 config: &FormatterConfig,
105) -> Result<(), ReportingError> {
106 match format {
107 ReportingFormat::Rich => rich::RichFormatter.format(writer, issues, database, config),
108 ReportingFormat::Medium => medium::MediumFormatter.format(writer, issues, database, config),
109 ReportingFormat::Short => short::ShortFormatter.format(writer, issues, database, config),
110 ReportingFormat::Ariadne => ariadne::AriadneFormatter.format(writer, issues, database, config),
111 ReportingFormat::Json => json::JsonFormatter.format(writer, issues, database, config),
112 ReportingFormat::Github => github::GithubFormatter.format(writer, issues, database, config),
113 ReportingFormat::Gitlab => gitlab::GitlabFormatter.format(writer, issues, database, config),
114 ReportingFormat::Checkstyle => checkstyle::CheckstyleFormatter.format(writer, issues, database, config),
115 ReportingFormat::Emacs => emacs::EmacsFormatter.format(writer, issues, database, config),
116 ReportingFormat::Count => count::CountFormatter.format(writer, issues, database, config),
117 ReportingFormat::CodeCount => code_count::CodeCountFormatter.format(writer, issues, database, config),
118 ReportingFormat::Sarif => sarif::SarifFormatter.format(writer, issues, database, config),
119 }
120}