packages feed

sproxy-0.9.7: src/ConfigFile.hs

{-# LANGUAGE OverloadedStrings #-}

module ConfigFile where

import           Control.Applicative
import           Data.Aeson
import           Data.Word
import           Data.Yaml
import           System.Exit
import           System.IO

import Logging (LogLevel(Debug))

withConfigFile :: FilePath -> (ConfigFile -> IO a) -> IO a
withConfigFile configFile action = do
  c <- decodeFileEither configFile
  case c of
    Left err -> do
      hPutStrLn stderr ("error parsing configuration file " ++ configFile ++ ": " ++ show err)
      exitFailure
    Right config -> action config

data ConfigFile = ConfigFile {
  cfListen :: Word16
, cfLogLevel :: LogLevel
, cfRedirectHttpToHttps :: Maybe Bool
, cfCookieDomain :: String
, cfCookieName :: String
, cfGoogleClientID :: Maybe String
, cfGoogleClientSecretFile :: Maybe FilePath
, cfLinkedInClientID :: Maybe String
, cfLinkedInClientSecretFile :: Maybe FilePath
, cfSslKey :: FilePath
, cfSslCerts :: FilePath
, cfDatabase :: String
, cfBackendAddress :: String
, cfBackendPort :: Word16
, cfBackendSocket :: Maybe String
, cfUser :: String
, cfSessionShelfLife :: Word32
} deriving (Eq, Show)

instance FromJSON ConfigFile where
  parseJSON (Object m) = ConfigFile <$>
        m .:? "listen" .!= 443
    <*> m .:? "log_level" .!= Debug
    <*> m .:? "redirect_http_to_https"
    <*> m .: "cookie_domain"
    <*> m .: "cookie_name"
    <*> m .:? "client_id"
    <*> m .:? "client_secret"
    <*> m .:? "linkedin_client_id"
    <*> m .:? "linkedin_client_secret"
    <*> m .: "ssl_key"
    <*> m .: "ssl_certs"
    <*> m .: "database"
    <*> m .:? "backend_address" .!= "127.0.0.1"
    <*> m .:? "backend_port" .!= 8080
    <*> m .:? "backend_socket"
    <*> m .:? "user" .!= "sproxy"
    <*> m .:? "session_shelf_life" .!= (30 * 24 * 60 * 60)
  parseJSON _ = empty