@@ -88,7 +88,7 @@ func WriteTypesJen(outDir string, schema *load.Schema, meta *load.Meta) error {
8888 if _ , ok := req [pk ]; ! ok {
8989 // Default: omit if empty, except for specific always-present fields
9090 // Ensure InitializeResponse.authMethods is always encoded (even when empty)
91- if ! ( name == "InitializeResponse" && pk == "authMethods" ) {
91+ if name != "InitializeResponse" || pk != "authMethods" {
9292 tag = pk + ",omitempty"
9393 }
9494 }
@@ -583,86 +583,87 @@ func emitUnion(f *File, name string, defs []*load.Definition, exactlyOne bool) {
583583 // Null-only variant encodes to JSON null
584584 if vi .isNull {
585585 gg .Return (Qual ("encoding/json" , "Marshal" ).Call (Nil ()))
586- }
587- // Marshal variant to map for discriminant injection and shaping
588- gg .Var ().Id ("m" ).Map (String ()).Any ()
589- gg .List (Id ("_b" ), Id ("_e" )).Op (":=" ).Qual ("encoding/json" , "Marshal" ).Call (Op ("*" ).Id ("u" ).Dot (vi .fieldName ))
590- gg .If (Id ("_e" ).Op ("!=" ).Nil ()).Block (Return (Index ().Byte ().Values (), Id ("_e" )))
591- gg .If (Qual ("encoding/json" , "Unmarshal" ).Call (Id ("_b" ), Op ("&" ).Id ("m" )).Op ("!=" ).Nil ()).Block (Return (Index ().Byte ().Values (), Qual ("errors" , "New" ).Call (Lit ("invalid variant payload" ))))
592- // Inject const discriminants
593- if len (vi .constPairs ) > 0 {
594- for _ , kv := range vi .constPairs {
595- gg .Id ("m" ).Index (Lit (kv [0 ])).Op ("=" ).Lit (kv [1 ])
586+ } else {
587+ // Marshal variant to map for discriminant injection and shaping
588+ gg .Var ().Id ("m" ).Map (String ()).Any ()
589+ gg .List (Id ("_b" ), Id ("_e" )).Op (":=" ).Qual ("encoding/json" , "Marshal" ).Call (Op ("*" ).Id ("u" ).Dot (vi .fieldName ))
590+ gg .If (Id ("_e" ).Op ("!=" ).Nil ()).Block (Return (Index ().Byte ().Values (), Id ("_e" )))
591+ gg .If (Qual ("encoding/json" , "Unmarshal" ).Call (Id ("_b" ), Op ("&" ).Id ("m" )).Op ("!=" ).Nil ()).Block (Return (Index ().Byte ().Values (), Qual ("errors" , "New" ).Call (Lit ("invalid variant payload" ))))
592+ // Inject const discriminants
593+ if len (vi .constPairs ) > 0 {
594+ for _ , kv := range vi .constPairs {
595+ gg .Id ("m" ).Index (Lit (kv [0 ])).Op ("=" ).Lit (kv [1 ])
596+ }
596597 }
597- }
598- // Special shaping for ContentBlock variants to preserve exact wire JSON
599- if name == "ContentBlock" {
600- switch vi .discValue {
601- case "text" :
602- gg .Block (
603- Var ().Id ("nm" ).Map (String ()).Any (),
604- Id ("nm" ).Op ("=" ).Make (Map (String ()).Any ()),
605- Id ("nm" ).Index (Lit ("type" )).Op ("=" ).Lit ("text" ),
606- Id ("nm" ).Index (Lit ("text" )).Op ("=" ).Id ("m" ).Index (Lit ("text" )),
607- Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("nm" ))),
608- )
609- case "image" :
610- gg .Block (
611- Var ().Id ("nm" ).Map (String ()).Any (),
612- Id ("nm" ).Op ("=" ).Make (Map (String ()).Any ()),
613- Id ("nm" ).Index (Lit ("type" )).Op ("=" ).Lit ("image" ),
614- Id ("nm" ).Index (Lit ("data" )).Op ("=" ).Id ("m" ).Index (Lit ("data" )),
615- Id ("nm" ).Index (Lit ("mimeType" )).Op ("=" ).Id ("m" ).Index (Lit ("mimeType" )),
616- // Only include uri if present; do not emit null
617- If (List (Id ("_v" ), Id ("_ok" )).Op (":=" ).Id ("m" ).Index (Lit ("uri" )), Id ("_ok" )).Block (
618- Id ("nm" ).Index (Lit ("uri" )).Op ("=" ).Id ("_v" ),
619- ),
620- Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("nm" ))),
621- )
622- case "audio" :
623- gg .Block (
624- Var ().Id ("nm" ).Map (String ()).Any (),
625- Id ("nm" ).Op ("=" ).Make (Map (String ()).Any ()),
626- Id ("nm" ).Index (Lit ("type" )).Op ("=" ).Lit ("audio" ),
627- Id ("nm" ).Index (Lit ("data" )).Op ("=" ).Id ("m" ).Index (Lit ("data" )),
628- Id ("nm" ).Index (Lit ("mimeType" )).Op ("=" ).Id ("m" ).Index (Lit ("mimeType" )),
629- Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("nm" ))),
630- )
631- case "resource_link" :
632- gg .BlockFunc (func (b * Group ) {
633- b .Var ().Id ("nm" ).Map (String ()).Any ()
634- b .Id ("nm" ).Op ("=" ).Make (Map (String ()).Any ())
635- b .Id ("nm" ).Index (Lit ("type" )).Op ("=" ).Lit ("resource_link" )
636- b .Id ("nm" ).Index (Lit ("name" )).Op ("=" ).Id ("m" ).Index (Lit ("name" ))
637- b .Id ("nm" ).Index (Lit ("uri" )).Op ("=" ).Id ("m" ).Index (Lit ("uri" ))
638- // Only include optional keys if present
639- b .If (List (Id ("v1" ), Id ("ok1" )).Op (":=" ).Id ("m" ).Index (Lit ("description" )), Id ("ok1" )).Block (
640- Id ("nm" ).Index (Lit ("description" )).Op ("=" ).Id ("v1" ),
598+ // Special shaping for ContentBlock variants to preserve exact wire JSON
599+ if name == "ContentBlock" {
600+ switch vi .discValue {
601+ case "text" :
602+ gg .Block (
603+ Var ().Id ("nm" ).Map (String ()).Any (),
604+ Id ("nm" ).Op ("=" ).Make (Map (String ()).Any ()),
605+ Id ("nm" ).Index (Lit ("type" )).Op ("=" ).Lit ("text" ),
606+ Id ("nm" ).Index (Lit ("text" )).Op ("=" ).Id ("m" ).Index (Lit ("text" )),
607+ Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("nm" ))),
641608 )
642- b .If (List (Id ("v2" ), Id ("ok2" )).Op (":=" ).Id ("m" ).Index (Lit ("mimeType" )), Id ("ok2" )).Block (
643- Id ("nm" ).Index (Lit ("mimeType" )).Op ("=" ).Id ("v2" ),
609+ case "image" :
610+ gg .Block (
611+ Var ().Id ("nm" ).Map (String ()).Any (),
612+ Id ("nm" ).Op ("=" ).Make (Map (String ()).Any ()),
613+ Id ("nm" ).Index (Lit ("type" )).Op ("=" ).Lit ("image" ),
614+ Id ("nm" ).Index (Lit ("data" )).Op ("=" ).Id ("m" ).Index (Lit ("data" )),
615+ Id ("nm" ).Index (Lit ("mimeType" )).Op ("=" ).Id ("m" ).Index (Lit ("mimeType" )),
616+ // Only include uri if present; do not emit null
617+ If (List (Id ("_v" ), Id ("_ok" )).Op (":=" ).Id ("m" ).Index (Lit ("uri" )), Id ("_ok" )).Block (
618+ Id ("nm" ).Index (Lit ("uri" )).Op ("=" ).Id ("_v" ),
619+ ),
620+ Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("nm" ))),
644621 )
645- b .If (List (Id ("v3" ), Id ("ok3" )).Op (":=" ).Id ("m" ).Index (Lit ("size" )), Id ("ok3" )).Block (
646- Id ("nm" ).Index (Lit ("size" )).Op ("=" ).Id ("v3" ),
622+ case "audio" :
623+ gg .Block (
624+ Var ().Id ("nm" ).Map (String ()).Any (),
625+ Id ("nm" ).Op ("=" ).Make (Map (String ()).Any ()),
626+ Id ("nm" ).Index (Lit ("type" )).Op ("=" ).Lit ("audio" ),
627+ Id ("nm" ).Index (Lit ("data" )).Op ("=" ).Id ("m" ).Index (Lit ("data" )),
628+ Id ("nm" ).Index (Lit ("mimeType" )).Op ("=" ).Id ("m" ).Index (Lit ("mimeType" )),
629+ Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("nm" ))),
647630 )
648- b .If (List (Id ("v4" ), Id ("ok4" )).Op (":=" ).Id ("m" ).Index (Lit ("title" )), Id ("ok4" )).Block (
649- Id ("nm" ).Index (Lit ("title" )).Op ("=" ).Id ("v4" ),
631+ case "resource_link" :
632+ gg .BlockFunc (func (b * Group ) {
633+ b .Var ().Id ("nm" ).Map (String ()).Any ()
634+ b .Id ("nm" ).Op ("=" ).Make (Map (String ()).Any ())
635+ b .Id ("nm" ).Index (Lit ("type" )).Op ("=" ).Lit ("resource_link" )
636+ b .Id ("nm" ).Index (Lit ("name" )).Op ("=" ).Id ("m" ).Index (Lit ("name" ))
637+ b .Id ("nm" ).Index (Lit ("uri" )).Op ("=" ).Id ("m" ).Index (Lit ("uri" ))
638+ // Only include optional keys if present
639+ b .If (List (Id ("v1" ), Id ("ok1" )).Op (":=" ).Id ("m" ).Index (Lit ("description" )), Id ("ok1" )).Block (
640+ Id ("nm" ).Index (Lit ("description" )).Op ("=" ).Id ("v1" ),
641+ )
642+ b .If (List (Id ("v2" ), Id ("ok2" )).Op (":=" ).Id ("m" ).Index (Lit ("mimeType" )), Id ("ok2" )).Block (
643+ Id ("nm" ).Index (Lit ("mimeType" )).Op ("=" ).Id ("v2" ),
644+ )
645+ b .If (List (Id ("v3" ), Id ("ok3" )).Op (":=" ).Id ("m" ).Index (Lit ("size" )), Id ("ok3" )).Block (
646+ Id ("nm" ).Index (Lit ("size" )).Op ("=" ).Id ("v3" ),
647+ )
648+ b .If (List (Id ("v4" ), Id ("ok4" )).Op (":=" ).Id ("m" ).Index (Lit ("title" )), Id ("ok4" )).Block (
649+ Id ("nm" ).Index (Lit ("title" )).Op ("=" ).Id ("v4" ),
650+ )
651+ b .Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("nm" )))
652+ })
653+ case "resource" :
654+ gg .Block (
655+ Var ().Id ("nm" ).Map (String ()).Any (),
656+ Id ("nm" ).Op ("=" ).Make (Map (String ()).Any ()),
657+ Id ("nm" ).Index (Lit ("type" )).Op ("=" ).Lit ("resource" ),
658+ Id ("nm" ).Index (Lit ("resource" )).Op ("=" ).Id ("m" ).Index (Lit ("resource" )),
659+ Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("nm" ))),
650660 )
651- b .Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("nm" )))
652- })
653- case "resource" :
654- gg .Block (
655- Var ().Id ("nm" ).Map (String ()).Any (),
656- Id ("nm" ).Op ("=" ).Make (Map (String ()).Any ()),
657- Id ("nm" ).Index (Lit ("type" )).Op ("=" ).Lit ("resource" ),
658- Id ("nm" ).Index (Lit ("resource" )).Op ("=" ).Id ("m" ).Index (Lit ("resource" )),
659- Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("nm" ))),
660- )
661+ }
662+ }
663+ // default: remarshal possibly with injected discriminant
664+ if name != "ContentBlock" {
665+ gg .Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("m" )))
661666 }
662- }
663- // default: remarshal possibly with injected discriminant
664- if name != "ContentBlock" {
665- gg .Return (Qual ("encoding/json" , "Marshal" ).Call (Id ("m" )))
666667 }
667668 })
668669 }
0 commit comments