tier 0.1.17

Rust configuration library for layered TOML, env, and CLI settings
Documentation
use serde_json::Value;

use crate::schema::count::{keyword_u64, len_less_than, remaining_required};

pub(super) fn child_path(parent: &str, segment: &str) -> String {
    if parent.is_empty() {
        segment.to_owned()
    } else {
        format!("{parent}.{segment}")
    }
}

pub(super) fn fixed_array_item_count(object: &serde_json::Map<String, Value>) -> usize {
    object
        .get("prefixItems")
        .and_then(Value::as_array)
        .map_or(0, Vec::len)
        .max(
            object
                .get("items")
                .and_then(Value::as_array)
                .map_or(0, Vec::len),
        )
}

pub(super) fn array_item_is_required(
    object: &serde_json::Map<String, Value>,
    index: usize,
) -> bool {
    keyword_u64(object, "minItems").is_some_and(|min_items| len_less_than(index, min_items))
}

pub(super) fn required_additional_array_items(
    object: &serde_json::Map<String, Value>,
    fixed_item_count: usize,
) -> usize {
    keyword_u64(object, "minItems").map_or(0, |min_items| {
        remaining_required(min_items, fixed_item_count)
    })
}