cosmos-sdk/stack/helpers.go

114 lines
2.8 KiB
Go

package stack
import (
"github.com/pkg/errors"
"github.com/tendermint/go-wire/data"
"github.com/tendermint/basecoin"
"github.com/tendermint/basecoin/types"
)
const (
NameOK = "ok"
NameFail = "fail"
NamePanic = "panic"
NameEcho = "echo"
)
// OKHandler just used to return okay to everything
type OKHandler struct {
Log string
basecoin.NopOption
}
var _ basecoin.Handler = OKHandler{}
func (_ OKHandler) Name() string {
return NameOK
}
// CheckTx always returns an empty success tx
func (ok OKHandler) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
return basecoin.Result{Log: ok.Log}, nil
}
// DeliverTx always returns an empty success tx
func (ok OKHandler) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
return basecoin.Result{Log: ok.Log}, nil
}
// EchoHandler returns success, echoing res.Data = tx bytes
type EchoHandler struct {
basecoin.NopOption
}
var _ basecoin.Handler = EchoHandler{}
func (_ EchoHandler) Name() string {
return NameEcho
}
// CheckTx always returns an empty success tx
func (_ EchoHandler) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
data, err := data.ToWire(tx)
return basecoin.Result{Data: data}, err
}
// DeliverTx always returns an empty success tx
func (_ EchoHandler) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
data, err := data.ToWire(tx)
return basecoin.Result{Data: data}, err
}
// FailHandler always returns an error
type FailHandler struct {
Err error
basecoin.NopOption
}
var _ basecoin.Handler = FailHandler{}
func (_ FailHandler) Name() string {
return NameFail
}
// CheckTx always returns the given error
func (f FailHandler) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
return res, errors.WithStack(f.Err)
}
// DeliverTx always returns the given error
func (f FailHandler) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
return res, errors.WithStack(f.Err)
}
// PanicHandler always panics, using the given error (first choice) or msg (fallback)
type PanicHandler struct {
Msg string
Err error
basecoin.NopOption
}
var _ basecoin.Handler = PanicHandler{}
func (_ PanicHandler) Name() string {
return NamePanic
}
// CheckTx always panics
func (p PanicHandler) CheckTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
if p.Err != nil {
panic(p.Err)
}
panic(p.Msg)
}
// DeliverTx always panics
func (p PanicHandler) DeliverTx(ctx basecoin.Context, store types.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
if p.Err != nil {
panic(p.Err)
}
panic(p.Msg)
}