tier 0.1.17

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

use serde_json::Value;

use crate::error::ValidationError;
use crate::metadata::{ValidationRule, ValidationValue};
use crate::value::values_equal;

use super::super::super::error::validation_error;

pub(in crate::loader::validation::rules) fn validate_one_of(
    path: &str,
    actual: &Value,
    rule: &ValidationRule,
    secret_paths: &BTreeSet<String>,
    values: &[ValidationValue],
) -> Option<ValidationError> {
    let expected = Value::Array(values.iter().map(|value| value.0.clone()).collect());
    if values.iter().any(|value| values_equal(&value.0, actual)) {
        return None;
    }

    Some(validation_error(
        path,
        actual,
        rule,
        secret_paths,
        &format!(
            "must be one of {}",
            values
                .iter()
                .map(ToString::to_string)
                .collect::<Vec<_>>()
                .join(", ")
        ),
        Some(expected),
    ))
}