module Conferer.Core where import Data.Text (Text) import qualified Data.Text as Text import Data.Either (either) import Conferer.Types unsafeGetKey :: Key -> Config -> IO Text unsafeGetKey k config = either (error . Text.unpack) id <$> getKey k config getFromConfig :: FetchFromConfig a => Key -> Config -> IO a getFromConfig k config = either (error . Text.unpack) id <$> fetch k config getKey :: Key -> Config -> IO (Either Text Text) getKey k config = go $ providers config where go [] = return $ Left ("Key '" `Text.append` keyName k `Text.append` "' was not found") go (provider:providers) = do res <- getKeyInProvider provider k case res of Just t -> return $ Right t Nothing -> go providers (/.) :: Key -> Key -> Key parent /. child = Path (unKey parent ++ unKey child) emptyConfig :: Config emptyConfig = Config [] 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 ] }