@@ -27,31 +27,31 @@ import (
27
27
// VM struct tag expression interpreter
28
28
type VM struct {
29
29
tagName string
30
- structJar map [string ]* Struct
30
+ structJar map [string ]* structVM
31
31
rw sync.RWMutex
32
32
}
33
33
34
- // Struct tag expression set of struct
35
- type Struct struct {
34
+ // structVM tag expression set of struct
35
+ type structVM struct {
36
36
vm * VM
37
37
name string
38
- fields map [string ]* Field
38
+ fields map [string ]* fieldVM
39
39
exprs map [string ]* Expr
40
40
selectorList []string
41
41
}
42
42
43
- // Field tag expression set of struct field
44
- type Field struct {
43
+ // fieldVM tag expression set of struct field
44
+ type fieldVM struct {
45
45
reflect.StructField
46
- host * Struct
46
+ host * structVM
47
47
valueGetter func (uintptr ) interface {}
48
48
}
49
49
50
50
// New creates a tag expression interpreter that uses @tagName as the tag name.
51
51
func New (tagName string ) * VM {
52
52
return & VM {
53
53
tagName : tagName ,
54
- structJar : make (map [string ]* Struct , 256 ),
54
+ structJar : make (map [string ]* structVM , 256 ),
55
55
}
56
56
}
57
57
@@ -109,7 +109,7 @@ func (vm *VM) Run(structPtr interface{}) (*TagExpr, error) {
109
109
return s .newTagExpr (v .Pointer ()), nil
110
110
}
111
111
112
- func (vm * VM ) registerStructLocked (structType reflect.Type ) (* Struct , error ) {
112
+ func (vm * VM ) registerStructLocked (structType reflect.Type ) (* structVM , error ) {
113
113
structType , err := vm .getStructType (structType )
114
114
if err != nil {
115
115
return nil , err
@@ -119,14 +119,14 @@ func (vm *VM) registerStructLocked(structType reflect.Type) (*Struct, error) {
119
119
if had {
120
120
return s , nil
121
121
}
122
- s = vm .newStruct ()
122
+ s = vm .newStructVM ()
123
123
vm .structJar [structTypeName ] = s
124
124
var numField = structType .NumField ()
125
125
var structField reflect.StructField
126
- var sub * Struct
126
+ var sub * structVM
127
127
for i := 0 ; i < numField ; i ++ {
128
128
structField = structType .Field (i )
129
- field , err := s .newField (structField )
129
+ field , err := s .newFieldVM (structField )
130
130
if err != nil {
131
131
return nil , err
132
132
}
@@ -160,17 +160,17 @@ func (vm *VM) registerStructLocked(structType reflect.Type) (*Struct, error) {
160
160
return s , nil
161
161
}
162
162
163
- func (vm * VM ) newStruct () * Struct {
164
- return & Struct {
163
+ func (vm * VM ) newStructVM () * structVM {
164
+ return & structVM {
165
165
vm : vm ,
166
- fields : make (map [string ]* Field , 16 ),
166
+ fields : make (map [string ]* fieldVM , 16 ),
167
167
exprs : make (map [string ]* Expr , 64 ),
168
168
selectorList : make ([]string , 0 , 64 ),
169
169
}
170
170
}
171
171
172
- func (s * Struct ) newField (structField reflect.StructField ) (* Field , error ) {
173
- f := & Field {
172
+ func (s * structVM ) newFieldVM (structField reflect.StructField ) (* fieldVM , error ) {
173
+ f := & fieldVM {
174
174
StructField : structField ,
175
175
host : s ,
176
176
}
@@ -182,15 +182,15 @@ func (s *Struct) newField(structField reflect.StructField) (*Field, error) {
182
182
return f , nil
183
183
}
184
184
185
- func (f * Field ) newFrom (ptr uintptr , ptrDeep int ) reflect.Value {
185
+ func (f * fieldVM ) newFrom (ptr uintptr , ptrDeep int ) reflect.Value {
186
186
v := reflect .NewAt (f .Type , unsafe .Pointer (ptr + f .Offset )).Elem ()
187
187
for i := 0 ; i < ptrDeep ; i ++ {
188
188
v = v .Elem ()
189
189
}
190
190
return v
191
191
}
192
192
193
- func (f * Field ) setFloatGetter (kind reflect.Kind , ptrDeep int ) {
193
+ func (f * fieldVM ) setFloatGetter (kind reflect.Kind , ptrDeep int ) {
194
194
if ptrDeep == 0 {
195
195
f .valueGetter = func (ptr uintptr ) interface {} {
196
196
return getFloat64 (kind , ptr + f .Offset )
@@ -206,7 +206,7 @@ func (f *Field) setFloatGetter(kind reflect.Kind, ptrDeep int) {
206
206
}
207
207
}
208
208
209
- func (f * Field ) setBoolGetter (ptrDeep int ) {
209
+ func (f * fieldVM ) setBoolGetter (ptrDeep int ) {
210
210
if ptrDeep == 0 {
211
211
f .valueGetter = func (ptr uintptr ) interface {} {
212
212
return * (* bool )(unsafe .Pointer (ptr + f .Offset ))
@@ -222,7 +222,7 @@ func (f *Field) setBoolGetter(ptrDeep int) {
222
222
}
223
223
}
224
224
225
- func (f * Field ) setStringGetter (ptrDeep int ) {
225
+ func (f * fieldVM ) setStringGetter (ptrDeep int ) {
226
226
if ptrDeep == 0 {
227
227
f .valueGetter = func (ptr uintptr ) interface {} {
228
228
return * (* string )(unsafe .Pointer (ptr + f .Offset ))
@@ -238,13 +238,13 @@ func (f *Field) setStringGetter(ptrDeep int) {
238
238
}
239
239
}
240
240
241
- func (f * Field ) setLengthGetter (ptrDeep int ) {
241
+ func (f * fieldVM ) setLengthGetter (ptrDeep int ) {
242
242
f .valueGetter = func (ptr uintptr ) interface {} {
243
243
return f .newFrom (ptr , ptrDeep ).Interface ()
244
244
}
245
245
}
246
246
247
- func (f * Field ) parseExprs (tag string ) error {
247
+ func (f * fieldVM ) parseExprs (tag string ) error {
248
248
raw := tag
249
249
tag = strings .TrimSpace (tag )
250
250
if tag == "" {
@@ -300,11 +300,11 @@ func (f *Field) parseExprs(tag string) error {
300
300
}
301
301
}
302
302
303
- func (s * Struct ) copySubFields (field * Field , sub * Struct , ptrDeep int ) {
303
+ func (s * structVM ) copySubFields (field * fieldVM , sub * structVM , ptrDeep int ) {
304
304
nameSpace := field .Name
305
305
for k , v := range sub .fields {
306
306
valueGetter := v .valueGetter
307
- f := & Field {
307
+ f := & fieldVM {
308
308
StructField : v .StructField ,
309
309
host : v .host ,
310
310
}
@@ -315,11 +315,11 @@ func (s *Struct) copySubFields(field *Field, sub *Struct, ptrDeep int) {
315
315
}
316
316
} else {
317
317
f .valueGetter = func (ptr uintptr ) interface {} {
318
- newField := reflect .NewAt (field .Type , unsafe .Pointer (ptr + field .Offset ))
318
+ newFieldVM := reflect .NewAt (field .Type , unsafe .Pointer (ptr + field .Offset ))
319
319
for i := 0 ; i < ptrDeep ; i ++ {
320
- newField = newField .Elem ()
320
+ newFieldVM = newFieldVM .Elem ()
321
321
}
322
- return valueGetter (uintptr (newField .Pointer ()))
322
+ return valueGetter (uintptr (newFieldVM .Pointer ()))
323
323
}
324
324
}
325
325
}
@@ -344,7 +344,7 @@ func (vm *VM) getStructType(t reflect.Type) (reflect.Type, error) {
344
344
return structType , nil
345
345
}
346
346
347
- func (s * Struct ) newTagExpr (ptr uintptr ) * TagExpr {
347
+ func (s * structVM ) newTagExpr (ptr uintptr ) * TagExpr {
348
348
te := & TagExpr {
349
349
s : s ,
350
350
ptr : ptr ,
@@ -354,60 +354,69 @@ func (s *Struct) newTagExpr(ptr uintptr) *TagExpr {
354
354
355
355
// TagExpr struct tag expression evaluator
356
356
type TagExpr struct {
357
- s * Struct
357
+ s * structVM
358
358
ptr uintptr
359
359
}
360
360
361
361
// EvalFloat evaluate the value of the struct tag expression by the selector expression.
362
362
// NOTE:
363
363
// If the expression value type is not float64, return 0.
364
- func (t * TagExpr ) EvalFloat (selector string ) float64 {
365
- r , _ := t .Eval (selector ).(float64 )
364
+ func (t * TagExpr ) EvalFloat (exprSelector string ) float64 {
365
+ r , _ := t .Eval (exprSelector ).(float64 )
366
366
return r
367
367
}
368
368
369
369
// EvalString evaluate the value of the struct tag expression by the selector expression.
370
370
// NOTE:
371
371
// If the expression value type is not string, return "".
372
- func (t * TagExpr ) EvalString (selector string ) string {
373
- r , _ := t .Eval (selector ).(string )
372
+ func (t * TagExpr ) EvalString (exprSelector string ) string {
373
+ r , _ := t .Eval (exprSelector ).(string )
374
374
return r
375
375
}
376
376
377
377
// EvalBool evaluate the value of the struct tag expression by the selector expression.
378
378
// NOTE:
379
379
// If the expression value type is not bool, return false.
380
- func (t * TagExpr ) EvalBool (selector string ) bool {
381
- r , _ := t .Eval (selector ).(bool )
380
+ func (t * TagExpr ) EvalBool (exprSelector string ) bool {
381
+ r , _ := t .Eval (exprSelector ).(bool )
382
382
return r
383
383
}
384
384
385
385
// Eval evaluate the value of the struct tag expression by the selector expression.
386
386
// NOTE:
387
387
// format: fieldName, fieldName.exprName, fieldName1.fieldName2.exprName1
388
388
// result types: float64, string, bool, nil
389
- func (t * TagExpr ) Eval (selector string ) interface {} {
390
- expr , ok := t .s .exprs [selector ]
389
+ func (t * TagExpr ) Eval (exprSelector string ) interface {} {
390
+ expr , ok := t .s .exprs [exprSelector ]
391
391
if ! ok {
392
392
return nil
393
393
}
394
- return expr .run (getFieldSelector (selector ), t )
394
+ return expr .run (getFieldSelector (exprSelector ), t )
395
395
}
396
396
397
397
// Range loop through each tag expression
398
398
// NOTE:
399
399
// eval result types: float64, string, bool, nil
400
- func (t * TagExpr ) Range (fn func (selector string , eval func () interface {}) bool ) {
400
+ func (t * TagExpr ) Range (fn func (exprSelector string , eval func () interface {}) bool ) {
401
401
exprs := t .s .exprs
402
- for _ , selector := range t .s .selectorList {
403
- if ! fn (selector , func () interface {} {
404
- return exprs [selector ].run (getFieldSelector (selector ), t )
402
+ for _ , exprSelector := range t .s .selectorList {
403
+ if ! fn (exprSelector , func () interface {} {
404
+ return exprs [exprSelector ].run (getFieldSelector (exprSelector ), t )
405
405
}) {
406
406
return
407
407
}
408
408
}
409
409
}
410
410
411
+ // Field returns the field reflect.Value specified by the selector.
412
+ func (t * TagExpr ) Field (fieldSelector string ) reflect.Value {
413
+ f , ok := t .s .fields [fieldSelector ]
414
+ if ! ok {
415
+ return reflect.Value {}
416
+ }
417
+ return reflect .NewAt (f .Type , unsafe .Pointer (t .ptr + f .Offset )).Elem ()
418
+ }
419
+
411
420
func (t * TagExpr ) getValue (field string , subFields []interface {}) (v interface {}) {
412
421
f , ok := t .s .fields [field ]
413
422
if ! ok {
0 commit comments