Retain enum constraints on nullable primitive schemas

This commit is contained in:
Afloat 2026-10-20 21:22:35 +08:00
parent 935817c66f
commit 30e230306d

View File

@ -21,6 +21,8 @@ pub(crate) enum JsonSchema {
SimpleAnyOf {
r#type: Vec<SimpleJsonSchemaType>,
#[serde(skip_serializing_if = "Option::is_none")]
r#enum: Option<Vec<serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
description: Option<String>,
},
#[untagged_deserialize(field = "type")]
@ -364,3 +366,21 @@ mod tests {
);
}
}
#[cfg(test)]
mod contribution_regression {
use super::*;
#[test]
fn nullable_enum_constraints_survive_normalization() {
let input = serde_json::json!({"type":"object","properties":{"state":{"type":["string","null"],"enum":["on",null]}}});
let result = normalize_strict_schema(input, true, |e| e.to_string(), "root").unwrap();
assert_eq!(
result["properties"]["state"]["enum"],
serde_json::json!(["on", null])
);
let validator = jsonschema::options().offline().build(&result).unwrap();
assert!(validator.is_valid(&serde_json::json!({"state":null})));
assert!(!validator.is_valid(&serde_json::json!({"state":"invalid"})));
}
}