in azkustodata/value/dynamic.go [70:120]
func (d *Dynamic) Convert(v reflect.Value) error {
t := v.Type()
if t.Kind() == reflect.Ptr {
t = t.Elem()
}
if d.Value == nil {
return nil
}
var valueToSet reflect.Value
switch {
case t.ConvertibleTo(reflect.TypeOf(Dynamic{})):
valueToSet = reflect.ValueOf(*d)
case t.ConvertibleTo(reflect.TypeOf([]byte{})):
if t.Kind() == reflect.String {
s := string(d.Value)
valueToSet = reflect.ValueOf(s)
} else {
valueToSet = reflect.ValueOf(d.Value)
}
case t.Kind() == reflect.Slice || t.Kind() == reflect.Map:
ptr := reflect.New(t)
if err := json.Unmarshal([]byte(d.Value), ptr.Interface()); err != nil {
return fmt.Errorf("Error occurred while trying to unmarshal Dynamic into a %s: %s", t.Kind(), err)
}
valueToSet = ptr.Elem()
case t.Kind() == reflect.Struct:
structPtr := reflect.New(t)
if err := json.Unmarshal([]byte(d.Value), structPtr.Interface()); err != nil {
return fmt.Errorf("Could not unmarshal type dynamic into receiver: %s", err)
}
valueToSet = structPtr.Elem()
default:
return fmt.Errorf("Column was type Kusto.Dynamic, receiver had base Kind %s ", t.Kind())
}
if v.Type().Kind() != reflect.Ptr {
v.Set(valueToSet)
} else {
if v.IsZero() {
v.Set(reflect.New(valueToSet.Type()))
}
v.Elem().Set(valueToSet)
}
return nil
}