tier 0.1.17

Rust configuration library for layered TOML, env, and CLI settings
Documentation
#[cfg(feature = "schema")]
use serde_json::Value;

use super::super::FieldMetadata;
#[cfg(feature = "schema")]
use super::FieldValidationExport;

impl FieldMetadata {
    #[cfg(feature = "schema")]
    pub(crate) fn allowed_source_names(&self) -> Vec<String> {
        self.allowed_sources
            .as_ref()
            .map(|allowed_sources| allowed_sources.iter().copied().collect::<Vec<_>>())
            .unwrap_or_default()
            .into_iter()
            .map(|source| source.to_string())
            .collect()
    }

    #[cfg(feature = "schema")]
    pub(crate) fn denied_source_names(&self) -> Vec<String> {
        self.denied_sources
            .as_ref()
            .map(|denied_sources| denied_sources.iter().copied().collect::<Vec<_>>())
            .unwrap_or_default()
            .into_iter()
            .map(|source| source.to_string())
            .collect()
    }

    #[cfg(feature = "schema")]
    pub(crate) fn validation_export(&self) -> FieldValidationExport {
        let mut export = FieldValidationExport::default();
        for (rule_code, config) in &self.validation_configs {
            export.levels.insert(rule_code.clone(), config.level);
            if let Some(message) = &config.message {
                export.messages.insert(rule_code.clone(), message.clone());
            }
            if !config.tags.is_empty() {
                export.tags.insert(rule_code.clone(), config.tags.clone());
            }
        }
        export
    }

    #[cfg(feature = "schema")]
    pub(crate) fn validation_config_json(&self) -> Option<Value> {
        if self.validation_configs.is_empty() {
            None
        } else {
            Some(
                serde_json::to_value(&self.validation_configs)
                    .unwrap_or_else(|_| Value::Object(Default::default())),
            )
        }
    }
}