use crate::{ConfigError, DefaultLoader};
/// Marks a typed struct as the owner of a named TOML section.
///
/// Implement this on any `serde::Deserialize + Default` config struct. The
/// runtime calls [`ConfigSection::load`] once at startup — callers never
/// write the loader call manually.
pub trait ConfigSection: serde::de::DeserializeOwned + Default + Send + Sync + 'static {
/// The top-level TOML key for this section (e.g. `"mtls"`, `"authz"`).
fn section_name() -> &'static str;
/// The top-level TOML key for this section from a runtime value.
fn section_key(&self) -> &'static str {
Self::section_name()
}
/// Load this section from `loader`, returning `Self::default()` when the
/// key is absent. Override only when custom merge logic is required.
fn load(loader: &DefaultLoader) -> Result<Self, ConfigError> {
loader.load_section(Self::section_name())
}
}