use super::SchemaSanitizer;
use serde_json::{Map, Value, json};
impl SchemaSanitizer {
pub(super) fn remove_unsupported_keywords(&self, obj: &mut Map<String, Value>) {
if !self.capabilities.composition.allof {
obj.remove("allOf");
}
if !self.capabilities.composition.anyof {
obj.remove("anyOf");
}
if !self.capabilities.composition.oneof {
obj.remove("oneOf");
}
if !self.capabilities.composition.if_then_else {
obj.remove("if");
obj.remove("then");
obj.remove("else");
}
if !self.capabilities.features.references {
obj.remove("$ref");
}
if !self.capabilities.features.definitions {
obj.remove("definitions");
obj.remove("$defs");
}
if !self.capabilities.composition.not {
obj.remove("not");
}
if !self.capabilities.features.additional_properties {
obj.remove("additionalProperties");
}
if !self.capabilities.features.exclusive_bounds {
obj.remove("exclusiveMinimum");
obj.remove("exclusiveMaximum");
}
if !self.capabilities.features.property_names {
obj.remove("propertyNames");
obj.remove("patternProperties");
}
if !self.capabilities.features.tuple_items {
Self::flatten_tuple_items(obj);
}
}
pub(super) fn flatten_tuple_items(obj: &mut Map<String, Value>) {
let prefix = obj.remove("prefixItems");
obj.remove("additionalItems");
obj.remove("unevaluatedItems");
let Some(Value::Array(prefix)) = prefix else {
return;
};
if obj.contains_key("items") {
return;
}
let items = match prefix.split_first() {
Some((first, rest)) if rest.iter().all(|s| s == first) => first.clone(),
_ => Value::Object(Map::new()),
};
obj.insert("items".to_owned(), items);
}
pub(super) fn remove_metadata_fields(obj: &mut Map<String, Value>) {
for field in [
"$schema",
"$id",
"readOnly",
"writeOnly",
"deprecated",
"examples",
"contentMediaType",
"contentEncoding",
"outputSchema",
"$comment",
] {
obj.remove(field);
}
}
pub(super) fn remove_extension_fields(obj: &mut Map<String, Value>) {
let extensions: Vec<String> = obj
.keys()
.filter(|k| k.starts_with("x-"))
.cloned()
.collect();
for key in extensions {
obj.remove(&key);
}
}
pub(super) fn convert_const_to_enum(&self, obj: &mut Map<String, Value>) {
if !self.capabilities.features.const_values
&& let Some(const_val) = obj.remove("const")
{
obj.insert("enum".to_owned(), json!([const_val]));
}
if !self.capabilities.features.const_values
&& !obj.contains_key("type")
&& let Some(Value::Array(values)) = obj.get("enum")
&& let Some(kind) = Self::common_json_type(values)
{
obj.insert("type".to_owned(), Value::String(kind.to_owned()));
}
}
}