From 265c24143c6df76b0061d415c9c65852465e3767 Mon Sep 17 00:00:00 2001 From: Akhil Mohan Date: Sat, 22 Jun 2024 23:43:25 +0530 Subject: [PATCH] refactor marshalling funcs for anypb.Any - move marshalling funcs for anypb.Any from containerd/containerd/protobuf to typeurl Signed-off-by: Akhil Mohan --- types.go | 26 ++++++++++++++++++++++++++ types_test.go | 7 +++++++ 2 files changed, 33 insertions(+) diff --git a/types.go b/types.go index d52ee94..78817b7 100644 --- a/types.go +++ b/types.go @@ -27,6 +27,7 @@ import ( gogoproto "github.com/gogo/protobuf/proto" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/reflect/protoregistry" + "google.golang.org/protobuf/types/known/anypb" ) var ( @@ -196,6 +197,31 @@ func UnmarshalToByTypeURL(typeURL string, value []byte, out interface{}) error { return err } +// MarshalProto converts typeurl.Any to google.golang.org/protobuf/types/known/anypb.Any. +func MarshalProto(from Any) *anypb.Any { + if from == nil { + return nil + } + + if pbany, ok := from.(*anypb.Any); ok { + return pbany + } + + return &anypb.Any{ + TypeUrl: from.GetTypeUrl(), + Value: from.GetValue(), + } +} + +// MarshalAnyToProto converts an arbitrary interface to google.golang.org/protobuf/types/known/anypb.Any. +func MarshalAnyToProto(from interface{}) (*anypb.Any, error) { + anyType, err := MarshalAny(from) + if err != nil { + return nil, err + } + return MarshalProto(anyType), nil +} + func unmarshal(typeURL string, value []byte, v interface{}) (interface{}, error) { t, err := getTypeByUrl(typeURL) if err != nil { diff --git a/types_test.go b/types_test.go index 108ecf2..f6c001a 100644 --- a/types_test.go +++ b/types_test.go @@ -167,6 +167,13 @@ func TestUnmarshalToInvalid(t *testing.T) { } } +func TestFromAny(t *testing.T) { + actual := MarshalProto(nil) + if actual != nil { + t.Fatalf("expected nil, got %v", actual) + } +} + func TestIs(t *testing.T) { clear() Register(&test{}, "test")