in compiler-rs/openapi_to_clients_schema/src/types.rs [463:524]
fn generate_value_for_schema(
open_api: &OpenAPI,
schema: &Schema,
id_gen: impl Fn() -> String,
types: &mut Types,
) -> anyhow::Result<ValueOf> {
use openapiv3::SchemaKind::*;
match &schema.schema_kind {
Type(typ) => {
use openapiv3::Type::*;
match typ {
String(string) if string.enumeration.is_empty() => Ok((&builtins::STRING).into()),
String(_) => {
let type_name = generate_type_for_schema(open_api, &id_gen(), schema, types)?;
Ok(type_name.into())
}
Number(_) => {
// TODO: choose float/double depending on min/max values
// (see also generate_schema_kind_type)
Ok((&builtins::DOUBLE).into())
}
Integer(_) => {
// TODO: choose int/long depending on min/max values
// (see also generate_schema_kind_type)
Ok((&builtins::LONG).into())
}
Object(_) => {
let type_name = generate_type_for_schema(open_api, &id_gen(), schema, types)?;
Ok(type_name.into())
}
Array(array) => {
let item = array
.items
.as_ref()
.ok_or(anyhow!("Array type in '{}' has no items", id_gen()))?;
let item = generate_value_of(open_api, item.into(), id_gen, types)?;
Ok(ValueOf::ArrayOf(ArrayOf { value: Box::new(item) }))
}
Boolean { .. } => Ok((&builtins::BOOLEAN).into()),
}
}
// Do not factorize below to keep exhaustiveness, if some specific handling is needed/possible
OneOf { .. } => {
let type_name = generate_type_for_schema(open_api, &id_gen(), schema, types)?;
Ok(type_name.into())
}
AllOf { .. } => {
let type_name = generate_type_for_schema(open_api, &id_gen(), schema, types)?;
Ok(type_name.into())
}
AnyOf { .. } => {
let type_name = generate_type_for_schema(open_api, &id_gen(), schema, types)?;
Ok(type_name.into())
}
Not { .. } => Ok((&builtins::VOID).into()),
Any(AnySchema { typ: Some(typ), .. }) if typ == "null" => Ok((&builtins::NULL).into()),
Any(_) => {
let type_name = generate_type_for_schema(open_api, &id_gen(), schema, types)?;
Ok(type_name.into())
}
}
}