@@ -216,7 +216,7 @@ func MarshalAnyToProto(from interface{}) (*anypb.Any, error) {
216216}
217217
218218func unmarshal (typeURL string , value []byte , v interface {}) (interface {}, error ) {
219- t , err := getTypeByUrl (typeURL )
219+ t , isProto , err := getTypeByUrl (typeURL )
220220 if err != nil {
221221 return nil , err
222222 }
@@ -234,31 +234,32 @@ func unmarshal(typeURL string, value []byte, v interface{}) (interface{}, error)
234234 }
235235 }
236236
237- pm , ok := v .(proto.Message )
238- if ok {
239- err = proto .Unmarshal (value , pm )
240- } else {
241- err = json .Unmarshal (value , v )
237+ if isProto {
238+ pm , ok := v .(proto.Message )
239+ if ok {
240+ err = proto .Unmarshal (value , pm )
241+ return v , err
242+ }
242243 }
244+ return v , json .Unmarshal (value , v )
243245
244- return v , err
245246}
246247
247- func getTypeByUrl (url string ) (reflect.Type , error ) {
248+ func getTypeByUrl (url string ) (_ reflect.Type , isProto bool , _ error ) {
248249 mu .RLock ()
249250 for t , u := range registry {
250251 if u == url {
251252 mu .RUnlock ()
252- return t , nil
253+ return t , false , nil
253254 }
254255 }
255256 mu .RUnlock ()
256257 mt , err := protoregistry .GlobalTypes .FindMessageByURL (url )
257258 if err != nil {
258- return nil , fmt .Errorf ("type with url %s: %w" , url , ErrNotFound )
259+ return nil , false , fmt .Errorf ("type with url %s: %w" , url , ErrNotFound )
259260 }
260261 empty := mt .New ().Interface ()
261- return reflect .TypeOf (empty ).Elem (), nil
262+ return reflect .TypeOf (empty ).Elem (), true , nil
262263}
263264
264265func tryDereference (v interface {}) reflect.Type {
0 commit comments