packages feed

erebos-0.2.3: src/Erebos/Storage/Monad.hs

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