in compiler-rs/openapi_to_clients_schema/src/types.rs [379:447]
fn generate_interface_def(
open_api: &OpenAPI,
id: &str,
base: BaseType,
required: &[String],
properties: &IndexMap<String, ReferenceOr<Box<Schema>>>,
additional_properties: &Option<AdditionalProperties>,
types: &mut Types,
) -> anyhow::Result<()> {
// Regular type
// FIXME: max_properties -- if == 1 indicates a container
let required: HashSet<_> = required.iter().collect();
if required.len() != required.len() {
bail!("'required' in {id} has duplicate entries");
}
let mut props = Vec::new();
for (name, value) in properties {
let property = Property {
name: name.clone(),
typ: generate_value_of(open_api, value.into(), || format!("{}_{}", id, name), types)?,
required: required.contains(&name),
doc_id: None,
doc_url: None,
ext_doc_id: None,
ext_doc_url: None,
codegen_name: None, // FIXME: extension in workplace search
description: None,
aliases: Vec::default(),
deprecation: None,
container_property: false,
es_quirk: None,
server_default: None,
availability: None,
};
props.push(property);
}
let mut typedef = Interface {
base,
properties: props,
generics: Vec::default(),
behaviors: Vec::default(),
attached_behaviors: Vec::default(),
inherits: None,
implements: Vec::default(),
variants: None,
shortcut_property: None,
};
if let Some(props) = additional_properties {
let prop_value: ValueOf = match props {
AdditionalProperties::Any(_) => (&builtins::USER_DEFINED).into(),
AdditionalProperties::Schema(schema) => {
generate_value_of(open_api, schema.into(), || format!("{id}_props"), types)?
}
};
typedef.behaviors.push(clients_schema::Inherits {
typ: builtins::ADDITIONAL_PROPERTIES.clone(),
generics: vec![prop_value],
})
};
types.add(id, TypeDefinition::Interface(typedef));
Ok(())
}