packages feed

yaml-rpc-0.3: Network/YAML/Dispatcher.hs

module Network.YAML.Dispatcher where

import qualified Data.Map as M
import Data.Object.Yaml
import qualified Data.ByteString.Char8 as BS

import Network.YAML.Types
import Network.YAML.Instances
import Network.YAML.Server

-- | Build dispatching rules
mkRules :: [(BS.ByteString, Worker)] -> Rules
mkRules pairs = M.fromList pairs

-- | Select worker from dispatching rules
dispatch :: Rules -> Worker
dispatch rules = \obj -> 
  let call :: Call
      call = fromYaml obj
  in case M.lookup (methodName call) rules of
      Nothing -> fail $ "Unknown method: " ++ (BS.unpack $ methodName call)
      Just fn -> fn (args call)

-- | Listens given port and dispatches requests
dispatcher :: Int -> Rules -> IO ()
dispatcher port rules = server port (dispatch rules)

-- | Similar, but use persistent server.
persistentDispatcher :: Int -> Rules -> IO ()
persistentDispatcher port rules = persistentServer port (dispatch rules)