@@ -3,7 +3,6 @@ package parser
3
3
import (
4
4
"fmt"
5
5
"go/types"
6
- "strings"
7
6
8
7
"github.com/webrpc/webrpc/schema"
9
8
)
@@ -21,7 +20,12 @@ func (p *Parser) ParseStruct(typeName string, structTyp *types.Struct) (*schema.
21
20
}
22
21
structTags := structTyp .Tag (i )
23
22
24
- if structField .Embedded () || strings .Contains (structTags , `json:",inline"` ) {
23
+ jsonTag , _ := GetJsonTag (structTags )
24
+ if jsonTag .Name == "-" { // struct field ignored by `json:"-"` struct tag
25
+ continue
26
+ }
27
+
28
+ if structField .Embedded () || jsonTag .Inline {
25
29
varType , err := p .ParseNamedType ("" , structField .Type ())
26
30
if err != nil {
27
31
return nil , fmt .Errorf ("parsing var %v: %w" , structField .Name (), err )
@@ -35,7 +39,7 @@ func (p *Parser) ParseStruct(typeName string, structTyp *types.Struct) (*schema.
35
39
continue
36
40
}
37
41
38
- field , err := p .parseStructField (typeName + "Field" , structField , structTags )
42
+ field , err := p .parseStructField (typeName + "Field" , structField , jsonTag )
39
43
if err != nil {
40
44
return nil , fmt .Errorf ("parsing struct field %v: %w" , i , err )
41
45
}
@@ -58,7 +62,7 @@ func (p *Parser) ParseStruct(typeName string, structTyp *types.Struct) (*schema.
58
62
59
63
// parses single Go struct field
60
64
// if the field is embedded, ie. `json:",inline"`, parse recursively
61
- func (p * Parser ) parseStructField (structTypeName string , field * types.Var , structTags string ) (* schema.TypeField , error ) {
65
+ func (p * Parser ) parseStructField (structTypeName string , field * types.Var , jsonTag JsonTag ) (* schema.TypeField , error ) {
62
66
fieldName := field .Name ()
63
67
fieldType := field .Type ()
64
68
@@ -68,48 +72,43 @@ func (p *Parser) parseStructField(structTypeName string, field *types.Var, struc
68
72
69
73
goFieldImport := p .GoTypeImport (fieldType )
70
74
71
- jsonTag , ok := GetJsonTag (structTags )
72
- if ok {
75
+ if jsonTag .Name != "" {
73
76
if jsonTag .Name == "-" { // struct field ignored by `json:"-"` struct tag
74
77
return nil , nil
75
78
}
79
+ jsonFieldName = jsonTag .Name
80
+ }
76
81
77
- if jsonTag .Name != "" {
78
- jsonFieldName = jsonTag .Name
79
- }
80
-
82
+ if jsonTag .Omitempty {
81
83
optional = jsonTag .Omitempty
82
- if optional {
83
- goFieldType = "*" + goFieldType
84
- }
85
-
86
- if jsonTag .IsString { // struct field forced to be string by `json:",string"`
84
+ goFieldType = "*" + goFieldType
85
+ }
87
86
88
- structField := & schema.TypeField {
89
- Name : jsonFieldName ,
90
- Type : & schema.VarType {
91
- Expr : "string" ,
92
- Type : schema .T_String ,
93
- },
94
- TypeExtra : schema.TypeExtra {
95
- Meta : []schema.TypeFieldMeta {
96
- {"go.field.name" : fieldName },
97
- {"go.field.type" : goFieldType },
98
- },
99
- Optional : optional ,
87
+ if jsonTag .IsString { // struct field forced to be string by `json:",string"`
88
+ structField := & schema.TypeField {
89
+ Name : jsonFieldName ,
90
+ Type : & schema.VarType {
91
+ Expr : "string" ,
92
+ Type : schema .T_String ,
93
+ },
94
+ TypeExtra : schema.TypeExtra {
95
+ Meta : []schema.TypeFieldMeta {
96
+ {"go.field.name" : fieldName },
97
+ {"go.field.type" : goFieldType },
100
98
},
101
- }
102
- if goFieldImport != "" {
103
- structField .TypeExtra .Meta = append (structField .TypeExtra .Meta ,
104
- schema.TypeFieldMeta {"go.type.import" : goFieldImport },
105
- )
106
- }
99
+ Optional : optional ,
100
+ },
101
+ }
102
+ if goFieldImport != "" {
107
103
structField .TypeExtra .Meta = append (structField .TypeExtra .Meta ,
108
- schema.TypeFieldMeta {"go.tag.json " : jsonTag . Value },
104
+ schema.TypeFieldMeta {"go.type.import " : goFieldImport },
109
105
)
110
-
111
- return structField , nil
112
106
}
107
+ structField .TypeExtra .Meta = append (structField .TypeExtra .Meta ,
108
+ schema.TypeFieldMeta {"go.tag.json" : jsonTag .Value },
109
+ )
110
+
111
+ return structField , nil
113
112
}
114
113
115
114
if _ , ok := field .Type ().Underlying ().(* types.Pointer ); ok {
0 commit comments