package storage import ( "github.com/hashicorp/vault/api" "github.com/nats-io/nats.go" "code.uint32.ru/tiny/storage/internal/errinternal" "code.uint32.ru/tiny/storage/internal/filesystem" "code.uint32.ru/tiny/storage/internal/natsobj" "code.uint32.ru/tiny/storage/internal/vault" ) var ( // ErrInvalidKey is returned when key validation // for particular implementation of Storage fails. ErrInvalidKey = errinternal.ErrInvalidKey // ErrNotFound is returned when object is not found // in Storage. ErrNotFound = errinternal.ErrNotFound ) var ( _ Storage = (*natsobj.Storage)(nil) _ Storage = (*filesystem.Storage)(nil) _ Storage = (*vault.Storage)(nil) ) // Storage is a very basic object store. type Storage interface { // Save puts object with name 'key' into the store. // If a key already exists it gets overwritten. Save(key string, data []byte) error // Load returns contents of object named 'key' or // ErrNotFound. Load(key string) ([]byte, error) // Delete removes object named 'key' from the store. // If key does not exist Delete returns nil. Delete(key string) error } // NewNats wraps the provided ObjectStore with Storage interface. func NewNats(store nats.ObjectStore) Storage { return natsobj.New(store) } // NewFS established a key/value within the directory 'path' // and uses it as underlying physical store. // Note that the implementation requires keys to be at least // 3 characters long. // Key "abcd" will be stored in /path/a/b/abcd. func NewFS(path string) (Storage, error) { return filesystem.New(path) } // NewVault uses provided Vault client to store objects. // All objects are stored as a single secret, a JSON object // where key are keys and values are base64 encoded bytes of // saved object. // If secret specified by path does not exist it will be created // on first call to Storage methods. // Note that a secret in vault gets updated (a new version of secret is created) // on every save/delete operation. func NewVault(client *api.Client, path string) Storage { return vault.New(client, path) }