1use std::collections::BTreeMap;
4use std::path::Path;
5
6use serde::{Deserialize, Serialize};
7
8#[derive(Debug, Clone, Default, Serialize, Deserialize)]
10#[serde(default)]
11pub struct TomlConfig {
12 pub scan: ScanConfig,
14
15 pub module: ModuleConfig,
17
18 pub export: ExportConfig,
20
21 pub analyze: AnalyzeConfig,
23
24 pub context: ContextConfig,
26
27 pub badge: BadgeConfig,
29
30 pub gate: GateConfig,
32
33 #[serde(default)]
35 pub view: BTreeMap<String, ViewProfile>,
36}
37
38#[derive(Debug, Clone, Default, Serialize, Deserialize)]
40#[serde(default)]
41pub struct ScanConfig {
42 pub paths: Option<Vec<String>>,
44
45 pub exclude: Option<Vec<String>>,
47
48 pub hidden: Option<bool>,
50
51 pub config: Option<String>,
53
54 pub no_ignore: Option<bool>,
56
57 pub no_ignore_parent: Option<bool>,
59
60 pub no_ignore_dot: Option<bool>,
62
63 pub no_ignore_vcs: Option<bool>,
65
66 pub doc_comments: Option<bool>,
68}
69
70#[derive(Debug, Clone, Default, Serialize, Deserialize)]
72#[serde(default)]
73pub struct ModuleConfig {
74 pub roots: Option<Vec<String>>,
76
77 pub depth: Option<usize>,
79
80 pub children: Option<String>,
82}
83
84#[derive(Debug, Clone, Default, Serialize, Deserialize)]
86#[serde(default)]
87pub struct ExportConfig {
88 pub min_code: Option<usize>,
90
91 pub max_rows: Option<usize>,
93
94 pub redact: Option<String>,
96
97 pub format: Option<String>,
99
100 pub children: Option<String>,
102}
103
104#[derive(Debug, Clone, Default, Serialize, Deserialize)]
106#[serde(default)]
107pub struct AnalyzeConfig {
108 pub preset: Option<String>,
110
111 pub window: Option<usize>,
113
114 pub format: Option<String>,
116
117 pub git: Option<bool>,
119
120 pub max_files: Option<usize>,
122
123 pub max_bytes: Option<u64>,
125
126 pub max_file_bytes: Option<u64>,
128
129 pub max_commits: Option<usize>,
131
132 pub max_commit_files: Option<usize>,
134
135 pub granularity: Option<String>,
137
138 pub effort_model: Option<String>,
140
141 pub effort_layer: Option<String>,
143
144 pub effort_base_ref: Option<String>,
146
147 pub effort_head_ref: Option<String>,
149
150 pub effort_monte_carlo: Option<bool>,
152
153 pub effort_mc_iterations: Option<usize>,
155
156 pub effort_mc_seed: Option<u64>,
158}
159
160#[derive(Debug, Clone, Default, Serialize, Deserialize)]
162#[serde(default)]
163pub struct ContextConfig {
164 pub budget: Option<String>,
166
167 pub strategy: Option<String>,
169
170 pub rank_by: Option<String>,
172
173 pub output: Option<String>,
175
176 pub compress: Option<bool>,
178}
179
180#[derive(Debug, Clone, Default, Serialize, Deserialize)]
182#[serde(default)]
183pub struct BadgeConfig {
184 pub metric: Option<String>,
186}
187
188#[derive(Debug, Clone, Default, Serialize, Deserialize)]
190#[serde(default)]
191pub struct GateConfig {
192 pub policy: Option<String>,
194
195 pub baseline: Option<String>,
197
198 pub preset: Option<String>,
200
201 pub fail_fast: Option<bool>,
203
204 pub rules: Option<Vec<GateRule>>,
206
207 pub ratchet: Option<Vec<RatchetRuleConfig>>,
209
210 pub allow_missing_baseline: Option<bool>,
212
213 pub allow_missing_current: Option<bool>,
215}
216
217#[derive(Debug, Clone, Serialize, Deserialize)]
219pub struct RatchetRuleConfig {
220 pub pointer: String,
222
223 #[serde(default)]
225 pub max_increase_pct: Option<f64>,
226
227 #[serde(default)]
229 pub max_value: Option<f64>,
230
231 #[serde(default)]
233 pub level: Option<String>,
234
235 #[serde(default)]
237 pub description: Option<String>,
238}
239
240#[derive(Debug, Clone, Serialize, Deserialize)]
242pub struct GateRule {
243 pub name: String,
245
246 pub pointer: String,
248
249 pub op: String,
251
252 #[serde(default)]
254 pub value: Option<serde_json::Value>,
255
256 #[serde(default)]
258 pub values: Option<Vec<serde_json::Value>>,
259
260 #[serde(default)]
262 pub negate: bool,
263
264 #[serde(default)]
266 pub level: Option<String>,
267
268 #[serde(default)]
270 pub message: Option<String>,
271}
272
273#[derive(Debug, Clone, Default, Serialize, Deserialize)]
275#[serde(default)]
276pub struct ViewProfile {
277 pub format: Option<String>,
280
281 pub top: Option<usize>,
283
284 pub files: Option<bool>,
287
288 pub module_roots: Option<Vec<String>>,
291
292 pub module_depth: Option<usize>,
294
295 pub min_code: Option<usize>,
297
298 pub max_rows: Option<usize>,
300
301 pub redact: Option<String>,
303
304 pub meta: Option<bool>,
306
307 pub children: Option<String>,
309
310 pub preset: Option<String>,
313
314 pub window: Option<usize>,
316
317 pub budget: Option<String>,
320
321 pub strategy: Option<String>,
323
324 pub rank_by: Option<String>,
326
327 pub output: Option<String>,
329
330 pub compress: Option<bool>,
332
333 pub metric: Option<String>,
336}
337
338impl TomlConfig {
339 pub fn parse(s: &str) -> Result<Self, toml::de::Error> {
341 toml::from_str(s)
342 }
343
344 pub fn from_file(path: &Path) -> std::io::Result<Self> {
346 let content = std::fs::read_to_string(path)?;
347 toml::from_str(&content)
348 .map_err(|e| std::io::Error::new(std::io::ErrorKind::InvalidData, e))
349 }
350}