@@ -68,39 +68,15 @@ func (s *StructToTS) AddWithName(v interface{}, name string) *Struct {
68
68
t = reflect .TypeOf (v )
69
69
}
70
70
71
- return s .addType (t , name , "" )
71
+ return s .addType (t , name )
72
72
}
73
73
74
- func (s * StructToTS ) addType (t reflect.Type , name , prefix string ) (out * Struct ) {
75
- t = indirect (t )
76
-
77
- if out = s .seen [t ]; out != nil {
78
- return out
79
- }
80
-
81
- if name == "" {
82
- name = t .Name ()
83
- if ! s .opts .NoCapitalize {
84
- name = capitalize (name )
85
- }
86
- }
87
-
88
- out = & Struct {
89
- Name : prefix + name ,
90
- Fields : make ([]* Field , 0 , t .NumField ()),
91
-
92
- t : t ,
93
- }
94
-
95
- s .seen [t ] = out
96
-
74
+ func (s * StructToTS ) addTypeFields (out * Struct , t reflect.Type ) {
97
75
for i := 0 ; i < t .NumField (); i ++ {
98
- var (
99
- sf = t .Field (i )
100
- sft = sf .Type
101
- tf Field
102
- k = sft .Kind ()
103
- )
76
+ sf := t .Field (i )
77
+ sft := sf .Type
78
+ k := sft .Kind ()
79
+ var tf Field
104
80
105
81
if k == reflect .Ptr {
106
82
tf .CanBeNull = true
@@ -112,13 +88,19 @@ func (s *StructToTS) addType(t reflect.Type, name, prefix string) (out *Struct)
112
88
continue
113
89
}
114
90
91
+ if sf .Anonymous && k == reflect .Struct && ! tf .IsDate {
92
+ // log.Println("trying anonymous field:", sft, k)
93
+ s .addTypeFields (out , sft )
94
+ continue
95
+ }
96
+
115
97
switch {
116
98
case k == reflect .Map :
117
99
tf .TsType , tf .KeyType , tf .ValType = "map" , stripType (sft .Key ()), stripType (sft .Elem ())
118
100
119
101
switch {
120
102
case isStruct (sft .Elem ()):
121
- tf .ValType = s .addType (sft .Elem (), "" , out . Name ).Name
103
+ tf .ValType = s .addType (sft .Elem (), "" ).Name
122
104
case sft .Elem ().Kind () == reflect .Interface :
123
105
tf .ValType = "any"
124
106
}
@@ -127,15 +109,15 @@ func (s *StructToTS) addType(t reflect.Type, name, prefix string) (out *Struct)
127
109
tf .TsType , tf .ValType = "array" , stripType (sft .Elem ())
128
110
129
111
if isStruct (sft .Elem ()) {
130
- tf .ValType = s .addType (sft .Elem (), "" , out . Name ).Name
112
+ tf .ValType = s .addType (sft .Elem (), "" ).Name
131
113
}
132
114
133
115
case k == reflect .Struct :
134
- if isDate (sft ) {
116
+ if isDate (sft ) || tf . IsDate {
135
117
break
136
118
}
137
119
tf .TsType = "object"
138
- tf .ValType = s .addType (sft , "" , out . Name ).Name
120
+ tf .ValType = s .addType (sft , "" ).Name
139
121
140
122
case k == reflect .Interface :
141
123
tf .TsType , tf .ValType = "object" , ""
@@ -147,8 +129,34 @@ func (s *StructToTS) addType(t reflect.Type, name, prefix string) (out *Struct)
147
129
148
130
out .Fields = append (out .Fields , & tf )
149
131
}
132
+ }
133
+
134
+ func (s * StructToTS ) addType (t reflect.Type , name string ) (out * Struct ) {
135
+ t = indirect (t )
136
+
137
+ if out = s .seen [t ]; out != nil {
138
+ return out
139
+ }
140
+
141
+ if name == "" {
142
+ name = t .Name ()
143
+ if ! s .opts .NoCapitalize {
144
+ name = capitalize (name )
145
+ }
146
+ }
150
147
148
+ out = & Struct {
149
+ Name : name ,
150
+ Fields : make ([]* Field , 0 , t .NumField ()),
151
+
152
+ t : t ,
153
+ }
154
+
155
+ // log.Println("building struct:", out.Name)
156
+ s .addTypeFields (out , t )
157
+ s .seen [t ] = out
151
158
s .structs = append (s .structs , out )
159
+ // log.Println("/building struct:", out.Name)
152
160
return
153
161
}
154
162
0 commit comments