From 79204caba651e890c1ebeceeddc8136f6df6b566 Mon Sep 17 00:00:00 2001 From: Brent Westbrook Date: Fri, 26 Sep 2025 12:05:32 -0400 Subject: [PATCH] factor out DiagnosticFormat::try_from(OutputFormat) --- crates/ruff/src/printer.rs | 58 ++++-------------------- crates/ruff_linter/src/settings/types.rs | 29 ++++++++++++ 2 files changed, 38 insertions(+), 49 deletions(-) diff --git a/crates/ruff/src/printer.rs b/crates/ruff/src/printer.rs index 0cbd455741..3ea8bc00b9 100644 --- a/crates/ruff/src/printer.rs +++ b/crates/ruff/src/printer.rs @@ -18,7 +18,7 @@ use ruff_linter::logging::LogLevel; use ruff_linter::message::{Emitter, EmitterContext, GroupedEmitter, SarifEmitter}; use ruff_linter::notify_user; use ruff_linter::settings::flags::{self}; -use ruff_linter::settings::types::{OutputFormat, UnsafeFixes}; +use ruff_linter::settings::types::{OutputFormat, RuffOutputFormat, UnsafeFixes}; use crate::diagnostics::{Diagnostics, FixMap}; @@ -233,64 +233,24 @@ impl Printer { .fix_applicability(self.unsafe_fixes.required_applicability()) .show_fix_diff(preview); - match self.format { - OutputFormat::Json => { - let config = config.format(DiagnosticFormat::Json); + match DiagnosticFormat::try_from(self.format) { + Ok(format) => { + let config = config.format(format); let value = DisplayDiagnostics::new(&context, &config, &diagnostics.inner); write!(writer, "{value}")?; } - OutputFormat::Rdjson => { - let config = config.format(DiagnosticFormat::Rdjson); - let value = DisplayDiagnostics::new(&context, &config, &diagnostics.inner); + Err(RuffOutputFormat::Github) => { + let renderer = GithubRenderer::new(&context, "Ruff"); + let value = DisplayGithubDiagnostics::new(&renderer, &diagnostics.inner); write!(writer, "{value}")?; } - OutputFormat::JsonLines => { - let config = config.format(DiagnosticFormat::JsonLines); - let value = DisplayDiagnostics::new(&context, &config, &diagnostics.inner); - write!(writer, "{value}")?; - } - OutputFormat::Junit => { - let config = config.format(DiagnosticFormat::Junit); - let value = DisplayDiagnostics::new(&context, &config, &diagnostics.inner); - write!(writer, "{value}")?; - } - OutputFormat::Concise => { - let config = config.format(DiagnosticFormat::Concise); - let value = DisplayDiagnostics::new(&context, &config, &diagnostics.inner); - write!(writer, "{value}")?; - } - OutputFormat::Full => { - let config = config.format(DiagnosticFormat::Full); - let value = DisplayDiagnostics::new(&context, &config, &diagnostics.inner); - write!(writer, "{value}")?; - } - OutputFormat::Grouped => { + Err(RuffOutputFormat::Grouped) => { GroupedEmitter::default() .with_show_fix_status(show_fix_status(self.fix_mode, fixables.as_ref())) .with_unsafe_fixes(self.unsafe_fixes) .emit(writer, &diagnostics.inner, &context)?; } - OutputFormat::Github => { - let renderer = GithubRenderer::new(&context, "Ruff"); - let value = DisplayGithubDiagnostics::new(&renderer, &diagnostics.inner); - write!(writer, "{value}")?; - } - OutputFormat::Gitlab => { - let config = config.format(DiagnosticFormat::Gitlab); - let value = DisplayDiagnostics::new(&context, &config, &diagnostics.inner); - write!(writer, "{value}")?; - } - OutputFormat::Pylint => { - let config = config.format(DiagnosticFormat::Pylint); - let value = DisplayDiagnostics::new(&context, &config, &diagnostics.inner); - write!(writer, "{value}")?; - } - OutputFormat::Azure => { - let config = config.format(DiagnosticFormat::Azure); - let value = DisplayDiagnostics::new(&context, &config, &diagnostics.inner); - write!(writer, "{value}")?; - } - OutputFormat::Sarif => { + Err(RuffOutputFormat::Sarif) => { SarifEmitter.emit(writer, &diagnostics.inner, &context)?; } } diff --git a/crates/ruff_linter/src/settings/types.rs b/crates/ruff_linter/src/settings/types.rs index a72e80284a..760422a0ce 100644 --- a/crates/ruff_linter/src/settings/types.rs +++ b/crates/ruff_linter/src/settings/types.rs @@ -9,6 +9,7 @@ use anyhow::{Context, Result, bail}; use globset::{Glob, GlobMatcher, GlobSet, GlobSetBuilder}; use log::debug; use pep440_rs::{VersionSpecifier, VersionSpecifiers}; +use ruff_db::diagnostic::DiagnosticFormat; use rustc_hash::FxHashMap; use serde::{Deserialize, Deserializer, Serialize, de}; use strum_macros::EnumIter; @@ -553,6 +554,34 @@ impl Display for OutputFormat { } } +/// The subset of output formats only implemented in Ruff, not in `ruff_db` via `DisplayDiagnostics`. +pub enum RuffOutputFormat { + Github, + Grouped, + Sarif, +} + +impl TryFrom for DiagnosticFormat { + type Error = RuffOutputFormat; + + fn try_from(format: OutputFormat) -> std::result::Result { + match format { + OutputFormat::Concise => Ok(DiagnosticFormat::Concise), + OutputFormat::Full => Ok(DiagnosticFormat::Full), + OutputFormat::Json => Ok(DiagnosticFormat::Json), + OutputFormat::JsonLines => Ok(DiagnosticFormat::JsonLines), + OutputFormat::Junit => Ok(DiagnosticFormat::Junit), + OutputFormat::Gitlab => Ok(DiagnosticFormat::Gitlab), + OutputFormat::Pylint => Ok(DiagnosticFormat::Pylint), + OutputFormat::Rdjson => Ok(DiagnosticFormat::Rdjson), + OutputFormat::Azure => Ok(DiagnosticFormat::Azure), + OutputFormat::Github => Err(RuffOutputFormat::Github), + OutputFormat::Grouped => Err(RuffOutputFormat::Grouped), + OutputFormat::Sarif => Err(RuffOutputFormat::Sarif), + } + } +} + #[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize, Hash)] #[serde(try_from = "String")] pub struct RequiredVersion(VersionSpecifiers);