refactor: use proto.Message instead of ProtoMarshler (#14208)

This commit is contained in:
Marko
2022-12-08 19:38:38 +00:00
committed by GitHub
parent 09bff2f444
commit 755c99ac44
18 changed files with 131 additions and 175 deletions
+8 -8
View File
@@ -18,42 +18,42 @@ func NewAminoCodec(codec *LegacyAmino) *AminoCodec {
}
// Marshal implements BinaryMarshaler.Marshal method.
func (ac *AminoCodec) Marshal(o ProtoMarshaler) ([]byte, error) {
func (ac *AminoCodec) Marshal(o proto.Message) ([]byte, error) {
return ac.LegacyAmino.Marshal(o)
}
// MustMarshal implements BinaryMarshaler.MustMarshal method.
func (ac *AminoCodec) MustMarshal(o ProtoMarshaler) []byte {
func (ac *AminoCodec) MustMarshal(o proto.Message) []byte {
return ac.LegacyAmino.MustMarshal(o)
}
// MarshalLengthPrefixed implements BinaryMarshaler.MarshalLengthPrefixed method.
func (ac *AminoCodec) MarshalLengthPrefixed(o ProtoMarshaler) ([]byte, error) {
func (ac *AminoCodec) MarshalLengthPrefixed(o proto.Message) ([]byte, error) {
return ac.LegacyAmino.MarshalLengthPrefixed(o)
}
// MustMarshalLengthPrefixed implements BinaryMarshaler.MustMarshalLengthPrefixed method.
func (ac *AminoCodec) MustMarshalLengthPrefixed(o ProtoMarshaler) []byte {
func (ac *AminoCodec) MustMarshalLengthPrefixed(o proto.Message) []byte {
return ac.LegacyAmino.MustMarshalLengthPrefixed(o)
}
// Unmarshal implements BinaryMarshaler.Unmarshal method.
func (ac *AminoCodec) Unmarshal(bz []byte, ptr ProtoMarshaler) error {
func (ac *AminoCodec) Unmarshal(bz []byte, ptr proto.Message) error {
return ac.LegacyAmino.Unmarshal(bz, ptr)
}
// MustUnmarshal implements BinaryMarshaler.MustUnmarshal method.
func (ac *AminoCodec) MustUnmarshal(bz []byte, ptr ProtoMarshaler) {
func (ac *AminoCodec) MustUnmarshal(bz []byte, ptr proto.Message) {
ac.LegacyAmino.MustUnmarshal(bz, ptr)
}
// UnmarshalLengthPrefixed implements BinaryMarshaler.UnmarshalLengthPrefixed method.
func (ac *AminoCodec) UnmarshalLengthPrefixed(bz []byte, ptr ProtoMarshaler) error {
func (ac *AminoCodec) UnmarshalLengthPrefixed(bz []byte, ptr proto.Message) error {
return ac.LegacyAmino.UnmarshalLengthPrefixed(bz, ptr)
}
// MustUnmarshalLengthPrefixed implements BinaryMarshaler.MustUnmarshalLengthPrefixed method.
func (ac *AminoCodec) MustUnmarshalLengthPrefixed(bz []byte, ptr ProtoMarshaler) {
func (ac *AminoCodec) MustUnmarshalLengthPrefixed(bz []byte, ptr proto.Message) {
ac.LegacyAmino.MustUnmarshalLengthPrefixed(bz, ptr)
}
+10 -8
View File
@@ -22,28 +22,28 @@ type (
BinaryCodec interface {
// Marshal returns binary encoding of v.
Marshal(o ProtoMarshaler) ([]byte, error)
Marshal(o proto.Message) ([]byte, error)
// MustMarshal calls Marshal and panics if error is returned.
MustMarshal(o ProtoMarshaler) []byte
MustMarshal(o proto.Message) []byte
// MarshalLengthPrefixed returns binary encoding of v with bytes length prefix.
MarshalLengthPrefixed(o ProtoMarshaler) ([]byte, error)
MarshalLengthPrefixed(o proto.Message) ([]byte, error)
// MustMarshalLengthPrefixed calls MarshalLengthPrefixed and panics if
// error is returned.
MustMarshalLengthPrefixed(o ProtoMarshaler) []byte
MustMarshalLengthPrefixed(o proto.Message) []byte
// Unmarshal parses the data encoded with Marshal method and stores the result
// in the value pointed to by v.
Unmarshal(bz []byte, ptr ProtoMarshaler) error
Unmarshal(bz []byte, ptr proto.Message) error
// MustUnmarshal calls Unmarshal and panics if error is returned.
MustUnmarshal(bz []byte, ptr ProtoMarshaler)
MustUnmarshal(bz []byte, ptr proto.Message)
// Unmarshal parses the data encoded with UnmarshalLengthPrefixed method and stores
// the result in the value pointed to by v.
UnmarshalLengthPrefixed(bz []byte, ptr ProtoMarshaler) error
UnmarshalLengthPrefixed(bz []byte, ptr proto.Message) error
// MustUnmarshalLengthPrefixed calls UnmarshalLengthPrefixed and panics if error
// is returned.
MustUnmarshalLengthPrefixed(bz []byte, ptr ProtoMarshaler)
MustUnmarshalLengthPrefixed(bz []byte, ptr proto.Message)
// MarshalInterface is a helper method which will wrap `i` into `Any` for correct
// binary interface (de)serialization.
@@ -78,6 +78,8 @@ type (
// ProtoMarshaler defines an interface a type must implement to serialize itself
// as a protocol buffer defined message.
//
// Deprecated: Use proto.Message instead from github.com/cosmos/gogoproto/proto.
ProtoMarshaler interface {
proto.Message // for JSON serialization
+10 -10
View File
@@ -50,16 +50,16 @@ func testInterfaceMarshaling(require *require.Assertions, cdc interfaceMarshaler
}
type mustMarshaler struct {
marshal func(i codec.ProtoMarshaler) ([]byte, error)
mustMarshal func(i codec.ProtoMarshaler) []byte
unmarshal func(bz []byte, ptr codec.ProtoMarshaler) error
mustUnmarshal func(bz []byte, ptr codec.ProtoMarshaler)
marshal func(i proto.Message) ([]byte, error)
mustMarshal func(i proto.Message) []byte
unmarshal func(bz []byte, ptr proto.Message) error
mustUnmarshal func(bz []byte, ptr proto.Message)
}
type testCase struct {
name string
input codec.ProtoMarshaler
recv codec.ProtoMarshaler
input proto.Message
recv proto.Message
marshalErr bool
unmarshalErr bool
}
@@ -121,10 +121,10 @@ func testMarshaling(t *testing.T, cdc codec.Codec) {
m1 := mustMarshaler{cdc.Marshal, cdc.MustMarshal, cdc.Unmarshal, cdc.MustUnmarshal}
m2 := mustMarshaler{cdc.MarshalLengthPrefixed, cdc.MustMarshalLengthPrefixed, cdc.UnmarshalLengthPrefixed, cdc.MustUnmarshalLengthPrefixed}
m3 := mustMarshaler{
func(i codec.ProtoMarshaler) ([]byte, error) { return cdc.MarshalJSON(i) },
func(i codec.ProtoMarshaler) []byte { return cdc.MustMarshalJSON(i) },
func(bz []byte, ptr codec.ProtoMarshaler) error { return cdc.UnmarshalJSON(bz, ptr) },
func(bz []byte, ptr codec.ProtoMarshaler) { cdc.MustUnmarshalJSON(bz, ptr) },
func(i proto.Message) ([]byte, error) { return cdc.MarshalJSON(i) },
func(i proto.Message) []byte { return cdc.MustMarshalJSON(i) },
func(bz []byte, ptr proto.Message) error { return cdc.UnmarshalJSON(bz, ptr) },
func(bz []byte, ptr proto.Message) { cdc.MustUnmarshalJSON(bz, ptr) },
}
t.Run(tc.name+"_BinaryBare",
+22 -28
View File
@@ -6,7 +6,6 @@ import (
"fmt"
"strings"
legacyproto "github.com/golang/protobuf/proto" //nolint:staticcheck
"google.golang.org/grpc/encoding"
"google.golang.org/protobuf/proto"
@@ -42,19 +41,20 @@ func NewProtoCodec(interfaceRegistry types.InterfaceRegistry) *ProtoCodec {
// Marshal implements BinaryMarshaler.Marshal method.
// NOTE: this function must be used with a concrete type which
// implements proto.Message. For interface please use the codec.MarshalInterface
func (pc *ProtoCodec) Marshal(o ProtoMarshaler) ([]byte, error) {
func (pc *ProtoCodec) Marshal(o gogoproto.Message) ([]byte, error) {
// Size() check can catch the typed nil value.
if o == nil || o.Size() == 0 {
if o == nil || gogoproto.Size(o) == 0 {
// return empty bytes instead of nil, because nil has special meaning in places like store.Set
return []byte{}, nil
}
return o.Marshal()
return gogoproto.Marshal(o)
}
// MustMarshal implements BinaryMarshaler.MustMarshal method.
// NOTE: this function must be used with a concrete type which
// implements proto.Message. For interface please use the codec.MarshalInterface
func (pc *ProtoCodec) MustMarshal(o ProtoMarshaler) []byte {
func (pc *ProtoCodec) MustMarshal(o gogoproto.Message) []byte {
bz, err := pc.Marshal(o)
if err != nil {
panic(err)
@@ -64,19 +64,19 @@ func (pc *ProtoCodec) MustMarshal(o ProtoMarshaler) []byte {
}
// MarshalLengthPrefixed implements BinaryMarshaler.MarshalLengthPrefixed method.
func (pc *ProtoCodec) MarshalLengthPrefixed(o ProtoMarshaler) ([]byte, error) {
func (pc *ProtoCodec) MarshalLengthPrefixed(o gogoproto.Message) ([]byte, error) {
bz, err := pc.Marshal(o)
if err != nil {
return nil, err
}
var sizeBuf [binary.MaxVarintLen64]byte
n := binary.PutUvarint(sizeBuf[:], uint64(o.Size()))
n := binary.PutUvarint(sizeBuf[:], uint64(len(bz)))
return append(sizeBuf[:n], bz...), nil
}
// MustMarshalLengthPrefixed implements BinaryMarshaler.MustMarshalLengthPrefixed method.
func (pc *ProtoCodec) MustMarshalLengthPrefixed(o ProtoMarshaler) []byte {
func (pc *ProtoCodec) MustMarshalLengthPrefixed(o gogoproto.Message) []byte {
bz, err := pc.MarshalLengthPrefixed(o)
if err != nil {
panic(err)
@@ -88,8 +88,8 @@ func (pc *ProtoCodec) MustMarshalLengthPrefixed(o ProtoMarshaler) []byte {
// Unmarshal implements BinaryMarshaler.Unmarshal method.
// NOTE: this function must be used with a concrete type which
// implements proto.Message. For interface please use the codec.UnmarshalInterface
func (pc *ProtoCodec) Unmarshal(bz []byte, ptr ProtoMarshaler) error {
err := ptr.Unmarshal(bz)
func (pc *ProtoCodec) Unmarshal(bz []byte, ptr gogoproto.Message) error {
err := gogoproto.Unmarshal(bz, ptr)
if err != nil {
return err
}
@@ -103,14 +103,14 @@ func (pc *ProtoCodec) Unmarshal(bz []byte, ptr ProtoMarshaler) error {
// MustUnmarshal implements BinaryMarshaler.MustUnmarshal method.
// NOTE: this function must be used with a concrete type which
// implements proto.Message. For interface please use the codec.UnmarshalInterface
func (pc *ProtoCodec) MustUnmarshal(bz []byte, ptr ProtoMarshaler) {
func (pc *ProtoCodec) MustUnmarshal(bz []byte, ptr gogoproto.Message) {
if err := pc.Unmarshal(bz, ptr); err != nil {
panic(err)
}
}
// UnmarshalLengthPrefixed implements BinaryMarshaler.UnmarshalLengthPrefixed method.
func (pc *ProtoCodec) UnmarshalLengthPrefixed(bz []byte, ptr ProtoMarshaler) error {
func (pc *ProtoCodec) UnmarshalLengthPrefixed(bz []byte, ptr gogoproto.Message) error {
size, n := binary.Uvarint(bz)
if n < 0 {
return fmt.Errorf("invalid number of bytes read from length-prefixed encoding: %d", n)
@@ -127,7 +127,7 @@ func (pc *ProtoCodec) UnmarshalLengthPrefixed(bz []byte, ptr ProtoMarshaler) err
}
// MustUnmarshalLengthPrefixed implements BinaryMarshaler.MustUnmarshalLengthPrefixed method.
func (pc *ProtoCodec) MustUnmarshalLengthPrefixed(bz []byte, ptr ProtoMarshaler) {
func (pc *ProtoCodec) MustUnmarshalLengthPrefixed(bz []byte, ptr gogoproto.Message) {
if err := pc.UnmarshalLengthPrefixed(bz, ptr); err != nil {
panic(err)
}
@@ -137,13 +137,13 @@ func (pc *ProtoCodec) MustUnmarshalLengthPrefixed(bz []byte, ptr ProtoMarshaler)
// it marshals to JSON using proto codec.
// NOTE: this function must be used with a concrete type which
// implements proto.Message. For interface please use the codec.MarshalInterfaceJSON
//
//nolint:stdmethods
func (pc *ProtoCodec) MarshalJSON(o gogoproto.Message) ([]byte, error) {
m, ok := o.(ProtoMarshaler)
if !ok {
return nil, fmt.Errorf("cannot protobuf JSON encode unsupported type: %T", o)
if o == nil {
return nil, fmt.Errorf("cannot protobuf JSON encode nil")
}
return ProtoMarshalJSON(m, pc.interfaceRegistry)
return ProtoMarshalJSON(o, pc.interfaceRegistry)
}
// MustMarshalJSON implements JSONCodec.MustMarshalJSON method,
@@ -164,13 +164,11 @@ func (pc *ProtoCodec) MustMarshalJSON(o gogoproto.Message) []byte {
// NOTE: this function must be used with a concrete type which
// implements proto.Message. For interface please use the codec.UnmarshalInterfaceJSON
func (pc *ProtoCodec) UnmarshalJSON(bz []byte, ptr gogoproto.Message) error {
m, ok := ptr.(ProtoMarshaler)
if !ok {
if ptr == nil {
return fmt.Errorf("cannot protobuf JSON decode unsupported type: %T", ptr)
}
unmarshaler := jsonpb.Unmarshaler{AnyResolver: pc.interfaceRegistry}
err := unmarshaler.Unmarshal(strings.NewReader(string(bz)), m)
err := unmarshaler.Unmarshal(strings.NewReader(string(bz)), ptr)
if err != nil {
return err
}
@@ -283,10 +281,8 @@ func (g grpcProtoCodec) Marshal(v interface{}) ([]byte, error) {
switch m := v.(type) {
case proto.Message:
return proto.Marshal(m)
case ProtoMarshaler:
case gogoproto.Message:
return g.cdc.Marshal(m)
case legacyproto.Message:
return legacyproto.Marshal(m)
default:
return nil, fmt.Errorf("%w: cannot marshal type %T", errUnknownProtoType, v)
}
@@ -296,10 +292,8 @@ func (g grpcProtoCodec) Unmarshal(data []byte, v interface{}) error {
switch m := v.(type) {
case proto.Message:
return proto.Unmarshal(data, m)
case ProtoMarshaler:
case gogoproto.Message:
return g.cdc.Unmarshal(data, m)
case legacyproto.Message:
return legacyproto.Unmarshal(data, m)
default:
return fmt.Errorf("%w: cannot unmarshal type %T", errUnknownProtoType, v)
}
-55
View File
@@ -1,8 +1,6 @@
package codec_test
import (
"errors"
"fmt"
"math"
"reflect"
"testing"
@@ -43,15 +41,6 @@ func TestProtoCodec(t *testing.T) {
testMarshaling(t, cdc)
}
type lyingProtoMarshaler struct {
codec.ProtoMarshaler
falseSize int
}
func (lpm *lyingProtoMarshaler) Size() int {
return lpm.falseSize
}
func TestEnsureRegistered(t *testing.T) {
interfaceRegistry := types.NewInterfaceRegistry()
cat := &testdata.Cat{Moniker: "Garfield"}
@@ -138,50 +127,6 @@ func grpcServerEncode(c encoding.Codec, msg interface{}) ([]byte, error) {
return b, nil
}
func TestProtoCodecUnmarshalLengthPrefixedChecks(t *testing.T) {
cdc := codec.NewProtoCodec(createTestInterfaceRegistry())
truth := &testdata.Cat{Lives: 9, Moniker: "glowing"}
realSize := len(cdc.MustMarshal(truth))
falseSizes := []int{
100,
5,
}
for _, falseSize := range falseSizes {
falseSize := falseSize
t.Run(fmt.Sprintf("ByMarshaling falseSize=%d", falseSize), func(t *testing.T) {
lpm := &lyingProtoMarshaler{
ProtoMarshaler: &testdata.Cat{Lives: 9, Moniker: "glowing"},
falseSize: falseSize,
}
var serialized []byte
require.NotPanics(t, func() { serialized = cdc.MustMarshalLengthPrefixed(lpm) })
recv := new(testdata.Cat)
gotErr := cdc.UnmarshalLengthPrefixed(serialized, recv)
var wantErr error
if falseSize > realSize {
wantErr = fmt.Errorf("not enough bytes to read; want: %d, got: %d", falseSize, realSize)
} else {
wantErr = fmt.Errorf("too many bytes to read; want: %d, got: %d", falseSize, realSize)
}
require.Equal(t, gotErr, wantErr)
})
}
t.Run("Crafted bad uvarint size", func(t *testing.T) {
crafted := []byte{0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x7f}
recv := new(testdata.Cat)
gotErr := cdc.UnmarshalLengthPrefixed(crafted, recv)
require.Equal(t, gotErr, errors.New("invalid number of bytes read from length-prefixed encoding: -10"))
require.Panics(t, func() { cdc.MustUnmarshalLengthPrefixed(crafted, recv) })
})
}
func mustAny(msg proto.Message) *types.Any {
any, err := types.NewAnyWithValue(msg)
if err != nil {
-1
View File
@@ -400,7 +400,6 @@ func (s *IntegrationTestSuite) TestGetParamsGRPC() {
s.Run(tc.name, func() {
resp, err := testutil.GetRequest(tc.url)
s.Require().NoError(err)
err = val.ClientCtx.Codec.UnmarshalJSON(resp, tc.respType)
if tc.expErr {
+4 -3
View File
@@ -5,6 +5,7 @@ import (
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store/types"
proto "github.com/cosmos/gogoproto/proto"
)
// FilteredPaginate does pagination of all the results in the PrefixStore based on the
@@ -128,7 +129,7 @@ func FilteredPaginate(
// If offset is used, the pagination uses lazy filtering i.e., searches through all the records.
// The resulting slice (of type F) can be of a different type than the one being iterated through
// (type T), so it's possible to do any necessary transformation inside the onResult function.
func GenericFilteredPaginate[T codec.ProtoMarshaler, F codec.ProtoMarshaler](
func GenericFilteredPaginate[T, F proto.Message](
cdc codec.BinaryCodec,
prefixStore types.KVStore,
pageRequest *PageRequest,
@@ -189,7 +190,7 @@ func GenericFilteredPaginate[T codec.ProtoMarshaler, F codec.ProtoMarshaler](
return nil, nil, err
}
if val.Size() != 0 {
if proto.Size(val) != 0 {
results = append(results, val)
numHits++
}
@@ -227,7 +228,7 @@ func GenericFilteredPaginate[T codec.ProtoMarshaler, F codec.ProtoMarshaler](
return nil, nil, err
}
if val.Size() != 0 {
if proto.Size(val) != 0 {
// Previously this was the "accumulate" flag
if numHits >= offset && numHits < end {
results = append(results, val)
+6 -4
View File
@@ -1,6 +1,8 @@
package orm
import (
"github.com/cosmos/gogoproto/proto"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
"github.com/cosmos/cosmos-sdk/types/errors"
@@ -18,7 +20,7 @@ type AutoUInt64Table struct {
}
// NewAutoUInt64Table creates a new AutoUInt64Table.
func NewAutoUInt64Table(prefixData [2]byte, prefixSeq byte, model codec.ProtoMarshaler, cdc codec.Codec) (*AutoUInt64Table, error) {
func NewAutoUInt64Table(prefixData [2]byte, prefixSeq byte, model proto.Message, cdc codec.Codec) (*AutoUInt64Table, error) {
table, err := newTable(prefixData, model, cdc)
if err != nil {
return nil, err
@@ -34,7 +36,7 @@ func NewAutoUInt64Table(prefixData [2]byte, prefixSeq byte, model codec.ProtoMar
//
// Create iterates through the registered callbacks that may add secondary index
// keys.
func (a AutoUInt64Table) Create(store sdk.KVStore, obj codec.ProtoMarshaler) (uint64, error) {
func (a AutoUInt64Table) Create(store sdk.KVStore, obj proto.Message) (uint64, error) {
autoIncID := a.seq.NextVal(store)
err := a.table.Create(store, EncodeSequence(autoIncID), obj)
if err != nil {
@@ -50,7 +52,7 @@ func (a AutoUInt64Table) Create(store sdk.KVStore, obj codec.ProtoMarshaler) (ui
//
// Update iterates through the registered callbacks that may add or remove
// secondary index keys.
func (a AutoUInt64Table) Update(store sdk.KVStore, rowID uint64, newValue codec.ProtoMarshaler) error {
func (a AutoUInt64Table) Update(store sdk.KVStore, rowID uint64, newValue proto.Message) error {
return a.table.Update(store, EncodeSequence(rowID), newValue)
}
@@ -70,7 +72,7 @@ func (a AutoUInt64Table) Has(store sdk.KVStore, rowID uint64) bool {
// GetOne load the object persisted for the given RowID into the dest parameter.
// If none exists `ErrNotFound` is returned instead. Parameters must not be nil.
func (a AutoUInt64Table) GetOne(store sdk.KVStore, rowID uint64, dest codec.ProtoMarshaler) (RowID, error) {
func (a AutoUInt64Table) GetOne(store sdk.KVStore, rowID uint64, dest proto.Message) (RowID, error) {
rawRowID := EncodeSequence(rowID)
if err := a.table.GetOne(store, rawRowID, dest); err != nil {
return nil, err
+5 -4
View File
@@ -3,7 +3,8 @@ package orm
import (
"bytes"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/gogoproto/proto"
"github.com/cosmos/cosmos-sdk/store/prefix"
"github.com/cosmos/cosmos-sdk/store/types"
sdk "github.com/cosmos/cosmos-sdk/types"
@@ -198,7 +199,7 @@ func getPrefixScanKeyBytes(keyI interface{}) ([]byte, error) {
return key, nil
}
func (i MultiKeyIndex) onSet(store sdk.KVStore, rowID RowID, newValue, oldValue codec.ProtoMarshaler) error {
func (i MultiKeyIndex) onSet(store sdk.KVStore, rowID RowID, newValue, oldValue proto.Message) error {
pStore := prefix.NewStore(store, []byte{i.prefix})
if oldValue == nil {
return i.indexer.OnCreate(pStore, rowID, newValue)
@@ -206,7 +207,7 @@ func (i MultiKeyIndex) onSet(store sdk.KVStore, rowID RowID, newValue, oldValue
return i.indexer.OnUpdate(pStore, rowID, newValue, oldValue)
}
func (i MultiKeyIndex) onDelete(store sdk.KVStore, rowID RowID, oldValue codec.ProtoMarshaler) error {
func (i MultiKeyIndex) onDelete(store sdk.KVStore, rowID RowID, oldValue proto.Message) error {
pStore := prefix.NewStore(store, []byte{i.prefix})
return i.indexer.OnDelete(pStore, rowID, oldValue)
}
@@ -241,7 +242,7 @@ type indexIterator struct {
// LoadNext loads the next value in the sequence into the pointer passed as dest and returns the key. If there
// are no more items the errors.ErrORMIteratorDone error is returned
// The key is the rowID and not any MultiKeyIndex key.
func (i indexIterator) LoadNext(dest codec.ProtoMarshaler) (RowID, error) {
func (i indexIterator) LoadNext(dest proto.Message) (RowID, error) {
if !i.it.Valid() {
return nil, errors.ErrORMIteratorDone
}
+12 -11
View File
@@ -4,7 +4,8 @@ import (
"fmt"
"reflect"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/gogoproto/proto"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/types/query"
"github.com/cosmos/cosmos-sdk/x/group/errors"
@@ -15,12 +16,12 @@ const defaultPageLimit = 100
// IteratorFunc is a function type that satisfies the Iterator interface
// The passed function is called on LoadNext operations.
type IteratorFunc func(dest codec.ProtoMarshaler) (RowID, error)
type IteratorFunc func(dest proto.Message) (RowID, error)
// LoadNext loads the next value in the sequence into the pointer passed as dest and returns the key. If there
// are no more items the errors.ErrORMIteratorDone error is returned
// The key is the rowID and not any MultiKeyIndex key.
func (i IteratorFunc) LoadNext(dest codec.ProtoMarshaler) (RowID, error) {
func (i IteratorFunc) LoadNext(dest proto.Message) (RowID, error) {
return i(dest)
}
@@ -31,7 +32,7 @@ func (i IteratorFunc) Close() error {
func NewSingleValueIterator(rowID RowID, val []byte) Iterator {
var closed bool
return IteratorFunc(func(dest codec.ProtoMarshaler) (RowID, error) {
return IteratorFunc(func(dest proto.Message) (RowID, error) {
if dest == nil {
return nil, sdkerrors.Wrap(errors.ErrORMInvalidArgument, "destination object must not be nil")
}
@@ -39,13 +40,13 @@ func NewSingleValueIterator(rowID RowID, val []byte) Iterator {
return nil, errors.ErrORMIteratorDone
}
closed = true
return rowID, dest.Unmarshal(val)
return rowID, proto.Unmarshal(val, dest)
})
}
// Iterator that return ErrORMInvalidIterator only.
func NewInvalidIterator() Iterator {
return IteratorFunc(func(dest codec.ProtoMarshaler) (RowID, error) {
return IteratorFunc(func(dest proto.Message) (RowID, error) {
return nil, errors.ErrORMInvalidIterator
})
}
@@ -72,7 +73,7 @@ func LimitIterator(parent Iterator, max int) (*LimitedIterator, error) {
// LoadNext loads the next value in the sequence into the pointer passed as dest and returns the key. If there
// are no more items or the defined max number of elements was returned the `errors.ErrORMIteratorDone` error is returned
// The key is the rowID and not any MultiKeyIndex key.
func (i *LimitedIterator) LoadNext(dest codec.ProtoMarshaler) (RowID, error) {
func (i *LimitedIterator) LoadNext(dest proto.Message) (RowID, error) {
if i.remainingCount == 0 {
return nil, errors.ErrORMIteratorDone
}
@@ -87,7 +88,7 @@ func (i LimitedIterator) Close() error {
// First loads the first element into the given destination type and closes the iterator.
// When the iterator is closed or has no elements the according error is passed as return value.
func First(it Iterator, dest codec.ProtoMarshaler) (RowID, error) {
func First(it Iterator, dest proto.Message) (RowID, error) {
if it == nil {
return nil, sdkerrors.Wrap(errors.ErrORMInvalidArgument, "iterator must not be nil")
}
@@ -173,7 +174,7 @@ func Paginate(
model = val
}
modelProto, ok := model.Interface().(codec.ProtoMarshaler)
modelProto, ok := model.Interface().(proto.Message)
if !ok {
return nil, sdkerrors.Wrapf(errors.ErrORMInvalidArgument, "%s should implement codec.ProtoMarshaler", elemType)
}
@@ -255,7 +256,7 @@ func ReadAll(it Iterator, dest ModelSlicePtr) ([]RowID, error) {
model = val
}
binKey, err := it.LoadNext(model.Interface().(codec.ProtoMarshaler))
binKey, err := it.LoadNext(model.Interface().(proto.Message))
switch {
case err == nil:
tmpSlice = reflect.Append(tmpSlice, val)
@@ -294,7 +295,7 @@ func assertDest(dest ModelSlicePtr, destRef *reflect.Value, tmpSlice *reflect.Va
elemType := reflect.TypeOf(dest).Elem().Elem()
protoMarshaler := reflect.TypeOf((*codec.ProtoMarshaler)(nil)).Elem()
protoMarshaler := reflect.TypeOf((*proto.Message)(nil)).Elem()
if !elemType.Implements(protoMarshaler) &&
!reflect.PtrTo(elemType).Implements(protoMarshaler) {
return nil, sdkerrors.Wrapf(errors.ErrORMInvalidArgument, "unsupported type :%s", elemType)
@@ -3,13 +3,14 @@ package orm
import (
"testing"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/gogoproto/proto"
"github.com/stretchr/testify/require"
"pgregory.net/rapid"
"github.com/cosmos/cosmos-sdk/testutil/testdata"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/types/query"
"github.com/cosmos/cosmos-sdk/x/group/errors"
"github.com/stretchr/testify/require"
"pgregory.net/rapid"
)
func TestPaginationProperty(t *testing.T) {
@@ -94,7 +95,7 @@ func testTableModelIterator(tms []*testdata.TableModel, key RowID) Iterator {
if key != nil {
index = int(DecodeSequence(key))
}
return IteratorFunc(func(dest codec.ProtoMarshaler) (RowID, error) {
return IteratorFunc(func(dest proto.Message) (RowID, error) {
if dest == nil {
return nil, sdkerrors.Wrap(errors.ErrORMInvalidArgument, "destination object must not be nil")
}
@@ -116,6 +117,6 @@ func testTableModelIterator(tms []*testdata.TableModel, key RowID) Iterator {
index++
return rowID, dest.Unmarshal(bytes)
return rowID, proto.Unmarshal(bytes, dest)
})
}
+9 -7
View File
@@ -3,6 +3,10 @@ package orm
import (
"testing"
"github.com/cosmos/gogoproto/proto"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/codec/types"
"github.com/cosmos/cosmos-sdk/testutil/testdata"
@@ -10,8 +14,6 @@ import (
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/types/query"
"github.com/cosmos/cosmos-sdk/x/group/errors"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestReadAll(t *testing.T) {
@@ -150,11 +152,11 @@ func TestFirst(t *testing.T) {
testCases := []struct {
name string
iterator Iterator
dest codec.ProtoMarshaler
dest proto.Message
expectErr bool
expectedErr string
expectedRowID RowID
expectedDest codec.ProtoMarshaler
expectedDest proto.Message
}{
{
name: "nil iterator",
@@ -342,8 +344,8 @@ func TestPaginate(t *testing.T) {
}
// mockIter encodes + decodes value object.
func mockIter(rowID RowID, val codec.ProtoMarshaler) Iterator {
b, err := val.Marshal()
func mockIter(rowID RowID, val proto.Message) Iterator {
b, err := proto.Marshal(val)
if err != nil {
panic(err)
}
@@ -351,7 +353,7 @@ func mockIter(rowID RowID, val codec.ProtoMarshaler) Iterator {
}
func noopIter() Iterator {
return IteratorFunc(func(dest codec.ProtoMarshaler) (RowID, error) {
return IteratorFunc(func(dest proto.Message) (RowID, error) {
return nil, nil
})
}
+4 -2
View File
@@ -1,6 +1,8 @@
package orm
import (
"github.com/cosmos/gogoproto/proto"
"github.com/cosmos/cosmos-sdk/codec"
sdk "github.com/cosmos/cosmos-sdk/types"
)
@@ -40,7 +42,7 @@ type PrimaryKeyed interface {
// IMPORTANT: []byte parts are encoded with a single byte length prefix,
// so cannot be longer than 255 bytes.
PrimaryKeyFields() []interface{}
codec.ProtoMarshaler
proto.Message
}
// PrimaryKey returns the immutable and serialized primary key of this object.
@@ -111,7 +113,7 @@ func (a PrimaryKeyTable) Contains(store sdk.KVStore, obj PrimaryKeyed) bool {
// GetOne loads the object persisted for the given primary Key into the dest parameter.
// If none exists `ErrNotFound` is returned instead. Parameters must not be nil.
func (a PrimaryKeyTable) GetOne(store sdk.KVStore, primKey RowID, dest codec.ProtoMarshaler) error {
func (a PrimaryKeyTable) GetOne(store sdk.KVStore, primKey RowID, dest proto.Message) error {
return a.table.GetOne(store, primKey, dest)
}
+12 -10
View File
@@ -4,6 +4,8 @@ import (
"bytes"
"reflect"
"github.com/cosmos/gogoproto/proto"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store/prefix"
"github.com/cosmos/cosmos-sdk/store/types"
@@ -36,7 +38,7 @@ type table struct {
}
// newTable creates a new table
func newTable(prefix [2]byte, model codec.ProtoMarshaler, cdc codec.Codec) (*table, error) {
func newTable(prefix [2]byte, model proto.Message, cdc codec.Codec) (*table, error) {
if model == nil {
return nil, errors.ErrORMInvalidArgument.Wrap("Model must not be nil")
}
@@ -71,7 +73,7 @@ func (a *table) AddAfterDeleteInterceptor(interceptor AfterDeleteInterceptor) {
//
// Create iterates through the registered callbacks that may add secondary index
// keys.
func (a table) Create(store sdk.KVStore, rowID RowID, obj codec.ProtoMarshaler) error {
func (a table) Create(store sdk.KVStore, rowID RowID, obj proto.Message) error {
if a.Has(store, rowID) {
return errors.ErrORMUniqueConstraint
}
@@ -85,7 +87,7 @@ func (a table) Create(store sdk.KVStore, rowID RowID, obj codec.ProtoMarshaler)
// nil.
//
// Update triggers all "after set" hooks that may add or remove secondary index keys.
func (a table) Update(store sdk.KVStore, rowID RowID, newValue codec.ProtoMarshaler) error {
func (a table) Update(store sdk.KVStore, rowID RowID, newValue proto.Message) error {
if !a.Has(store, rowID) {
return sdkerrors.ErrNotFound
}
@@ -98,7 +100,7 @@ func (a table) Update(store sdk.KVStore, rowID RowID, newValue codec.ProtoMarsha
//
// Set iterates through the registered callbacks that may add secondary index
// keys.
func (a table) Set(store sdk.KVStore, rowID RowID, newValue codec.ProtoMarshaler) error {
func (a table) Set(store sdk.KVStore, rowID RowID, newValue proto.Message) error {
if len(rowID) == 0 {
return errors.ErrORMEmptyKey
}
@@ -111,9 +113,9 @@ func (a table) Set(store sdk.KVStore, rowID RowID, newValue codec.ProtoMarshaler
pStore := prefix.NewStore(store, a.prefix[:])
var oldValue codec.ProtoMarshaler
var oldValue proto.Message
if a.Has(store, rowID) {
oldValue = reflect.New(a.model).Interface().(codec.ProtoMarshaler)
oldValue = reflect.New(a.model).Interface().(proto.Message)
a.GetOne(store, rowID, oldValue)
}
@@ -131,7 +133,7 @@ func (a table) Set(store sdk.KVStore, rowID RowID, newValue codec.ProtoMarshaler
return nil
}
func assertValid(obj codec.ProtoMarshaler) error {
func assertValid(obj proto.Message) error {
if v, ok := obj.(Validateable); ok {
if err := v.ValidateBasic(); err != nil {
return err
@@ -149,7 +151,7 @@ func assertValid(obj codec.ProtoMarshaler) error {
func (a table) Delete(store sdk.KVStore, rowID RowID) error {
pStore := prefix.NewStore(store, a.prefix[:])
oldValue := reflect.New(a.model).Interface().(codec.ProtoMarshaler)
oldValue := reflect.New(a.model).Interface().(proto.Message)
if err := a.GetOne(store, rowID, oldValue); err != nil {
return sdkerrors.Wrap(err, "load old value")
}
@@ -176,7 +178,7 @@ func (a table) Has(store sdk.KVStore, key RowID) bool {
// GetOne load the object persisted for the given RowID into the dest parameter.
// If none exists or `rowID==nil` then `sdkerrors.ErrNotFound` is returned instead.
// Parameters must not be nil - we don't allow creation of values with empty keys.
func (a table) GetOne(store sdk.KVStore, rowID RowID, dest codec.ProtoMarshaler) error {
func (a table) GetOne(store sdk.KVStore, rowID RowID, dest proto.Message) error {
if len(rowID) == 0 {
return sdkerrors.ErrNotFound
}
@@ -298,7 +300,7 @@ type typeSafeIterator struct {
it types.Iterator
}
func (i typeSafeIterator) LoadNext(dest codec.ProtoMarshaler) (RowID, error) {
func (i typeSafeIterator) LoadNext(dest proto.Message) (RowID, error) {
if !i.it.Valid() {
return nil, errors.ErrORMIteratorDone
}
+7 -5
View File
@@ -4,14 +4,16 @@ import (
"fmt"
"testing"
"github.com/cosmos/gogoproto/proto"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/codec/types"
"github.com/cosmos/cosmos-sdk/testutil/testdata"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
"github.com/cosmos/cosmos-sdk/x/group/errors"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
func TestNewTable(t *testing.T) {
@@ -20,7 +22,7 @@ func TestNewTable(t *testing.T) {
testCases := []struct {
name string
model codec.ProtoMarshaler
model proto.Message
expectErr bool
expectedErr string
}{
@@ -54,7 +56,7 @@ func TestNewTable(t *testing.T) {
func TestCreate(t *testing.T) {
specs := map[string]struct {
rowID RowID
src codec.ProtoMarshaler
src proto.Message
expErr *sdkerrors.Error
}{
"empty rowID": {
@@ -122,7 +124,7 @@ func TestCreate(t *testing.T) {
func TestUpdate(t *testing.T) {
specs := map[string]struct {
src codec.ProtoMarshaler
src proto.Message
expErr *sdkerrors.Error
}{
"happy path": {
+8 -6
View File
@@ -7,6 +7,8 @@ import (
"io"
"reflect"
"github.com/cosmos/gogoproto/proto"
"github.com/cosmos/cosmos-sdk/codec"
"github.com/cosmos/cosmos-sdk/store/prefix"
sdk "github.com/cosmos/cosmos-sdk/types"
@@ -79,7 +81,7 @@ type Iterator interface {
// LoadNext loads the next value in the sequence into the pointer passed as dest and returns the key. If there
// are no more items the ErrORMIteratorDone error is returned
// The key is the rowID.
LoadNext(dest codec.ProtoMarshaler) (RowID, error)
LoadNext(dest proto.Message) (RowID, error)
// Close releases the iterator and should be called at the end of iteration
io.Closer
}
@@ -93,18 +95,18 @@ type Indexable interface {
}
// AfterSetInterceptor defines a callback function to be called on Create + Update.
type AfterSetInterceptor func(store sdk.KVStore, rowID RowID, newValue, oldValue codec.ProtoMarshaler) error
type AfterSetInterceptor func(store sdk.KVStore, rowID RowID, newValue, oldValue proto.Message) error
// AfterDeleteInterceptor defines a callback function to be called on Delete operations.
type AfterDeleteInterceptor func(store sdk.KVStore, rowID RowID, value codec.ProtoMarshaler) error
type AfterDeleteInterceptor func(store sdk.KVStore, rowID RowID, value proto.Message) error
// RowGetter loads a persistent object by row ID into the destination object. The dest parameter must therefore be a pointer.
// Any implementation must return `sdkerrors.ErrNotFound` when no object for the rowID exists
type RowGetter func(store sdk.KVStore, rowID RowID, dest codec.ProtoMarshaler) error
type RowGetter func(store sdk.KVStore, rowID RowID, dest proto.Message) error
// NewTypeSafeRowGetter returns a `RowGetter` with type check on the dest parameter.
func NewTypeSafeRowGetter(prefixKey [2]byte, model reflect.Type, cdc codec.Codec) RowGetter {
return func(store sdk.KVStore, rowID RowID, dest codec.ProtoMarshaler) error {
return func(store sdk.KVStore, rowID RowID, dest proto.Message) error {
if len(rowID) == 0 {
return sdkerrors.Wrap(errors.ErrORMEmptyKey, "key must not be nil")
}
@@ -122,7 +124,7 @@ func NewTypeSafeRowGetter(prefixKey [2]byte, model reflect.Type, cdc codec.Codec
}
}
func assertCorrectType(model reflect.Type, obj codec.ProtoMarshaler) error {
func assertCorrectType(model reflect.Type, obj proto.Message) error {
tp := reflect.TypeOf(obj)
if tp.Kind() != reflect.Ptr {
return sdkerrors.Wrap(sdkerrors.ErrInvalidType, "model destination must be a pointer")
+5 -6
View File
@@ -31,12 +31,11 @@ func TestGogoUnmarshalProposal(t *testing.T) {
var p group.Proposal
err = cdc.Unmarshal(p1Bz, &p)
require.NoError(t, err)
err = cdc.Unmarshal(p2Bz, &p)
var i group.Proposal
err = cdc.Unmarshal(p2Bz, &i)
require.NoError(t, err)
// One would expect that unmarshalling into the same `&p` reference would
// clear the previous `p` value. But it seems that (at least for array
// fields), the values are not replaced, but concatenated, which
// is not an intuitive behavior.
require.Len(t, p.Proposers, 2)
require.Len(t, p.Proposers, 1)
require.Len(t, i.Proposers, 1)
}
+3 -2
View File
@@ -4,7 +4,8 @@ import (
"fmt"
"time"
"github.com/cosmos/cosmos-sdk/codec"
proto "github.com/cosmos/gogoproto/proto"
codectypes "github.com/cosmos/cosmos-sdk/codec/types"
sdk "github.com/cosmos/cosmos-sdk/types"
sdkerrors "github.com/cosmos/cosmos-sdk/types/errors"
@@ -26,7 +27,7 @@ type DecisionPolicyResult struct {
// DecisionPolicy is the persistent set of rules to determine the result of election on a proposal.
type DecisionPolicy interface {
codec.ProtoMarshaler
proto.Message
// GetVotingPeriod returns the duration after proposal submission where
// votes are accepted.