in avro_derive/src/lib.rs [242:283]
fn type_to_schema_expr(ty: &Type) -> Result<TokenStream, Vec<syn::Error>> {
if let Type::Path(p) = ty {
let type_string = p.path.segments.last().unwrap().ident.to_string();
let schema = match &type_string[..] {
"bool" => quote! {apache_avro::schema::Schema::Boolean},
"i8" | "i16" | "i32" | "u8" | "u16" => quote! {apache_avro::schema::Schema::Int},
"u32" | "i64" => quote! {apache_avro::schema::Schema::Long},
"f32" => quote! {apache_avro::schema::Schema::Float},
"f64" => quote! {apache_avro::schema::Schema::Double},
"String" | "str" => quote! {apache_avro::schema::Schema::String},
"char" => {
return Err(vec![syn::Error::new_spanned(
ty,
"AvroSchema: Cannot guarantee successful deserialization of this type",
)])
}
"u64" => {
return Err(vec![syn::Error::new_spanned(
ty,
"Cannot guarantee successful serialization of this type due to overflow concerns",
)])
} // Can't guarantee serialization type
_ => {
// Fails when the type does not implement AvroSchemaComponent directly
// TODO check and error report with something like https://docs.rs/quote/1.0.15/quote/macro.quote_spanned.html#example
type_path_schema_expr(p)
}
};
Ok(schema)
} else if let Type::Array(ta) = ty {
let inner_schema_expr = type_to_schema_expr(&ta.elem)?;
Ok(quote! {apache_avro::schema::Schema::array(#inner_schema_expr)})
} else if let Type::Reference(tr) = ty {
type_to_schema_expr(&tr.elem)
} else {
Err(vec![syn::Error::new_spanned(
ty,
format!("Unable to generate schema for type: {ty:?}"),
)])
}
}