openapi-schema-to-json-schema 0.1.0

Convert OpenAPI 3.0 schema objects to JSON Schema draft-04
Documentation
//! The default `patternProperties` handler.

use serde_json::Value;

use crate::value::is_object;

/// Disallow extra properties when one already matches a pattern.
///
/// When `additionalProperties` is an object or array and equals one of the
/// `patternProperties` schemas, set `additionalProperties` to false. An
/// `additionalProperties` that is not an object short-circuits and returns the
/// schema unchanged, so a boolean `additionalProperties` survives.
pub(crate) fn default_pattern_properties_handler(schema: Value) -> Value {
    let mut schema = schema;
    let Value::Object(map) = &mut schema else {
        return schema;
    };

    // Only an object or array `additionalProperties` carries a pattern value.
    // A null passes the container check but never equals a pattern value here.
    let Some(addit) = map.get("additionalProperties").cloned() else {
        return schema;
    };
    if !is_object(&addit) && !addit.is_null() {
        return schema;
    }

    let matches_pattern = match map.get("patternProperties") {
        Some(Value::Object(patterns)) => patterns.values().any(|p| *p == addit),
        _ => false,
    };
    if matches_pattern {
        map.insert("additionalProperties".to_string(), Value::Bool(false));
    }
    schema
}