| -- | 
 | -- Licensed to the Apache Software Foundation (ASF) under one | 
 | -- or more contributor license agreements. See the NOTICE file | 
 | -- distributed with this work for additional information | 
 | -- regarding copyright ownership. The ASF licenses this file | 
 | -- to you under the Apache License, Version 2.0 (the | 
 | -- "License"); you may not use this file except in compliance | 
 | -- with the License. You may obtain a copy of the License at | 
 | -- | 
 | --   http://www.apache.org/licenses/LICENSE-2.0 | 
 | -- | 
 | -- Unless required by applicable law or agreed to in writing, | 
 | -- software distributed under the License is distributed on an | 
 | -- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY | 
 | -- KIND, either express or implied. See the License for the | 
 | -- specific language governing permissions and limitations | 
 | -- under the License. | 
 | -- | 
 |  | 
 | module Thrift | 
 |     ( module Thrift.Transport | 
 |     , module Thrift.Protocol | 
 |     , AppExnType(..) | 
 |     , AppExn(..) | 
 |     , readAppExn | 
 |     , writeAppExn | 
 |     , ThriftException(..) | 
 |     ) where | 
 |  | 
 | import Control.Monad ( when ) | 
 | import Control.Exception | 
 |  | 
 | import Data.Typeable ( Typeable ) | 
 |  | 
 | import Thrift.Transport | 
 | import Thrift.Protocol | 
 |  | 
 |  | 
 | data ThriftException = ThriftException | 
 |   deriving ( Show, Typeable ) | 
 | instance Exception ThriftException | 
 |  | 
 | data AppExnType | 
 |     = AE_UNKNOWN | 
 |     | AE_UNKNOWN_METHOD | 
 |     | AE_INVALID_MESSAGE_TYPE | 
 |     | AE_WRONG_METHOD_NAME | 
 |     | AE_BAD_SEQUENCE_ID | 
 |     | AE_MISSING_RESULT | 
 |       deriving ( Eq, Show, Typeable ) | 
 |  | 
 | instance Enum AppExnType where | 
 |     toEnum 0 = AE_UNKNOWN | 
 |     toEnum 1 = AE_UNKNOWN_METHOD | 
 |     toEnum 2 = AE_INVALID_MESSAGE_TYPE | 
 |     toEnum 3 = AE_WRONG_METHOD_NAME | 
 |     toEnum 4 = AE_BAD_SEQUENCE_ID | 
 |     toEnum 5 = AE_MISSING_RESULT | 
 |  | 
 |     fromEnum AE_UNKNOWN = 0 | 
 |     fromEnum AE_UNKNOWN_METHOD = 1 | 
 |     fromEnum AE_INVALID_MESSAGE_TYPE = 2 | 
 |     fromEnum AE_WRONG_METHOD_NAME = 3 | 
 |     fromEnum AE_BAD_SEQUENCE_ID = 4 | 
 |     fromEnum AE_MISSING_RESULT = 5 | 
 |  | 
 | data AppExn = AppExn { ae_type :: AppExnType, ae_message :: String } | 
 |   deriving ( Show, Typeable ) | 
 | instance Exception AppExn | 
 |  | 
 | writeAppExn :: (Protocol p, Transport t) => p t -> AppExn -> IO () | 
 | writeAppExn pt ae = do | 
 |     writeStructBegin pt "TApplicationException" | 
 |  | 
 |     when (ae_message ae /= "") $ do | 
 |         writeFieldBegin pt ("message", T_STRING , 1) | 
 |         writeString pt (ae_message ae) | 
 |         writeFieldEnd pt | 
 |  | 
 |     writeFieldBegin pt ("type", T_I32, 2); | 
 |     writeI32 pt (fromEnum (ae_type ae)) | 
 |     writeFieldEnd pt | 
 |     writeFieldStop pt | 
 |     writeStructEnd pt | 
 |  | 
 | readAppExn :: (Protocol p, Transport t) => p t -> IO AppExn | 
 | readAppExn pt = do | 
 |     readStructBegin pt | 
 |     rec <- readAppExnFields pt (AppExn {ae_type = undefined, ae_message = undefined}) | 
 |     readStructEnd pt | 
 |     return rec | 
 |  | 
 | readAppExnFields pt rec = do | 
 |     (n, ft, id) <- readFieldBegin pt | 
 |     if ft == T_STOP | 
 |         then return rec | 
 |         else case id of | 
 |                  1 -> if ft == T_STRING then | 
 |                           do s <- readString pt | 
 |                              readAppExnFields pt rec{ae_message = s} | 
 |                           else do skip pt ft | 
 |                                   readAppExnFields pt rec | 
 |                  2 -> if ft == T_I32 then | 
 |                           do i <- readI32 pt | 
 |                              readAppExnFields pt rec{ae_type = (toEnum  i)} | 
 |                           else do skip pt ft | 
 |                                   readAppExnFields pt rec | 
 |                  _ -> do skip pt ft | 
 |                          readFieldEnd pt | 
 |                          readAppExnFields pt rec | 
 |  |