diff options
| author | Roman Smrž <roman.smrz@seznam.cz> | 2026-08-12 21:41:28 +0200 |
|---|---|---|
| committer | Roman Smrž <roman.smrz@seznam.cz> | 2026-08-14 22:08:15 +0200 |
| commit | 3bd3dbaaf6c840e05b90da8a8fd1e051cf473255 (patch) | |
| tree | 53372e6abc58abf09f0277a7729b0cf038001032 /src/Erebos/Storage/Monad.hs | |
| parent | 127036f4f7fc295b5815503f4f27e4f2827e02f1 (diff) | |
Key handling in MonadStorage class
Diffstat (limited to 'src/Erebos/Storage/Monad.hs')
| -rw-r--r-- | src/Erebos/Storage/Monad.hs | 37 |
1 files changed, 37 insertions, 0 deletions
diff --git a/src/Erebos/Storage/Monad.hs b/src/Erebos/Storage/Monad.hs new file mode 100644 index 0000000..6af3ae1 --- /dev/null +++ b/src/Erebos/Storage/Monad.hs @@ -0,0 +1,37 @@ +module Erebos.Storage.Monad ( + MonadStorage(..), + mloadKey, +) where + +import Control.Monad.Except +import Control.Monad.Reader + +import Erebos.Error +import Erebos.Object.Internal +import Erebos.Storable.Internal +import Erebos.Storage.Key + + +class Monad m => MonadStorage m where + getStorage :: m Storage + mstore :: Storable a => a -> m (Stored a) + + default mstore :: MonadIO m => Storable a => a -> m (Stored a) + mstore x = do + st <- getStorage + wrappedStore st x + + mstoreKey :: KeyPair sec pub => sec -> m () + default mstoreKey :: (KeyPair sec pub, MonadIO m) => sec -> m () + mstoreKey = liftIO . storeKey + + mloadKeyMb :: KeyPair sec pub => Stored pub -> m (Maybe sec) + default mloadKeyMb :: (KeyPair sec pub, MonadIO m) => Stored pub -> m (Maybe sec) + mloadKeyMb = loadKeyMb + +mloadKey :: (KeyPair sec pub, MonadStorage m, MonadError e m, FromErebosError e) => Stored pub -> m sec +mloadKey pub = maybe (throwOtherError $ "secret key not found for " <> show (storedRef pub)) return =<< mloadKeyMb pub + + +instance MonadIO m => MonadStorage (ReaderT Storage m) where + getStorage = ask |