tier 0.1.17

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

use serde_json::Value;

use super::{build_example_value, merge_example_value};

pub(super) fn merge_all_of_examples(
    object: &serde_json::Map<String, Value>,
    root: &Value,
    visited_refs: &mut BTreeSet<String>,
    reserved_keys: &BTreeSet<String>,
    merged: &mut Option<Value>,
) {
    let Some(values) = object.get("allOf").and_then(Value::as_array) else {
        return;
    };

    for child in values {
        let Some(example) = build_example_value(child, root, visited_refs, Some(reserved_keys))
        else {
            continue;
        };
        merge_example_value(merged, example);
    }
}

pub(super) fn merge_first_non_null_branch_example(
    keyword: &str,
    object: &serde_json::Map<String, Value>,
    root: &Value,
    visited_refs: &mut BTreeSet<String>,
    reserved_keys: &BTreeSet<String>,
    merged: &mut Option<Value>,
) {
    let Some(values) = object.get(keyword).and_then(Value::as_array) else {
        return;
    };

    for candidate in values {
        if schema_is_null(candidate) {
            continue;
        }
        if let Some(example) =
            build_example_value(candidate, root, visited_refs, Some(reserved_keys))
        {
            merge_example_value(merged, example);
            break;
        }
    }
}

fn schema_is_null(schema: &Value) -> bool {
    schema
        .get("type")
        .and_then(Value::as_str)
        .is_some_and(|ty| ty == "null")
}