| {-# LANGUAGE DeriveDataTypeable #-} |
| {-# LANGUAGE OverloadedStrings #-} |
| {-# LANGUAGE RankNTypes #-} |
| -- |
| -- 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.Exception |
| |
| import Data.Int |
| import Data.Text.Lazy ( Text, pack, unpack ) |
| import Data.Text.Lazy.Encoding |
| import Data.Typeable ( Typeable ) |
| import qualified Data.HashMap.Strict as Map |
| |
| import Thrift.Protocol |
| import Thrift.Transport |
| import Thrift.Types |
| |
| 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 |
| | AE_INTERNAL_ERROR |
| | AE_PROTOCOL_ERROR |
| | AE_INVALID_TRANSFORM |
| | AE_INVALID_PROTOCOL |
| | AE_UNSUPPORTED_CLIENT_TYPE |
| 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 |
| toEnum 6 = AE_INTERNAL_ERROR |
| toEnum 7 = AE_PROTOCOL_ERROR |
| toEnum 8 = AE_INVALID_TRANSFORM |
| toEnum 9 = AE_INVALID_PROTOCOL |
| toEnum 10 = AE_UNSUPPORTED_CLIENT_TYPE |
| toEnum t = error $ "Invalid AppExnType " ++ show t |
| |
| 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 |
| fromEnum AE_INTERNAL_ERROR = 6 |
| fromEnum AE_PROTOCOL_ERROR = 7 |
| fromEnum AE_INVALID_TRANSFORM = 8 |
| fromEnum AE_INVALID_PROTOCOL = 9 |
| fromEnum AE_UNSUPPORTED_CLIENT_TYPE = 10 |
| |
| 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 = writeVal pt $ TStruct $ Map.fromList |
| [ (1, ("message", TString $ encodeUtf8 $ pack $ ae_message ae)) |
| , (2, ("type", TI32 $ fromIntegral $ fromEnum (ae_type ae))) |
| ] |
| |
| readAppExn :: (Protocol p, Transport t) => p t -> IO AppExn |
| readAppExn pt = do |
| let typemap = Map.fromList [(1,("message",T_STRING)),(2,("type",T_I32))] |
| TStruct fields <- readVal pt $ T_STRUCT typemap |
| return $ readAppExnFields fields |
| |
| readAppExnFields :: Map.HashMap Int16 (Text, ThriftVal) -> AppExn |
| readAppExnFields fields = AppExn{ |
| ae_message = maybe undefined unwrapMessage $ Map.lookup 1 fields, |
| ae_type = maybe undefined unwrapType $ Map.lookup 2 fields |
| } |
| where |
| unwrapMessage (_, TString s) = unpack $ decodeUtf8 s |
| unwrapMessage _ = undefined |
| unwrapType (_, TI32 i) = toEnum $ fromIntegral i |
| unwrapType _ = undefined |