@@ -66,6 +66,7 @@ type TypeField struct {
6666 Tag string
6767 Validate * string
6868 Binding * Binding
69+ FormName string
6970 Comment string
7071}
7172
@@ -75,6 +76,10 @@ type Binding struct {
7576 Name string // Field name in the source
7677}
7778
79+ func (x Binding ) String () string {
80+ return fmt .Sprintf (`%s:"%s"` , x .From , x .Name )
81+ }
82+
7883// IsRequestBody returns true if the struct is a request body
7984func (t * Type ) IsRequestBody () bool {
8085 return strings .HasSuffix (t .Name , "Body" )
@@ -641,23 +646,43 @@ func parseBinding(arr []httpidl.Annotation) (*Binding, error) {
641646 return & Binding {From : a .Key , Name : val }, nil
642647}
643648
644- // genFieldTag generates the struct tag for a Go struct field.
645- // It includes JSON tags and optional binding tags (path, query).
646- func genFieldTag (fieldName , typeName string , arr []httpidl.Annotation , binding * Binding ) (string , error ) {
647- var tags []string
649+ type JSONTag struct {
650+ Name string
651+ OmitEmpty bool
652+ OmitZero bool
653+ }
654+
655+ // JSONTag returns a JSON tag string for a field.
656+ func (tag JSONTag ) String () string {
657+ var sb strings.Builder
658+ sb .WriteString (`json:"` )
659+ sb .WriteString (tag .Name )
660+ if tag .OmitEmpty {
661+ sb .WriteString (",omitempty" )
662+ }
663+ if tag .OmitZero {
664+ sb .WriteString (",omitzero" )
665+ }
666+ sb .WriteString (`"` )
667+ return sb .String ()
668+ }
648669
649- var jsonName string
650- var omitZero bool
651- omitEmpty := strings .HasPrefix (typeName , "*" )
670+ // genJSONTag generates a JSON tag for a field.
671+ func genJSONTag (fieldName , typeName string , arr []httpidl.Annotation ) (JSONTag , error ) {
672+ var (
673+ jsonName = fieldName
674+ omitEmpty = strings .HasPrefix (typeName , "*" )
675+ omitZero bool
676+ )
652677
653678 // Parse "json" annotation
654679 if a , ok := httpidl .GetAnnotation (arr , "json" ); ok {
655680 if a .Value == nil {
656- return "" , errutil .Explain (nil , `annotation "json" value is nil` )
681+ return JSONTag {} , errutil .Explain (nil , `annotation "json" value is nil` )
657682 }
658683 s := strings .TrimSpace (* a .Value )
659684 if s == "" {
660- return "" , errutil .Explain (nil , `annotation "json" value is empty` )
685+ return JSONTag {} , errutil .Explain (nil , `annotation "json" value is empty` )
661686 }
662687 s = strings .Trim (s , "\" " ) // Remove quotes
663688 for i , v := range strings .Split (s , "," ) {
@@ -680,20 +705,27 @@ func genFieldTag(fieldName, typeName string, arr []httpidl.Annotation, binding *
680705 }
681706 }
682707
683- if jsonName == "" {
684- jsonName += fieldName
685- }
686- if omitEmpty {
687- jsonName += ",omitempty"
688- }
689- if omitZero {
690- jsonName += ",omitzero"
708+ return JSONTag {
709+ Name : jsonName ,
710+ OmitEmpty : omitEmpty ,
711+ OmitZero : omitZero ,
712+ }, nil
713+ }
714+
715+ // genFieldTag generates the struct tag for a Go struct field.
716+ // It includes JSON tags and optional binding tags (path, query).
717+ func genFieldTag (fieldName , typeName string , arr []httpidl.Annotation , binding * Binding ) (string , error ) {
718+ var tags []string
719+
720+ jsonTag , err := genJSONTag (fieldName , typeName , arr )
721+ if err != nil {
722+ return "" , err
691723 }
692- tags = append (tags , fmt . Sprintf ( "json: \" %s \" " , jsonName ))
724+ tags = append (tags , jsonTag . String ( ))
693725
694726 // Generate binding tag
695727 if binding != nil {
696- tags = append (tags , fmt . Sprintf ( "%s: \" %s \" " , binding .From , binding . Name ))
728+ tags = append (tags , binding .String ( ))
697729 }
698730
699731 return "`" + strings .Join (tags , " " ) + "`" , nil
0 commit comments