daml-derive 0.2.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!(
                    "expected either zero or one type parameter for variant {}, found {}",
                    &variant.ident,
                    unnamed.len()
                )
            } else {
                unnamed.first().map(|pair| AttrType::from_type(&pair.ty)).expect("Field.ty")
            },
        Fields::Named(_) => panic!("only Unnamed or Unit enum variant expected"),
    }
}