use std::{fs, iter, path::Path};
use serde::{Deserialize, Serialize};
use thiserror::Error;
use toml;
use crate::rules::{
contract::ContractRulesConfig, error::ErrorRulesConfig, event::EventRulesConfig,
function::FunctionRulesConfig, r#enum::EnumRulesConfig, r#struct::StructRulesConfig,
variable::VariableRulesConfig, DynRule,
};
#[derive(Error, Debug)]
pub enum ConfigError {
#[error("Failed to read config file: {0}")]
FileRead(#[from] std::io::Error),
#[error("Failed to parse TOML config: {0}")]
TomlParse(#[from] toml::de::Error),
}
#[derive(Serialize, Deserialize, Default, Debug)]
#[allow(missing_docs)]
pub struct Config {
#[serde(default)]
pub contract_rules: ContractRulesConfig,
#[serde(default)]
pub error_rules: ErrorRulesConfig,
#[serde(default)]
pub function_rules: FunctionRulesConfig,
#[serde(default)]
pub enum_rules: EnumRulesConfig,
#[serde(default)]
pub struct_rules: StructRulesConfig,
#[serde(default)]
pub variable_rules: VariableRulesConfig,
#[serde(default)]
pub event_rules: EventRulesConfig,
}
impl Config {
#[must_use]
pub fn rules(&self) -> Vec<Box<dyn DynRule>> {
iter::empty()
.chain(self.contract_rules.rule_set())
.chain(self.error_rules.rule_set())
.chain(self.function_rules.rule_set())
.chain(self.enum_rules.rule_set())
.chain(self.struct_rules.rule_set())
.chain(self.variable_rules.rule_set())
.chain(self.event_rules.rule_set())
.collect()
}
pub fn from_file(path: &Path) -> Result<Self, ConfigError> {
let content = fs::read_to_string(path)?;
Ok(toml::from_str(&content)?)
}
}