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
102pub(crate) fn dispatch_format(
106 format: ReportingFormat,
107 writer: &mut dyn Write,
108 issues: &IssueCollection,
109 database: &ReadDatabase,
110 config: &FormatterConfig,
111) -> Result<(), ReportingError> {
112 match format {
113 ReportingFormat::Rich => rich::RichFormatter.format(writer, issues, database, config),
114 ReportingFormat::Medium => medium::MediumFormatter.format(writer, issues, database, config),
115 ReportingFormat::Short => short::ShortFormatter.format(writer, issues, database, config),
116 ReportingFormat::Ariadne => ariadne::AriadneFormatter.format(writer, issues, database, config),
117 #[cfg(feature = "serde")]
118 ReportingFormat::Json => json::JsonFormatter.format(writer, issues, database, config),
119 ReportingFormat::Github => github::GithubFormatter.format(writer, issues, database, config),
120 #[cfg(feature = "serde")]
121 ReportingFormat::Gitlab => gitlab::GitlabFormatter.format(writer, issues, database, config),
122 ReportingFormat::Checkstyle => checkstyle::CheckstyleFormatter.format(writer, issues, database, config),
123 ReportingFormat::Emacs => emacs::EmacsFormatter.format(writer, issues, database, config),
124 ReportingFormat::Count => count::CountFormatter.format(writer, issues, database, config),
125 ReportingFormat::CodeCount => code_count::CodeCountFormatter.format(writer, issues, database, config),
126 #[cfg(feature = "serde")]
127 ReportingFormat::Sarif => sarif::SarifFormatter.format(writer, issues, database, config),
128 }
129}