2017-06-28 03:19:22 -07:00
|
|
|
package stack
|
2017-06-27 11:53:06 -07:00
|
|
|
|
|
|
|
import (
|
2017-06-29 06:40:26 -07:00
|
|
|
"github.com/pkg/errors"
|
2017-06-29 11:02:38 -07:00
|
|
|
|
|
|
|
"github.com/tendermint/go-wire/data"
|
|
|
|
|
2017-06-27 11:53:06 -07:00
|
|
|
"github.com/tendermint/basecoin"
|
2017-07-06 05:23:38 -07:00
|
|
|
"github.com/tendermint/basecoin/state"
|
2017-06-27 11:53:06 -07:00
|
|
|
)
|
|
|
|
|
|
|
|
const (
|
2017-06-29 07:09:15 -07:00
|
|
|
NameOK = "ok"
|
2017-06-29 06:40:26 -07:00
|
|
|
NameFail = "fail"
|
|
|
|
NamePanic = "panic"
|
2017-06-29 11:02:38 -07:00
|
|
|
NameEcho = "echo"
|
2017-06-27 11:53:06 -07:00
|
|
|
)
|
|
|
|
|
2017-06-29 07:09:15 -07:00
|
|
|
// OKHandler just used to return okay to everything
|
|
|
|
type OKHandler struct {
|
|
|
|
Log string
|
2017-07-03 09:10:46 -07:00
|
|
|
basecoin.NopOption
|
2017-06-29 07:09:15 -07:00
|
|
|
}
|
2017-06-27 11:53:06 -07:00
|
|
|
|
2017-06-29 07:09:15 -07:00
|
|
|
var _ basecoin.Handler = OKHandler{}
|
2017-06-27 11:53:06 -07:00
|
|
|
|
2017-06-29 07:09:15 -07:00
|
|
|
func (_ OKHandler) Name() string {
|
|
|
|
return NameOK
|
2017-06-27 11:53:06 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// CheckTx always returns an empty success tx
|
2017-07-06 05:23:38 -07:00
|
|
|
func (ok OKHandler) CheckTx(ctx basecoin.Context, store state.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
|
2017-06-29 07:09:15 -07:00
|
|
|
return basecoin.Result{Log: ok.Log}, nil
|
2017-06-27 11:53:06 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// DeliverTx always returns an empty success tx
|
2017-07-06 05:23:38 -07:00
|
|
|
func (ok OKHandler) DeliverTx(ctx basecoin.Context, store state.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
|
2017-06-29 07:09:15 -07:00
|
|
|
return basecoin.Result{Log: ok.Log}, nil
|
2017-06-27 11:53:06 -07:00
|
|
|
}
|
2017-06-29 06:40:26 -07:00
|
|
|
|
2017-06-29 11:02:38 -07:00
|
|
|
// EchoHandler returns success, echoing res.Data = tx bytes
|
2017-07-03 09:10:46 -07:00
|
|
|
type EchoHandler struct {
|
|
|
|
basecoin.NopOption
|
|
|
|
}
|
2017-06-29 11:02:38 -07:00
|
|
|
|
|
|
|
var _ basecoin.Handler = EchoHandler{}
|
|
|
|
|
|
|
|
func (_ EchoHandler) Name() string {
|
|
|
|
return NameEcho
|
|
|
|
}
|
|
|
|
|
|
|
|
// CheckTx always returns an empty success tx
|
2017-07-06 05:23:38 -07:00
|
|
|
func (_ EchoHandler) CheckTx(ctx basecoin.Context, store state.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
|
2017-06-29 11:02:38 -07:00
|
|
|
data, err := data.ToWire(tx)
|
|
|
|
return basecoin.Result{Data: data}, err
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeliverTx always returns an empty success tx
|
2017-07-06 05:23:38 -07:00
|
|
|
func (_ EchoHandler) DeliverTx(ctx basecoin.Context, store state.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
|
2017-06-29 11:02:38 -07:00
|
|
|
data, err := data.ToWire(tx)
|
|
|
|
return basecoin.Result{Data: data}, err
|
|
|
|
}
|
|
|
|
|
2017-06-29 07:09:15 -07:00
|
|
|
// FailHandler always returns an error
|
|
|
|
type FailHandler struct {
|
|
|
|
Err error
|
2017-07-03 09:10:46 -07:00
|
|
|
basecoin.NopOption
|
2017-06-29 06:40:26 -07:00
|
|
|
}
|
|
|
|
|
2017-06-29 07:09:15 -07:00
|
|
|
var _ basecoin.Handler = FailHandler{}
|
2017-06-29 06:40:26 -07:00
|
|
|
|
2017-06-29 07:09:15 -07:00
|
|
|
func (_ FailHandler) Name() string {
|
2017-06-29 06:40:26 -07:00
|
|
|
return NameFail
|
|
|
|
}
|
|
|
|
|
|
|
|
// CheckTx always returns the given error
|
2017-07-06 05:23:38 -07:00
|
|
|
func (f FailHandler) CheckTx(ctx basecoin.Context, store state.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
|
2017-06-29 07:09:15 -07:00
|
|
|
return res, errors.WithStack(f.Err)
|
2017-06-29 06:40:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// DeliverTx always returns the given error
|
2017-07-06 05:23:38 -07:00
|
|
|
func (f FailHandler) DeliverTx(ctx basecoin.Context, store state.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
|
2017-06-29 07:09:15 -07:00
|
|
|
return res, errors.WithStack(f.Err)
|
2017-06-29 06:40:26 -07:00
|
|
|
}
|
|
|
|
|
2017-06-29 07:09:15 -07:00
|
|
|
// PanicHandler always panics, using the given error (first choice) or msg (fallback)
|
|
|
|
type PanicHandler struct {
|
|
|
|
Msg string
|
|
|
|
Err error
|
2017-07-03 09:10:46 -07:00
|
|
|
basecoin.NopOption
|
2017-06-29 06:40:26 -07:00
|
|
|
}
|
|
|
|
|
2017-06-29 07:09:15 -07:00
|
|
|
var _ basecoin.Handler = PanicHandler{}
|
2017-06-29 06:40:26 -07:00
|
|
|
|
2017-06-29 07:09:15 -07:00
|
|
|
func (_ PanicHandler) Name() string {
|
2017-06-29 06:40:26 -07:00
|
|
|
return NamePanic
|
|
|
|
}
|
|
|
|
|
|
|
|
// CheckTx always panics
|
2017-07-06 05:23:38 -07:00
|
|
|
func (p PanicHandler) CheckTx(ctx basecoin.Context, store state.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
|
2017-06-29 07:09:15 -07:00
|
|
|
if p.Err != nil {
|
|
|
|
panic(p.Err)
|
2017-06-29 06:40:26 -07:00
|
|
|
}
|
2017-06-29 07:09:15 -07:00
|
|
|
panic(p.Msg)
|
2017-06-29 06:40:26 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
// DeliverTx always panics
|
2017-07-06 05:23:38 -07:00
|
|
|
func (p PanicHandler) DeliverTx(ctx basecoin.Context, store state.KVStore, tx basecoin.Tx) (res basecoin.Result, err error) {
|
2017-06-29 07:09:15 -07:00
|
|
|
if p.Err != nil {
|
|
|
|
panic(p.Err)
|
2017-06-29 06:40:26 -07:00
|
|
|
}
|
2017-06-29 07:09:15 -07:00
|
|
|
panic(p.Msg)
|
2017-06-29 06:40:26 -07:00
|
|
|
}
|