use crate::settings::package_config::PackageConfig;
use anyhow::Context;
use anyhow::Result;
use serde::Deserialize;
use std::collections::BTreeMap;
use std::fs::read_to_string;
use std::path::Path;
use std::path::PathBuf;
use toml::from_str;
#[derive(Debug, Default, Deserialize, PartialEq, Eq)]
#[serde(deny_unknown_fields, rename_all = "kebab-case")]
pub struct ConfigFile {
#[serde(default)]
pub baseline: Option<PathBuf>,
#[serde(default)]
pub header_file: Option<PathBuf>,
#[serde(default)]
pub max_files_per_directory: Option<usize>,
#[serde(default)]
pub max_subfolders_per_directory: Option<usize>,
#[serde(default)]
pub offence_threshold: Option<usize>,
#[serde(default)]
pub rules: Vec<String>,
#[serde(default)]
pub skip: Vec<String>,
#[serde(default)]
pub exclude: Vec<String>,
#[serde(default, rename = "package")]
pub packages: BTreeMap<String, PackageConfig>,
}
impl ConfigFile {
pub const NAME: &'static str = "stern4rust.toml";
pub fn load(directory: &Path) -> Result<Option<Self>> {
let path = directory.join(Self::NAME);
if !path.exists() {
return Ok(None);
}
let text = read_to_string(&path)
.with_context(|| format!("{} could not be read", path.display()))?;
let parsed = from_str(&text)
.with_context(|| format!("{} is not valid stern4rust configuration", path.display()))?;
Ok(Some(parsed))
}
pub fn baseline_from(&self, directory: &Path) -> Option<PathBuf> {
self.baseline
.as_ref()
.map(|relative| directory.join(relative))
}
pub fn header_file_from(&self, directory: &Path) -> Option<PathBuf> {
self.header_file
.as_ref()
.map(|relative| directory.join(relative))
}
}