module Network.JobQueue.Param
( ParamEnv
, envParameters
, Param
, decodeParam
, encodeParam
, param
) where
import Data.Maybe
import qualified Data.Aeson as A
import qualified Data.ByteString.Lazy.Char8 as B
import Network.JobQueue.Class
import Network.JobQueue.Types
import Network.JobQueue.Action (getEnv,abort)
import Network.JobQueue.Logger
class (Env a) => ParamEnv a where
envParameters :: a -> [(String, String)]
envParameters _env = []
class Param a where
decodeParam :: String -> Maybe a
encodeParam :: a -> String
instance Param String where
decodeParam str = (fmap fst . listToMaybe . reads) str
encodeParam val = show val
instance Param Int where
decodeParam str = (fmap fst . listToMaybe . reads) str
encodeParam val = show val
instance Param Integer where
decodeParam str = (fmap fst . listToMaybe . reads) str
encodeParam val = show val
instance Param Double where
decodeParam str = (fmap fst . listToMaybe . reads) str
encodeParam val = show val
instance Param A.Value where
decodeParam str = A.decode (B.pack str)
encodeParam val = B.unpack $ A.encode val
param :: (ParamEnv e, Unit a, Param b) => (String, String) -> ActionM e a b
param (key, defaultValue) = do
env <- getEnv
case decodeParam defaultValue of
Nothing -> do
$(logCritical) "internal error. no parse: " [show (key, defaultValue)]
abort
Just defaultValue' -> case lookup key (envParameters env) of
Just value -> return (fromMaybe defaultValue' (decodeParam value))
Nothing -> return (defaultValue')