github.com/Finschia/finschia-sdk@v0.48.1/codec/amino.go (about) 1 package codec 2 3 import ( 4 "bytes" 5 "encoding/json" 6 "errors" 7 "fmt" 8 "io" 9 10 octypes "github.com/Finschia/ostracon/types" 11 amino "github.com/tendermint/go-amino" 12 13 "github.com/Finschia/finschia-sdk/codec/types" 14 ) 15 16 // LegacyAmino defines a wrapper for an Amino codec that properly 17 // handles protobuf types with Any's. Deprecated. 18 type LegacyAmino struct { 19 Amino *amino.Codec 20 } 21 22 func (cdc *LegacyAmino) Seal() { 23 cdc.Amino.Seal() 24 } 25 26 func NewLegacyAmino() *LegacyAmino { 27 return &LegacyAmino{amino.NewCodec()} 28 } 29 30 // RegisterEvidences registers Tendermint evidence types with the provided Amino 31 // codec. 32 func RegisterEvidences(cdc *LegacyAmino) { 33 cdc.Amino.RegisterInterface((*octypes.Evidence)(nil), nil) 34 cdc.Amino.RegisterConcrete(&octypes.DuplicateVoteEvidence{}, "tendermint/DuplicateVoteEvidence", nil) 35 } 36 37 // MarshalJSONIndent provides a utility for indented JSON encoding of an object 38 // via an Amino codec. It returns an error if it cannot serialize or indent as 39 // JSON. 40 func MarshalJSONIndent(cdc *LegacyAmino, obj interface{}) ([]byte, error) { 41 bz, err := cdc.MarshalJSON(obj) 42 if err != nil { 43 return nil, err 44 } 45 46 var out bytes.Buffer 47 if err = json.Indent(&out, bz, "", " "); err != nil { 48 return nil, err 49 } 50 51 return out.Bytes(), nil 52 } 53 54 // MustMarshalJSONIndent executes MarshalJSONIndent except it panics upon failure. 55 func MustMarshalJSONIndent(cdc *LegacyAmino, obj interface{}) []byte { 56 bz, err := MarshalJSONIndent(cdc, obj) 57 if err != nil { 58 panic(fmt.Sprintf("failed to marshal JSON: %s", err)) 59 } 60 61 return bz 62 } 63 64 func (cdc *LegacyAmino) marshalAnys(o interface{}) error { 65 return types.UnpackInterfaces(o, types.AminoPacker{Cdc: cdc.Amino}) 66 } 67 68 func (cdc *LegacyAmino) unmarshalAnys(o interface{}) error { 69 return types.UnpackInterfaces(o, types.AminoUnpacker{Cdc: cdc.Amino}) 70 } 71 72 func (cdc *LegacyAmino) jsonMarshalAnys(o interface{}) error { 73 return types.UnpackInterfaces(o, types.AminoJSONPacker{Cdc: cdc.Amino}) 74 } 75 76 func (cdc *LegacyAmino) jsonUnmarshalAnys(o interface{}) error { 77 return types.UnpackInterfaces(o, types.AminoJSONUnpacker{Cdc: cdc.Amino}) 78 } 79 80 func (cdc *LegacyAmino) Marshal(o interface{}) ([]byte, error) { 81 err := cdc.marshalAnys(o) 82 if err != nil { 83 return nil, err 84 } 85 return cdc.Amino.MarshalBinaryBare(o) 86 } 87 88 func (cdc *LegacyAmino) MustMarshal(o interface{}) []byte { 89 bz, err := cdc.Marshal(o) 90 if err != nil { 91 panic(err) 92 } 93 return bz 94 } 95 96 func (cdc *LegacyAmino) MarshalLengthPrefixed(o interface{}) ([]byte, error) { 97 err := cdc.marshalAnys(o) 98 if err != nil { 99 return nil, err 100 } 101 return cdc.Amino.MarshalBinaryLengthPrefixed(o) 102 } 103 104 func (cdc *LegacyAmino) MustMarshalLengthPrefixed(o interface{}) []byte { 105 bz, err := cdc.MarshalLengthPrefixed(o) 106 if err != nil { 107 panic(err) 108 } 109 return bz 110 } 111 112 func (cdc *LegacyAmino) Unmarshal(bz []byte, ptr interface{}) error { 113 err := cdc.Amino.UnmarshalBinaryBare(bz, ptr) 114 if err != nil { 115 return err 116 } 117 return cdc.unmarshalAnys(ptr) 118 } 119 120 func (cdc *LegacyAmino) MustUnmarshal(bz []byte, ptr interface{}) { 121 err := cdc.Unmarshal(bz, ptr) 122 if err != nil { 123 panic(err) 124 } 125 } 126 127 func (cdc *LegacyAmino) UnmarshalLengthPrefixed(bz []byte, ptr interface{}) error { 128 err := cdc.Amino.UnmarshalBinaryLengthPrefixed(bz, ptr) 129 if err != nil { 130 return err 131 } 132 return cdc.unmarshalAnys(ptr) 133 } 134 135 func (cdc *LegacyAmino) MustUnmarshalLengthPrefixed(bz []byte, ptr interface{}) { 136 err := cdc.UnmarshalLengthPrefixed(bz, ptr) 137 if err != nil { 138 panic(err) 139 } 140 } 141 142 // MarshalJSON implements codec.Codec interface 143 func (cdc *LegacyAmino) MarshalJSON(o interface{}) ([]byte, error) { 144 err := cdc.jsonMarshalAnys(o) 145 if err != nil { 146 return nil, err 147 } 148 return cdc.Amino.MarshalJSON(o) 149 } 150 151 func (cdc *LegacyAmino) MustMarshalJSON(o interface{}) []byte { 152 bz, err := cdc.MarshalJSON(o) 153 if err != nil { 154 panic(err) 155 } 156 return bz 157 } 158 159 // UnmarshalJSON implements codec.Codec interface 160 func (cdc *LegacyAmino) UnmarshalJSON(bz []byte, ptr interface{}) error { 161 err := cdc.Amino.UnmarshalJSON(bz, ptr) 162 if err != nil { 163 return err 164 } 165 return cdc.jsonUnmarshalAnys(ptr) 166 } 167 168 func (cdc *LegacyAmino) MustUnmarshalJSON(bz []byte, ptr interface{}) { 169 err := cdc.UnmarshalJSON(bz, ptr) 170 if err != nil { 171 panic(err) 172 } 173 } 174 175 func (*LegacyAmino) UnpackAny(*types.Any, interface{}) error { 176 return errors.New("AminoCodec can't handle unpack protobuf Any's") 177 } 178 179 func (cdc *LegacyAmino) RegisterInterface(ptr interface{}, iopts *amino.InterfaceOptions) { 180 cdc.Amino.RegisterInterface(ptr, iopts) 181 } 182 183 func (cdc *LegacyAmino) RegisterConcrete(o interface{}, name string, copts *amino.ConcreteOptions) { 184 cdc.Amino.RegisterConcrete(o, name, copts) 185 } 186 187 func (cdc *LegacyAmino) MarshalJSONIndent(o interface{}, prefix, indent string) ([]byte, error) { 188 err := cdc.jsonMarshalAnys(o) 189 if err != nil { 190 panic(err) 191 } 192 return cdc.Amino.MarshalJSONIndent(o, prefix, indent) 193 } 194 195 func (cdc *LegacyAmino) PrintTypes(out io.Writer) error { 196 return cdc.Amino.PrintTypes(out) 197 }