tier 0.1.17

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

use serde_json::Value;

use crate::ValidationCheck;
use crate::path::canonicalize_path_with_aliases;

use super::super::Layer;
use super::runtime::{
    canonicalize_paths_with_aliases, canonicalize_runtime_path,
    canonicalize_runtime_path_across_layers, canonicalize_runtime_paths_across_layers,
    canonicalize_runtime_paths_against_value,
};

pub(in crate::loader) fn canonicalize_check_with_aliases(
    check: ValidationCheck,
    aliases: &BTreeMap<String, String>,
) -> ValidationCheck {
    match check {
        ValidationCheck::AtLeastOneOf { paths } => ValidationCheck::AtLeastOneOf {
            paths: canonicalize_paths_with_aliases(paths, aliases),
        },
        ValidationCheck::ExactlyOneOf { paths } => ValidationCheck::ExactlyOneOf {
            paths: canonicalize_paths_with_aliases(paths, aliases),
        },
        ValidationCheck::MutuallyExclusive { paths } => ValidationCheck::MutuallyExclusive {
            paths: canonicalize_paths_with_aliases(paths, aliases),
        },
        ValidationCheck::RequiredWith { path, requires } => ValidationCheck::RequiredWith {
            path: canonicalize_path_with_aliases(&path, aliases),
            requires: canonicalize_paths_with_aliases(requires, aliases),
        },
        ValidationCheck::RequiredIf {
            path,
            equals,
            requires,
        } => ValidationCheck::RequiredIf {
            path: canonicalize_path_with_aliases(&path, aliases),
            equals,
            requires: canonicalize_paths_with_aliases(requires, aliases),
        },
    }
}

pub(in crate::loader) fn canonicalize_check_against_layers(
    check: ValidationCheck,
    layers: &[Layer],
) -> ValidationCheck {
    match check {
        ValidationCheck::AtLeastOneOf { paths } => ValidationCheck::AtLeastOneOf {
            paths: canonicalize_runtime_paths_across_layers(paths, layers),
        },
        ValidationCheck::ExactlyOneOf { paths } => ValidationCheck::ExactlyOneOf {
            paths: canonicalize_runtime_paths_across_layers(paths, layers),
        },
        ValidationCheck::MutuallyExclusive { paths } => ValidationCheck::MutuallyExclusive {
            paths: canonicalize_runtime_paths_across_layers(paths, layers),
        },
        ValidationCheck::RequiredWith { path, requires } => ValidationCheck::RequiredWith {
            path: canonicalize_runtime_path_across_layers(&path, layers),
            requires: canonicalize_runtime_paths_across_layers(requires, layers),
        },
        ValidationCheck::RequiredIf {
            path,
            equals,
            requires,
        } => ValidationCheck::RequiredIf {
            path: canonicalize_runtime_path_across_layers(&path, layers),
            equals,
            requires: canonicalize_runtime_paths_across_layers(requires, layers),
        },
    }
}

pub(in crate::loader) fn canonicalize_check_against_value(
    check: ValidationCheck,
    value: &Value,
) -> ValidationCheck {
    match check {
        ValidationCheck::AtLeastOneOf { paths } => ValidationCheck::AtLeastOneOf {
            paths: canonicalize_runtime_paths_against_value(paths, value),
        },
        ValidationCheck::ExactlyOneOf { paths } => ValidationCheck::ExactlyOneOf {
            paths: canonicalize_runtime_paths_against_value(paths, value),
        },
        ValidationCheck::MutuallyExclusive { paths } => ValidationCheck::MutuallyExclusive {
            paths: canonicalize_runtime_paths_against_value(paths, value),
        },
        ValidationCheck::RequiredWith { path, requires } => ValidationCheck::RequiredWith {
            path: canonicalize_runtime_path(value, &path),
            requires: canonicalize_runtime_paths_against_value(requires, value),
        },
        ValidationCheck::RequiredIf {
            path,
            equals,
            requires,
        } => ValidationCheck::RequiredIf {
            path: canonicalize_runtime_path(value, &path),
            equals,
            requires: canonicalize_runtime_paths_against_value(requires, value),
        },
    }
}