use crate::{
DocumentVariant, MappingProperty,
codegen::{IterableProperties, gen_object_mapping},
error::GeneratorError,
rename::RenameCasing,
};
pub(crate) fn gen_untagged_enum(
variants: &[DocumentVariant],
rename_all: Option<RenameCasing>,
) -> Result<(Vec<MappingProperty>, Vec<IterableProperties>), GeneratorError> {
let mut properties = Vec::new();
let iterable = Vec::new();
for variant in variants {
let variant_name = variant.resolve_name(rename_all);
let mut variant_properties = Vec::new();
if variant.fields.is_tuple() && variant.fields.len() != 1 {
return Err(GeneratorError::Custom(
"Tuple enums with multiple fields are not supported".to_string(),
));
}
match variant.fields.style {
darling::ast::Style::Tuple => {
let field = &variant.fields.fields[0];
let ty = &field.ty;
variant_properties.push(quote::quote! {
let mut prop = <#ty as elastic_mapping::MappingType>::fields();
});
}
darling::ast::Style::Struct => {
for field in variant.fields.iter() {
let field_mapping = field.gen_mapping(None);
let field_name = field_mapping.name;
let field_code = field_mapping.mapping;
variant_properties.push(quote::quote! {
prop.insert(#field_name.into(), #field_code)
});
}
}
darling::ast::Style::Unit => {
return Err(GeneratorError::Custom(
"Unit variants are not supported in untagged enums".to_string(),
));
}
}
let mapping = gen_object_mapping(variant_properties);
properties.push(MappingProperty {
name: variant_name,
mapping,
});
}
Ok((properties, iterable))
}