Skip to main content

tldr_cli/commands/bugbot/parsers/
mod.rs

1//! Output parsers for commodity diagnostic tools
2//!
3//! Each parser converts tool-specific output formats (NDJSON, JSON, etc.)
4//! into a uniform `Vec<L1Finding>`.
5
6pub mod cargo;
7pub mod cargo_audit;
8pub mod checkstyle;
9pub mod cppcheck;
10pub mod eslint;
11pub mod golangci_lint;
12pub mod ktlint;
13pub mod luacheck;
14pub mod phpstan;
15pub mod pyright;
16pub mod rubocop;
17pub mod ruff;
18pub mod swiftlint;
19
20use super::tools::L1Finding;
21
22/// Errors that can occur during output parsing
23#[derive(Debug)]
24pub enum ParseError {
25    /// JSON parsing failed
26    Json(serde_json::Error),
27    /// Output format not recognized
28    Format(String),
29}
30
31impl std::fmt::Display for ParseError {
32    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
33        match self {
34            ParseError::Json(e) => write!(f, "JSON parse error: {}", e),
35            ParseError::Format(s) => write!(f, "Format error: {}", s),
36        }
37    }
38}
39
40impl std::error::Error for ParseError {}
41
42impl From<serde_json::Error> for ParseError {
43    fn from(e: serde_json::Error) -> Self {
44        ParseError::Json(e)
45    }
46}
47
48/// Parse tool output using the named parser.
49///
50/// Dispatches to the appropriate parser based on `parser_name`.
51/// Returns `ParseError::Format` for unknown parser names.
52pub fn parse_tool_output(parser_name: &str, stdout: &str) -> Result<Vec<L1Finding>, ParseError> {
53    match parser_name {
54        "cargo" => Ok(cargo::parse_cargo_output(stdout)),
55        "cargo-audit" => cargo_audit::parse_cargo_audit_output(stdout),
56        "checkstyle" => Ok(checkstyle::parse_checkstyle_output(stdout)?),
57        "cppcheck" => Ok(cppcheck::parse_cppcheck_output(stdout)?),
58        "eslint" => eslint::parse_eslint_output(stdout),
59        "golangci-lint" => golangci_lint::parse_golangci_lint_output(stdout),
60        "ktlint" => ktlint::parse_ktlint_output(stdout),
61        "luacheck" => Ok(luacheck::parse_luacheck_output(stdout)?),
62        "phpstan" => phpstan::parse_phpstan_output(stdout),
63        "pyright" => pyright::parse_pyright_output(stdout),
64        "rubocop" => rubocop::parse_rubocop_output(stdout),
65        "ruff" => ruff::parse_ruff_output(stdout),
66        "swiftlint" => swiftlint::parse_swiftlint_output(stdout),
67        _ => Err(ParseError::Format(format!("Unknown parser: {}", parser_name))),
68    }
69}