Skip to main content

shuck_linter/
rule_metadata.rs

1use crate::{Rule, code_to_rule};
2
3#[derive(Debug, Clone, Copy, PartialEq, Eq)]
4pub enum ShellCheckLevel {
5    Style,
6    Info,
7    Warning,
8    Error,
9}
10
11#[derive(Debug, Clone, Copy, PartialEq, Eq)]
12pub struct RuleMetadata {
13    pub code: &'static str,
14    pub shellcheck_level: Option<ShellCheckLevel>,
15    pub description: &'static str,
16    pub rationale: &'static str,
17    pub fix_description: Option<&'static str>,
18}
19
20include!(concat!(env!("OUT_DIR"), "/rule_metadata_data.rs"));
21
22pub fn rule_metadata(rule: Rule) -> Option<&'static RuleMetadata> {
23    rule_metadata_by_code(rule.code())
24}
25
26pub fn rule_metadata_by_code(code: &str) -> Option<&'static RuleMetadata> {
27    let rule = code_to_rule(code)?;
28    RULE_METADATA
29        .iter()
30        .find(|metadata| metadata.code == rule.code())
31}
32
33#[cfg(test)]
34mod tests {
35    use super::*;
36
37    #[test]
38    fn loads_rule_metadata_for_known_rules() {
39        let metadata = rule_metadata(Rule::UnusedAssignment).expect("metadata for C001");
40        assert_eq!(metadata.code, "C001");
41        assert_eq!(metadata.shellcheck_level, Some(ShellCheckLevel::Warning));
42        assert!(metadata.description.contains("assigned"));
43        assert!(metadata.rationale.contains("dead assignments"));
44    }
45}