-----------------------------------------------------------------
-- Autogenerated by Thrift
--
-- DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING
--  @generated
-----------------------------------------------------------------
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE BangPatterns #-}
{-# OPTIONS_GHC -fno-warn-unused-imports#-}
{-# OPTIONS_GHC -fno-warn-overlapping-patterns#-}
{-# OPTIONS_GHC -fno-warn-incomplete-patterns#-}
{-# OPTIONS_GHC -fno-warn-incomplete-uni-patterns#-}
{-# OPTIONS_GHC -fno-warn-incomplete-record-updates#-}
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
module Thrift.Protocol.ApplicationException.Types
       (ApplicationExceptionType(ApplicationExceptionType_Unknown,
                                 ApplicationExceptionType_UnknownMethod,
                                 ApplicationExceptionType_InvalidMessageType,
                                 ApplicationExceptionType_WrongMethodType,
                                 ApplicationExceptionType_BadSequenceId,
                                 ApplicationExceptionType_MissingResult,
                                 ApplicationExceptionType_InternalError,
                                 ApplicationExceptionType_ProtocolError,
                                 ApplicationExceptionType_InvalidTransform,
                                 ApplicationExceptionType_InvalidProtocol,
                                 ApplicationExceptionType_UnsupportedClientType,
                                 ApplicationExceptionType_Loadshedding,
                                 ApplicationExceptionType_Timeout,
                                 ApplicationExceptionType_InjectedFailure,
                                 ApplicationExceptionType__UNKNOWN),
        ApplicationException(ApplicationException,
                             applicationException_message, applicationException_type))
       where
import qualified Control.DeepSeq as DeepSeq
import qualified Control.Exception as Exception
import qualified Control.Monad as Monad
import qualified Control.Monad.ST.Trans as ST
import qualified Control.Monad.Trans.Class as Trans
import qualified Data.Aeson as Aeson
import qualified Data.Aeson.Types as Aeson
import qualified Data.Default as Default
import qualified Data.Function as Function
import qualified Data.HashMap.Strict as HashMap
import qualified Data.Hashable as Hashable
import qualified Data.Int as Int
import qualified Data.List as List
import qualified Data.Ord as Ord
import qualified Data.Text as Text
import qualified Data.Text.Encoding as Text
import qualified GHC.Magic as GHC
import qualified Prelude as Prelude
import qualified Thrift.Binary.Parser as Parser
import qualified Thrift.CodegenTypesOnly as Thrift
import Control.Applicative ((<|>), (*>), (<*))
import Data.Aeson ((.:), (.:?), (.=), (.!=))
import Data.Monoid ((<>))
import Prelude ((.), (++), (>), (==))
import Prelude ((.), (<$>), (<*>), (>>=), (==), (/=), (<), (++))

data ApplicationExceptionType = ApplicationExceptionType_Unknown
                              | ApplicationExceptionType_UnknownMethod
                              | ApplicationExceptionType_InvalidMessageType
                              | ApplicationExceptionType_WrongMethodType
                              | ApplicationExceptionType_BadSequenceId
                              | ApplicationExceptionType_MissingResult
                              | ApplicationExceptionType_InternalError
                              | ApplicationExceptionType_ProtocolError
                              | ApplicationExceptionType_InvalidTransform
                              | ApplicationExceptionType_InvalidProtocol
                              | ApplicationExceptionType_UnsupportedClientType
                              | ApplicationExceptionType_Loadshedding
                              | ApplicationExceptionType_Timeout
                              | ApplicationExceptionType_InjectedFailure
                              | ApplicationExceptionType__UNKNOWN Prelude.Int
                                deriving (Prelude.Eq, Prelude.Show, Prelude.Ord)

instance Aeson.ToJSON ApplicationExceptionType where
  toJSON = Aeson.toJSON . Thrift.fromThriftEnum

instance DeepSeq.NFData ApplicationExceptionType where
  rnf __ApplicationExceptionType
    = Prelude.seq __ApplicationExceptionType ()

instance Default.Default ApplicationExceptionType where
  def = ApplicationExceptionType_Unknown

instance Hashable.Hashable ApplicationExceptionType where
  hashWithSalt _salt _val
    = Hashable.hashWithSalt _salt (Thrift.fromThriftEnum _val)

instance Thrift.ThriftEnum ApplicationExceptionType where
  toThriftEnum 0 = ApplicationExceptionType_Unknown
  toThriftEnum 1 = ApplicationExceptionType_UnknownMethod
  toThriftEnum 2 = ApplicationExceptionType_InvalidMessageType
  toThriftEnum 3 = ApplicationExceptionType_WrongMethodType
  toThriftEnum 4 = ApplicationExceptionType_BadSequenceId
  toThriftEnum 5 = ApplicationExceptionType_MissingResult
  toThriftEnum 6 = ApplicationExceptionType_InternalError
  toThriftEnum 7 = ApplicationExceptionType_ProtocolError
  toThriftEnum 8 = ApplicationExceptionType_InvalidTransform
  toThriftEnum 9 = ApplicationExceptionType_InvalidProtocol
  toThriftEnum 10 = ApplicationExceptionType_UnsupportedClientType
  toThriftEnum 11 = ApplicationExceptionType_Loadshedding
  toThriftEnum 12 = ApplicationExceptionType_Timeout
  toThriftEnum 13 = ApplicationExceptionType_InjectedFailure
  toThriftEnum val = ApplicationExceptionType__UNKNOWN val
  fromThriftEnum ApplicationExceptionType_Unknown = 0
  fromThriftEnum ApplicationExceptionType_UnknownMethod = 1
  fromThriftEnum ApplicationExceptionType_InvalidMessageType = 2
  fromThriftEnum ApplicationExceptionType_WrongMethodType = 3
  fromThriftEnum ApplicationExceptionType_BadSequenceId = 4
  fromThriftEnum ApplicationExceptionType_MissingResult = 5
  fromThriftEnum ApplicationExceptionType_InternalError = 6
  fromThriftEnum ApplicationExceptionType_ProtocolError = 7
  fromThriftEnum ApplicationExceptionType_InvalidTransform = 8
  fromThriftEnum ApplicationExceptionType_InvalidProtocol = 9
  fromThriftEnum ApplicationExceptionType_UnsupportedClientType = 10
  fromThriftEnum ApplicationExceptionType_Loadshedding = 11
  fromThriftEnum ApplicationExceptionType_Timeout = 12
  fromThriftEnum ApplicationExceptionType_InjectedFailure = 13
  fromThriftEnum (ApplicationExceptionType__UNKNOWN val) = val
  allThriftEnumValues
    = [ApplicationExceptionType_Unknown,
       ApplicationExceptionType_UnknownMethod,
       ApplicationExceptionType_InvalidMessageType,
       ApplicationExceptionType_WrongMethodType,
       ApplicationExceptionType_BadSequenceId,
       ApplicationExceptionType_MissingResult,
       ApplicationExceptionType_InternalError,
       ApplicationExceptionType_ProtocolError,
       ApplicationExceptionType_InvalidTransform,
       ApplicationExceptionType_InvalidProtocol,
       ApplicationExceptionType_UnsupportedClientType,
       ApplicationExceptionType_Loadshedding,
       ApplicationExceptionType_Timeout,
       ApplicationExceptionType_InjectedFailure]
  toThriftEnumEither 0
    = Prelude.Right ApplicationExceptionType_Unknown
  toThriftEnumEither 1
    = Prelude.Right ApplicationExceptionType_UnknownMethod
  toThriftEnumEither 2
    = Prelude.Right ApplicationExceptionType_InvalidMessageType
  toThriftEnumEither 3
    = Prelude.Right ApplicationExceptionType_WrongMethodType
  toThriftEnumEither 4
    = Prelude.Right ApplicationExceptionType_BadSequenceId
  toThriftEnumEither 5
    = Prelude.Right ApplicationExceptionType_MissingResult
  toThriftEnumEither 6
    = Prelude.Right ApplicationExceptionType_InternalError
  toThriftEnumEither 7
    = Prelude.Right ApplicationExceptionType_ProtocolError
  toThriftEnumEither 8
    = Prelude.Right ApplicationExceptionType_InvalidTransform
  toThriftEnumEither 9
    = Prelude.Right ApplicationExceptionType_InvalidProtocol
  toThriftEnumEither 10
    = Prelude.Right ApplicationExceptionType_UnsupportedClientType
  toThriftEnumEither 11
    = Prelude.Right ApplicationExceptionType_Loadshedding
  toThriftEnumEither 12
    = Prelude.Right ApplicationExceptionType_Timeout
  toThriftEnumEither 13
    = Prelude.Right ApplicationExceptionType_InjectedFailure
  toThriftEnumEither val
    = Prelude.Left
        ("toThriftEnumEither: not a valid identifier for enum ApplicationExceptionType: "
           ++ Prelude.show val)

data ApplicationException = ApplicationException{applicationException_message
                                                 :: Text.Text,
                                                 applicationException_type ::
                                                 ApplicationExceptionType}
                            deriving (Prelude.Eq, Prelude.Show, Prelude.Ord)

instance Aeson.ToJSON ApplicationException where
  toJSON (ApplicationException __field__message __field__type)
    = Aeson.object
        ("message" .= __field__message :
           "type" .= __field__type : Prelude.mempty)

instance Thrift.ThriftStruct ApplicationException where
  buildStruct _proxy
    (ApplicationException __field__message __field__type)
    = Thrift.genStruct _proxy
        (Thrift.genField _proxy "message" (Thrift.getStringType _proxy) 1 0
           (Thrift.genText _proxy __field__message)
           :
           Thrift.genField _proxy "type" (Thrift.getI32Type _proxy) 2 1
             ((Thrift.genI32 _proxy . Prelude.fromIntegral .
                 Thrift.fromThriftEnum)
                __field__type)
             : [])
  parseStruct _proxy
    = ST.runSTT
        (do Prelude.return ()
            __field__message <- ST.newSTRef ""
            __field__type <- ST.newSTRef Default.def
            let
              _parse _lastId
                = do _fieldBegin <- Trans.lift
                                      (Thrift.parseFieldBegin _proxy _lastId _idMap)
                     case _fieldBegin of
                       Thrift.FieldBegin _type _id _bool -> do case _id of
                                                                 1 | _type ==
                                                                       Thrift.getStringType _proxy
                                                                     ->
                                                                     do !_val <- Trans.lift
                                                                                   (Thrift.parseText
                                                                                      _proxy)
                                                                        ST.writeSTRef
                                                                          __field__message
                                                                          _val
                                                                 2 | _type ==
                                                                       Thrift.getI32Type _proxy
                                                                     ->
                                                                     do !_val <- Trans.lift
                                                                                   (Thrift.parseEnum
                                                                                      _proxy
                                                                                      "ApplicationExceptionType")
                                                                        ST.writeSTRef __field__type
                                                                          _val
                                                                 _ -> Trans.lift
                                                                        (Thrift.parseSkip _proxy
                                                                           _type
                                                                           (Prelude.Just _bool))
                                                               _parse _id
                       Thrift.FieldEnd -> do !__val__message <- ST.readSTRef
                                                                  __field__message
                                             !__val__type <- ST.readSTRef __field__type
                                             Prelude.pure
                                               (ApplicationException __val__message __val__type)
              _idMap = HashMap.fromList [("message", 1), ("type", 2)]
            _parse 0)

instance DeepSeq.NFData ApplicationException where
  rnf (ApplicationException __field__message __field__type)
    = DeepSeq.rnf __field__message `Prelude.seq`
        DeepSeq.rnf __field__type `Prelude.seq` ()

instance Default.Default ApplicationException where
  def = ApplicationException "" Default.def

instance Hashable.Hashable ApplicationException where
  hashWithSalt __salt (ApplicationException _message _type)
    = Hashable.hashWithSalt (Hashable.hashWithSalt __salt _message)
        _type

instance Exception.Exception ApplicationException