@@ -24,13 +24,15 @@ var (
24
24
)
25
25
26
26
type udt struct {
27
+ mapper * reflectx.Mapper
27
28
field map [string ]reflect.Value
28
29
value reflect.Value
29
30
strict bool
30
31
}
31
32
32
33
func makeUDT (value reflect.Value , mapper * reflectx.Mapper , strict bool ) udt {
33
34
return udt {
35
+ mapper : mapper ,
34
36
value : value ,
35
37
field : mapper .FieldMap (value ),
36
38
strict : strict ,
@@ -40,7 +42,12 @@ func makeUDT(value reflect.Value, mapper *reflectx.Mapper, strict bool) udt {
40
42
func (u udt ) MarshalUDT (name string , info gocql.TypeInfo ) ([]byte , error ) {
41
43
value , ok := u .field [name ]
42
44
if ok {
43
- return gocql .Marshal (info , value .Interface ())
45
+ switch info .(type ) {
46
+ case gocql.UDTTypeInfo :
47
+ return gocql .Marshal (info , makeUDT (value , u .mapper , u .strict ))
48
+ default :
49
+ return gocql .Marshal (info , value .Interface ())
50
+ }
44
51
}
45
52
if ! u .strict {
46
53
return nil , nil
@@ -51,6 +58,10 @@ func (u udt) MarshalUDT(name string, info gocql.TypeInfo) ([]byte, error) {
51
58
func (u udt ) UnmarshalUDT (name string , info gocql.TypeInfo , data []byte ) error {
52
59
value , ok := u .field [name ]
53
60
if ok {
61
+ if value .Addr ().Type ().Implements (autoUDTInterface ) {
62
+ return gocql .Unmarshal (info , data , makeUDT (value .Addr (), u .mapper , u .strict ))
63
+ }
64
+
54
65
return gocql .Unmarshal (info , data , value .Addr ().Interface ())
55
66
}
56
67
if ! u .strict {
0 commit comments