Skip to content

Commit ad42ce8

Browse files
authoredNov 16, 2022
feat: Add Any helper functions (#92)
1 parent 47964f2 commit ad42ce8

File tree

4 files changed

+116
-1
lines changed

4 files changed

+116
-1
lines changed
 

‎README.md

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ go install github.com/cosmos/cosmos-proto/cmd/protoc-gen-go-pulsar
88

99
cd path/to/proto/files
1010

11-
protoc --go-pulsar_out=. --go-pulsar_opt=paths=source_relative --go-pulsar_opt=features=marshal+unmarshal+size -I .
11+
protoc --go-pulsar_out=. --go-pulsar_opt=paths=source_relative --go-pulsar_opt=features=protoc+fast -I .
1212
NAME_OF_FILE.proto
1313

1414
## Acknowledgements

‎any/any.go

+63
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
// Protocol Buffers - Google's data interchange format
2+
// Copyright 2008 Google Inc. All rights reserved.
3+
// https://developers.google.com/protocol-buffers/
4+
//
5+
// Redistribution and use in source and binary forms, with or without
6+
// modification, are permitted provided that the following conditions are
7+
// met:
8+
//
9+
// * Redistributions of source code must retain the above copyright
10+
// notice, this list of conditions and the following disclaimer.
11+
// * Redistributions in binary form must reproduce the above
12+
// copyright notice, this list of conditions and the following disclaimer
13+
// in the documentation and/or other materials provided with the
14+
// distribution.
15+
// * Neither the name of Google Inc. nor the names of its
16+
// contributors may be used to endorse or promote products derived from
17+
// this software without specific prior written permission.
18+
//
19+
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20+
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21+
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22+
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23+
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24+
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25+
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26+
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27+
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28+
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29+
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30+
31+
package any
32+
33+
import (
34+
"google.golang.org/protobuf/proto"
35+
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
36+
"google.golang.org/protobuf/types/known/anypb"
37+
)
38+
39+
// New marshals src into a new Any instance.
40+
func New(src proto.Message) (*anypb.Any, error) {
41+
dst := new(anypb.Any)
42+
if err := MarshalFrom(dst, src, proto.MarshalOptions{}); err != nil {
43+
return nil, err
44+
}
45+
return dst, nil
46+
}
47+
48+
// MarshalFrom marshals src into dst as the underlying message
49+
// using the provided marshal options.
50+
//
51+
// If no options are specified, call dst.MarshalFrom instead.
52+
func MarshalFrom(dst *anypb.Any, src proto.Message, opts proto.MarshalOptions) error {
53+
if src == nil {
54+
return protoimpl.X.NewError("invalid nil source message")
55+
}
56+
b, err := opts.Marshal(src)
57+
if err != nil {
58+
return err
59+
}
60+
dst.TypeUrl = string(src.ProtoReflect().Descriptor().FullName())
61+
dst.Value = b
62+
return nil
63+
}

‎any/any_test.go

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package any_test
2+
3+
import (
4+
"testing"
5+
6+
"github.com/google/go-cmp/cmp"
7+
"github.com/stretchr/testify/require"
8+
"google.golang.org/protobuf/proto"
9+
"google.golang.org/protobuf/testing/protocmp"
10+
"google.golang.org/protobuf/types/known/anypb"
11+
12+
"github.com/cosmos/cosmos-proto/any"
13+
"github.com/cosmos/cosmos-proto/testpb"
14+
)
15+
16+
func TestAny(t *testing.T) {
17+
value := &testpb.A{SomeBoolean: true}
18+
19+
dst1 := &anypb.Any{}
20+
err := any.MarshalFrom(dst1, value, proto.MarshalOptions{})
21+
require.NoError(t, err)
22+
require.Equal(t, "A", dst1.TypeUrl) // Make sure there's no "type.googleapis.com/" prefix.
23+
24+
dst2, err := any.New(value)
25+
require.NoError(t, err)
26+
require.Equal(t, "A", dst2.TypeUrl) // Make sure there's no "type.googleapis.com/" prefix.
27+
28+
// Round trip.
29+
newValue, err := anypb.UnmarshalNew(dst2, proto.UnmarshalOptions{})
30+
require.NoError(t, err)
31+
diff := cmp.Diff(value, newValue, protocmp.Transform())
32+
require.Empty(t, diff)
33+
}

‎any/doc.go

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
// Package any is a helper library to be used as a replacement for some of the
2+
// official "google.golang.org/protobuf/types/known/anypb"'s functions which
3+
// prepend the "type.googleapis.com" prefix in type URLs.
4+
//
5+
// In the Cosmos SDK, an Any's TypeURL starts with a `/` character, e.g.
6+
// "/cosmos.bank.v1beta1.MsgSend". However, if we pack this MsgSend into
7+
// an anypb.Any using the offical anypb package's helper functions, we get a
8+
// TypeURL which is "type.googleapis.com/cosmos.bank.v1beta1.MsgSend".
9+
//
10+
// Therefore, the following 3 functions/methods cannot be used within the
11+
// Cosmos context:
12+
// - anypb.New
13+
// - anypb.MarshalFrom
14+
// - anypb.Any#MarshalFrom
15+
// as all of them append the unwanted prefix.
16+
//
17+
// This package exposes the `New` and `MarshalFrom` helper functions, which do
18+
// not prepend any prefix to type URLs.
19+
package any

0 commit comments

Comments
 (0)
Please sign in to comment.