mariusaeriksen / bert

haskell implementation of BERT[-RPC] (http://bert-rpc.org/)

This URL has Read+Write access

Tue Nov 03 23:56:28 -0800 2009
commit  60be31badccb2b7147f9796ac96d07eee7e157db
tree    78bbb3e47c1f0cb4fd6762eed6f2f94b58530303
parent  3a0d73bfffb1cc49d2e4007f5141eca447fcc73c
bert /
name age message
file .gitignore Wed Oct 28 19:56:24 -0700 2009 CABAL support. [mariusaeriksen]
directory Data/ Loading commit data...
file LICENSE Wed Oct 28 19:56:24 -0700 2009 CABAL support. [mariusaeriksen]
directory Network/
file QC.hs
file README.md
file bert.cabal
file bert.hs
README.md

BERT[-RPC] for Haskell

by marius a. eriksen (marius@monkey.org)

This is a BERT serializer/deserializer and BERT-RPC client and server for Haskell. BERT-RPC currently supports synchronous (call) requests.

The primitives provided are fairly elementary: for the client, call provides the capability to perform the RPC call, while the server's serve is provided with a dispatch function providing the dispatching logic for the server. Thus, one can imagine building higher level abstractions on top of these primitives.

Installation

It's a cabal package, so

$ cabal configure && cabal install

should do the trick.

BERT

import qualified Data.ByteString.Lazy.Char8 as C
import Data.BERT

Creating BERT terms is simple.

TupleTerm [BytelistTerm (C.pack "hello"), IntTerm 123]

Or by using the BERT typeclass.

showBERT $ ("hello", 123)

The BERT class can also read terms back.

Right ("hello", 123) = readBERT . showBERT $ ("hello", 123)

BERT-RPC client

import Data.BERT
import Network.BERT.Client

Create a transport to the server endpoint, and issue a (synchronous) call with it.

t <- fromURI "bert://localhost:8000"
r <- call t "calc" "add" ([123, 3000]::[Int])
case r of
  Right res -> print (res :: Int)
  Left _    -> putStrLn "error"

BERT-RPC server

import Data.BERT
import Network.BERT.Server

Create a transport from which to accept connections, and provide a dispatch function for incoming RPCs. The dispatch function is issued in a new thread for each incoming request.

main = do
  t <- fromHostPort "" 8080
  serve t dispatch

dispatch "calc" "add" [IntTerm a, IntTerm b] = 
  return $ Right $ IntTerm (a + b)
dispatch mod fun args = do
  return $ Left "no such m/f!"