added strict validation option
This commit is contained in:
35
src/lib.rs
35
src/lib.rs
@ -20,11 +20,16 @@ lazy_static! {
|
||||
}
|
||||
|
||||
#[pg_extern(strict)]
|
||||
fn cache_json_schema(schema_id: &str, schema: JsonB) -> JsonB {
|
||||
fn cache_json_schema(schema_id: &str, schema: JsonB, strict: bool) -> JsonB {
|
||||
let mut cache = SCHEMA_CACHE.write().unwrap();
|
||||
let schema_value: Value = schema.0;
|
||||
let mut schema_value: Value = schema.0;
|
||||
let schema_path = format!("urn:{}", schema_id);
|
||||
|
||||
// Apply strict validation to all objects in the schema if requested
|
||||
if strict {
|
||||
apply_strict_validation(&mut schema_value);
|
||||
}
|
||||
|
||||
let mut compiler = Compiler::new();
|
||||
compiler.enable_format_assertions();
|
||||
|
||||
@ -75,6 +80,32 @@ fn cache_json_schema(schema_id: &str, schema: JsonB) -> JsonB {
|
||||
}
|
||||
}
|
||||
|
||||
// Helper function to recursively apply strict validation to all objects in a schema
|
||||
fn apply_strict_validation(schema: &mut Value) {
|
||||
match schema {
|
||||
Value::Object(map) => {
|
||||
// If this is an object type schema, add additionalProperties: false
|
||||
if let Some(Value::String(t)) = map.get("type") {
|
||||
if t == "object" && !map.contains_key("additionalProperties") {
|
||||
map.insert("additionalProperties".to_string(), Value::Bool(false));
|
||||
}
|
||||
}
|
||||
|
||||
// Recurse into all properties
|
||||
for (_, value) in map.iter_mut() {
|
||||
apply_strict_validation(value);
|
||||
}
|
||||
}
|
||||
Value::Array(arr) => {
|
||||
// Recurse into array items
|
||||
for item in arr.iter_mut() {
|
||||
apply_strict_validation(item);
|
||||
}
|
||||
}
|
||||
_ => {}
|
||||
}
|
||||
}
|
||||
|
||||
#[pg_extern(strict, parallel_safe)]
|
||||
fn validate_json_schema(schema_id: &str, instance: JsonB) -> JsonB {
|
||||
let cache = SCHEMA_CACHE.read().unwrap();
|
||||
|
||||
Reference in New Issue
Block a user