package storage import ( "fmt" ) type Map map[string]map[string][]byte func NewMap() *Map { m := make(map[string]map[string][]byte) n := Map(m) return &n } func (m *Map) String() string { s := "" for k, v := range *m { if s != "" { s += ",\n" } s += fmt.Sprintf("[%s]:[%s]", k, v) } return s } func (m *Map) Close() error { m = nil return nil } func (m *Map) List(ns []string, limits ...string) ([]string, error) { namespace := resolveNamespace(ns) limits = resolveLimits(limits) keys := []string{} n, _ := (*m)[DefaultNamespace] if v, ok := (*m)[namespace]; ok { n = v } for k := range n { if k >= limits[0] && k <= limits[1] { keys = append(keys, k) } } return keys, nil } func (m *Map) Get(key string, ns ...string) ([]byte, error) { namespace := resolveNamespace(ns) if _, ok := (*m)[namespace]; !ok { return nil, ErrNotFound } if _, ok := (*m)[namespace][key]; !ok { return nil, ErrNotFound } return (*m)[namespace][key], nil } func (m *Map) Set(key string, value []byte, ns ...string) error { namespace := resolveNamespace(ns) if value == nil { if _, ok := (*m)[namespace]; !ok { return nil } else if _, ok := (*m)[namespace][key]; ok { delete((*m)[namespace], key) } } else { if _, ok := (*m)[namespace]; !ok { (*m)[namespace] = make(map[string][]byte) } (*m)[namespace][key] = value } return nil }