module Database.Redis.Config
( RedisConfig(..)
, connectRedis
) where
import Control.Applicative
import Data.Aeson
import Data.Scientific
import Data.Time
import Database.Redis
import qualified Data.Aeson.Types as A
import qualified Data.Text.Encoding as T
newtype RedisConfig =
RedisConfig
{ getConnectInfo :: ConnectInfo
}
parsePort :: Object -> A.Parser (Maybe PortID)
parsePort o =
optional
$ (fmap (\a -> PortNumber $ floor (a :: Scientific)) (o .: "port"))
<|> (fmap UnixSocket (o .: "socket"))
<|> (fmap Service (o .: "service"))
instance FromJSON RedisConfig where
parseJSON v = RedisConfig <$> withObject "RedisConfig" go v
where
go o =
ConnInfo
<$> (o .:? "host" .!= connectHost defaultConnectInfo)
<*> (parsePort o .!= connectPort defaultConnectInfo)
<*> (fmap (fmap T.encodeUtf8) (o .:? "password"))
<*> (o .:? "database" .!= (connectDatabase defaultConnectInfo))
<*> (o .:? "max-connections" .!= (connectMaxConnections defaultConnectInfo))
<*> (fmap (fmap (realToFrac :: Scientific -> NominalDiffTime)) (o .:? "max-idle-time") .!= (connectMaxIdleTime defaultConnectInfo))
connectRedis :: RedisConfig -> IO Connection
connectRedis = connect . getConnectInfo