macbeth-lib-0.0.12: src/Macbeth/Fics/Configuration.hs
{-# LANGUAGE DeriveGeneric #-}
module Macbeth.Fics.Configuration (
Config(..),
Logging(..),
loadConfig,
loadDefaultConfig,
saveConfig
) where
import Paths
import Control.Monad.Except
import Data.Either.Unwrap
import System.Directory
import System.FilePath
import GHC.Generics
import qualified Data.Yaml as Y
data Config = Config {
directory :: Maybe FilePath,
logging :: Logging
} deriving (Show, Generic)
data Logging = Logging {
stdOut :: Bool,
file :: Bool
} deriving (Show, Generic)
instance Y.FromJSON Config
instance Y.ToJSON Config
instance Y.FromJSON Logging
instance Y.ToJSON Logging
loadConfig :: IO Config
loadConfig = fmap fromRight $ runExceptT $ fromDisk `catchError` (\_ -> return defaultConfig)
loadDefaultConfig :: IO Config
loadDefaultConfig = do
dir <- getDefaultDirectory Nothing
return $ defaultConfig {directory = Just dir}
-- | If no directory is set, set default directory ~/Macbeth
fromDisk :: ExceptT Y.ParseException IO Config
fromDisk = do
config <- ExceptT $ getDataFileName "macbeth.yaml" >>= Y.decodeFileEither
dir <- liftIO $ getDefaultDirectory (directory config)
return $ config {directory = Just dir}
-- | Create default directory if it doesn't exist
getDefaultDirectory :: Maybe FilePath -> IO FilePath
getDefaultDirectory Nothing = do
dir <- (</> "Macbeth") `fmap` getUserDocumentsDirectory
createDirectoryIfMissing False dir
return dir
getDefaultDirectory (Just path) = return path
saveConfig :: Config -> IO ()
saveConfig config = getDataFileName "macbeth.yaml" >>= flip Y.encodeFile config
defaultConfig = Config {
directory = Nothing,
logging = Logging False False
}