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

88 lines
1.5 KiB
Go
Raw Normal View History

package subspace
2018-10-06 08:32:41 -07:00
import (
"reflect"
)
2019-02-04 18:13:04 -08:00
type attribute struct {
ty reflect.Type
}
// KeyTable subspaces appropriate type for each parameter key
type KeyTable struct {
m map[string]attribute
}
2018-10-06 08:32:41 -07:00
2018-10-06 09:08:49 -07:00
// Constructs new table
2019-02-04 18:13:04 -08:00
func NewKeyTable(keytypes ...interface{}) (res KeyTable) {
2018-10-06 08:32:41 -07:00
if len(keytypes)%2 != 0 {
2019-02-04 18:13:04 -08:00
panic("odd number arguments in NewTypeKeyTable")
2018-10-06 08:32:41 -07:00
}
2019-02-04 18:13:04 -08:00
res = KeyTable{
m: make(map[string]attribute),
}
2018-10-06 08:32:41 -07:00
for i := 0; i < len(keytypes); i += 2 {
res = res.RegisterType(keytypes[i].([]byte), keytypes[i+1])
}
return
}
func isAlphaNumeric(key []byte) bool {
for _, b := range key {
if !((48 <= b && b <= 57) || // numeric
(65 <= b && b <= 90) || // upper case
(97 <= b && b <= 122)) { // lower case
return false
}
}
return true
}
2018-10-06 09:08:49 -07:00
// Register single key-type pair
2019-02-04 18:13:04 -08:00
func (t KeyTable) RegisterType(key []byte, ty interface{}) KeyTable {
if len(key) == 0 {
panic("cannot register empty key")
}
if !isAlphaNumeric(key) {
panic("non alphanumeric parameter key")
}
2018-10-06 08:32:41 -07:00
keystr := string(key)
if _, ok := t.m[keystr]; ok {
2018-10-06 08:32:41 -07:00
panic("duplicate parameter key")
}
rty := reflect.TypeOf(ty)
// Indirect rty if it is ptr
if rty.Kind() == reflect.Ptr {
rty = rty.Elem()
}
2019-02-04 18:13:04 -08:00
t.m[keystr] = attribute{
ty: rty,
}
2018-10-06 08:32:41 -07:00
return t
}
// Register multiple pairs from ParamSet
2019-02-04 18:13:04 -08:00
func (t KeyTable) RegisterParamSet(ps ParamSet) KeyTable {
for _, kvp := range ps.ParamSetPairs() {
2018-10-06 08:32:41 -07:00
t = t.RegisterType(kvp.Key, kvp.Value)
}
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
}
}
return
}