stern4rust/settings/
config_file.rs1use anyhow::Context;
6use anyhow::Result;
7use serde::Deserialize;
8use std::fs::read_to_string;
9use std::path::Path;
10use std::path::PathBuf;
11use toml::from_str;
12
13#[derive(Debug, Default, Deserialize, PartialEq, Eq)]
26#[serde(deny_unknown_fields, rename_all = "kebab-case")]
27pub struct ConfigFile {
28 #[serde(default)]
29 pub baseline: Option<PathBuf>,
30 #[serde(default)]
31 pub header_file: Option<PathBuf>,
32 #[serde(default)]
33 pub max_files_per_directory: Option<usize>,
34 #[serde(default)]
35 pub max_subfolders_per_directory: Option<usize>,
36 #[serde(default)]
37 pub offence_threshold: Option<usize>,
38 #[serde(default)]
39 pub rules: Vec<String>,
40 #[serde(default)]
41 pub skip: Vec<String>,
42 #[serde(default)]
43 pub exclude: Vec<String>,
44}
45
46impl ConfigFile {
47 pub const NAME: &'static str = "stern4rust.toml";
48
49 pub fn load(directory: &Path) -> Result<Option<Self>> {
54 let path = directory.join(Self::NAME);
55 if !path.exists() {
56 return Ok(None);
57 }
58 let text = read_to_string(&path)
59 .with_context(|| format!("{} could not be read", path.display()))?;
60 let parsed = from_str(&text)
61 .with_context(|| format!("{} is not valid stern4rust configuration", path.display()))?;
62 Ok(Some(parsed))
63 }
64
65 pub fn baseline_from(&self, directory: &Path) -> Option<PathBuf> {
68 self.baseline
69 .as_ref()
70 .map(|relative| directory.join(relative))
71 }
72
73 pub fn header_file_from(&self, directory: &Path) -> Option<PathBuf> {
74 self.header_file
75 .as_ref()
76 .map(|relative| directory.join(relative))
77 }
78}