shuck_linter/
rule_metadata.rs1use 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}