module Network.YAML.Dispatcher where

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

import Network.YAML.Base
import Network.YAML.Instances
import Network.YAML.Server

type Worker = YamlObject -> IO YamlObject
type Rules = M.Map BS.ByteString Worker

-- | 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 = cs 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)