2020-02-19 03:52:20 -08:00
|
|
|
package types
|
2018-10-06 08:32:41 -07:00
|
|
|
|
|
|
|
import (
|
|
|
|
"reflect"
|
2019-12-10 08:48:57 -08:00
|
|
|
|
|
|
|
sdk "github.com/cosmos/cosmos-sdk/types"
|
2018-10-06 08:32:41 -07:00
|
|
|
)
|
|
|
|
|
2019-02-04 18:13:04 -08:00
|
|
|
type attribute struct {
|
2019-12-10 08:48:57 -08:00
|
|
|
ty reflect.Type
|
|
|
|
vfn ValueValidatorFn
|
2019-02-04 18:13:04 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
// KeyTable subspaces appropriate type for each parameter key
|
|
|
|
type KeyTable struct {
|
|
|
|
m map[string]attribute
|
2018-10-13 10:29:59 -07:00
|
|
|
}
|
2018-10-06 08:32:41 -07:00
|
|
|
|
2019-12-10 08:48:57 -08:00
|
|
|
func NewKeyTable(pairs ...ParamSetPair) KeyTable {
|
|
|
|
keyTable := KeyTable{
|
2019-02-04 18:13:04 -08:00
|
|
|
m: make(map[string]attribute),
|
2018-10-13 10:29:59 -07:00
|
|
|
}
|
2018-10-06 08:32:41 -07:00
|
|
|
|
2019-12-10 08:48:57 -08:00
|
|
|
for _, psp := range pairs {
|
|
|
|
keyTable = keyTable.RegisterType(psp)
|
2018-10-06 08:32:41 -07:00
|
|
|
}
|
|
|
|
|
2019-12-10 08:48:57 -08:00
|
|
|
return keyTable
|
2018-10-06 08:32:41 -07:00
|
|
|
}
|
|
|
|
|
2019-12-10 08:48:57 -08:00
|
|
|
// RegisterType registers a single ParamSetPair (key-type pair) in a KeyTable.
|
|
|
|
func (t KeyTable) RegisterType(psp ParamSetPair) KeyTable {
|
|
|
|
if len(psp.Key) == 0 {
|
|
|
|
panic("cannot register ParamSetPair with an parameter empty key")
|
2018-10-15 11:02:48 -07:00
|
|
|
}
|
2019-12-10 08:48:57 -08:00
|
|
|
if !sdk.IsAlphaNumeric(string(psp.Key)) {
|
|
|
|
panic("cannot register ParamSetPair with a non-alphanumeric parameter key")
|
2018-10-15 11:02:48 -07:00
|
|
|
}
|
2019-12-10 08:48:57 -08:00
|
|
|
if psp.ValidatorFn == nil {
|
|
|
|
panic("cannot register ParamSetPair without a value validation function")
|
2018-10-15 11:02:48 -07:00
|
|
|
}
|
2019-12-10 08:48:57 -08:00
|
|
|
|
|
|
|
keystr := string(psp.Key)
|
2018-10-13 10:29:59 -07:00
|
|
|
if _, ok := t.m[keystr]; ok {
|
2018-10-06 08:32:41 -07:00
|
|
|
panic("duplicate parameter key")
|
|
|
|
}
|
|
|
|
|
2019-12-10 08:48:57 -08:00
|
|
|
rty := reflect.TypeOf(psp.Value)
|
2018-10-06 08:32:41 -07:00
|
|
|
|
2019-12-10 08:48:57 -08:00
|
|
|
// indirect rty if it is a pointer
|
2020-08-02 13:18:28 -07:00
|
|
|
for rty.Kind() == reflect.Ptr {
|
2018-10-06 08:32:41 -07:00
|
|
|
rty = rty.Elem()
|
|
|
|
}
|
|
|
|
|
2019-02-04 18:13:04 -08:00
|
|
|
t.m[keystr] = attribute{
|
2019-12-10 08:48:57 -08:00
|
|
|
vfn: psp.ValidatorFn,
|
|
|
|
ty: rty,
|
2019-02-04 18:13:04 -08:00
|
|
|
}
|
2018-10-06 08:32:41 -07:00
|
|
|
|
|
|
|
return t
|
|
|
|
}
|
|
|
|
|
2019-12-10 08:48:57 -08:00
|
|
|
// RegisterParamSet registers multiple ParamSetPairs from a ParamSet in a KeyTable.
|
2019-02-04 18:13:04 -08:00
|
|
|
func (t KeyTable) RegisterParamSet(ps ParamSet) KeyTable {
|
2019-12-10 08:48:57 -08:00
|
|
|
for _, psp := range ps.ParamSetPairs() {
|
|
|
|
t = t.RegisterType(psp)
|
2018-10-06 08:32:41 -07:00
|
|
|
}
|
|
|
|
return t
|
|
|
|
}
|
2018-10-13 10:29:59 -07:00
|
|
|
|
2019-02-04 18:13:04 -08:00
|
|
|
func (t KeyTable) maxKeyLength() (res int) {
|
2018-10-13 10:29:59 -07:00
|
|
|
for k := range t.m {
|
|
|
|
l := len(k)
|
|
|
|
if l > res {
|
|
|
|
res = l
|
|
|
|
}
|
|
|
|
}
|
2019-12-10 08:48:57 -08:00
|
|
|
|
2018-10-13 10:29:59 -07:00
|
|
|
return
|
|
|
|
}
|