packages feed

batchd-0.1.1.0: src/Batchd/Common/Config.hs

{-# LANGUAGE OverloadedStrings #-}
-- | This module contains utility functions for locating and loading
-- configuration files.
module Batchd.Common.Config where

import Control.Exception
import Data.Yaml
import qualified Data.Text as T
import System.IO

import Batchd.Core.Common.Types
import Batchd.Core.Common.Localize
import Batchd.Core.Common.Config
import Batchd.Common.Types

-- | Load job type config file
loadTemplate :: T.Text -> IO (Either Error JobType)
loadTemplate name = loadConfig "jobtypes" name InvalidJobType

-- | Load global config file (@"batchd.yaml"@)
loadGlobalConfig :: Maybe FilePath -> IO (Either Error GlobalConfig)
loadGlobalConfig mbCmdlinePath = do
  mbPath <- case mbCmdlinePath of
              Just path -> return $ Just path
              Nothing   -> locateConfig "" "batchd.yaml"
  case mbPath of
    Nothing -> return $ Left $ FileNotExists "batchd.yaml"
    Just path -> do
      r <- decodeFileEither path
      case r of
        Left err -> return $ Left $ InvalidDbCfg err
        Right cfg -> do
          return $ Right cfg

-- | Read password from stdout.
getPassword :: String    -- ^ Prompt
           -> IO String
getPassword prompt = do
  putStr prompt
  hFlush stdout
  pass <- withEcho False getLine
  putChar '\n'
  return pass

-- | Ask password from stdout twice.
-- Make sure that entered passwords are equal.
getPassword2 :: IO String
getPassword2 = do
  pwd1 <- getPassword =<< (__s "Password: ")
  pwd2 <- getPassword =<< (__s "Password again: ")
  if pwd1 /= pwd2
    then fail =<< (__s "passwords do not match")
    else return pwd1

-- | Execute IO actions with enabled\/disabled terminal echo,
-- and then return echo state to previous.
withEcho :: Bool -> IO a -> IO a
withEcho echo action = do
  old <- hGetEcho stdin
  bracket_ (hSetEcho stdin echo) (hSetEcho stdin old) action