in pkg/gcv/result.go [263:307]
func convertToProtoValInternal(from interface{}) *structpb.Value {
if from == nil {
return nil
}
switch val := from.(type) {
case map[string]interface{}:
fields := map[string]*structpb.Value{}
for k, v := range val {
fields[k] = convertToProtoValInternal(v)
}
return &structpb.Value{
Kind: &structpb.Value_StructValue{
StructValue: &structpb.Struct{
Fields: fields,
},
}}
case []interface{}:
vals := make([]*structpb.Value, len(val))
for idx, v := range val {
vals[idx] = convertToProtoValInternal(v)
}
return &structpb.Value{
Kind: &structpb.Value_ListValue{
ListValue: &structpb.ListValue{Values: vals},
},
}
case string:
return &structpb.Value{Kind: &structpb.Value_StringValue{StringValue: val}}
case int:
return &structpb.Value{Kind: &structpb.Value_NumberValue{NumberValue: float64(val)}}
case int64:
return &structpb.Value{Kind: &structpb.Value_NumberValue{NumberValue: float64(val)}}
case float64:
return &structpb.Value{Kind: &structpb.Value_NumberValue{NumberValue: val}}
case float32:
return &structpb.Value{Kind: &structpb.Value_NumberValue{NumberValue: float64(val)}}
case bool:
return &structpb.Value{Kind: &structpb.Value_BoolValue{BoolValue: val}}
default:
panic(&convertFailed{errors.Errorf("Unhandled type %v (%s)", from, reflect.TypeOf(from).String())})
}
}