/* package memstorage provides a simple in-memory key store designed for use in test cases, particularly to isolate them from the filesystem, concurrency, and cleanup issues. */ package memstorage import ( "github.com/pkg/errors" keys "github.com/tendermint/go-crypto/keys" ) type data struct { info keys.Info key []byte } type MemStore map[string]data // New creates an instance of file-based key storage with tight permissions func New() MemStore { return MemStore{} } // assert MemStore satisfies keys.Storage var _ keys.Storage = MemStore{} // Put adds the given key, returns an error if it another key // is already stored under this name func (s MemStore) Put(name string, key []byte, info keys.Info) error { if _, ok := s[name]; ok { return errors.Errorf("Key named '%s' already exists", name) } s[name] = data{info, key} return nil } // Get returns the key stored under the name, or returns an error if not present func (s MemStore) Get(name string) ([]byte, keys.Info, error) { var err error d, ok := s[name] if !ok { err = errors.Errorf("Key named '%s' doesn't exist", name) } return d.key, d.info.Format(), err } // List returns the public info of all keys in the MemStore in unsorted order func (s MemStore) List() (keys.Infos, error) { res := make([]keys.Info, len(s)) i := 0 for _, d := range s { res[i] = d.info.Format() i++ } return res, nil } // Delete removes the named key from the MemStore, raising an error if it // wasn't present yet. func (s MemStore) Delete(name string) error { _, ok := s[name] if !ok { return errors.Errorf("Key named '%s' doesn't exist", name) } delete(s, name) return nil }