From 30e230306d98eaaf3644992a6817b3919ee37114 Mon Sep 17 00:00:00 2001 From: Afloat <132809511+Afloat16@users.noreply.github.com> Date: Tue, 20 Oct 2026 21:22:35 +0800 Subject: [PATCH] Retain enum constraints on nullable primitive schemas --- deepseek-recipe/src/protocol/json_schema.rs | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/deepseek-recipe/src/protocol/json_schema.rs b/deepseek-recipe/src/protocol/json_schema.rs index f00a97d..6b5a479 100644 --- a/deepseek-recipe/src/protocol/json_schema.rs +++ b/deepseek-recipe/src/protocol/json_schema.rs @@ -21,6 +21,8 @@ pub(crate) enum JsonSchema { SimpleAnyOf { r#type: Vec, #[serde(skip_serializing_if = "Option::is_none")] + r#enum: Option>, + #[serde(skip_serializing_if = "Option::is_none")] description: Option, }, #[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"}))); + } +}