@@ -208,11 +208,11 @@ const {{$c.Name}} {{$c.Type}} = {{$c.Value}}
208
208
// genType generates a Go type file corresponding to the IDL file.
209
209
// It includes constants, enums, and struct types.
210
210
func (g * Generator ) genType (ctx Context , fileName string , doc tidl.Document ) error {
211
- consts , err := convertConsts (ctx , doc . Consts )
211
+ consts , err := convertConsts (ctx , doc )
212
212
if err != nil {
213
213
return err
214
214
}
215
- enums , err := convertEnums (doc . Enums )
215
+ enums , err := convertEnums (ctx , doc )
216
216
if err != nil {
217
217
return err
218
218
}
@@ -258,9 +258,9 @@ type Const struct {
258
258
}
259
259
260
260
// convertConsts converts IDL constants to Go constants
261
- func convertConsts (ctx Context , consts [] tidl.Const ) ([]Const , error ) {
261
+ func convertConsts (ctx Context , doc tidl.Document ) ([]Const , error ) {
262
262
var ret []Const
263
- for _ , c := range consts {
263
+ for _ , c := range doc . Consts {
264
264
typeName , err := getTypeName (ctx , tidl.BaseType {
265
265
Name : c .Type ,
266
266
}, nil )
@@ -292,9 +292,9 @@ type EnumField struct {
292
292
}
293
293
294
294
// convertEnums converts IDL enums to Go enums
295
- func convertEnums (enums [] tidl.Enum ) ([]Enum , error ) {
295
+ func convertEnums (ctx Context , doc tidl.Document ) ([]Enum , error ) {
296
296
var ret []Enum
297
- for _ , e := range enums {
297
+ for _ , e := range doc . Enums {
298
298
var fields []EnumField
299
299
for _ , f := range e .Fields {
300
300
fields = append (fields , EnumField {
@@ -304,11 +304,28 @@ func convertEnums(enums []tidl.Enum) ([]Enum, error) {
304
304
})
305
305
}
306
306
ret = append (ret , Enum {
307
- Name : generator .CapitalizeASCII (e .Name ),
307
+ Name : tidl .CapitalizeASCII (e .Name ),
308
308
Fields : fields ,
309
309
Comment : genComment (e .Comments ),
310
310
})
311
311
}
312
+ for _ , t := range doc .Types {
313
+ if ! t .OneOf {
314
+ continue
315
+ }
316
+ name := tidl .CapitalizeASCII (t .Name ) + "Type"
317
+ var fields []EnumField
318
+ for i , f := range t .Fields {
319
+ fields = append (fields , EnumField {
320
+ Name : generator .ToPascal (f .Name ),
321
+ Value : int64 (i ),
322
+ })
323
+ }
324
+ ret = append (ret , Enum {
325
+ Name : name ,
326
+ Fields : fields ,
327
+ })
328
+ }
312
329
return ret , nil
313
330
}
314
331
@@ -401,14 +418,14 @@ func convertTypes(ctx Context, doc tidl.Document) (_ []Type, err error) {
401
418
402
419
// convertResponseType instantiates a generic response type for RPC
403
420
func convertResponseType (ctx Context , rpcName string , respType tidl.RespType ) (Type , error ) {
404
- t , ok := generator .GetType (ctx .files , respType .TypeName )
421
+ t , ok := tidl .GetType (ctx .files , respType .TypeName )
405
422
if ! ok {
406
423
return Type {}, fmt .Errorf ("type %s not found" , respType .TypeName )
407
424
}
408
425
409
- typeName := generator .CapitalizeASCII (rpcName )
410
- typeName += generator .CapitalizeASCII (t .Name )
411
- typeName += generator .CapitalizeASCII (respType .UserType .Name )
426
+ typeName := tidl .CapitalizeASCII (rpcName )
427
+ typeName += tidl .CapitalizeASCII (t .Name )
428
+ typeName += tidl .CapitalizeASCII (respType .UserType .Name )
412
429
413
430
r := tidl.Type {
414
431
Name : typeName ,
@@ -430,7 +447,7 @@ func convertResponseType(ctx Context, rpcName string, respType tidl.RespType) (T
430
447
431
448
// convertRedefinedType instantiates a redefined generic struct type
432
449
func convertRedefinedType (ctx Context , r tidl.Type ) (Type , error ) {
433
- t , ok := generator .GetType (ctx .files , r .Redefined .Name )
450
+ t , ok := tidl .GetType (ctx .files , r .Redefined .Name )
434
451
if ! ok {
435
452
return Type {}, fmt .Errorf ("type %s not found" , r .Redefined .Name )
436
453
}
@@ -471,13 +488,23 @@ func resolveGenericType(t tidl.TypeDefinition, genericName string, r *tidl.Redef
471
488
// convertType converts an IDL struct type to a Go struct type
472
489
func convertType (ctx Context , t tidl.Type ) (Type , error ) {
473
490
r := Type {
474
- Name : generator .CapitalizeASCII (t .Name ),
491
+ Name : tidl .CapitalizeASCII (t .Name ),
475
492
}
493
+
494
+ if t .OneOf {
495
+ r .Fields = append (r .Fields , TypeField {
496
+ Type : r .Name + "Type" ,
497
+ TypeKind : TypeKindEnumType ,
498
+ Name : "FieldType" ,
499
+ Tag : "`json:\" field_type\" `" ,
500
+ })
501
+ }
502
+
476
503
for _ , f := range t .Fields {
477
504
478
505
// Handle embedded types (flatten their fields into the struct)
479
506
if ft , ok := f .FieldType .(tidl.EmbedType ); ok {
480
- et , ok := generator .GetType (ctx .files , ft .Name )
507
+ et , ok := tidl .GetType (ctx .files , ft .Name )
481
508
if ! ok {
482
509
return Type {}, fmt .Errorf ("embedded type %s not found for field in struct %s" , ft .Name , r .Name )
483
510
}
@@ -516,7 +543,7 @@ func convertType(ctx Context, t tidl.Type) (Type, error) {
516
543
}
517
544
518
545
// Generate struct tag for the field
519
- fieldTag , err := genFieldTag (fieldName , typeName , f .Annotations , binding )
546
+ fieldTag , err := genFieldTag (f . Name , typeName , f .Annotations , binding )
520
547
if err != nil {
521
548
return Type {}, err
522
549
}
@@ -574,14 +601,14 @@ func getTypeName(ctx Context, t tidl.TypeDefinition, arr []tidl.Annotation) (str
574
601
}
575
602
return typeName , nil
576
603
case tidl.UserType :
577
- typeName := generator .CapitalizeASCII (ft .Name )
604
+ typeName := tidl .CapitalizeASCII (ft .Name )
578
605
if ft .Optional {
579
606
typeName = "*" + typeName
580
607
}
581
608
582
609
// Handle enum_as_string annotation
583
610
if _ , ok := tidl .GetOneOfAnnotation (arr , "enum_as_string" ); ok {
584
- if _ , ok := generator .GetEnum (ctx .files , ft .Name ); ! ok {
611
+ if _ , ok := tidl .GetEnum (ctx .files , ft .Name ); ! ok {
585
612
return "" , fmt .Errorf ("enum %s not found" , ft .Name )
586
613
}
587
614
typeName += "AsString"
@@ -641,13 +668,13 @@ func getTypeKind(ctx Context, typeName string) (TypeKind, error) {
641
668
}
642
669
return TypeKindMapType , nil
643
670
default :
644
- if _ , ok := generator .GetEnum (ctx .files , strings .TrimSuffix (typeName , "AsString" )); ok {
671
+ if _ , ok := tidl .GetEnum (ctx .files , strings .TrimSuffix (typeName , "AsString" )); ok {
645
672
if optional {
646
673
return TypeKindOptionalEnumType , nil
647
674
}
648
675
return TypeKindEnumType , nil
649
676
}
650
- if _ , ok := generator .GetType (ctx .files , typeName ); ok {
677
+ if _ , ok := tidl .GetType (ctx .files , typeName ); ok {
651
678
if optional {
652
679
return TypeKindOptionalStructType , nil
653
680
}
@@ -683,10 +710,10 @@ func parseDefault(ctx Context, typeName string, v *string) (*string, error) {
683
710
// Handle enum values like EnumName.VALUE
684
711
asString := strings .HasSuffix (typeName , "AsString" )
685
712
typeNameTrimmed := strings .TrimSuffix (typeName , "AsString" )
686
- if _ , ok := generator .GetEnum (ctx .files , typeNameTrimmed ); ! ok {
713
+ if _ , ok := tidl .GetEnum (ctx .files , typeNameTrimmed ); ! ok {
687
714
return v , nil // Treat as a regular string
688
715
}
689
- s := generator .CapitalizeASCII (parts [0 ]) + "_" + parts [1 ]
716
+ s := tidl .CapitalizeASCII (parts [0 ]) + "_" + parts [1 ]
690
717
if asString {
691
718
s = fmt .Sprintf ("%sAsString(%s)" , typeNameTrimmed , s )
692
719
}
0 commit comments