use crate::{
DocumentVariant, MappingProperty,
codegen::{IterableProperties, gen_string_mapping},
error::GeneratorError,
rename::RenameCasing,
};
pub(crate) fn gen_internally_tagged_enum(
tag: &str,
variants: &[DocumentVariant],
rename_all: Option<RenameCasing>,
) -> Result<(Vec<MappingProperty>, Vec<IterableProperties>), GeneratorError> {
let mut properties = Vec::new();
let mut iterable = Vec::new();
properties.push(MappingProperty {
name: tag.to_string(),
mapping: gen_string_mapping(),
});
for variant in variants {
match variant.fields.style {
darling::ast::Style::Tuple => {
for field in &variant.fields.fields {
let ty = &field.ty;
iterable.push(IterableProperties {
source: quote::quote! {
<#ty as elastic_mapping::MappingType>::fields()
},
});
}
}
darling::ast::Style::Struct => {
for field in &variant.fields.fields {
properties.push(field.gen_mapping(rename_all));
}
}
darling::ast::Style::Unit => {
return Err(GeneratorError::Custom(
"Unit variants are not supported in tagged enums".to_string(),
));
}
}
}
Ok((properties, iterable))
}