Skip to main content

normalize_syntax_rules/builtin/
mod.rs

1//! Embedded builtin rules for syntax-based linting.
2//!
3//! Rules are embedded at compile time and loaded as the lowest-priority source.
4//! Users can override or disable them via ~/.config/normalize/rules/ or .normalize/rules/.
5
6use crate::BuiltinRule;
7
8/// All embedded builtin rules.
9pub const BUILTIN_RULES: &[BuiltinRule] = &[
10    // Rust rules
11    BuiltinRule {
12        id: "rust/todo-macro",
13        content: include_str!("rust_todo_macro.scm"),
14    },
15    BuiltinRule {
16        id: "rust/println-debug",
17        content: include_str!("rust_println_debug.scm"),
18    },
19    BuiltinRule {
20        id: "rust/dbg-macro",
21        content: include_str!("rust_dbg_macro.scm"),
22    },
23    BuiltinRule {
24        id: "rust/expect-empty",
25        content: include_str!("rust_expect_empty.scm"),
26    },
27    BuiltinRule {
28        id: "rust/unwrap-in-impl",
29        content: include_str!("rust_unwrap_in_impl.scm"),
30    },
31    BuiltinRule {
32        id: "rust/unnecessary-let",
33        content: include_str!("rust_unnecessary_let.scm"),
34    },
35    BuiltinRule {
36        id: "rust/unnecessary-type-alias",
37        content: include_str!("rust_unnecessary_type_alias.scm"),
38    },
39    BuiltinRule {
40        id: "rust/chained-if-let",
41        content: include_str!("rust_chained_if_let.scm"),
42    },
43    BuiltinRule {
44        id: "rust/numeric-type-annotation",
45        content: include_str!("rust_numeric_type_annotation.scm"),
46    },
47    BuiltinRule {
48        id: "rust/tuple-return",
49        content: include_str!("rust_tuple_return.scm"),
50    },
51    BuiltinRule {
52        id: "rust/static-mut",
53        content: include_str!("rust_static_mut.scm"),
54    },
55    BuiltinRule {
56        id: "rust/magic-number",
57        content: include_str!("rust_magic_number.scm"),
58    },
59    BuiltinRule {
60        id: "rust/commented-out-code",
61        content: include_str!("rust_commented_out_code.scm"),
62    },
63    BuiltinRule {
64        id: "rust/missing-module-doc",
65        content: include_str!("rust_missing_module_doc.scm"),
66    },
67    BuiltinRule {
68        id: "hardcoded-secret",
69        content: include_str!("hardcoded_secret.scm"),
70    },
71    // JavaScript/TypeScript rules
72    BuiltinRule {
73        id: "js/console-log",
74        content: include_str!("js_console_log.scm"),
75    },
76    BuiltinRule {
77        id: "js/unnecessary-const",
78        content: include_str!("js_unnecessary_const.scm"),
79    },
80    BuiltinRule {
81        id: "js/module-let",
82        content: include_str!("js_module_let.scm"),
83    },
84    BuiltinRule {
85        id: "js/var-declaration",
86        content: include_str!("js_var_declaration.scm"),
87    },
88    BuiltinRule {
89        id: "js/typeof-string",
90        content: include_str!("js_typeof_string.scm"),
91    },
92    BuiltinRule {
93        id: "js/eq-null",
94        content: include_str!("js_eq_null.scm"),
95    },
96    BuiltinRule {
97        id: "js/no-await-in-loop",
98        content: include_str!("js_no_await_in_loop.scm"),
99    },
100    BuiltinRule {
101        id: "js/no-prototype-builtins",
102        content: include_str!("js_no_prototype_builtins.scm"),
103    },
104    BuiltinRule {
105        id: "js/prefer-optional-chain",
106        content: include_str!("js_prefer_optional_chain.scm"),
107    },
108    BuiltinRule {
109        id: "js/magic-number",
110        content: include_str!("js_magic_number.scm"),
111    },
112    BuiltinRule {
113        id: "typescript/tuple-return",
114        content: include_str!("typescript_tuple_return.scm"),
115    },
116    BuiltinRule {
117        id: "typescript/no-any",
118        content: include_str!("typescript_no_any.scm"),
119    },
120    BuiltinRule {
121        id: "typescript/no-non-null-assertion",
122        content: include_str!("typescript_no_non_null_assertion.scm"),
123    },
124    BuiltinRule {
125        id: "typescript/no-empty-interface",
126        content: include_str!("typescript_no_empty_interface.scm"),
127    },
128    BuiltinRule {
129        id: "typescript/no-inferrable-types",
130        content: include_str!("typescript_no_inferrable_types.scm"),
131    },
132    // Python rules
133    BuiltinRule {
134        id: "python/print-debug",
135        content: include_str!("python_print_debug.scm"),
136    },
137    BuiltinRule {
138        id: "python/breakpoint",
139        content: include_str!("python_breakpoint.scm"),
140    },
141    BuiltinRule {
142        id: "python/tuple-return",
143        content: include_str!("python_tuple_return.scm"),
144    },
145    BuiltinRule {
146        id: "python/module-assign",
147        content: include_str!("python_module_assign.scm"),
148    },
149    BuiltinRule {
150        id: "python/bare-except",
151        content: include_str!("python_bare_except.scm"),
152    },
153    BuiltinRule {
154        id: "python/mutable-default-arg",
155        content: include_str!("python_mutable_default_arg.scm"),
156    },
157    BuiltinRule {
158        id: "python/assert-in-non-test",
159        content: include_str!("python_assert.scm"),
160    },
161    BuiltinRule {
162        id: "python/use-enumerate",
163        content: include_str!("python_use_enumerate.scm"),
164    },
165    BuiltinRule {
166        id: "python/raise-without-from",
167        content: include_str!("python_raise_without_from.scm"),
168    },
169    BuiltinRule {
170        id: "python/no-star-import",
171        content: include_str!("python_no_star_import.scm"),
172    },
173    BuiltinRule {
174        id: "python/use-with",
175        content: include_str!("python_use_with.scm"),
176    },
177    BuiltinRule {
178        id: "python/magic-number",
179        content: include_str!("python_magic_number.scm"),
180    },
181    // Go rules
182    BuiltinRule {
183        id: "go/fmt-print",
184        content: include_str!("go_fmt_print.scm"),
185    },
186    BuiltinRule {
187        id: "go/many-returns",
188        content: include_str!("go_many_returns.scm"),
189    },
190    BuiltinRule {
191        id: "go/package-var",
192        content: include_str!("go_package_var.scm"),
193    },
194    BuiltinRule {
195        id: "go/error-ignored",
196        content: include_str!("go_error_ignored.scm"),
197    },
198    BuiltinRule {
199        id: "go/empty-return",
200        content: include_str!("go_empty_return.scm"),
201    },
202    BuiltinRule {
203        id: "go/defer-in-loop",
204        content: include_str!("go_defer_in_loop.scm"),
205    },
206    BuiltinRule {
207        id: "go/context-todo",
208        content: include_str!("go_context_todo.scm"),
209    },
210    BuiltinRule {
211        id: "go/sync-mutex-copied",
212        content: include_str!("go_sync_mutex_copied.scm"),
213    },
214    BuiltinRule {
215        id: "go/magic-number",
216        content: include_str!("go_magic_number.scm"),
217    },
218    // C/C++ rules
219    BuiltinRule {
220        id: "c/printf-debug",
221        content: include_str!("c_printf_debug.scm"),
222    },
223    BuiltinRule {
224        id: "c/goto",
225        content: include_str!("c_goto.scm"),
226    },
227    BuiltinRule {
228        id: "c/magic-number",
229        content: include_str!("c_magic_number.scm"),
230    },
231    BuiltinRule {
232        id: "cpp/cout-debug",
233        content: include_str!("cpp_cout_debug.scm"),
234    },
235    // C# rules
236    BuiltinRule {
237        id: "csharp/console-write",
238        content: include_str!("csharp_console_write.scm"),
239    },
240    BuiltinRule {
241        id: "csharp/empty-catch",
242        content: include_str!("csharp_empty_catch.scm"),
243    },
244    BuiltinRule {
245        id: "csharp/goto",
246        content: include_str!("csharp_goto.scm"),
247    },
248    BuiltinRule {
249        id: "csharp/magic-number",
250        content: include_str!("csharp_magic_number.scm"),
251    },
252    BuiltinRule {
253        id: "csharp/thread-sleep",
254        content: include_str!("csharp_thread_sleep.scm"),
255    },
256    BuiltinRule {
257        id: "csharp/suppress-warnings",
258        content: include_str!("csharp_suppress_warnings.scm"),
259    },
260    // Kotlin rules
261    BuiltinRule {
262        id: "kotlin/println-debug",
263        content: include_str!("kotlin_println_debug.scm"),
264    },
265    BuiltinRule {
266        id: "kotlin/empty-catch",
267        content: include_str!("kotlin_empty_catch.scm"),
268    },
269    BuiltinRule {
270        id: "kotlin/magic-number",
271        content: include_str!("kotlin_magic_number.scm"),
272    },
273    BuiltinRule {
274        id: "kotlin/thread-sleep",
275        content: include_str!("kotlin_thread_sleep.scm"),
276    },
277    BuiltinRule {
278        id: "kotlin/suppress-warnings",
279        content: include_str!("kotlin_suppress_warnings.scm"),
280    },
281    // Swift rules
282    BuiltinRule {
283        id: "swift/print-debug",
284        content: include_str!("swift_print_debug.scm"),
285    },
286    BuiltinRule {
287        id: "swift/empty-catch",
288        content: include_str!("swift_empty_catch.scm"),
289    },
290    BuiltinRule {
291        id: "swift/magic-number",
292        content: include_str!("swift_magic_number.scm"),
293    },
294    BuiltinRule {
295        id: "swift/force-unwrap",
296        content: include_str!("swift_force_unwrap.scm"),
297    },
298    BuiltinRule {
299        id: "swift/thread-sleep",
300        content: include_str!("swift_thread_sleep.scm"),
301    },
302    // PHP rules
303    BuiltinRule {
304        id: "php/debug-print",
305        content: include_str!("php_debug_print.scm"),
306    },
307    BuiltinRule {
308        id: "php/empty-catch",
309        content: include_str!("php_empty_catch.scm"),
310    },
311    BuiltinRule {
312        id: "php/goto",
313        content: include_str!("php_goto.scm"),
314    },
315    BuiltinRule {
316        id: "php/magic-number",
317        content: include_str!("php_magic_number.scm"),
318    },
319    BuiltinRule {
320        id: "php/eval",
321        content: include_str!("php_eval.scm"),
322    },
323    // Java rules
324    BuiltinRule {
325        id: "java/system-print",
326        content: include_str!("java_system_print.scm"),
327    },
328    BuiltinRule {
329        id: "java/empty-catch",
330        content: include_str!("java_empty_catch.scm"),
331    },
332    BuiltinRule {
333        id: "java/print-stack-trace",
334        content: include_str!("java_print_stack_trace.scm"),
335    },
336    BuiltinRule {
337        id: "java/magic-number",
338        content: include_str!("java_magic_number.scm"),
339    },
340    BuiltinRule {
341        id: "java/suppress-warnings",
342        content: include_str!("java_suppress_warnings.scm"),
343    },
344    BuiltinRule {
345        id: "java/thread-sleep",
346        content: include_str!("java_thread_sleep.scm"),
347    },
348    // Ruby rules
349    BuiltinRule {
350        id: "ruby/binding-pry",
351        content: include_str!("ruby_binding_pry.scm"),
352    },
353    BuiltinRule {
354        id: "ruby/global-var",
355        content: include_str!("ruby_global_var.scm"),
356    },
357    BuiltinRule {
358        id: "ruby/rescue-exception",
359        content: include_str!("ruby_rescue_exception.scm"),
360    },
361    BuiltinRule {
362        id: "ruby/puts-in-lib",
363        content: include_str!("ruby_puts_in_lib.scm"),
364    },
365    BuiltinRule {
366        id: "ruby/string-concat",
367        content: include_str!("ruby_string_concat.scm"),
368    },
369    BuiltinRule {
370        id: "ruby/double-negation",
371        content: include_str!("ruby_double_negation.scm"),
372    },
373    BuiltinRule {
374        id: "ruby/open-struct",
375        content: include_str!("ruby_open_struct.scm"),
376    },
377    BuiltinRule {
378        id: "ruby/method-missing",
379        content: include_str!("ruby_method_missing.scm"),
380    },
381    BuiltinRule {
382        id: "ruby/magic-number",
383        content: include_str!("ruby_magic_number.scm"),
384    },
385    // Cross-language rules
386    BuiltinRule {
387        id: "no-todo-comment",
388        content: include_str!("no_todo_comment.scm"),
389    },
390    BuiltinRule {
391        id: "no-fixme-comment",
392        content: include_str!("no_fixme_comment.scm"),
393    },
394    BuiltinRule {
395        id: "commented-out-code",
396        content: include_str!("commented_out_code.scm"),
397    },
398];