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  }