packages feed

hcheckers-0.1.0.2: src/Core/Config.hs

{-# LANGUAGE OverloadedStrings #-}
module Core.Config
  (locateConfig, loadConfig
  ) where

import Data.Yaml
import Data.Default
import System.FilePath
import System.Directory
import System.Environment

import Core.Types
import Core.CmdLine
import Core.Json () -- import instances only

locateConfig :: IO (Maybe FilePath)
locateConfig = do
  home <- getEnv "HOME"
  let homePath = home </> ".config" </> "hcheckers" </> "server.yaml"
  ex <- doesFileExist homePath
  if ex
    then return $ Just homePath
    else do
      let etcPath = "/etc" </> "hcheckers" </> "server.yaml"
      ex <- doesFileExist etcPath
      if ex
        then return $ Just etcPath
        else return Nothing

loadConfig :: CmdLine -> IO GeneralConfig
loadConfig cmd = do
  mbPath <-
      case cmdConfigPath cmd of
          Nothing -> locateConfig
          Just path -> return (Just path)
  config <-
      case mbPath of
        Nothing -> return def
        Just path -> do
          putStrLn $ "Using config: " ++ path
          r <- decodeFileEither path
          case r of
            Left err -> fail $ show err
            Right cfg -> return cfg
  let config' = case cmdLocal cmd of
                  Nothing -> config
                  Just local -> config {gcLocal = local}
      config'' = case cmdMetrics cmd of
                  Nothing -> config'
                  Just metrics -> config {gcEnableMetrics = metrics}
  return config''