-
Notifications
You must be signed in to change notification settings - Fork 29
/
contextual.go
82 lines (65 loc) · 1.83 KB
/
contextual.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package tendermint
import (
"github.com/cosmos/cosmos-sdk/codec"
"github.com/gogo/protobuf/proto"
)
type contextualStdCodec struct {
codec.Codec
useContext func() func()
}
var _ codec.Codec = &contextualStdCodec{}
// newContextualCodec creates a codec that sets and resets context
func newContextualStdCodec(cdc codec.Codec, useContext func() func()) *contextualStdCodec {
return &contextualStdCodec{
Codec: cdc,
useContext: useContext,
}
}
// MarshalJSON marshals with the original codec and new context
func (cdc *contextualStdCodec) MarshalJSON(ptr proto.Message) ([]byte, error) {
done := cdc.useContext()
defer done()
return cdc.Codec.MarshalJSON(ptr)
}
func (cdc *contextualStdCodec) MustMarshalJSON(ptr proto.Message) []byte {
out, err := cdc.MarshalJSON(ptr)
if err != nil {
panic(err)
}
return out
}
// UnmarshalJSON unmarshals with the original codec and new context
func (cdc *contextualStdCodec) UnmarshalJSON(bz []byte, ptr proto.Message) error {
done := cdc.useContext()
defer done()
return cdc.Codec.UnmarshalJSON(bz, ptr)
}
func (cdc *contextualStdCodec) MustUnmarshalJSON(bz []byte, ptr proto.Message) {
if err := cdc.UnmarshalJSON(bz, ptr); err != nil {
panic(err)
}
return
}
func (cdc *contextualStdCodec) Marshal(ptr codec.ProtoMarshaler) ([]byte, error) {
done := cdc.useContext()
defer done()
return cdc.Codec.Marshal(ptr)
}
func (cdc *contextualStdCodec) MustMarshal(ptr codec.ProtoMarshaler) []byte {
out, err := cdc.Marshal(ptr)
if err != nil {
panic(err)
}
return out
}
func (cdc *contextualStdCodec) Unmarshal(bz []byte, ptr codec.ProtoMarshaler) error {
done := cdc.useContext()
defer done()
return cdc.Codec.Unmarshal(bz, ptr)
}
func (cdc *contextualStdCodec) MustUnmarshal(bz []byte, ptr codec.ProtoMarshaler) {
if err := cdc.Unmarshal(bz, ptr); err != nil {
panic(err)
}
return
}