cosmos-sdk/x/params/subspace/table.go

81 lines
1.6 KiB
Go
Raw Normal View History

package subspace
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-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-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")
}
2019-12-10 08:48:57 -08:00
if !sdk.IsAlphaNumeric(string(psp.Key)) {
panic("cannot register ParamSetPair with a non-alphanumeric parameter key")
}
2019-12-10 08:48:57 -08:00
if psp.ValidatorFn == nil {
panic("cannot register ParamSetPair without a value validation function")
}
2019-12-10 08:48:57 -08:00
keystr := string(psp.Key)
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
2018-10-06 08:32:41 -07:00
if rty.Kind() == reflect.Ptr {
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
}
2019-02-04 18:13:04 -08:00
func (t KeyTable) maxKeyLength() (res int) {
for k := range t.m {
l := len(k)
if l > res {
res = l
}
}
2019-12-10 08:48:57 -08:00
return
}