daml-derive 0.3.0

Daml Ledger Procedural Macro
Documentation
use syn::{DataEnum, Fields, FieldsUnnamed, Variant};

use crate::convert::{AttrField, AttrType};

pub fn extract_enum_data(data_enum: &DataEnum) -> Vec<AttrField> {
    data_enum
        .variants
        .iter()
        .map(|variant| AttrField::new(variant.ident.to_string(), extract_enum_field_type(variant)))
        .collect()
}

fn extract_enum_field_type(variant: &Variant) -> AttrType {
    match &variant.fields {
        Fields::Unit => AttrType::Unit,
        Fields::Unnamed(FieldsUnnamed {
            unnamed,
            ..
        }) => {
            if unnamed.is_empty() {
                AttrType::Unit
            } else if unnamed.len() > 1 {
                panic!("variant {} takes at most one type parameter, found {}", &variant.ident, unnamed.len())
            } else {
                unnamed
                    .first()
                    .map(|pair| AttrType::from_type(&pair.ty))
                    .expect("Unnamed variant has at least one entry after the length check")
            }
        },
        Fields::Named(_) => panic!("only Unnamed or Unit enum variant expected"),
    }
}