salak-0.1.0: src/Data/Salak.hs
{-# LANGUAGE NoImplicitPrelude #-}
module Data.Salak(
Property(..)
, Properties(..)
, Key
, Return(..)
, insert
, toKeys
, empty
, lookup
, makePropertiesFromEnvironment
, defaultParseCommandLine
, makePropertiesFromCommandLine
, ParseCommandLine
, makePropertiesFromJson
, makePropertiesFromYaml
, defaultProperties
, defaultProperties'
, defaultPropertiesWithFile
, FileName
) where
import Data.Maybe
import Data.Salak.Aeson
import Data.Salak.CommandLine
import Data.Salak.Environment
import Data.Salak.Property
import Data.Salak.Yaml
import Prelude hiding (empty, lookup)
import System.Directory
import System.FilePath ((</>))
defaultProperties :: IO Properties
defaultProperties = defaultProperties' defaultParseCommandLine
defaultProperties' :: ParseCommandLine -> IO Properties
defaultProperties' dpc
= makePropertiesFromCommandLine dpc empty
>>= makePropertiesFromEnvironment
type FileName = String
defaultPropertiesWithFile :: FileName -> IO Properties
defaultPropertiesWithFile name = do
p <- defaultProperties
let n = fromMaybe name $ (lookup "salak.config.name" p :: Maybe String)
p' = insert (toKeys "salak.config.name") (PStr n) p
c <- getCurrentDirectory
h <- getHomeDirectory
foldl (go n) (return p') $ [(lookup "salak.config.dir" p, False), (Just c, True), (Just h, True)]
where
go _ p (Nothing, _) = p
go name p (Just d, ok) = let f = d </> name in do
p' <- p
b <- doesFileExist f
if b
then makePropertiesFromYaml f p'
else if ok then return p' else error $ "File " ++ f ++ " not found"