{-# LANGUAGE OverloadedStrings #-}
module Main (main) where
import Network.JsonRpc.Server
import Happstack.Server.SimpleHTTP hiding (Method, body, result)
import Data.List (intercalate)
import Data.Maybe (fromMaybe)
import Control.Monad (when)
import Control.Monad.Trans (liftIO)
import Control.Monad.Error (throwError)
import Control.Monad.Reader (ReaderT, ask, runReaderT)
import Control.Concurrent.MVar
main :: IO ()
main = newMVar 0 >>= \count ->
simpleHTTP nullConf $ do
request <- askRq
body <- liftIO $ getBody request
result <- runReaderT (call methods body) count
let resultStr = fromMaybe "" result
return $ toResponse resultStr
where getBody r = unBody `fmap` readMVar (rqBody r)
type Server = ReaderT (MVar Integer) (ServerPartT IO)
methods :: Methods Server
methods = toMethods [printSequence, getCount, add]
printSequence, getCount, add :: Method Server
printSequence = toMethod "print" f params
where params = Required "string" :+:
Optional "count" 1 :+:
Optional "separator" ',' :+: ()
f :: String -> Int -> Char -> RpcResult Server ()
f str count sep = do
when (count < 0) $ throwError negativeCount
liftIO $ print $ intercalate [sep] $ replicate count str
negativeCount = rpcError (-32000) "negative count"
getCount = toMethod "get_count" f ()
where f :: RpcResult Server Integer
f = ask >>= \count -> liftIO $ modifyMVar count inc
where inc x = return (x + 1, x + 1)
add = toMethod "add" f (Required "x" :+: Required "y" :+: ())
where f :: Double -> Double -> RpcResult Server Double
f x y = liftIO $ return (x + y)