From 6a3705c8801f06b2405c9de6a60c260a69936fa7 Mon Sep 17 00:00:00 2001 From: Bryan Duxbury Date: Tue, 7 Apr 2009 23:23:39 +0000 Subject: [PATCH] THRIFT-390. hs: Cabalize Haskell library code Use Cabal to build and install the Haskell library code. git-svn-id: https://svn.apache.org/repos/asf/incubator/thrift/trunk@763029 13f79535-47bb-0310-9956-ffa450edef68 --- lib/hs/README | 63 +++++++++++++++++++++++++++------ lib/hs/src/TChannelTransport.hs | 8 +++-- lib/hs/src/TSocket.hs | 6 +++- 3 files changed, 64 insertions(+), 13 deletions(-) diff --git a/lib/hs/README b/lib/hs/README index 7cc2f002..5510de1e 100644 --- a/lib/hs/README +++ b/lib/hs/README @@ -1,19 +1,62 @@ Haskell Thrift Bindings -Running: you need -fglasgow-exts. +Running +======= -Enums: become haskell data types. Use fromEnum to get out the int value. +You need -fglasgow-exts. Use Cabal to compile and install. If you're trying to +manually compile or load via ghci, and you're using ghc 6.10 (or really if your +default base package has major version number 4), you must specify a version of +the base package with major version number 3. Furthermore if you have the syb +package installed you need to hide that package to avoid import conflicts. +Here's an example of what I'm talking about: -Structs: become records. Field labels are ugly, of the form f_STRUCTNAME_FIELDNAME. All fields are Maybe types. + ghci -fglasgow-exts -package base-3.0.3.0 -hide-package syb -isrc Thrift.hs -Exceptions: identical to structs. Throw them with throwDyn. Catch them with catchDyn. +To determine which versions of the base package you have installed use the +following command: -Client: just a bunch of functions. You may have to import a bunch of client files to deal with inheritance. + ghc-pkg list base -Interface: You should only have to import the last one in the chain of inheritors. To make an interface, declare a label: -data MyIface = MyIface -and then declare it an instance of each iface class, starting with the superest class and proceding down (all the while defining the methods). -Then pass your label to process as the handler. +All of this is taken care of for you if you use Cabal. -Processor: Just a function that takes a handler label, protocols. It calls the superclasses process if there is a superclass. + +Enums +===== + +become haskell data types. Use fromEnum to get out the int value. + +Structs +======= + +become records. Field labels are ugly, of the form f_STRUCTNAME_FIELDNAME. All +fields are Maybe types. + +Exceptions +========== + +identical to structs. Throw them with throwDyn. Catch them with catchDyn. + +Client +====== + +just a bunch of functions. You may have to import a bunch of client files to +deal with inheritance. + +Interface +========= + +You should only have to import the last one in the chain of inheritors. To make +an interface, declare a label: + + data MyIface = MyIface + +and then declare it an instance of each iface class, starting with the superest +class and proceding down (all the while defining the methods). Then pass your +label to process as the handler. + +Processor +========= + +Just a function that takes a handler label, protocols. It calls the +superclasses process if there is a superclass. diff --git a/lib/hs/src/TChannelTransport.hs b/lib/hs/src/TChannelTransport.hs index d704c3a9..b67751af 100644 --- a/lib/hs/src/TChannelTransport.hs +++ b/lib/hs/src/TChannelTransport.hs @@ -18,10 +18,14 @@ -- module TChannelTransport(TChannelTrans(..)) where -import System.IO -import IO + import Thrift import Control.Exception + +import System.IO +import System.IO.Error ( isEOFError ) + + data TChannelTrans = TChannelTrans (Handle) instance TTransport TChannelTrans where diff --git a/lib/hs/src/TSocket.hs b/lib/hs/src/TSocket.hs index a04739a2..1e00261d 100644 --- a/lib/hs/src/TSocket.hs +++ b/lib/hs/src/TSocket.hs @@ -18,11 +18,15 @@ -- module TSocket(TSocket(..)) where + import Thrift import Data.IORef import Network -import IO import Control.Exception + +import System.IO + + data TSocket = TSocket{host::[Char],port::PortNumber,chan :: Maybe Handle} instance TTransport TSocket where -- 2.17.1