pedant_core/check_config/
file.rs1use std::collections::BTreeMap;
2use std::sync::{Arc, LazyLock};
3
4use serde::Deserialize;
5
6use super::gate::GateConfig;
7use super::naming::{NamingCheck, NamingOverride};
8use super::pattern::{PatternCheck, PatternOverride};
9use super::string_list::deserialize_arc_str_slice;
10
11#[derive(Debug, Deserialize, Clone)]
14#[serde(deny_unknown_fields)]
15pub struct ItemVisibilityRule {
16 pub path: Box<str>,
18 pub kind: Box<str>,
20 pub name: Box<str>,
22 pub visibility: Box<str>,
25}
26
27#[derive(Debug, Deserialize, Clone)]
29#[serde(deny_unknown_fields)]
30pub struct FeatureBoundaryRule {
31 pub package: Box<str>,
33 pub feature: Box<str>,
35 pub rule: Box<str>,
38}
39
40#[derive(Debug, Deserialize, Clone)]
43#[serde(deny_unknown_fields)]
44pub struct FlatModuleFamily {
45 pub parent: Box<str>,
47 pub package_root: Box<str>,
49 pub prefix: Box<str>,
51}
52
53#[derive(Debug, Deserialize, Default)]
55#[serde(deny_unknown_fields)]
56pub struct ConfigFile {
57 #[serde(default)]
59 pub gate: GateConfig,
60 #[serde(default = "default_max_depth")]
62 pub max_depth: usize,
63 #[serde(default = "default_else_chain_threshold")]
65 pub else_chain_threshold: usize,
66 #[serde(default = "default_max_params")]
68 pub max_params: usize,
69 #[serde(default = "default_max_function_body_lines")]
71 pub max_function_body_lines: usize,
72 #[serde(
75 default = "default_module_root_files",
76 deserialize_with = "deserialize_arc_str_slice"
77 )]
78 pub module_root_files: Arc<[Arc<str>]>,
79 #[serde(default = "default_source_file_warn_lines")]
81 pub source_file_warn_lines: usize,
82 #[serde(default = "default_source_file_deny_lines")]
84 pub source_file_deny_lines: usize,
85 #[serde(default = "default_max_methods")]
87 pub max_methods: usize,
88 #[serde(default)]
90 pub forbid_attributes: PatternCheck,
91 #[serde(default)]
93 pub forbid_types: PatternCheck,
94 #[serde(default)]
96 pub forbid_calls: PatternCheck,
97 #[serde(default)]
99 pub forbid_macros: PatternCheck,
100 #[serde(default)]
102 pub check_naming: NamingCheck,
103 #[serde(default = "default_true")]
105 pub check_nested_if: bool,
106 #[serde(default = "default_true")]
108 pub check_if_in_match: bool,
109 #[serde(default = "default_true")]
111 pub check_nested_match: bool,
112 #[serde(default = "default_true")]
114 pub check_match_in_if: bool,
115 #[serde(default = "default_true")]
117 pub check_else_chain: bool,
118 #[serde(default)]
120 pub forbid_else: bool,
121 #[serde(default = "default_true")]
123 pub forbid_unsafe: bool,
124 #[serde(default)]
126 pub check_dyn_return: bool,
127 #[serde(default)]
129 pub check_dyn_param: bool,
130 #[serde(default)]
132 pub check_vec_box_dyn: bool,
133 #[serde(default)]
135 pub check_dyn_field: bool,
136 #[serde(default)]
138 pub check_clone_in_loop: bool,
139 #[serde(default)]
141 pub check_default_hasher: bool,
142 #[serde(default)]
144 pub check_mixed_concerns: bool,
145 #[serde(default)]
147 pub check_inline_tests: bool,
148 #[serde(default)]
150 pub check_let_underscore_result: bool,
151 #[serde(default)]
153 pub check_high_param_count: bool,
154 #[serde(default)]
156 pub check_long_function_body: bool,
157 #[serde(default)]
159 pub check_module_root_definitions: bool,
160 #[serde(default)]
162 pub check_large_source_file: bool,
163 #[serde(default)]
165 pub check_high_method_count: bool,
166 #[serde(default)]
168 pub count_forwarders: bool,
169 #[serde(default = "default_true")]
171 pub check_item_visibility_policy: bool,
172 #[serde(default)]
174 pub item_visibility_policy: Vec<ItemVisibilityRule>,
175 #[serde(default)]
177 pub check_ungated_test_api: bool,
178 #[serde(default)]
180 pub check_conflicting_module_root: bool,
181 #[serde(
183 default = "default_test_api_patterns",
184 deserialize_with = "deserialize_arc_str_slice"
185 )]
186 pub test_api_patterns: Arc<[Arc<str>]>,
187 #[serde(default = "default_test_support_feature")]
189 pub test_support_feature: Box<str>,
190 #[serde(default = "default_true")]
192 pub check_flat_module_family: bool,
193 #[serde(default)]
195 pub flat_module_families: Vec<FlatModuleFamily>,
196 #[serde(default = "default_true")]
198 pub check_feature_boundary: bool,
199 #[serde(default)]
201 pub feature_boundaries: Vec<FeatureBoundaryRule>,
202 #[serde(default)]
204 pub check_scattered_inherent_impl: bool,
205 #[serde(default)]
207 pub overrides: BTreeMap<Box<str>, PathOverride>,
208}
209
210#[derive(Debug, Deserialize, Default)]
212#[serde(deny_unknown_fields)]
213pub struct PathOverride {
214 pub enabled: Option<bool>,
216 pub max_depth: Option<usize>,
218 pub max_params: Option<usize>,
220 pub max_function_body_lines: Option<usize>,
222 pub source_file_warn_lines: Option<usize>,
225 pub source_file_deny_lines: Option<usize>,
227 pub max_methods: Option<usize>,
229 pub forbid_attributes: Option<PatternOverride>,
231 pub forbid_types: Option<PatternOverride>,
233 pub forbid_calls: Option<PatternOverride>,
235 pub forbid_macros: Option<PatternOverride>,
237 pub check_naming: Option<NamingOverride>,
239 pub check_nested_if: Option<bool>,
241 pub check_if_in_match: Option<bool>,
243 pub check_nested_match: Option<bool>,
245 pub check_match_in_if: Option<bool>,
247 pub check_else_chain: Option<bool>,
249 pub forbid_else: Option<bool>,
251 pub forbid_unsafe: Option<bool>,
253 pub check_dyn_return: Option<bool>,
255 pub check_dyn_param: Option<bool>,
257 pub check_vec_box_dyn: Option<bool>,
259 pub check_dyn_field: Option<bool>,
261 pub check_clone_in_loop: Option<bool>,
263 pub check_default_hasher: Option<bool>,
265 pub check_mixed_concerns: Option<bool>,
267 pub check_inline_tests: Option<bool>,
269 pub check_let_underscore_result: Option<bool>,
271 pub check_high_param_count: Option<bool>,
273 pub check_long_function_body: Option<bool>,
275 pub check_module_root_definitions: Option<bool>,
277 pub check_large_source_file: Option<bool>,
279 pub check_high_method_count: Option<bool>,
281 pub count_forwarders: Option<bool>,
283 pub check_item_visibility_policy: Option<bool>,
285 pub check_ungated_test_api: Option<bool>,
287 pub check_conflicting_module_root: Option<bool>,
289 pub check_flat_module_family: Option<bool>,
291 pub check_feature_boundary: Option<bool>,
293 pub check_scattered_inherent_impl: Option<bool>,
295}
296
297pub(super) fn default_max_depth() -> usize {
298 3
299}
300
301pub(super) fn default_else_chain_threshold() -> usize {
302 3
303}
304
305pub(super) fn default_max_params() -> usize {
306 5
307}
308
309pub(super) fn default_max_function_body_lines() -> usize {
310 120
311}
312
313static MODULE_ROOT_FILES_ARC: LazyLock<Arc<[Arc<str>]>> =
314 LazyLock::new(|| [Arc::from("mod.rs"), Arc::from("lib.rs")].into());
315
316pub(super) fn default_module_root_files() -> Arc<[Arc<str>]> {
317 Arc::clone(&MODULE_ROOT_FILES_ARC)
318}
319
320pub(super) fn default_source_file_warn_lines() -> usize {
321 500
322}
323
324pub(super) fn default_source_file_deny_lines() -> usize {
325 1000
326}
327
328pub(super) fn default_max_methods() -> usize {
329 40
330}
331
332static TEST_API_PATTERNS_ARC: LazyLock<Arc<[Arc<str>]>> =
333 LazyLock::new(|| [Arc::from("*_for_tests")].into());
334
335pub(super) fn default_test_api_patterns() -> Arc<[Arc<str>]> {
336 Arc::clone(&TEST_API_PATTERNS_ARC)
337}
338
339pub(super) fn default_test_support_feature() -> Box<str> {
340 "test-support".into()
341}
342
343fn default_true() -> bool {
344 true
345}