{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE RankNTypes #-}
{-# LANGUAGE RecordWildCards #-}
module Salak(
Selector
, SourcePack
, SourcePackT
, Reload(..)
, load
, loadJSON
, loadYaml
, loadEnv
, defaultLoadSalak
, loadSalak
, PropConfig(..)
, HasSourcePack(..)
, fetch
, require
, ReloadableSourcePack
, runReloadable
, Prop
, FromProp(..)
, PResult(..)
, readPrimitive
, readSelect
, err
) where
import Control.Monad (unless)
import Control.Monad.IO.Class (MonadIO)
import Control.Monad.Reader
import Data.Default
import Data.Text (Text)
import Salak.Dynamic
import Salak.Env
import Salak.Json
import Salak.Prop
import Salak.Types
data PropConfig = PropConfig
{ configFileKey :: Maybe String
, commandLine :: ParseCommandLine
}
instance Default PropConfig where
def = PropConfig Nothing defaultParseCommandLine
loadSalak :: Monad m => ReaderT SourcePack m a -> SourcePackT m () -> m a
loadSalak a spm = do
(es, sp) <- runSourcePackT spm
unless (null es) $ do
fail (head es)
runReaderT a sp
defaultLoadSalak :: MonadIO m => PropConfig -> ReaderT SourcePack m a -> m a
defaultLoadSalak PropConfig{..} a = loadSalak a $ do
loadCommandLine commandLine
loadEnv
go configFileKey
where
go (Just file) = loadYaml file
go _ = return ()
class Monad m => HasSourcePack m where
askSourcePack :: m SourcePack
fetch :: (HasSourcePack m, FromProp a) => Text -> m (Either String a)
fetch key = askSourcePack >>= return . search key
require :: (HasSourcePack m, FromProp a) => Text -> m a
require k = do
x <- fetch k
case x of
Left e -> fail e
Right v -> return v
instance Monad m => HasSourcePack (ReaderT SourcePack m) where
askSourcePack = ask