@@ -54,7 +54,8 @@ type Converter struct {
54
54
generatedConversionFuncs ConversionFuncs
55
55
56
56
// Set of conversions that should be treated as a no-op
57
- ignoredConversions map [typePair ]struct {}
57
+ ignoredConversions map [typePair ]struct {}
58
+ ignoredUntypedConversions map [typePair ]struct {}
58
59
59
60
// This is a map from a source field type and name, to a list of destination
60
61
// field type and name.
@@ -83,17 +84,23 @@ type Converter struct {
83
84
// NewConverter creates a new Converter object.
84
85
func NewConverter (nameFn NameFunc ) * Converter {
85
86
c := & Converter {
86
- conversionFuncs : NewConversionFuncs (),
87
- generatedConversionFuncs : NewConversionFuncs (),
88
- ignoredConversions : make (map [typePair ]struct {}),
89
- nameFunc : nameFn ,
90
- structFieldDests : make (map [typeNamePair ][]typeNamePair ),
91
- structFieldSources : make (map [typeNamePair ][]typeNamePair ),
87
+ conversionFuncs : NewConversionFuncs (),
88
+ generatedConversionFuncs : NewConversionFuncs (),
89
+ ignoredConversions : make (map [typePair ]struct {}),
90
+ ignoredUntypedConversions : make (map [typePair ]struct {}),
91
+ nameFunc : nameFn ,
92
+ structFieldDests : make (map [typeNamePair ][]typeNamePair ),
93
+ structFieldSources : make (map [typeNamePair ][]typeNamePair ),
92
94
93
95
inputFieldMappingFuncs : make (map [reflect.Type ]FieldMappingFunc ),
94
96
inputDefaultFlags : make (map [reflect.Type ]FieldMatchingFlags ),
95
97
}
96
- c .RegisterConversionFunc (Convert_Slice_byte_To_Slice_byte )
98
+ c .RegisterUntypedConversionFunc (
99
+ (* []byte )(nil ), (* []byte )(nil ),
100
+ func (a , b interface {}, s Scope ) error {
101
+ return Convert_Slice_byte_To_Slice_byte (a .(* []byte ), b .(* []byte ), s )
102
+ },
103
+ )
97
104
return c
98
105
}
99
106
@@ -153,31 +160,14 @@ type FieldMappingFunc func(key string, sourceTag, destTag reflect.StructTag) (so
153
160
154
161
func NewConversionFuncs () ConversionFuncs {
155
162
return ConversionFuncs {
156
- fns : make (map [typePair ]reflect.Value ),
157
163
untyped : make (map [typePair ]ConversionFunc ),
158
164
}
159
165
}
160
166
161
167
type ConversionFuncs struct {
162
- fns map [typePair ]reflect.Value
163
168
untyped map [typePair ]ConversionFunc
164
169
}
165
170
166
- // Add adds the provided conversion functions to the lookup table - they must have the signature
167
- // `func(type1, type2, Scope) error`. Functions are added in the order passed and will override
168
- // previously registered pairs.
169
- func (c ConversionFuncs ) Add (fns ... interface {}) error {
170
- for _ , fn := range fns {
171
- fv := reflect .ValueOf (fn )
172
- ft := fv .Type ()
173
- if err := verifyConversionFunctionSignature (ft ); err != nil {
174
- return err
175
- }
176
- c .fns [typePair {ft .In (0 ).Elem (), ft .In (1 ).Elem ()}] = fv
177
- }
178
- return nil
179
- }
180
-
181
171
// AddUntyped adds the provided conversion function to the lookup table for the types that are
182
172
// supplied as a and b. a and b must be pointers or an error is returned. This method overwrites
183
173
// previously defined functions.
@@ -197,12 +187,6 @@ func (c ConversionFuncs) AddUntyped(a, b interface{}, fn ConversionFunc) error {
197
187
// both other and c, with other conversions taking precedence.
198
188
func (c ConversionFuncs ) Merge (other ConversionFuncs ) ConversionFuncs {
199
189
merged := NewConversionFuncs ()
200
- for k , v := range c .fns {
201
- merged .fns [k ] = v
202
- }
203
- for k , v := range other .fns {
204
- merged .fns [k ] = v
205
- }
206
190
for k , v := range c .untyped {
207
191
merged .untyped [k ] = v
208
192
}
@@ -360,29 +344,6 @@ func verifyConversionFunctionSignature(ft reflect.Type) error {
360
344
return nil
361
345
}
362
346
363
- // RegisterConversionFunc registers a conversion func with the
364
- // Converter. conversionFunc must take three parameters: a pointer to the input
365
- // type, a pointer to the output type, and a conversion.Scope (which should be
366
- // used if recursive conversion calls are desired). It must return an error.
367
- //
368
- // Example:
369
- // c.RegisterConversionFunc(
370
- // func(in *Pod, out *v1.Pod, s Scope) error {
371
- // // conversion logic...
372
- // return nil
373
- // })
374
- // DEPRECATED: Will be removed in favor of RegisterUntypedConversionFunc
375
- func (c * Converter ) RegisterConversionFunc (conversionFunc interface {}) error {
376
- return c .conversionFuncs .Add (conversionFunc )
377
- }
378
-
379
- // Similar to RegisterConversionFunc, but registers conversion function that were
380
- // automatically generated.
381
- // DEPRECATED: Will be removed in favor of RegisterGeneratedUntypedConversionFunc
382
- func (c * Converter ) RegisterGeneratedConversionFunc (conversionFunc interface {}) error {
383
- return c .generatedConversionFuncs .Add (conversionFunc )
384
- }
385
-
386
347
// RegisterUntypedConversionFunc registers a function that converts between a and b by passing objects of those
387
348
// types to the provided function. The function *must* accept objects of a and b - this machinery will not enforce
388
349
// any other guarantee.
@@ -409,6 +370,7 @@ func (c *Converter) RegisterIgnoredConversion(from, to interface{}) error {
409
370
return fmt .Errorf ("expected pointer arg for 'to' param 1, got: %v" , typeTo )
410
371
}
411
372
c .ignoredConversions [typePair {typeFrom .Elem (), typeTo .Elem ()}] = struct {}{}
373
+ c .ignoredUntypedConversions [typePair {typeFrom , typeTo }] = struct {}{}
412
374
return nil
413
375
}
414
376
@@ -491,6 +453,11 @@ func (c *Converter) doConversion(src, dest interface{}, flags FieldMatchingFlags
491
453
flags : flags ,
492
454
meta : meta ,
493
455
}
456
+
457
+ // ignore conversions of this type
458
+ if _ , ok := c .ignoredUntypedConversions [pair ]; ok {
459
+ return nil
460
+ }
494
461
if fn , ok := c .conversionFuncs .untyped [pair ]; ok {
495
462
return fn (src , dest , scope )
496
463
}
@@ -517,35 +484,6 @@ func (c *Converter) doConversion(src, dest interface{}, flags FieldMatchingFlags
517
484
return f (sv , dv , scope )
518
485
}
519
486
520
- // callCustom calls 'custom' with sv & dv. custom must be a conversion function.
521
- func (c * Converter ) callCustom (sv , dv , custom reflect.Value , scope * scope ) error {
522
- if ! sv .CanAddr () {
523
- sv2 := reflect .New (sv .Type ())
524
- sv2 .Elem ().Set (sv )
525
- sv = sv2
526
- } else {
527
- sv = sv .Addr ()
528
- }
529
- if ! dv .CanAddr () {
530
- if ! dv .CanSet () {
531
- return scope .errorf ("can't addr or set dest." )
532
- }
533
- dvOrig := dv
534
- dv := reflect .New (dvOrig .Type ())
535
- defer func () { dvOrig .Set (dv ) }()
536
- } else {
537
- dv = dv .Addr ()
538
- }
539
- args := []reflect.Value {sv , dv , reflect .ValueOf (scope )}
540
- ret := custom .Call (args )[0 ].Interface ()
541
- // This convolution is necessary because nil interfaces won't convert
542
- // to errors.
543
- if ret == nil {
544
- return nil
545
- }
546
- return ret .(error )
547
- }
548
-
549
487
// callUntyped calls predefined conversion func.
550
488
func (c * Converter ) callUntyped (sv , dv reflect.Value , f ConversionFunc , scope * scope ) error {
551
489
if ! dv .CanAddr () {
@@ -577,19 +515,6 @@ func (c *Converter) convert(sv, dv reflect.Value, scope *scope) error {
577
515
}
578
516
579
517
// Convert sv to dv.
580
- if fv , ok := c .conversionFuncs .fns [pair ]; ok {
581
- if c .Debug != nil {
582
- c .Debug .Logf ("Calling custom conversion of '%v' to '%v'" , st , dt )
583
- }
584
- return c .callCustom (sv , dv , fv , scope )
585
- }
586
- if fv , ok := c .generatedConversionFuncs .fns [pair ]; ok {
587
- if c .Debug != nil {
588
- c .Debug .Logf ("Calling generated conversion of '%v' to '%v'" , st , dt )
589
- }
590
- return c .callCustom (sv , dv , fv , scope )
591
- }
592
-
593
518
pair = typePair {reflect .PtrTo (sv .Type ()), reflect .PtrTo (dv .Type ())}
594
519
if f , ok := c .conversionFuncs .untyped [pair ]; ok {
595
520
return c .callUntyped (sv , dv , f , scope )
0 commit comments