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;
16#[cfg(feature = "serde")]
17pub mod gitlab;
18#[cfg(feature = "serde")]
19pub mod json;
20pub mod medium;
21pub mod rich;
22#[cfg(feature = "serde")]
23pub mod sarif;
24pub mod short;
25pub mod utils;
26
27#[derive(Debug, Clone)]
29pub struct FormatterConfig {
30 pub color_choice: ColorChoice,
32 pub sort: bool,
34 pub minimum_level: Option<Level>,
36 pub filter_fixable: bool,
38 pub editor_url: Option<String>,
43}
44
45pub trait Formatter {
47 fn format(
60 &self,
61 writer: &mut dyn Write,
62 issues: &IssueCollection,
63 database: &ReadDatabase,
64 config: &FormatterConfig,
65 ) -> Result<(), ReportingError>;
66}
67
68#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, strum::Display, strum::EnumString, strum::VariantNames, Default)]
70#[strum(serialize_all = "kebab-case")]
71pub enum ReportingFormat {
72 #[default]
74 Rich,
75 Medium,
77 Short,
79 Ariadne,
81 Github,
83 #[cfg(feature = "serde")]
85 Gitlab,
86 #[cfg(feature = "serde")]
88 Json,
89 Count,
91 CodeCount,
93 Checkstyle,
95 Emacs,
97 #[cfg(feature = "serde")]
99 Sarif,
100}
101
102impl ReportingFormat {
103 #[must_use]
104 pub const fn requires_output_when_empty(self) -> bool {
105 match self {
106 Self::Checkstyle => true,
107 #[cfg(feature = "serde")]
108 Self::Gitlab | Self::Json | Self::Sarif => true,
109 _ => false,
110 }
111 }
112}
113
114pub(crate) fn dispatch_format(
118 format: ReportingFormat,
119 writer: &mut dyn Write,
120 issues: &IssueCollection,
121 database: &ReadDatabase,
122 config: &FormatterConfig,
123) -> Result<(), ReportingError> {
124 match format {
125 ReportingFormat::Rich => rich::RichFormatter.format(writer, issues, database, config),
126 ReportingFormat::Medium => medium::MediumFormatter.format(writer, issues, database, config),
127 ReportingFormat::Short => short::ShortFormatter.format(writer, issues, database, config),
128 ReportingFormat::Ariadne => ariadne::AriadneFormatter.format(writer, issues, database, config),
129 #[cfg(feature = "serde")]
130 ReportingFormat::Json => json::JsonFormatter.format(writer, issues, database, config),
131 ReportingFormat::Github => github::GithubFormatter.format(writer, issues, database, config),
132 #[cfg(feature = "serde")]
133 ReportingFormat::Gitlab => gitlab::GitlabFormatter.format(writer, issues, database, config),
134 ReportingFormat::Checkstyle => checkstyle::CheckstyleFormatter.format(writer, issues, database, config),
135 ReportingFormat::Emacs => emacs::EmacsFormatter.format(writer, issues, database, config),
136 ReportingFormat::Count => count::CountFormatter.format(writer, issues, database, config),
137 ReportingFormat::CodeCount => code_count::CodeCountFormatter.format(writer, issues, database, config),
138 #[cfg(feature = "serde")]
139 ReportingFormat::Sarif => sarif::SarifFormatter.format(writer, issues, database, config),
140 }
141}