Skip to main content

sherlock_io/patterns/
haskell.rs

1use regex::Regex;
2
3pub struct HaskellPatterns {
4    external_patterns: Vec<Regex>,
5    cache_patterns: Vec<Regex>,
6    extensions: Vec<String>,
7}
8
9impl HaskellPatterns {
10    pub fn new() -> Self {
11        let external_patterns = vec![
12            // Stack build artifacts
13            Regex::new(r"\.stack-work/").unwrap(),
14            Regex::new(r"stack\.yaml\.lock").unwrap(),
15            
16            // Cabal build artifacts
17            Regex::new(r"dist/").unwrap(),
18            Regex::new(r"dist-newstyle/").unwrap(),
19            Regex::new(r"cabal\.project\.local").unwrap(),
20            Regex::new(r"\.cabal-sandbox/").unwrap(),
21            Regex::new(r"cabal\.sandbox\.config").unwrap(),
22            
23            // GHC artifacts
24            Regex::new(r"\.hi$").unwrap(),
25            Regex::new(r"\.o$").unwrap(),
26            Regex::new(r"\.dyn_hi$").unwrap(),
27            Regex::new(r"\.dyn_o$").unwrap(),
28            Regex::new(r"\.p_hi$").unwrap(),
29            Regex::new(r"\.p_o$").unwrap(),
30            
31            // Haddock documentation
32            Regex::new(r"\.haddock/").unwrap(),
33            Regex::new(r"haddock\.html").unwrap(),
34            
35            // Nix build artifacts
36            Regex::new(r"result").unwrap(),
37            Regex::new(r"result-*").unwrap(),
38            
39            // IDE files
40            Regex::new(r"\.ghc\.environment\.").unwrap(),
41            Regex::new(r"\.hie/").unwrap(),
42            Regex::new(r"\.hiedb").unwrap(),
43            
44            // Package databases
45            Regex::new(r"package\.conf\.d/").unwrap(),
46            
47            // Profiling files
48            Regex::new(r"\.prof$").unwrap(),
49            Regex::new(r"\.hp$").unwrap(),
50            Regex::new(r"\.ps$").unwrap(),
51            Regex::new(r"\.aux$").unwrap(),
52            
53            // Test coverage
54            Regex::new(r"\.tix$").unwrap(),
55            Regex::new(r"hpc_index\.html").unwrap(),
56            
57            // Temporary files
58            Regex::new(r"\.swp$").unwrap(),
59            Regex::new(r"\.swo$").unwrap(),
60            Regex::new(r"~$").unwrap(),
61        ];
62
63        let cache_patterns = vec![
64            // Stack cache
65            Regex::new(r"\.stack-work/").unwrap(),
66            
67            // Cabal cache
68            Regex::new(r"dist/").unwrap(),
69            Regex::new(r"dist-newstyle/").unwrap(),
70            
71            // GHC cache
72            Regex::new(r"\.ghc/").unwrap(),
73            
74            // HIE cache
75            Regex::new(r"\.hie/").unwrap(),
76        ];
77
78        let extensions = vec![
79            // Haskell source files
80            "hs".to_string(),
81            
82            // Literate Haskell
83            "lhs".to_string(),
84            
85            // Haskell C files
86            "hsc".to_string(),
87            
88            // Cabal files
89            "cabal".to_string(),
90            
91            // C files (often used with Haskell)
92            "c".to_string(),
93            "h".to_string(),
94            
95            // Configuration files
96            "yaml".to_string(),
97            "yml".to_string(),
98            "json".to_string(),
99            
100            // Documentation
101            "md".to_string(),
102            "rst".to_string(),
103            "txt".to_string(),
104            
105            // Nix files (common in Haskell projects)
106            "nix".to_string(),
107            
108            // Shell scripts
109            "sh".to_string(),
110        ];
111
112        Self {
113            external_patterns,
114            cache_patterns,
115            extensions,
116        }
117    }
118
119    pub fn get_external_patterns(&self) -> &[Regex] {
120        &self.external_patterns
121    }
122
123    pub fn get_cache_patterns(&self) -> &[Regex] {
124        &self.cache_patterns
125    }
126
127    pub fn get_extensions(&self) -> &[String] {
128        &self.extensions
129    }
130
131    pub fn get_script_names() -> Vec<&'static str> {
132        vec![
133            // Stack files
134            "stack.yaml", "stack.yaml.lock",
135            
136            // Cabal files
137            "cabal.project", "cabal.project.local",
138            "Setup.hs", "Setup.lhs",
139            
140            // Package files
141            "package.yaml", "hpack.yaml",
142            
143            // Build scripts
144            "Makefile", "makefile", "build.sh",
145            
146            // Nix files
147            "default.nix", "shell.nix", "release.nix",
148            
149            // Documentation
150            "README.md", "CHANGELOG.md", "LICENSE",
151            
152            // Configuration
153            ".ghci", ".ghc-flags", ".hspec",
154            
155            // CI/CD
156            ".github/workflows/haskell.yml",
157            ".travis.yml", "appveyor.yml",
158            "circle.yml", ".circleci/config.yml",
159            
160            // Git
161            ".gitignore", ".gitattributes",
162            
163            // Editor
164            ".dir-locals.el", ".projectile",
165            
166            // Benchmarks
167            "bench.hs", "benchmarks.hs",
168            
169            // Tests
170            "test.hs", "tests.hs", "Spec.hs",
171            
172            // Examples
173            "example.hs", "examples.hs",
174            
175            // Main files
176            "Main.hs", "main.hs",
177            
178            // Library files
179            "Lib.hs", "lib.hs",
180        ]
181    }
182}