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),
},
}
}