#![allow(dead_code)]
use serde::Deserialize;
use std::collections::HashMap;
#[derive(Debug, Default, Deserialize, Clone)]
#[serde(default, deny_unknown_fields)]
pub struct ArchitectureConfig {
pub enabled: bool,
pub layers: ArchitectureLayersConfig,
pub reexport_points: ReexportPointsConfig,
pub external_crates: HashMap<String, String>,
#[serde(rename = "forbidden")]
pub forbidden_rules: Vec<ForbiddenRule>,
#[serde(rename = "pattern")]
pub patterns: Vec<SymbolPattern>,
#[serde(rename = "trait_contract")]
pub trait_contracts: Vec<TraitContract>,
#[serde(default)]
pub call_parity: Option<CallParityConfig>,
}
#[derive(Debug, Deserialize, Clone)]
pub struct ArchitectureLayersConfig {
#[serde(default)]
pub order: Vec<String>,
#[serde(default = "default_unmatched_behavior")]
pub unmatched_behavior: String,
#[serde(flatten)]
pub definitions: HashMap<String, LayerPathsConfig>,
}
impl Default for ArchitectureLayersConfig {
fn default() -> Self {
Self {
order: Vec::new(),
unmatched_behavior: default_unmatched_behavior(),
definitions: HashMap::new(),
}
}
}
fn default_unmatched_behavior() -> String {
"composition_root".to_string()
}
#[derive(Debug, Deserialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct LayerPathsConfig {
pub paths: Vec<String>,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(default, deny_unknown_fields)]
pub struct ReexportPointsConfig {
pub paths: Vec<String>,
}
impl Default for ReexportPointsConfig {
fn default() -> Self {
Self {
paths: vec!["src/lib.rs".to_string(), "src/main.rs".to_string()],
}
}
}
#[derive(Debug, Deserialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct ForbiddenRule {
pub from: String,
pub to: String,
#[serde(default)]
pub except: Vec<String>,
pub reason: String,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct SymbolPattern {
pub name: String,
#[serde(default)]
pub allowed_in: Option<Vec<String>>,
#[serde(default)]
pub forbidden_in: Option<Vec<String>>,
#[serde(default)]
pub except: Vec<String>,
#[serde(default)]
pub forbid_path_prefix: Option<Vec<String>>,
#[serde(default)]
pub forbid_method_call: Option<Vec<String>>,
#[serde(default)]
pub forbid_function_call: Option<Vec<String>>,
#[serde(default)]
pub forbid_macro_call: Option<Vec<String>>,
#[serde(default)]
pub forbid_item_kind: Option<Vec<String>>,
#[serde(default)]
pub forbid_derive: Option<Vec<String>>,
#[serde(default)]
pub forbid_glob_import: Option<bool>,
#[serde(default)]
pub regex: Option<String>,
pub reason: String,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct TraitContract {
pub name: String,
pub scope: String,
#[serde(default)]
pub receiver_may_be: Option<Vec<String>>,
#[serde(default)]
pub required_param_type_contains: Option<String>,
#[serde(default)]
pub forbidden_return_type_contains: Option<Vec<String>>,
#[serde(default)]
pub forbidden_error_variant_contains: Option<Vec<String>>,
#[serde(default)]
pub error_types: Option<Vec<String>>,
#[serde(default)]
pub methods_must_be_async: Option<bool>,
#[serde(default)]
pub must_be_object_safe: Option<bool>,
#[serde(default)]
pub required_supertraits_contain: Option<Vec<String>>,
}
#[derive(Debug, Deserialize, Clone)]
#[serde(deny_unknown_fields)]
pub struct CallParityConfig {
pub adapters: Vec<String>,
pub target: String,
#[serde(default = "default_call_depth")]
pub call_depth: usize,
#[serde(default)]
pub exclude_targets: Vec<String>,
#[serde(default)]
pub transparent_wrappers: Vec<String>,
#[serde(default)]
pub transparent_macros: Vec<String>,
}
pub(crate) fn default_call_depth() -> usize {
3
}