module Marvin.Adapter
( Event(..)
, RunWithAdapter, EventHandler, RunnerM
, IsAdapter(..), AdapterId
, lookupFromAdapterConfig, requireFromAdapterConfig
, lookupFromAppConfig, requireFromAppConfig
, getAdapterConfig, getAppConfig
, liftAdapterAction
) where
import Control.Monad.IO.Class
import Control.Monad.Logger
import qualified Data.Configurator.Types as C
import qualified Data.Configurator as C
import qualified Data.Text.Lazy as L
import Marvin.Internal.Types
import Control.Monad.Reader
import Marvin.Interpolate.Text
liftAdapterAction :: (MonadIO m, HasConfigAccess m, AccessAdapter m, IsAdapter a, a ~ AdapterT m) => AdapterM a r -> m r
liftAdapterAction (AdapterM ac) = do
a <- getAdapter
c <- getConfigInternal
liftIO $ runStderrLoggingT $ runReaderT ac (c, a)
getAppConfig :: AdapterM a C.Config
getAppConfig = AdapterM $
C.subconfig $(isT "#{applicationScriptId}") . fst <$> ask
lookupFromAppConfig :: C.Configured v => C.Name -> AdapterM a (Maybe v)
lookupFromAppConfig n = getAppConfig >>= liftIO . flip C.lookup n
requireFromAppConfig :: C.Configured v => C.Name -> AdapterM a v
requireFromAppConfig n = getAppConfig >>= liftIO . flip C.require n
getAdapterConfig :: forall a. IsAdapter a => AdapterM a C.Config
getAdapterConfig = AdapterM $
C.subconfig $(isT "adapter.#{adapterId :: AdapterId a}") . fst <$> ask
lookupFromAdapterConfig :: (IsAdapter a, C.Configured v) => C.Name -> AdapterM a (Maybe v)
lookupFromAdapterConfig n = getAdapterConfig >>= liftIO . flip C.lookup n
requireFromAdapterConfig :: (IsAdapter a, C.Configured v) => C.Name -> AdapterM a v
requireFromAdapterConfig n = getAdapterConfig >>= liftIO . flip C.require n