module Conferer.Core where
import Data.Text (Text)
import qualified Data.Text as Text
import Data.Map (Map)
import qualified Data.Map as Map
import Data.Maybe (fromMaybe)
import Data.Typeable (Typeable, Proxy(..), typeRep)
import Control.Exception (throw)
import Conferer.Provider.Simple
import Conferer.Types
getKey :: Key -> Config -> IO (Maybe Text)
getKey k config =
go $ providers config ++ [mkPureMapProvider (defaults config)]
where
go [] = return Nothing
go (provider:providers) = do
res <- getKeyInProvider provider k
case res of
Just t -> return $ Just t
Nothing -> go providers
getFromConfig :: forall a. (Typeable a, FetchFromConfig a) => Key -> Config -> IO a
getFromConfig key config =
fromMaybe (throw $ FailedToFetchError key (typeRep (Proxy :: Proxy a)))
<$> fetch key config
(/.) :: Key -> Key -> Key
parent /. child = Path (unKey parent ++ unKey child)
emptyConfig :: Config
emptyConfig = Config [] Map.empty
withDefaults :: [(Key, Text)] -> Config -> Config
withDefaults configMap config =
config { defaults = Map.fromList configMap }
mkStandaloneProvider :: ProviderCreator -> IO Provider
mkStandaloneProvider mkProvider =
mkProvider emptyConfig
addProvider :: ProviderCreator -> Config -> IO Config
addProvider mkProvider config = do
newProvider <- mkProvider config
return $
config
{ providers = providers config ++ [ newProvider ]
}
unsafeGetKey :: Key -> Config -> IO Text
unsafeGetKey key config =
fromMaybe (throw $ FailedToFetchError key (typeRep (Proxy :: Proxy Text)))
<$> getKey key config