use serde_json::Value;
pub fn parse_output_schema(value: Option<&Value>) -> Result<Option<Value>, String> {
lashlang::parse_output_schema(value)
}
#[cfg(test)]
mod tests {
use serde_json::json;
use super::*;
use crate::LASH_TYPE_KEY;
#[test]
fn output_schema_supports_scalars_and_lists() {
let schema = parse_output_schema(Some(&json!({
"answer": "str",
"count": "int",
"items": "list[str]"
})))
.expect("schema")
.expect("present");
assert_eq!(schema["properties"]["answer"]["type"], json!("string"));
assert_eq!(schema["properties"]["count"]["type"], json!("integer"));
assert_eq!(schema["properties"]["items"]["type"], json!("array"));
}
#[test]
fn output_schema_passes_through_lash_type_wrapper() {
let inner_schema = json!({
"type": "object",
"properties": {
"name": { "type": "string" },
"tags": { "type": "array", "items": { "type": "string" } },
"status": { "type": "string", "enum": ["ok", "err"] }
},
"required": ["name", "tags", "status"],
"additionalProperties": false
});
let wrapped = json!({ LASH_TYPE_KEY: inner_schema.clone() });
let schema = parse_output_schema(Some(&wrapped))
.expect("schema")
.expect("present");
assert_eq!(schema, inner_schema);
}
#[test]
fn output_schema_rejects_lash_type_without_type_field() {
let wrapped = json!({ LASH_TYPE_KEY: {"properties": {}} });
let err = parse_output_schema(Some(&wrapped)).expect_err("missing type");
assert!(err.contains("type"), "error: {err}");
}
#[test]
fn output_schema_accepts_array_top_level_type() {
let wrapped = json!({
LASH_TYPE_KEY: {
"type": "array",
"items": {"type": "string"}
}
});
let schema = parse_output_schema(Some(&wrapped))
.expect("schema")
.expect("present");
assert_eq!(schema["type"], json!("array"));
}
}