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. // The provided path is used as base path for // keys. Objects saved to Storage will be put at // /path/key as new secrets. // Bytes passed to storage will be base64 encoded and saved // in Vault as string. func NewVault(client *api.Client, path string) Storage { return vault.New(client, path) }