tier 0.1.17

Rust configuration library for layered TOML, env, and CLI settings
Documentation
use std::collections::BTreeMap;

use crate::metadata::paths::{normalize_checks, normalize_metadata_path};

use super::super::{ConfigMetadata, FieldMetadata};

impl ConfigMetadata {
    pub(super) fn normalize(&mut self) {
        let mut merged = BTreeMap::<String, FieldMetadata>::new();
        for mut field in self.fields.drain(..) {
            field.path = normalize_metadata_path(&field.path);
            field.aliases = field
                .aliases
                .into_iter()
                .map(|alias| normalize_metadata_path(&alias))
                .filter(|alias| alias != &field.path)
                .collect();
            field.aliases.sort();
            field.aliases.dedup();
            match merged.get_mut(&field.path) {
                Some(existing) => existing.merge_from(field),
                None => {
                    merged.insert(field.path.clone(), field);
                }
            }
        }
        self.fields = merged.into_values().collect();
        self.checks = normalize_checks(self.checks.drain(..));
    }
}