func mojomToVDLTypeUDT(typeKey string, udt mojom_types.UserDefinedType, mp map[string]mojom_types.UserDefinedType, builder *vdl.TypeBuilder, pendingUdts map[string]vdl.TypeOrPending) (vt vdl.TypeOrPending) { u := interface{}(udt) switch u := u.(type) { // To do the type switch, udt has to be converted to interface{}. case *mojom_types.UserDefinedTypeEnumType: // enum me := u.Value // TODO: Assumes that the maximum enum index is len(me.Values) - 1. labels := make([]string, len(me.Values)) for _, ev := range me.Values { // per EnumValue... // EnumValue has DeclData, EnumTypeKey, and IntValue. // We just need the first and last. labels[int(ev.IntValue)] = upperCamelCase(*ev.DeclData.ShortName) } vt = vdl.NamedType(mojomToVdlPath(*me.DeclData.FullIdentifier), vdl.EnumType(labels...)) pendingUdts[typeKey] = vt case *mojom_types.UserDefinedTypeStructType: // struct vt = mojomStructToVDLType(typeKey, u.Value, mp, builder, pendingUdts) case *mojom_types.UserDefinedTypeUnionType: // union mu := u.Value union := builder.Union() vt = builder.Named(mojomToVdlPath(*mu.DeclData.FullIdentifier)).AssignBase(union) pendingUdts[typeKey] = vt for _, mfield := range mu.Fields { union = union.AppendField(upperCamelCase(*mfield.DeclData.ShortName), mojomToVDLType(mfield.Type, mp, builder, pendingUdts)) } case *mojom_types.UserDefinedTypeInterfaceType: // interface panic("interfaces don't exist in vdl") default: // unknown panic(fmt.Errorf("user defined type %#v with unknown tag %d", udt, udt.Tag())) } return vt }