cosmos-sdk/stack/interface.go

148 lines
4.4 KiB
Go
Raw Normal View History

2017-07-06 20:37:45 -07:00
//nolint
package stack
import (
2017-07-30 14:26:25 -07:00
abci "github.com/tendermint/abci/types"
"github.com/tendermint/tmlibs/log"
"github.com/tendermint/basecoin"
2017-07-06 05:23:38 -07:00
"github.com/tendermint/basecoin/state"
)
// Middleware is anything that wraps another handler to enhance functionality.
//
// You can use utilities in handlers to construct them, the interfaces
// are exposed in the top-level package to avoid import loops.
type Middleware interface {
CheckerMiddle
DeliverMiddle
2017-07-30 14:26:25 -07:00
InitStaterMiddle
InitValidaterMiddle
basecoin.Named
}
type CheckerMiddle interface {
CheckTx(ctx basecoin.Context, store state.SimpleDB,
tx basecoin.Tx, next basecoin.Checker) (basecoin.CheckResult, error)
}
type CheckerMiddleFunc func(basecoin.Context, state.SimpleDB,
basecoin.Tx, basecoin.Checker) (basecoin.CheckResult, error)
func (c CheckerMiddleFunc) CheckTx(ctx basecoin.Context, store state.SimpleDB,
tx basecoin.Tx, next basecoin.Checker) (basecoin.CheckResult, error) {
return c(ctx, store, tx, next)
}
type DeliverMiddle interface {
DeliverTx(ctx basecoin.Context, store state.SimpleDB, tx basecoin.Tx,
next basecoin.Deliver) (basecoin.DeliverResult, error)
}
type DeliverMiddleFunc func(basecoin.Context, state.SimpleDB,
basecoin.Tx, basecoin.Deliver) (basecoin.DeliverResult, error)
func (d DeliverMiddleFunc) DeliverTx(ctx basecoin.Context, store state.SimpleDB,
tx basecoin.Tx, next basecoin.Deliver) (basecoin.DeliverResult, error) {
return d(ctx, store, tx, next)
}
2017-07-30 14:26:25 -07:00
type InitStaterMiddle interface {
2017-07-30 09:57:48 -07:00
InitState(l log.Logger, store state.SimpleDB, module,
key, value string, next basecoin.InitStater) (string, error)
}
2017-07-30 14:26:25 -07:00
type InitStaterMiddleFunc func(log.Logger, state.SimpleDB,
2017-07-30 09:57:48 -07:00
string, string, string, basecoin.InitStater) (string, error)
2017-07-30 14:26:25 -07:00
func (c InitStaterMiddleFunc) InitState(l log.Logger, store state.SimpleDB,
2017-07-30 09:57:48 -07:00
module, key, value string, next basecoin.InitStater) (string, error) {
return c(l, store, module, key, value, next)
}
2017-07-30 14:26:25 -07:00
type InitValidaterMiddle interface {
InitValidate(l log.Logger, store state.SimpleDB, vals []*abci.Validator, next basecoin.InitValidater)
}
type InitValidaterMiddleFunc func(log.Logger, state.SimpleDB,
[]*abci.Validator, basecoin.InitValidater)
func (c InitValidaterMiddleFunc) InitValidate(l log.Logger, store state.SimpleDB,
vals []*abci.Validator, next basecoin.InitValidater) {
c(l, store, vals, next)
}
// holders
type PassCheck struct{}
func (_ PassCheck) CheckTx(ctx basecoin.Context, store state.SimpleDB,
tx basecoin.Tx, next basecoin.Checker) (basecoin.CheckResult, error) {
return next.CheckTx(ctx, store, tx)
}
type PassDeliver struct{}
func (_ PassDeliver) DeliverTx(ctx basecoin.Context, store state.SimpleDB,
tx basecoin.Tx, next basecoin.Deliver) (basecoin.DeliverResult, error) {
return next.DeliverTx(ctx, store, tx)
}
2017-07-30 14:26:25 -07:00
type PassInitState struct{}
2017-07-30 14:26:25 -07:00
func (_ PassInitState) InitState(l log.Logger, store state.SimpleDB, module,
2017-07-30 09:57:48 -07:00
key, value string, next basecoin.InitStater) (string, error) {
return next.InitState(l, store, module, key, value)
}
2017-07-30 14:26:25 -07:00
type PassInitValidate struct{}
2017-07-30 14:26:25 -07:00
func (_ PassInitValidate) InitValidate(l log.Logger, store state.SimpleDB,
vals []*abci.Validator, next basecoin.InitValidater) {
next.InitValidate(l, store, vals)
}
// Dispatchable is like middleware, except the meaning of "next" is different.
// Whereas in the middleware, it is the next handler that we should pass the same tx into,
// for dispatchers, it is a dispatcher, which it can use to
type Dispatchable interface {
Middleware
AssertDispatcher()
}
// WrapHandler turns a basecoin.Handler into a Dispatchable interface
func WrapHandler(h basecoin.Handler) Dispatchable {
return wrapped{h}
}
type wrapped struct {
h basecoin.Handler
}
var _ Dispatchable = wrapped{}
func (w wrapped) AssertDispatcher() {}
func (w wrapped) Name() string {
return w.h.Name()
}
func (w wrapped) CheckTx(ctx basecoin.Context, store state.SimpleDB,
tx basecoin.Tx, _ basecoin.Checker) (basecoin.CheckResult, error) {
return w.h.CheckTx(ctx, store, tx)
}
func (w wrapped) DeliverTx(ctx basecoin.Context, store state.SimpleDB,
tx basecoin.Tx, _ basecoin.Deliver) (basecoin.DeliverResult, error) {
return w.h.DeliverTx(ctx, store, tx)
}
2017-07-30 09:57:48 -07:00
func (w wrapped) InitState(l log.Logger, store state.SimpleDB,
module, key, value string, _ basecoin.InitStater) (string, error) {
return w.h.InitState(l, store, module, key, value)
}
2017-07-30 14:26:25 -07:00
func (w wrapped) InitValidate(l log.Logger, store state.SimpleDB,
vals []*abci.Validator, next basecoin.InitValidater) {
w.h.InitValidate(l, store, vals)
}