Skip to main content

alint_rules/
lib.rs

1//! Built-in rule implementations for alint.
2//!
3//! Rules are registered into an [`alint_core::RuleRegistry`] via
4//! [`register_builtin`]. Each kind has its own submodule.
5
6use alint_core::RuleRegistry;
7
8pub mod case;
9pub mod dir_absent;
10pub mod dir_contains;
11pub mod dir_exists;
12pub mod dir_only_contains;
13pub mod every_matching_has;
14pub mod file_absent;
15pub mod file_content_forbidden;
16pub mod file_content_matches;
17pub mod file_exists;
18pub mod file_header;
19pub mod file_is_text;
20pub mod file_max_size;
21pub mod filename_case;
22pub mod filename_regex;
23pub mod fixers;
24pub mod for_each_dir;
25pub mod for_each_file;
26pub mod io;
27pub mod pair;
28pub mod unique_by;
29
30/// Register every built-in rule kind into the given registry.
31pub fn register_builtin(registry: &mut RuleRegistry) {
32    registry.register("file_exists", file_exists::build);
33    registry.register("file_absent", file_absent::build);
34    registry.register("dir_exists", dir_exists::build);
35    registry.register("dir_absent", dir_absent::build);
36    registry.register("file_content_matches", file_content_matches::build);
37    registry.register("file_content_forbidden", file_content_forbidden::build);
38    registry.register("file_header", file_header::build);
39    registry.register("file_max_size", file_max_size::build);
40    registry.register("file_is_text", file_is_text::build);
41    registry.register("filename_case", filename_case::build);
42    registry.register("filename_regex", filename_regex::build);
43    registry.register("pair", pair::build);
44    registry.register("for_each_dir", for_each_dir::build);
45    registry.register("for_each_file", for_each_file::build);
46    registry.register("dir_only_contains", dir_only_contains::build);
47    registry.register("unique_by", unique_by::build);
48    registry.register("dir_contains", dir_contains::build);
49    registry.register("every_matching_has", every_matching_has::build);
50}
51
52/// Convenience constructor that returns a fresh registry pre-populated with
53/// every built-in rule.
54pub fn builtin_registry() -> RuleRegistry {
55    let mut r = RuleRegistry::new();
56    register_builtin(&mut r);
57    r
58}
59
60#[cfg(test)]
61mod registry_tests {
62    use super::*;
63
64    #[test]
65    fn every_documented_kind_is_registered() {
66        let r = builtin_registry();
67        let known: Vec<&str> = r.known_kinds().collect();
68        for kind in [
69            "file_exists",
70            "file_absent",
71            "dir_exists",
72            "dir_absent",
73            "file_content_matches",
74            "file_content_forbidden",
75            "file_header",
76            "file_max_size",
77            "file_is_text",
78            "filename_case",
79            "filename_regex",
80            "pair",
81            "for_each_dir",
82            "for_each_file",
83            "dir_only_contains",
84            "unique_by",
85            "dir_contains",
86            "every_matching_has",
87        ] {
88            assert!(
89                known.contains(&kind),
90                "{kind} missing from builtin registry"
91            );
92        }
93    }
94}