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