-- | https://www.rfc-editor.org/rfc/rfc3463
module Email.DSN.StatusCode
  ( StatusCode(..)
  , Class(..), encodeClass, decodeClass
  , SubjectDetail(..), encodeSubjectDetail, decodeSubjectDetail
  , AddressingDetail(..), encodeAddressingDetail, decodeAddressingDetail
  , MailboxDetail(..), encodeMailboxDetail, decodeMailboxDetail
  , MailSystemDetail(..), encodeMailSystemDetail, decodeMailSystemDetail
  , NetworkAndRoutingDetail(..), encodeNetworkAndRoutingDetail, decodeNetworkAndRoutingDetail
  , DeliveryProtocolDetail(..), encodeDeliveryProtocolDetail, decodeDeliveryProtocolDetail
  , MessageContentOrMediaDetail(..), encodeMessageContentOrMediaDetail, decodeMessageContentOrMediaDetail
  , SecurityOrPolicyDetail(..), encodeSecurityOrPolicyDetail, decodeSecurityOrPolicyDetail
  , parse, parseWithRemainder
  , encodeString
  , parser
  ) where

import Data.Char (isDigit, isSpace)
import GHC.Generics (Generic)
import Text.Read (readMaybe)

import qualified Data.Attoparsec.Text as AP

data StatusCode = StatusCode Class SubjectDetail
  deriving ((forall x. StatusCode -> Rep StatusCode x)
-> (forall x. Rep StatusCode x -> StatusCode) -> Generic StatusCode
forall x. Rep StatusCode x -> StatusCode
forall x. StatusCode -> Rep StatusCode x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. StatusCode -> Rep StatusCode x
from :: forall x. StatusCode -> Rep StatusCode x
$cto :: forall x. Rep StatusCode x -> StatusCode
to :: forall x. Rep StatusCode x -> StatusCode
Generic, StatusCode -> StatusCode -> Bool
(StatusCode -> StatusCode -> Bool)
-> (StatusCode -> StatusCode -> Bool) -> Eq StatusCode
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: StatusCode -> StatusCode -> Bool
== :: StatusCode -> StatusCode -> Bool
$c/= :: StatusCode -> StatusCode -> Bool
/= :: StatusCode -> StatusCode -> Bool
Eq, Eq StatusCode
Eq StatusCode =>
(StatusCode -> StatusCode -> Ordering)
-> (StatusCode -> StatusCode -> Bool)
-> (StatusCode -> StatusCode -> Bool)
-> (StatusCode -> StatusCode -> Bool)
-> (StatusCode -> StatusCode -> Bool)
-> (StatusCode -> StatusCode -> StatusCode)
-> (StatusCode -> StatusCode -> StatusCode)
-> Ord StatusCode
StatusCode -> StatusCode -> Bool
StatusCode -> StatusCode -> Ordering
StatusCode -> StatusCode -> StatusCode
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: StatusCode -> StatusCode -> Ordering
compare :: StatusCode -> StatusCode -> Ordering
$c< :: StatusCode -> StatusCode -> Bool
< :: StatusCode -> StatusCode -> Bool
$c<= :: StatusCode -> StatusCode -> Bool
<= :: StatusCode -> StatusCode -> Bool
$c> :: StatusCode -> StatusCode -> Bool
> :: StatusCode -> StatusCode -> Bool
$c>= :: StatusCode -> StatusCode -> Bool
>= :: StatusCode -> StatusCode -> Bool
$cmax :: StatusCode -> StatusCode -> StatusCode
max :: StatusCode -> StatusCode -> StatusCode
$cmin :: StatusCode -> StatusCode -> StatusCode
min :: StatusCode -> StatusCode -> StatusCode
Ord, ReadPrec [StatusCode]
ReadPrec StatusCode
Int -> ReadS StatusCode
ReadS [StatusCode]
(Int -> ReadS StatusCode)
-> ReadS [StatusCode]
-> ReadPrec StatusCode
-> ReadPrec [StatusCode]
-> Read StatusCode
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS StatusCode
readsPrec :: Int -> ReadS StatusCode
$creadList :: ReadS [StatusCode]
readList :: ReadS [StatusCode]
$creadPrec :: ReadPrec StatusCode
readPrec :: ReadPrec StatusCode
$creadListPrec :: ReadPrec [StatusCode]
readListPrec :: ReadPrec [StatusCode]
Read, Int -> StatusCode -> ShowS
[StatusCode] -> ShowS
StatusCode -> String
(Int -> StatusCode -> ShowS)
-> (StatusCode -> String)
-> ([StatusCode] -> ShowS)
-> Show StatusCode
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> StatusCode -> ShowS
showsPrec :: Int -> StatusCode -> ShowS
$cshow :: StatusCode -> String
show :: StatusCode -> String
$cshowList :: [StatusCode] -> ShowS
showList :: [StatusCode] -> ShowS
Show)

data Class
  = Success
  | PersistentTransientFailure
  | PermanentFailure
  deriving ((forall x. Class -> Rep Class x)
-> (forall x. Rep Class x -> Class) -> Generic Class
forall x. Rep Class x -> Class
forall x. Class -> Rep Class x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. Class -> Rep Class x
from :: forall x. Class -> Rep Class x
$cto :: forall x. Rep Class x -> Class
to :: forall x. Rep Class x -> Class
Generic, Class -> Class -> Bool
(Class -> Class -> Bool) -> (Class -> Class -> Bool) -> Eq Class
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Class -> Class -> Bool
== :: Class -> Class -> Bool
$c/= :: Class -> Class -> Bool
/= :: Class -> Class -> Bool
Eq, Eq Class
Eq Class =>
(Class -> Class -> Ordering)
-> (Class -> Class -> Bool)
-> (Class -> Class -> Bool)
-> (Class -> Class -> Bool)
-> (Class -> Class -> Bool)
-> (Class -> Class -> Class)
-> (Class -> Class -> Class)
-> Ord Class
Class -> Class -> Bool
Class -> Class -> Ordering
Class -> Class -> Class
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: Class -> Class -> Ordering
compare :: Class -> Class -> Ordering
$c< :: Class -> Class -> Bool
< :: Class -> Class -> Bool
$c<= :: Class -> Class -> Bool
<= :: Class -> Class -> Bool
$c> :: Class -> Class -> Bool
> :: Class -> Class -> Bool
$c>= :: Class -> Class -> Bool
>= :: Class -> Class -> Bool
$cmax :: Class -> Class -> Class
max :: Class -> Class -> Class
$cmin :: Class -> Class -> Class
min :: Class -> Class -> Class
Ord, ReadPrec [Class]
ReadPrec Class
Int -> ReadS Class
ReadS [Class]
(Int -> ReadS Class)
-> ReadS [Class]
-> ReadPrec Class
-> ReadPrec [Class]
-> Read Class
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Class
readsPrec :: Int -> ReadS Class
$creadList :: ReadS [Class]
readList :: ReadS [Class]
$creadPrec :: ReadPrec Class
readPrec :: ReadPrec Class
$creadListPrec :: ReadPrec [Class]
readListPrec :: ReadPrec [Class]
Read, Int -> Class -> ShowS
[Class] -> ShowS
Class -> String
(Int -> Class -> ShowS)
-> (Class -> String) -> ([Class] -> ShowS) -> Show Class
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Class -> ShowS
showsPrec :: Int -> Class -> ShowS
$cshow :: Class -> String
show :: Class -> String
$cshowList :: [Class] -> ShowS
showList :: [Class] -> ShowS
Show)

encodeClass :: Class -> Int
encodeClass :: Class -> Int
encodeClass Class
c = case Class
c of
  Class
Success -> Int
2
  Class
PersistentTransientFailure -> Int
4
  Class
PermanentFailure -> Int
5

decodeClass :: Int -> Maybe Class
decodeClass :: Int -> Maybe Class
decodeClass Int
c = case Int
c of
  Int
2 -> Class -> Maybe Class
forall a. a -> Maybe a
Just Class
Success
  Int
4 -> Class -> Maybe Class
forall a. a -> Maybe a
Just Class
PersistentTransientFailure
  Int
5 -> Class -> Maybe Class
forall a. a -> Maybe a
Just Class
PermanentFailure
  Int
_ -> Maybe Class
forall a. Maybe a
Nothing

safeToEnum :: forall a. (Bounded a, Enum a) => Int -> Maybe a
safeToEnum :: forall a. (Bounded a, Enum a) => Int -> Maybe a
safeToEnum Int
i
  | Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
< a -> Int
forall a. Enum a => a -> Int
fromEnum (a
forall a. Bounded a => a
minBound :: a)
    Bool -> Bool -> Bool
|| Int
i Int -> Int -> Bool
forall a. Ord a => a -> a -> Bool
> a -> Int
forall a. Enum a => a -> Int
fromEnum (a
forall a. Bounded a => a
maxBound :: a) = Maybe a
forall a. Maybe a
Nothing
  | Bool
otherwise = a -> Maybe a
forall a. a -> Maybe a
Just (Int -> a
forall a. Enum a => Int -> a
toEnum Int
i)

data AddressingDetail
  = OtherAddressDetail
  | BadDestinationMailbox
  | BadDestinationSystem
  | BadDestinationMailboxSyntax
  | DestinationMailboxAmbiguous
  | DestinationAddressValid
  | DestinationMailboxMovedNoForwarding
  | BadSenderMailboxSyntax
  | BadSenderSystemAddress
  deriving ((forall x. AddressingDetail -> Rep AddressingDetail x)
-> (forall x. Rep AddressingDetail x -> AddressingDetail)
-> Generic AddressingDetail
forall x. Rep AddressingDetail x -> AddressingDetail
forall x. AddressingDetail -> Rep AddressingDetail x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. AddressingDetail -> Rep AddressingDetail x
from :: forall x. AddressingDetail -> Rep AddressingDetail x
$cto :: forall x. Rep AddressingDetail x -> AddressingDetail
to :: forall x. Rep AddressingDetail x -> AddressingDetail
Generic, AddressingDetail
AddressingDetail -> AddressingDetail -> Bounded AddressingDetail
forall a. a -> a -> Bounded a
$cminBound :: AddressingDetail
minBound :: AddressingDetail
$cmaxBound :: AddressingDetail
maxBound :: AddressingDetail
Bounded, Int -> AddressingDetail
AddressingDetail -> Int
AddressingDetail -> [AddressingDetail]
AddressingDetail -> AddressingDetail
AddressingDetail -> AddressingDetail -> [AddressingDetail]
AddressingDetail
-> AddressingDetail -> AddressingDetail -> [AddressingDetail]
(AddressingDetail -> AddressingDetail)
-> (AddressingDetail -> AddressingDetail)
-> (Int -> AddressingDetail)
-> (AddressingDetail -> Int)
-> (AddressingDetail -> [AddressingDetail])
-> (AddressingDetail -> AddressingDetail -> [AddressingDetail])
-> (AddressingDetail -> AddressingDetail -> [AddressingDetail])
-> (AddressingDetail
    -> AddressingDetail -> AddressingDetail -> [AddressingDetail])
-> Enum AddressingDetail
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: AddressingDetail -> AddressingDetail
succ :: AddressingDetail -> AddressingDetail
$cpred :: AddressingDetail -> AddressingDetail
pred :: AddressingDetail -> AddressingDetail
$ctoEnum :: Int -> AddressingDetail
toEnum :: Int -> AddressingDetail
$cfromEnum :: AddressingDetail -> Int
fromEnum :: AddressingDetail -> Int
$cenumFrom :: AddressingDetail -> [AddressingDetail]
enumFrom :: AddressingDetail -> [AddressingDetail]
$cenumFromThen :: AddressingDetail -> AddressingDetail -> [AddressingDetail]
enumFromThen :: AddressingDetail -> AddressingDetail -> [AddressingDetail]
$cenumFromTo :: AddressingDetail -> AddressingDetail -> [AddressingDetail]
enumFromTo :: AddressingDetail -> AddressingDetail -> [AddressingDetail]
$cenumFromThenTo :: AddressingDetail
-> AddressingDetail -> AddressingDetail -> [AddressingDetail]
enumFromThenTo :: AddressingDetail
-> AddressingDetail -> AddressingDetail -> [AddressingDetail]
Enum, AddressingDetail -> AddressingDetail -> Bool
(AddressingDetail -> AddressingDetail -> Bool)
-> (AddressingDetail -> AddressingDetail -> Bool)
-> Eq AddressingDetail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AddressingDetail -> AddressingDetail -> Bool
== :: AddressingDetail -> AddressingDetail -> Bool
$c/= :: AddressingDetail -> AddressingDetail -> Bool
/= :: AddressingDetail -> AddressingDetail -> Bool
Eq, Eq AddressingDetail
Eq AddressingDetail =>
(AddressingDetail -> AddressingDetail -> Ordering)
-> (AddressingDetail -> AddressingDetail -> Bool)
-> (AddressingDetail -> AddressingDetail -> Bool)
-> (AddressingDetail -> AddressingDetail -> Bool)
-> (AddressingDetail -> AddressingDetail -> Bool)
-> (AddressingDetail -> AddressingDetail -> AddressingDetail)
-> (AddressingDetail -> AddressingDetail -> AddressingDetail)
-> Ord AddressingDetail
AddressingDetail -> AddressingDetail -> Bool
AddressingDetail -> AddressingDetail -> Ordering
AddressingDetail -> AddressingDetail -> AddressingDetail
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: AddressingDetail -> AddressingDetail -> Ordering
compare :: AddressingDetail -> AddressingDetail -> Ordering
$c< :: AddressingDetail -> AddressingDetail -> Bool
< :: AddressingDetail -> AddressingDetail -> Bool
$c<= :: AddressingDetail -> AddressingDetail -> Bool
<= :: AddressingDetail -> AddressingDetail -> Bool
$c> :: AddressingDetail -> AddressingDetail -> Bool
> :: AddressingDetail -> AddressingDetail -> Bool
$c>= :: AddressingDetail -> AddressingDetail -> Bool
>= :: AddressingDetail -> AddressingDetail -> Bool
$cmax :: AddressingDetail -> AddressingDetail -> AddressingDetail
max :: AddressingDetail -> AddressingDetail -> AddressingDetail
$cmin :: AddressingDetail -> AddressingDetail -> AddressingDetail
min :: AddressingDetail -> AddressingDetail -> AddressingDetail
Ord, ReadPrec [AddressingDetail]
ReadPrec AddressingDetail
Int -> ReadS AddressingDetail
ReadS [AddressingDetail]
(Int -> ReadS AddressingDetail)
-> ReadS [AddressingDetail]
-> ReadPrec AddressingDetail
-> ReadPrec [AddressingDetail]
-> Read AddressingDetail
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS AddressingDetail
readsPrec :: Int -> ReadS AddressingDetail
$creadList :: ReadS [AddressingDetail]
readList :: ReadS [AddressingDetail]
$creadPrec :: ReadPrec AddressingDetail
readPrec :: ReadPrec AddressingDetail
$creadListPrec :: ReadPrec [AddressingDetail]
readListPrec :: ReadPrec [AddressingDetail]
Read, Int -> AddressingDetail -> ShowS
[AddressingDetail] -> ShowS
AddressingDetail -> String
(Int -> AddressingDetail -> ShowS)
-> (AddressingDetail -> String)
-> ([AddressingDetail] -> ShowS)
-> Show AddressingDetail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AddressingDetail -> ShowS
showsPrec :: Int -> AddressingDetail -> ShowS
$cshow :: AddressingDetail -> String
show :: AddressingDetail -> String
$cshowList :: [AddressingDetail] -> ShowS
showList :: [AddressingDetail] -> ShowS
Show)

encodeAddressingDetail :: AddressingDetail -> Int
encodeAddressingDetail :: AddressingDetail -> Int
encodeAddressingDetail = AddressingDetail -> Int
forall a. Enum a => a -> Int
fromEnum

decodeAddressingDetail :: Int -> Maybe AddressingDetail
decodeAddressingDetail :: Int -> Maybe AddressingDetail
decodeAddressingDetail = Int -> Maybe AddressingDetail
forall a. (Bounded a, Enum a) => Int -> Maybe a
safeToEnum

data MailboxDetail
  = OtherMailboxDetail
  | MailboxDisabled
  | MailboxFull
  | MessageLengthExceedsAdminLimit
  | MailingListExpansionProblem
  deriving ((forall x. MailboxDetail -> Rep MailboxDetail x)
-> (forall x. Rep MailboxDetail x -> MailboxDetail)
-> Generic MailboxDetail
forall x. Rep MailboxDetail x -> MailboxDetail
forall x. MailboxDetail -> Rep MailboxDetail x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. MailboxDetail -> Rep MailboxDetail x
from :: forall x. MailboxDetail -> Rep MailboxDetail x
$cto :: forall x. Rep MailboxDetail x -> MailboxDetail
to :: forall x. Rep MailboxDetail x -> MailboxDetail
Generic, MailboxDetail
MailboxDetail -> MailboxDetail -> Bounded MailboxDetail
forall a. a -> a -> Bounded a
$cminBound :: MailboxDetail
minBound :: MailboxDetail
$cmaxBound :: MailboxDetail
maxBound :: MailboxDetail
Bounded, Int -> MailboxDetail
MailboxDetail -> Int
MailboxDetail -> [MailboxDetail]
MailboxDetail -> MailboxDetail
MailboxDetail -> MailboxDetail -> [MailboxDetail]
MailboxDetail -> MailboxDetail -> MailboxDetail -> [MailboxDetail]
(MailboxDetail -> MailboxDetail)
-> (MailboxDetail -> MailboxDetail)
-> (Int -> MailboxDetail)
-> (MailboxDetail -> Int)
-> (MailboxDetail -> [MailboxDetail])
-> (MailboxDetail -> MailboxDetail -> [MailboxDetail])
-> (MailboxDetail -> MailboxDetail -> [MailboxDetail])
-> (MailboxDetail
    -> MailboxDetail -> MailboxDetail -> [MailboxDetail])
-> Enum MailboxDetail
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: MailboxDetail -> MailboxDetail
succ :: MailboxDetail -> MailboxDetail
$cpred :: MailboxDetail -> MailboxDetail
pred :: MailboxDetail -> MailboxDetail
$ctoEnum :: Int -> MailboxDetail
toEnum :: Int -> MailboxDetail
$cfromEnum :: MailboxDetail -> Int
fromEnum :: MailboxDetail -> Int
$cenumFrom :: MailboxDetail -> [MailboxDetail]
enumFrom :: MailboxDetail -> [MailboxDetail]
$cenumFromThen :: MailboxDetail -> MailboxDetail -> [MailboxDetail]
enumFromThen :: MailboxDetail -> MailboxDetail -> [MailboxDetail]
$cenumFromTo :: MailboxDetail -> MailboxDetail -> [MailboxDetail]
enumFromTo :: MailboxDetail -> MailboxDetail -> [MailboxDetail]
$cenumFromThenTo :: MailboxDetail -> MailboxDetail -> MailboxDetail -> [MailboxDetail]
enumFromThenTo :: MailboxDetail -> MailboxDetail -> MailboxDetail -> [MailboxDetail]
Enum, MailboxDetail -> MailboxDetail -> Bool
(MailboxDetail -> MailboxDetail -> Bool)
-> (MailboxDetail -> MailboxDetail -> Bool) -> Eq MailboxDetail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MailboxDetail -> MailboxDetail -> Bool
== :: MailboxDetail -> MailboxDetail -> Bool
$c/= :: MailboxDetail -> MailboxDetail -> Bool
/= :: MailboxDetail -> MailboxDetail -> Bool
Eq, Eq MailboxDetail
Eq MailboxDetail =>
(MailboxDetail -> MailboxDetail -> Ordering)
-> (MailboxDetail -> MailboxDetail -> Bool)
-> (MailboxDetail -> MailboxDetail -> Bool)
-> (MailboxDetail -> MailboxDetail -> Bool)
-> (MailboxDetail -> MailboxDetail -> Bool)
-> (MailboxDetail -> MailboxDetail -> MailboxDetail)
-> (MailboxDetail -> MailboxDetail -> MailboxDetail)
-> Ord MailboxDetail
MailboxDetail -> MailboxDetail -> Bool
MailboxDetail -> MailboxDetail -> Ordering
MailboxDetail -> MailboxDetail -> MailboxDetail
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: MailboxDetail -> MailboxDetail -> Ordering
compare :: MailboxDetail -> MailboxDetail -> Ordering
$c< :: MailboxDetail -> MailboxDetail -> Bool
< :: MailboxDetail -> MailboxDetail -> Bool
$c<= :: MailboxDetail -> MailboxDetail -> Bool
<= :: MailboxDetail -> MailboxDetail -> Bool
$c> :: MailboxDetail -> MailboxDetail -> Bool
> :: MailboxDetail -> MailboxDetail -> Bool
$c>= :: MailboxDetail -> MailboxDetail -> Bool
>= :: MailboxDetail -> MailboxDetail -> Bool
$cmax :: MailboxDetail -> MailboxDetail -> MailboxDetail
max :: MailboxDetail -> MailboxDetail -> MailboxDetail
$cmin :: MailboxDetail -> MailboxDetail -> MailboxDetail
min :: MailboxDetail -> MailboxDetail -> MailboxDetail
Ord, ReadPrec [MailboxDetail]
ReadPrec MailboxDetail
Int -> ReadS MailboxDetail
ReadS [MailboxDetail]
(Int -> ReadS MailboxDetail)
-> ReadS [MailboxDetail]
-> ReadPrec MailboxDetail
-> ReadPrec [MailboxDetail]
-> Read MailboxDetail
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS MailboxDetail
readsPrec :: Int -> ReadS MailboxDetail
$creadList :: ReadS [MailboxDetail]
readList :: ReadS [MailboxDetail]
$creadPrec :: ReadPrec MailboxDetail
readPrec :: ReadPrec MailboxDetail
$creadListPrec :: ReadPrec [MailboxDetail]
readListPrec :: ReadPrec [MailboxDetail]
Read, Int -> MailboxDetail -> ShowS
[MailboxDetail] -> ShowS
MailboxDetail -> String
(Int -> MailboxDetail -> ShowS)
-> (MailboxDetail -> String)
-> ([MailboxDetail] -> ShowS)
-> Show MailboxDetail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MailboxDetail -> ShowS
showsPrec :: Int -> MailboxDetail -> ShowS
$cshow :: MailboxDetail -> String
show :: MailboxDetail -> String
$cshowList :: [MailboxDetail] -> ShowS
showList :: [MailboxDetail] -> ShowS
Show)

encodeMailboxDetail :: MailboxDetail -> Int
encodeMailboxDetail :: MailboxDetail -> Int
encodeMailboxDetail = MailboxDetail -> Int
forall a. Enum a => a -> Int
fromEnum

decodeMailboxDetail :: Int -> Maybe MailboxDetail
decodeMailboxDetail :: Int -> Maybe MailboxDetail
decodeMailboxDetail = Int -> Maybe MailboxDetail
forall a. (Bounded a, Enum a) => Int -> Maybe a
safeToEnum

data MailSystemDetail
  = OtherMailSystemDetail
  | MailSystemFull
  | SystemNotAcceptingMessages
  | SystemNotCapableOfSelectedFeatures
  | MessageTooBigForSystem
  | SystemIncorrectlyConfigured
  deriving ((forall x. MailSystemDetail -> Rep MailSystemDetail x)
-> (forall x. Rep MailSystemDetail x -> MailSystemDetail)
-> Generic MailSystemDetail
forall x. Rep MailSystemDetail x -> MailSystemDetail
forall x. MailSystemDetail -> Rep MailSystemDetail x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. MailSystemDetail -> Rep MailSystemDetail x
from :: forall x. MailSystemDetail -> Rep MailSystemDetail x
$cto :: forall x. Rep MailSystemDetail x -> MailSystemDetail
to :: forall x. Rep MailSystemDetail x -> MailSystemDetail
Generic, MailSystemDetail
MailSystemDetail -> MailSystemDetail -> Bounded MailSystemDetail
forall a. a -> a -> Bounded a
$cminBound :: MailSystemDetail
minBound :: MailSystemDetail
$cmaxBound :: MailSystemDetail
maxBound :: MailSystemDetail
Bounded, Int -> MailSystemDetail
MailSystemDetail -> Int
MailSystemDetail -> [MailSystemDetail]
MailSystemDetail -> MailSystemDetail
MailSystemDetail -> MailSystemDetail -> [MailSystemDetail]
MailSystemDetail
-> MailSystemDetail -> MailSystemDetail -> [MailSystemDetail]
(MailSystemDetail -> MailSystemDetail)
-> (MailSystemDetail -> MailSystemDetail)
-> (Int -> MailSystemDetail)
-> (MailSystemDetail -> Int)
-> (MailSystemDetail -> [MailSystemDetail])
-> (MailSystemDetail -> MailSystemDetail -> [MailSystemDetail])
-> (MailSystemDetail -> MailSystemDetail -> [MailSystemDetail])
-> (MailSystemDetail
    -> MailSystemDetail -> MailSystemDetail -> [MailSystemDetail])
-> Enum MailSystemDetail
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: MailSystemDetail -> MailSystemDetail
succ :: MailSystemDetail -> MailSystemDetail
$cpred :: MailSystemDetail -> MailSystemDetail
pred :: MailSystemDetail -> MailSystemDetail
$ctoEnum :: Int -> MailSystemDetail
toEnum :: Int -> MailSystemDetail
$cfromEnum :: MailSystemDetail -> Int
fromEnum :: MailSystemDetail -> Int
$cenumFrom :: MailSystemDetail -> [MailSystemDetail]
enumFrom :: MailSystemDetail -> [MailSystemDetail]
$cenumFromThen :: MailSystemDetail -> MailSystemDetail -> [MailSystemDetail]
enumFromThen :: MailSystemDetail -> MailSystemDetail -> [MailSystemDetail]
$cenumFromTo :: MailSystemDetail -> MailSystemDetail -> [MailSystemDetail]
enumFromTo :: MailSystemDetail -> MailSystemDetail -> [MailSystemDetail]
$cenumFromThenTo :: MailSystemDetail
-> MailSystemDetail -> MailSystemDetail -> [MailSystemDetail]
enumFromThenTo :: MailSystemDetail
-> MailSystemDetail -> MailSystemDetail -> [MailSystemDetail]
Enum, MailSystemDetail -> MailSystemDetail -> Bool
(MailSystemDetail -> MailSystemDetail -> Bool)
-> (MailSystemDetail -> MailSystemDetail -> Bool)
-> Eq MailSystemDetail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MailSystemDetail -> MailSystemDetail -> Bool
== :: MailSystemDetail -> MailSystemDetail -> Bool
$c/= :: MailSystemDetail -> MailSystemDetail -> Bool
/= :: MailSystemDetail -> MailSystemDetail -> Bool
Eq, Eq MailSystemDetail
Eq MailSystemDetail =>
(MailSystemDetail -> MailSystemDetail -> Ordering)
-> (MailSystemDetail -> MailSystemDetail -> Bool)
-> (MailSystemDetail -> MailSystemDetail -> Bool)
-> (MailSystemDetail -> MailSystemDetail -> Bool)
-> (MailSystemDetail -> MailSystemDetail -> Bool)
-> (MailSystemDetail -> MailSystemDetail -> MailSystemDetail)
-> (MailSystemDetail -> MailSystemDetail -> MailSystemDetail)
-> Ord MailSystemDetail
MailSystemDetail -> MailSystemDetail -> Bool
MailSystemDetail -> MailSystemDetail -> Ordering
MailSystemDetail -> MailSystemDetail -> MailSystemDetail
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: MailSystemDetail -> MailSystemDetail -> Ordering
compare :: MailSystemDetail -> MailSystemDetail -> Ordering
$c< :: MailSystemDetail -> MailSystemDetail -> Bool
< :: MailSystemDetail -> MailSystemDetail -> Bool
$c<= :: MailSystemDetail -> MailSystemDetail -> Bool
<= :: MailSystemDetail -> MailSystemDetail -> Bool
$c> :: MailSystemDetail -> MailSystemDetail -> Bool
> :: MailSystemDetail -> MailSystemDetail -> Bool
$c>= :: MailSystemDetail -> MailSystemDetail -> Bool
>= :: MailSystemDetail -> MailSystemDetail -> Bool
$cmax :: MailSystemDetail -> MailSystemDetail -> MailSystemDetail
max :: MailSystemDetail -> MailSystemDetail -> MailSystemDetail
$cmin :: MailSystemDetail -> MailSystemDetail -> MailSystemDetail
min :: MailSystemDetail -> MailSystemDetail -> MailSystemDetail
Ord, ReadPrec [MailSystemDetail]
ReadPrec MailSystemDetail
Int -> ReadS MailSystemDetail
ReadS [MailSystemDetail]
(Int -> ReadS MailSystemDetail)
-> ReadS [MailSystemDetail]
-> ReadPrec MailSystemDetail
-> ReadPrec [MailSystemDetail]
-> Read MailSystemDetail
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS MailSystemDetail
readsPrec :: Int -> ReadS MailSystemDetail
$creadList :: ReadS [MailSystemDetail]
readList :: ReadS [MailSystemDetail]
$creadPrec :: ReadPrec MailSystemDetail
readPrec :: ReadPrec MailSystemDetail
$creadListPrec :: ReadPrec [MailSystemDetail]
readListPrec :: ReadPrec [MailSystemDetail]
Read, Int -> MailSystemDetail -> ShowS
[MailSystemDetail] -> ShowS
MailSystemDetail -> String
(Int -> MailSystemDetail -> ShowS)
-> (MailSystemDetail -> String)
-> ([MailSystemDetail] -> ShowS)
-> Show MailSystemDetail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MailSystemDetail -> ShowS
showsPrec :: Int -> MailSystemDetail -> ShowS
$cshow :: MailSystemDetail -> String
show :: MailSystemDetail -> String
$cshowList :: [MailSystemDetail] -> ShowS
showList :: [MailSystemDetail] -> ShowS
Show)

encodeMailSystemDetail :: MailSystemDetail -> Int
encodeMailSystemDetail :: MailSystemDetail -> Int
encodeMailSystemDetail = MailSystemDetail -> Int
forall a. Enum a => a -> Int
fromEnum

decodeMailSystemDetail :: Int -> Maybe MailSystemDetail
decodeMailSystemDetail :: Int -> Maybe MailSystemDetail
decodeMailSystemDetail = Int -> Maybe MailSystemDetail
forall a. (Bounded a, Enum a) => Int -> Maybe a
safeToEnum

data NetworkAndRoutingDetail
  = OtherNetworkAndRoutingDetail
  | NoAnswerFromHost
  | BadConnection
  | DirectoryServerFailure
  | UnableToRoute
  | MailSystemCongestion
  | RoutingLoopDetected
  | DeliveryTimeExpired
  deriving ((forall x.
 NetworkAndRoutingDetail -> Rep NetworkAndRoutingDetail x)
-> (forall x.
    Rep NetworkAndRoutingDetail x -> NetworkAndRoutingDetail)
-> Generic NetworkAndRoutingDetail
forall x. Rep NetworkAndRoutingDetail x -> NetworkAndRoutingDetail
forall x. NetworkAndRoutingDetail -> Rep NetworkAndRoutingDetail x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. NetworkAndRoutingDetail -> Rep NetworkAndRoutingDetail x
from :: forall x. NetworkAndRoutingDetail -> Rep NetworkAndRoutingDetail x
$cto :: forall x. Rep NetworkAndRoutingDetail x -> NetworkAndRoutingDetail
to :: forall x. Rep NetworkAndRoutingDetail x -> NetworkAndRoutingDetail
Generic, NetworkAndRoutingDetail
NetworkAndRoutingDetail
-> NetworkAndRoutingDetail -> Bounded NetworkAndRoutingDetail
forall a. a -> a -> Bounded a
$cminBound :: NetworkAndRoutingDetail
minBound :: NetworkAndRoutingDetail
$cmaxBound :: NetworkAndRoutingDetail
maxBound :: NetworkAndRoutingDetail
Bounded, Int -> NetworkAndRoutingDetail
NetworkAndRoutingDetail -> Int
NetworkAndRoutingDetail -> [NetworkAndRoutingDetail]
NetworkAndRoutingDetail -> NetworkAndRoutingDetail
NetworkAndRoutingDetail
-> NetworkAndRoutingDetail -> [NetworkAndRoutingDetail]
NetworkAndRoutingDetail
-> NetworkAndRoutingDetail
-> NetworkAndRoutingDetail
-> [NetworkAndRoutingDetail]
(NetworkAndRoutingDetail -> NetworkAndRoutingDetail)
-> (NetworkAndRoutingDetail -> NetworkAndRoutingDetail)
-> (Int -> NetworkAndRoutingDetail)
-> (NetworkAndRoutingDetail -> Int)
-> (NetworkAndRoutingDetail -> [NetworkAndRoutingDetail])
-> (NetworkAndRoutingDetail
    -> NetworkAndRoutingDetail -> [NetworkAndRoutingDetail])
-> (NetworkAndRoutingDetail
    -> NetworkAndRoutingDetail -> [NetworkAndRoutingDetail])
-> (NetworkAndRoutingDetail
    -> NetworkAndRoutingDetail
    -> NetworkAndRoutingDetail
    -> [NetworkAndRoutingDetail])
-> Enum NetworkAndRoutingDetail
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail
succ :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail
$cpred :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail
pred :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail
$ctoEnum :: Int -> NetworkAndRoutingDetail
toEnum :: Int -> NetworkAndRoutingDetail
$cfromEnum :: NetworkAndRoutingDetail -> Int
fromEnum :: NetworkAndRoutingDetail -> Int
$cenumFrom :: NetworkAndRoutingDetail -> [NetworkAndRoutingDetail]
enumFrom :: NetworkAndRoutingDetail -> [NetworkAndRoutingDetail]
$cenumFromThen :: NetworkAndRoutingDetail
-> NetworkAndRoutingDetail -> [NetworkAndRoutingDetail]
enumFromThen :: NetworkAndRoutingDetail
-> NetworkAndRoutingDetail -> [NetworkAndRoutingDetail]
$cenumFromTo :: NetworkAndRoutingDetail
-> NetworkAndRoutingDetail -> [NetworkAndRoutingDetail]
enumFromTo :: NetworkAndRoutingDetail
-> NetworkAndRoutingDetail -> [NetworkAndRoutingDetail]
$cenumFromThenTo :: NetworkAndRoutingDetail
-> NetworkAndRoutingDetail
-> NetworkAndRoutingDetail
-> [NetworkAndRoutingDetail]
enumFromThenTo :: NetworkAndRoutingDetail
-> NetworkAndRoutingDetail
-> NetworkAndRoutingDetail
-> [NetworkAndRoutingDetail]
Enum, NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
(NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool)
-> (NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool)
-> Eq NetworkAndRoutingDetail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
== :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
$c/= :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
/= :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
Eq, Eq NetworkAndRoutingDetail
Eq NetworkAndRoutingDetail =>
(NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Ordering)
-> (NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool)
-> (NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool)
-> (NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool)
-> (NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool)
-> (NetworkAndRoutingDetail
    -> NetworkAndRoutingDetail -> NetworkAndRoutingDetail)
-> (NetworkAndRoutingDetail
    -> NetworkAndRoutingDetail -> NetworkAndRoutingDetail)
-> Ord NetworkAndRoutingDetail
NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Ordering
NetworkAndRoutingDetail
-> NetworkAndRoutingDetail -> NetworkAndRoutingDetail
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Ordering
compare :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Ordering
$c< :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
< :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
$c<= :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
<= :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
$c> :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
> :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
$c>= :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
>= :: NetworkAndRoutingDetail -> NetworkAndRoutingDetail -> Bool
$cmax :: NetworkAndRoutingDetail
-> NetworkAndRoutingDetail -> NetworkAndRoutingDetail
max :: NetworkAndRoutingDetail
-> NetworkAndRoutingDetail -> NetworkAndRoutingDetail
$cmin :: NetworkAndRoutingDetail
-> NetworkAndRoutingDetail -> NetworkAndRoutingDetail
min :: NetworkAndRoutingDetail
-> NetworkAndRoutingDetail -> NetworkAndRoutingDetail
Ord, ReadPrec [NetworkAndRoutingDetail]
ReadPrec NetworkAndRoutingDetail
Int -> ReadS NetworkAndRoutingDetail
ReadS [NetworkAndRoutingDetail]
(Int -> ReadS NetworkAndRoutingDetail)
-> ReadS [NetworkAndRoutingDetail]
-> ReadPrec NetworkAndRoutingDetail
-> ReadPrec [NetworkAndRoutingDetail]
-> Read NetworkAndRoutingDetail
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS NetworkAndRoutingDetail
readsPrec :: Int -> ReadS NetworkAndRoutingDetail
$creadList :: ReadS [NetworkAndRoutingDetail]
readList :: ReadS [NetworkAndRoutingDetail]
$creadPrec :: ReadPrec NetworkAndRoutingDetail
readPrec :: ReadPrec NetworkAndRoutingDetail
$creadListPrec :: ReadPrec [NetworkAndRoutingDetail]
readListPrec :: ReadPrec [NetworkAndRoutingDetail]
Read, Int -> NetworkAndRoutingDetail -> ShowS
[NetworkAndRoutingDetail] -> ShowS
NetworkAndRoutingDetail -> String
(Int -> NetworkAndRoutingDetail -> ShowS)
-> (NetworkAndRoutingDetail -> String)
-> ([NetworkAndRoutingDetail] -> ShowS)
-> Show NetworkAndRoutingDetail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> NetworkAndRoutingDetail -> ShowS
showsPrec :: Int -> NetworkAndRoutingDetail -> ShowS
$cshow :: NetworkAndRoutingDetail -> String
show :: NetworkAndRoutingDetail -> String
$cshowList :: [NetworkAndRoutingDetail] -> ShowS
showList :: [NetworkAndRoutingDetail] -> ShowS
Show)

encodeNetworkAndRoutingDetail :: NetworkAndRoutingDetail -> Int
encodeNetworkAndRoutingDetail :: NetworkAndRoutingDetail -> Int
encodeNetworkAndRoutingDetail = NetworkAndRoutingDetail -> Int
forall a. Enum a => a -> Int
fromEnum

decodeNetworkAndRoutingDetail :: Int -> Maybe NetworkAndRoutingDetail
decodeNetworkAndRoutingDetail :: Int -> Maybe NetworkAndRoutingDetail
decodeNetworkAndRoutingDetail = Int -> Maybe NetworkAndRoutingDetail
forall a. (Bounded a, Enum a) => Int -> Maybe a
safeToEnum

data DeliveryProtocolDetail
  = OtherDeliveryProtocolDetail
  | InvalidCommand
  | SyntaxError
  | TooManyRecipients
  | InvalidCommandArguments
  | WrongProtocolVersion
  deriving ((forall x. DeliveryProtocolDetail -> Rep DeliveryProtocolDetail x)
-> (forall x.
    Rep DeliveryProtocolDetail x -> DeliveryProtocolDetail)
-> Generic DeliveryProtocolDetail
forall x. Rep DeliveryProtocolDetail x -> DeliveryProtocolDetail
forall x. DeliveryProtocolDetail -> Rep DeliveryProtocolDetail x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. DeliveryProtocolDetail -> Rep DeliveryProtocolDetail x
from :: forall x. DeliveryProtocolDetail -> Rep DeliveryProtocolDetail x
$cto :: forall x. Rep DeliveryProtocolDetail x -> DeliveryProtocolDetail
to :: forall x. Rep DeliveryProtocolDetail x -> DeliveryProtocolDetail
Generic, DeliveryProtocolDetail
DeliveryProtocolDetail
-> DeliveryProtocolDetail -> Bounded DeliveryProtocolDetail
forall a. a -> a -> Bounded a
$cminBound :: DeliveryProtocolDetail
minBound :: DeliveryProtocolDetail
$cmaxBound :: DeliveryProtocolDetail
maxBound :: DeliveryProtocolDetail
Bounded, Int -> DeliveryProtocolDetail
DeliveryProtocolDetail -> Int
DeliveryProtocolDetail -> [DeliveryProtocolDetail]
DeliveryProtocolDetail -> DeliveryProtocolDetail
DeliveryProtocolDetail
-> DeliveryProtocolDetail -> [DeliveryProtocolDetail]
DeliveryProtocolDetail
-> DeliveryProtocolDetail
-> DeliveryProtocolDetail
-> [DeliveryProtocolDetail]
(DeliveryProtocolDetail -> DeliveryProtocolDetail)
-> (DeliveryProtocolDetail -> DeliveryProtocolDetail)
-> (Int -> DeliveryProtocolDetail)
-> (DeliveryProtocolDetail -> Int)
-> (DeliveryProtocolDetail -> [DeliveryProtocolDetail])
-> (DeliveryProtocolDetail
    -> DeliveryProtocolDetail -> [DeliveryProtocolDetail])
-> (DeliveryProtocolDetail
    -> DeliveryProtocolDetail -> [DeliveryProtocolDetail])
-> (DeliveryProtocolDetail
    -> DeliveryProtocolDetail
    -> DeliveryProtocolDetail
    -> [DeliveryProtocolDetail])
-> Enum DeliveryProtocolDetail
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: DeliveryProtocolDetail -> DeliveryProtocolDetail
succ :: DeliveryProtocolDetail -> DeliveryProtocolDetail
$cpred :: DeliveryProtocolDetail -> DeliveryProtocolDetail
pred :: DeliveryProtocolDetail -> DeliveryProtocolDetail
$ctoEnum :: Int -> DeliveryProtocolDetail
toEnum :: Int -> DeliveryProtocolDetail
$cfromEnum :: DeliveryProtocolDetail -> Int
fromEnum :: DeliveryProtocolDetail -> Int
$cenumFrom :: DeliveryProtocolDetail -> [DeliveryProtocolDetail]
enumFrom :: DeliveryProtocolDetail -> [DeliveryProtocolDetail]
$cenumFromThen :: DeliveryProtocolDetail
-> DeliveryProtocolDetail -> [DeliveryProtocolDetail]
enumFromThen :: DeliveryProtocolDetail
-> DeliveryProtocolDetail -> [DeliveryProtocolDetail]
$cenumFromTo :: DeliveryProtocolDetail
-> DeliveryProtocolDetail -> [DeliveryProtocolDetail]
enumFromTo :: DeliveryProtocolDetail
-> DeliveryProtocolDetail -> [DeliveryProtocolDetail]
$cenumFromThenTo :: DeliveryProtocolDetail
-> DeliveryProtocolDetail
-> DeliveryProtocolDetail
-> [DeliveryProtocolDetail]
enumFromThenTo :: DeliveryProtocolDetail
-> DeliveryProtocolDetail
-> DeliveryProtocolDetail
-> [DeliveryProtocolDetail]
Enum, DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
(DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool)
-> (DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool)
-> Eq DeliveryProtocolDetail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
== :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
$c/= :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
/= :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
Eq, Eq DeliveryProtocolDetail
Eq DeliveryProtocolDetail =>
(DeliveryProtocolDetail -> DeliveryProtocolDetail -> Ordering)
-> (DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool)
-> (DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool)
-> (DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool)
-> (DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool)
-> (DeliveryProtocolDetail
    -> DeliveryProtocolDetail -> DeliveryProtocolDetail)
-> (DeliveryProtocolDetail
    -> DeliveryProtocolDetail -> DeliveryProtocolDetail)
-> Ord DeliveryProtocolDetail
DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
DeliveryProtocolDetail -> DeliveryProtocolDetail -> Ordering
DeliveryProtocolDetail
-> DeliveryProtocolDetail -> DeliveryProtocolDetail
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Ordering
compare :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Ordering
$c< :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
< :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
$c<= :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
<= :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
$c> :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
> :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
$c>= :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
>= :: DeliveryProtocolDetail -> DeliveryProtocolDetail -> Bool
$cmax :: DeliveryProtocolDetail
-> DeliveryProtocolDetail -> DeliveryProtocolDetail
max :: DeliveryProtocolDetail
-> DeliveryProtocolDetail -> DeliveryProtocolDetail
$cmin :: DeliveryProtocolDetail
-> DeliveryProtocolDetail -> DeliveryProtocolDetail
min :: DeliveryProtocolDetail
-> DeliveryProtocolDetail -> DeliveryProtocolDetail
Ord, ReadPrec [DeliveryProtocolDetail]
ReadPrec DeliveryProtocolDetail
Int -> ReadS DeliveryProtocolDetail
ReadS [DeliveryProtocolDetail]
(Int -> ReadS DeliveryProtocolDetail)
-> ReadS [DeliveryProtocolDetail]
-> ReadPrec DeliveryProtocolDetail
-> ReadPrec [DeliveryProtocolDetail]
-> Read DeliveryProtocolDetail
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS DeliveryProtocolDetail
readsPrec :: Int -> ReadS DeliveryProtocolDetail
$creadList :: ReadS [DeliveryProtocolDetail]
readList :: ReadS [DeliveryProtocolDetail]
$creadPrec :: ReadPrec DeliveryProtocolDetail
readPrec :: ReadPrec DeliveryProtocolDetail
$creadListPrec :: ReadPrec [DeliveryProtocolDetail]
readListPrec :: ReadPrec [DeliveryProtocolDetail]
Read, Int -> DeliveryProtocolDetail -> ShowS
[DeliveryProtocolDetail] -> ShowS
DeliveryProtocolDetail -> String
(Int -> DeliveryProtocolDetail -> ShowS)
-> (DeliveryProtocolDetail -> String)
-> ([DeliveryProtocolDetail] -> ShowS)
-> Show DeliveryProtocolDetail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> DeliveryProtocolDetail -> ShowS
showsPrec :: Int -> DeliveryProtocolDetail -> ShowS
$cshow :: DeliveryProtocolDetail -> String
show :: DeliveryProtocolDetail -> String
$cshowList :: [DeliveryProtocolDetail] -> ShowS
showList :: [DeliveryProtocolDetail] -> ShowS
Show)

encodeDeliveryProtocolDetail :: DeliveryProtocolDetail -> Int
encodeDeliveryProtocolDetail :: DeliveryProtocolDetail -> Int
encodeDeliveryProtocolDetail = DeliveryProtocolDetail -> Int
forall a. Enum a => a -> Int
fromEnum

decodeDeliveryProtocolDetail :: Int -> Maybe DeliveryProtocolDetail
decodeDeliveryProtocolDetail :: Int -> Maybe DeliveryProtocolDetail
decodeDeliveryProtocolDetail = Int -> Maybe DeliveryProtocolDetail
forall a. (Bounded a, Enum a) => Int -> Maybe a
safeToEnum

data MessageContentOrMediaDetail
  = OtherContentOrMediaDetail
  | MediaNotSupported
  | ConversionRequiredAndProhibited
  | ConversionRequiredAndUnsupported
  | ConversionWithLossPerformed
  | ConversionFailed
  deriving ((forall x.
 MessageContentOrMediaDetail -> Rep MessageContentOrMediaDetail x)
-> (forall x.
    Rep MessageContentOrMediaDetail x -> MessageContentOrMediaDetail)
-> Generic MessageContentOrMediaDetail
forall x.
Rep MessageContentOrMediaDetail x -> MessageContentOrMediaDetail
forall x.
MessageContentOrMediaDetail -> Rep MessageContentOrMediaDetail x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x.
MessageContentOrMediaDetail -> Rep MessageContentOrMediaDetail x
from :: forall x.
MessageContentOrMediaDetail -> Rep MessageContentOrMediaDetail x
$cto :: forall x.
Rep MessageContentOrMediaDetail x -> MessageContentOrMediaDetail
to :: forall x.
Rep MessageContentOrMediaDetail x -> MessageContentOrMediaDetail
Generic, MessageContentOrMediaDetail
MessageContentOrMediaDetail
-> MessageContentOrMediaDetail
-> Bounded MessageContentOrMediaDetail
forall a. a -> a -> Bounded a
$cminBound :: MessageContentOrMediaDetail
minBound :: MessageContentOrMediaDetail
$cmaxBound :: MessageContentOrMediaDetail
maxBound :: MessageContentOrMediaDetail
Bounded, Int -> MessageContentOrMediaDetail
MessageContentOrMediaDetail -> Int
MessageContentOrMediaDetail -> [MessageContentOrMediaDetail]
MessageContentOrMediaDetail -> MessageContentOrMediaDetail
MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> [MessageContentOrMediaDetail]
MessageContentOrMediaDetail
-> MessageContentOrMediaDetail
-> MessageContentOrMediaDetail
-> [MessageContentOrMediaDetail]
(MessageContentOrMediaDetail -> MessageContentOrMediaDetail)
-> (MessageContentOrMediaDetail -> MessageContentOrMediaDetail)
-> (Int -> MessageContentOrMediaDetail)
-> (MessageContentOrMediaDetail -> Int)
-> (MessageContentOrMediaDetail -> [MessageContentOrMediaDetail])
-> (MessageContentOrMediaDetail
    -> MessageContentOrMediaDetail -> [MessageContentOrMediaDetail])
-> (MessageContentOrMediaDetail
    -> MessageContentOrMediaDetail -> [MessageContentOrMediaDetail])
-> (MessageContentOrMediaDetail
    -> MessageContentOrMediaDetail
    -> MessageContentOrMediaDetail
    -> [MessageContentOrMediaDetail])
-> Enum MessageContentOrMediaDetail
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail
succ :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail
$cpred :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail
pred :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail
$ctoEnum :: Int -> MessageContentOrMediaDetail
toEnum :: Int -> MessageContentOrMediaDetail
$cfromEnum :: MessageContentOrMediaDetail -> Int
fromEnum :: MessageContentOrMediaDetail -> Int
$cenumFrom :: MessageContentOrMediaDetail -> [MessageContentOrMediaDetail]
enumFrom :: MessageContentOrMediaDetail -> [MessageContentOrMediaDetail]
$cenumFromThen :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> [MessageContentOrMediaDetail]
enumFromThen :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> [MessageContentOrMediaDetail]
$cenumFromTo :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> [MessageContentOrMediaDetail]
enumFromTo :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> [MessageContentOrMediaDetail]
$cenumFromThenTo :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail
-> MessageContentOrMediaDetail
-> [MessageContentOrMediaDetail]
enumFromThenTo :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail
-> MessageContentOrMediaDetail
-> [MessageContentOrMediaDetail]
Enum, MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
(MessageContentOrMediaDetail
 -> MessageContentOrMediaDetail -> Bool)
-> (MessageContentOrMediaDetail
    -> MessageContentOrMediaDetail -> Bool)
-> Eq MessageContentOrMediaDetail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
== :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
$c/= :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
/= :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
Eq, Eq MessageContentOrMediaDetail
Eq MessageContentOrMediaDetail =>
(MessageContentOrMediaDetail
 -> MessageContentOrMediaDetail -> Ordering)
-> (MessageContentOrMediaDetail
    -> MessageContentOrMediaDetail -> Bool)
-> (MessageContentOrMediaDetail
    -> MessageContentOrMediaDetail -> Bool)
-> (MessageContentOrMediaDetail
    -> MessageContentOrMediaDetail -> Bool)
-> (MessageContentOrMediaDetail
    -> MessageContentOrMediaDetail -> Bool)
-> (MessageContentOrMediaDetail
    -> MessageContentOrMediaDetail -> MessageContentOrMediaDetail)
-> (MessageContentOrMediaDetail
    -> MessageContentOrMediaDetail -> MessageContentOrMediaDetail)
-> Ord MessageContentOrMediaDetail
MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> Ordering
MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> MessageContentOrMediaDetail
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> Ordering
compare :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> Ordering
$c< :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
< :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
$c<= :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
<= :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
$c> :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
> :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
$c>= :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
>= :: MessageContentOrMediaDetail -> MessageContentOrMediaDetail -> Bool
$cmax :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> MessageContentOrMediaDetail
max :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> MessageContentOrMediaDetail
$cmin :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> MessageContentOrMediaDetail
min :: MessageContentOrMediaDetail
-> MessageContentOrMediaDetail -> MessageContentOrMediaDetail
Ord, ReadPrec [MessageContentOrMediaDetail]
ReadPrec MessageContentOrMediaDetail
Int -> ReadS MessageContentOrMediaDetail
ReadS [MessageContentOrMediaDetail]
(Int -> ReadS MessageContentOrMediaDetail)
-> ReadS [MessageContentOrMediaDetail]
-> ReadPrec MessageContentOrMediaDetail
-> ReadPrec [MessageContentOrMediaDetail]
-> Read MessageContentOrMediaDetail
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS MessageContentOrMediaDetail
readsPrec :: Int -> ReadS MessageContentOrMediaDetail
$creadList :: ReadS [MessageContentOrMediaDetail]
readList :: ReadS [MessageContentOrMediaDetail]
$creadPrec :: ReadPrec MessageContentOrMediaDetail
readPrec :: ReadPrec MessageContentOrMediaDetail
$creadListPrec :: ReadPrec [MessageContentOrMediaDetail]
readListPrec :: ReadPrec [MessageContentOrMediaDetail]
Read, Int -> MessageContentOrMediaDetail -> ShowS
[MessageContentOrMediaDetail] -> ShowS
MessageContentOrMediaDetail -> String
(Int -> MessageContentOrMediaDetail -> ShowS)
-> (MessageContentOrMediaDetail -> String)
-> ([MessageContentOrMediaDetail] -> ShowS)
-> Show MessageContentOrMediaDetail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> MessageContentOrMediaDetail -> ShowS
showsPrec :: Int -> MessageContentOrMediaDetail -> ShowS
$cshow :: MessageContentOrMediaDetail -> String
show :: MessageContentOrMediaDetail -> String
$cshowList :: [MessageContentOrMediaDetail] -> ShowS
showList :: [MessageContentOrMediaDetail] -> ShowS
Show)

encodeMessageContentOrMediaDetail :: MessageContentOrMediaDetail -> Int
encodeMessageContentOrMediaDetail :: MessageContentOrMediaDetail -> Int
encodeMessageContentOrMediaDetail = MessageContentOrMediaDetail -> Int
forall a. Enum a => a -> Int
fromEnum

decodeMessageContentOrMediaDetail :: Int -> Maybe MessageContentOrMediaDetail
decodeMessageContentOrMediaDetail :: Int -> Maybe MessageContentOrMediaDetail
decodeMessageContentOrMediaDetail = Int -> Maybe MessageContentOrMediaDetail
forall a. (Bounded a, Enum a) => Int -> Maybe a
safeToEnum

data SecurityOrPolicyDetail
  = OtherSecurityOrPolicyDetail
  | DeliveryNotAuthorized
  | MailingListExpansionProhibited
  | SecurityConversionRequiredButNotPossible
  | SecurityFeaturesNotSupported
  | CryptographicFailure
  | CryptographicAlgorithmNotSupported
  | MessageIntegrityFailure
  deriving ((forall x. SecurityOrPolicyDetail -> Rep SecurityOrPolicyDetail x)
-> (forall x.
    Rep SecurityOrPolicyDetail x -> SecurityOrPolicyDetail)
-> Generic SecurityOrPolicyDetail
forall x. Rep SecurityOrPolicyDetail x -> SecurityOrPolicyDetail
forall x. SecurityOrPolicyDetail -> Rep SecurityOrPolicyDetail x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. SecurityOrPolicyDetail -> Rep SecurityOrPolicyDetail x
from :: forall x. SecurityOrPolicyDetail -> Rep SecurityOrPolicyDetail x
$cto :: forall x. Rep SecurityOrPolicyDetail x -> SecurityOrPolicyDetail
to :: forall x. Rep SecurityOrPolicyDetail x -> SecurityOrPolicyDetail
Generic, SecurityOrPolicyDetail
SecurityOrPolicyDetail
-> SecurityOrPolicyDetail -> Bounded SecurityOrPolicyDetail
forall a. a -> a -> Bounded a
$cminBound :: SecurityOrPolicyDetail
minBound :: SecurityOrPolicyDetail
$cmaxBound :: SecurityOrPolicyDetail
maxBound :: SecurityOrPolicyDetail
Bounded, Int -> SecurityOrPolicyDetail
SecurityOrPolicyDetail -> Int
SecurityOrPolicyDetail -> [SecurityOrPolicyDetail]
SecurityOrPolicyDetail -> SecurityOrPolicyDetail
SecurityOrPolicyDetail
-> SecurityOrPolicyDetail -> [SecurityOrPolicyDetail]
SecurityOrPolicyDetail
-> SecurityOrPolicyDetail
-> SecurityOrPolicyDetail
-> [SecurityOrPolicyDetail]
(SecurityOrPolicyDetail -> SecurityOrPolicyDetail)
-> (SecurityOrPolicyDetail -> SecurityOrPolicyDetail)
-> (Int -> SecurityOrPolicyDetail)
-> (SecurityOrPolicyDetail -> Int)
-> (SecurityOrPolicyDetail -> [SecurityOrPolicyDetail])
-> (SecurityOrPolicyDetail
    -> SecurityOrPolicyDetail -> [SecurityOrPolicyDetail])
-> (SecurityOrPolicyDetail
    -> SecurityOrPolicyDetail -> [SecurityOrPolicyDetail])
-> (SecurityOrPolicyDetail
    -> SecurityOrPolicyDetail
    -> SecurityOrPolicyDetail
    -> [SecurityOrPolicyDetail])
-> Enum SecurityOrPolicyDetail
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
$csucc :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail
succ :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail
$cpred :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail
pred :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail
$ctoEnum :: Int -> SecurityOrPolicyDetail
toEnum :: Int -> SecurityOrPolicyDetail
$cfromEnum :: SecurityOrPolicyDetail -> Int
fromEnum :: SecurityOrPolicyDetail -> Int
$cenumFrom :: SecurityOrPolicyDetail -> [SecurityOrPolicyDetail]
enumFrom :: SecurityOrPolicyDetail -> [SecurityOrPolicyDetail]
$cenumFromThen :: SecurityOrPolicyDetail
-> SecurityOrPolicyDetail -> [SecurityOrPolicyDetail]
enumFromThen :: SecurityOrPolicyDetail
-> SecurityOrPolicyDetail -> [SecurityOrPolicyDetail]
$cenumFromTo :: SecurityOrPolicyDetail
-> SecurityOrPolicyDetail -> [SecurityOrPolicyDetail]
enumFromTo :: SecurityOrPolicyDetail
-> SecurityOrPolicyDetail -> [SecurityOrPolicyDetail]
$cenumFromThenTo :: SecurityOrPolicyDetail
-> SecurityOrPolicyDetail
-> SecurityOrPolicyDetail
-> [SecurityOrPolicyDetail]
enumFromThenTo :: SecurityOrPolicyDetail
-> SecurityOrPolicyDetail
-> SecurityOrPolicyDetail
-> [SecurityOrPolicyDetail]
Enum, SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
(SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool)
-> (SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool)
-> Eq SecurityOrPolicyDetail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
== :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
$c/= :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
/= :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
Eq, Eq SecurityOrPolicyDetail
Eq SecurityOrPolicyDetail =>
(SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Ordering)
-> (SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool)
-> (SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool)
-> (SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool)
-> (SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool)
-> (SecurityOrPolicyDetail
    -> SecurityOrPolicyDetail -> SecurityOrPolicyDetail)
-> (SecurityOrPolicyDetail
    -> SecurityOrPolicyDetail -> SecurityOrPolicyDetail)
-> Ord SecurityOrPolicyDetail
SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Ordering
SecurityOrPolicyDetail
-> SecurityOrPolicyDetail -> SecurityOrPolicyDetail
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Ordering
compare :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Ordering
$c< :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
< :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
$c<= :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
<= :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
$c> :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
> :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
$c>= :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
>= :: SecurityOrPolicyDetail -> SecurityOrPolicyDetail -> Bool
$cmax :: SecurityOrPolicyDetail
-> SecurityOrPolicyDetail -> SecurityOrPolicyDetail
max :: SecurityOrPolicyDetail
-> SecurityOrPolicyDetail -> SecurityOrPolicyDetail
$cmin :: SecurityOrPolicyDetail
-> SecurityOrPolicyDetail -> SecurityOrPolicyDetail
min :: SecurityOrPolicyDetail
-> SecurityOrPolicyDetail -> SecurityOrPolicyDetail
Ord, ReadPrec [SecurityOrPolicyDetail]
ReadPrec SecurityOrPolicyDetail
Int -> ReadS SecurityOrPolicyDetail
ReadS [SecurityOrPolicyDetail]
(Int -> ReadS SecurityOrPolicyDetail)
-> ReadS [SecurityOrPolicyDetail]
-> ReadPrec SecurityOrPolicyDetail
-> ReadPrec [SecurityOrPolicyDetail]
-> Read SecurityOrPolicyDetail
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS SecurityOrPolicyDetail
readsPrec :: Int -> ReadS SecurityOrPolicyDetail
$creadList :: ReadS [SecurityOrPolicyDetail]
readList :: ReadS [SecurityOrPolicyDetail]
$creadPrec :: ReadPrec SecurityOrPolicyDetail
readPrec :: ReadPrec SecurityOrPolicyDetail
$creadListPrec :: ReadPrec [SecurityOrPolicyDetail]
readListPrec :: ReadPrec [SecurityOrPolicyDetail]
Read, Int -> SecurityOrPolicyDetail -> ShowS
[SecurityOrPolicyDetail] -> ShowS
SecurityOrPolicyDetail -> String
(Int -> SecurityOrPolicyDetail -> ShowS)
-> (SecurityOrPolicyDetail -> String)
-> ([SecurityOrPolicyDetail] -> ShowS)
-> Show SecurityOrPolicyDetail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SecurityOrPolicyDetail -> ShowS
showsPrec :: Int -> SecurityOrPolicyDetail -> ShowS
$cshow :: SecurityOrPolicyDetail -> String
show :: SecurityOrPolicyDetail -> String
$cshowList :: [SecurityOrPolicyDetail] -> ShowS
showList :: [SecurityOrPolicyDetail] -> ShowS
Show)

encodeSecurityOrPolicyDetail :: SecurityOrPolicyDetail -> Int
encodeSecurityOrPolicyDetail :: SecurityOrPolicyDetail -> Int
encodeSecurityOrPolicyDetail = SecurityOrPolicyDetail -> Int
forall a. Enum a => a -> Int
fromEnum

decodeSecurityOrPolicyDetail :: Int -> Maybe SecurityOrPolicyDetail
decodeSecurityOrPolicyDetail :: Int -> Maybe SecurityOrPolicyDetail
decodeSecurityOrPolicyDetail = Int -> Maybe SecurityOrPolicyDetail
forall a. (Bounded a, Enum a) => Int -> Maybe a
safeToEnum

data SubjectDetail
  = OtherSubjectDetail
  | Addressing AddressingDetail
  | Mailbox MailboxDetail
  | MailSystem MailSystemDetail
  | NetworkAndRouting NetworkAndRoutingDetail
  | MailDeliveryProtocol DeliveryProtocolDetail
  | MessageContentOrMedia MessageContentOrMediaDetail
  | SecurityOrPolicy SecurityOrPolicyDetail
  deriving ((forall x. SubjectDetail -> Rep SubjectDetail x)
-> (forall x. Rep SubjectDetail x -> SubjectDetail)
-> Generic SubjectDetail
forall x. Rep SubjectDetail x -> SubjectDetail
forall x. SubjectDetail -> Rep SubjectDetail x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cfrom :: forall x. SubjectDetail -> Rep SubjectDetail x
from :: forall x. SubjectDetail -> Rep SubjectDetail x
$cto :: forall x. Rep SubjectDetail x -> SubjectDetail
to :: forall x. Rep SubjectDetail x -> SubjectDetail
Generic, SubjectDetail -> SubjectDetail -> Bool
(SubjectDetail -> SubjectDetail -> Bool)
-> (SubjectDetail -> SubjectDetail -> Bool) -> Eq SubjectDetail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SubjectDetail -> SubjectDetail -> Bool
== :: SubjectDetail -> SubjectDetail -> Bool
$c/= :: SubjectDetail -> SubjectDetail -> Bool
/= :: SubjectDetail -> SubjectDetail -> Bool
Eq, Eq SubjectDetail
Eq SubjectDetail =>
(SubjectDetail -> SubjectDetail -> Ordering)
-> (SubjectDetail -> SubjectDetail -> Bool)
-> (SubjectDetail -> SubjectDetail -> Bool)
-> (SubjectDetail -> SubjectDetail -> Bool)
-> (SubjectDetail -> SubjectDetail -> Bool)
-> (SubjectDetail -> SubjectDetail -> SubjectDetail)
-> (SubjectDetail -> SubjectDetail -> SubjectDetail)
-> Ord SubjectDetail
SubjectDetail -> SubjectDetail -> Bool
SubjectDetail -> SubjectDetail -> Ordering
SubjectDetail -> SubjectDetail -> SubjectDetail
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: SubjectDetail -> SubjectDetail -> Ordering
compare :: SubjectDetail -> SubjectDetail -> Ordering
$c< :: SubjectDetail -> SubjectDetail -> Bool
< :: SubjectDetail -> SubjectDetail -> Bool
$c<= :: SubjectDetail -> SubjectDetail -> Bool
<= :: SubjectDetail -> SubjectDetail -> Bool
$c> :: SubjectDetail -> SubjectDetail -> Bool
> :: SubjectDetail -> SubjectDetail -> Bool
$c>= :: SubjectDetail -> SubjectDetail -> Bool
>= :: SubjectDetail -> SubjectDetail -> Bool
$cmax :: SubjectDetail -> SubjectDetail -> SubjectDetail
max :: SubjectDetail -> SubjectDetail -> SubjectDetail
$cmin :: SubjectDetail -> SubjectDetail -> SubjectDetail
min :: SubjectDetail -> SubjectDetail -> SubjectDetail
Ord, ReadPrec [SubjectDetail]
ReadPrec SubjectDetail
Int -> ReadS SubjectDetail
ReadS [SubjectDetail]
(Int -> ReadS SubjectDetail)
-> ReadS [SubjectDetail]
-> ReadPrec SubjectDetail
-> ReadPrec [SubjectDetail]
-> Read SubjectDetail
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS SubjectDetail
readsPrec :: Int -> ReadS SubjectDetail
$creadList :: ReadS [SubjectDetail]
readList :: ReadS [SubjectDetail]
$creadPrec :: ReadPrec SubjectDetail
readPrec :: ReadPrec SubjectDetail
$creadListPrec :: ReadPrec [SubjectDetail]
readListPrec :: ReadPrec [SubjectDetail]
Read, Int -> SubjectDetail -> ShowS
[SubjectDetail] -> ShowS
SubjectDetail -> String
(Int -> SubjectDetail -> ShowS)
-> (SubjectDetail -> String)
-> ([SubjectDetail] -> ShowS)
-> Show SubjectDetail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SubjectDetail -> ShowS
showsPrec :: Int -> SubjectDetail -> ShowS
$cshow :: SubjectDetail -> String
show :: SubjectDetail -> String
$cshowList :: [SubjectDetail] -> ShowS
showList :: [SubjectDetail] -> ShowS
Show)

decodeSubjectDetail :: Int -> Int -> Maybe SubjectDetail
decodeSubjectDetail :: Int -> Int -> Maybe SubjectDetail
decodeSubjectDetail Int
subjectNum Int
detailNum =
  case Int
subjectNum of
    Int
0 | Int
detailNum Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== Int
0 -> SubjectDetail -> Maybe SubjectDetail
forall a. a -> Maybe a
Just SubjectDetail
OtherSubjectDetail
      | Bool
otherwise -> Maybe SubjectDetail
forall a. Maybe a
Nothing
    Int
1 -> AddressingDetail -> SubjectDetail
Addressing (AddressingDetail -> SubjectDetail)
-> Maybe AddressingDetail -> Maybe SubjectDetail
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Maybe AddressingDetail
decodeAddressingDetail Int
detailNum
    Int
2 -> MailboxDetail -> SubjectDetail
Mailbox (MailboxDetail -> SubjectDetail)
-> Maybe MailboxDetail -> Maybe SubjectDetail
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Maybe MailboxDetail
decodeMailboxDetail Int
detailNum
    Int
3 -> MailSystemDetail -> SubjectDetail
MailSystem (MailSystemDetail -> SubjectDetail)
-> Maybe MailSystemDetail -> Maybe SubjectDetail
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Maybe MailSystemDetail
decodeMailSystemDetail Int
detailNum
    Int
4 -> NetworkAndRoutingDetail -> SubjectDetail
NetworkAndRouting (NetworkAndRoutingDetail -> SubjectDetail)
-> Maybe NetworkAndRoutingDetail -> Maybe SubjectDetail
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Maybe NetworkAndRoutingDetail
decodeNetworkAndRoutingDetail Int
detailNum
    Int
5 -> DeliveryProtocolDetail -> SubjectDetail
MailDeliveryProtocol (DeliveryProtocolDetail -> SubjectDetail)
-> Maybe DeliveryProtocolDetail -> Maybe SubjectDetail
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Maybe DeliveryProtocolDetail
decodeDeliveryProtocolDetail Int
detailNum
    Int
6 -> MessageContentOrMediaDetail -> SubjectDetail
MessageContentOrMedia (MessageContentOrMediaDetail -> SubjectDetail)
-> Maybe MessageContentOrMediaDetail -> Maybe SubjectDetail
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Maybe MessageContentOrMediaDetail
decodeMessageContentOrMediaDetail Int
detailNum
    Int
7 -> SecurityOrPolicyDetail -> SubjectDetail
SecurityOrPolicy (SecurityOrPolicyDetail -> SubjectDetail)
-> Maybe SecurityOrPolicyDetail -> Maybe SubjectDetail
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Maybe SecurityOrPolicyDetail
decodeSecurityOrPolicyDetail Int
detailNum
    Int
_ -> Maybe SubjectDetail
forall a. Maybe a
Nothing

encodeSubjectDetail :: SubjectDetail -> (Int, Int)
encodeSubjectDetail :: SubjectDetail -> (Int, Int)
encodeSubjectDetail SubjectDetail
sd = case SubjectDetail
sd of
  SubjectDetail
OtherSubjectDetail -> (Int
0, Int
0)
  Addressing AddressingDetail
d -> (Int
1, AddressingDetail -> Int
encodeAddressingDetail AddressingDetail
d)
  Mailbox MailboxDetail
d -> (Int
2, MailboxDetail -> Int
encodeMailboxDetail MailboxDetail
d)
  MailSystem MailSystemDetail
d -> (Int
3, MailSystemDetail -> Int
encodeMailSystemDetail MailSystemDetail
d)
  NetworkAndRouting NetworkAndRoutingDetail
d -> (Int
4, NetworkAndRoutingDetail -> Int
encodeNetworkAndRoutingDetail NetworkAndRoutingDetail
d)
  MailDeliveryProtocol DeliveryProtocolDetail
d -> (Int
5, DeliveryProtocolDetail -> Int
encodeDeliveryProtocolDetail DeliveryProtocolDetail
d)
  MessageContentOrMedia MessageContentOrMediaDetail
d -> (Int
6, MessageContentOrMediaDetail -> Int
encodeMessageContentOrMediaDetail MessageContentOrMediaDetail
d)
  SecurityOrPolicy SecurityOrPolicyDetail
d -> (Int
7, SecurityOrPolicyDetail -> Int
encodeSecurityOrPolicyDetail SecurityOrPolicyDetail
d)

parseNums :: String -> Maybe ((Int, Int, Int), String)
parseNums :: String -> Maybe ((Int, Int, Int), String)
parseNums String
inp = do
  (Int
classNum, String
afterClass) <- String -> Maybe (Int, String)
forall {a}. Read a => String -> Maybe (a, String)
digitDot String
inp
  (Int
subjectNum, String
afterSubject) <- String -> Maybe (Int, String)
forall {a}. Read a => String -> Maybe (a, String)
digitDot String
afterClass
  case (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
span Char -> Bool
isDigit String
afterSubject of
    (String
ns, String
rest) -> (, String
rest) ((Int, Int, Int) -> ((Int, Int, Int), String))
-> (Int -> (Int, Int, Int)) -> Int -> ((Int, Int, Int), String)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Int
classNum, Int
subjectNum,) (Int -> ((Int, Int, Int), String))
-> Maybe Int -> Maybe ((Int, Int, Int), String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Maybe Int
forall a. Read a => String -> Maybe a
readMaybe String
ns
  where
    digitDot :: String -> Maybe (a, String)
digitDot String
s = case (Char -> Bool) -> String -> (String, String)
forall a. (a -> Bool) -> [a] -> ([a], [a])
break (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== Char
'.') String
s of
      (String
ns, Char
_ : String
rest) -> (, String
rest) (a -> (a, String)) -> Maybe a -> Maybe (a, String)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> String -> Maybe a
forall a. Read a => String -> Maybe a
readMaybe String
ns
      (String, String)
_ -> Maybe (a, String)
forall a. Maybe a
Nothing

parseWithRemainder :: String -> Maybe (StatusCode, String)
parseWithRemainder :: String -> Maybe (StatusCode, String)
parseWithRemainder String
s = do
  ((Int
classNum, Int
subjectNum, Int
detailNum), String
rest) <- String -> Maybe ((Int, Int, Int), String)
parseNums String
s
  StatusCode
code <- Class -> SubjectDetail -> StatusCode
StatusCode
    (Class -> SubjectDetail -> StatusCode)
-> Maybe Class -> Maybe (SubjectDetail -> StatusCode)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int -> Maybe Class
decodeClass Int
classNum
    Maybe (SubjectDetail -> StatusCode)
-> Maybe SubjectDetail -> Maybe StatusCode
forall a b. Maybe (a -> b) -> Maybe a -> Maybe b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Int -> Int -> Maybe SubjectDetail
decodeSubjectDetail Int
subjectNum Int
detailNum
  (StatusCode, String) -> Maybe (StatusCode, String)
forall a. a -> Maybe a
Just (StatusCode
code, String
rest)

parse :: String -> Maybe StatusCode
parse :: String -> Maybe StatusCode
parse String
s = do
  (StatusCode
code, String
r) <- String -> Maybe (StatusCode, String)
parseWithRemainder String
s
  if (Char -> Bool) -> String -> Bool
forall (t :: * -> *) a. Foldable t => (a -> Bool) -> t a -> Bool
all Char -> Bool
isSpace String
r
    then StatusCode -> Maybe StatusCode
forall a. a -> Maybe a
Just StatusCode
code
    else Maybe StatusCode
forall a. Maybe a
Nothing

encodeString :: StatusCode -> String
encodeString :: StatusCode -> String
encodeString (StatusCode Class
cl SubjectDetail
sd) =
  Int -> ShowS
forall a. Show a => a -> ShowS
shows (Class -> Int
encodeClass Class
cl)
  ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
"."
  ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Int -> ShowS
forall a. Show a => a -> ShowS
shows Int
subjectNum
  ShowS -> ShowS -> ShowS
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> ShowS
showString String
"."
  ShowS -> ShowS
forall a b. (a -> b) -> a -> b
$ Int -> String
forall a. Show a => a -> String
show Int
detailNum
  where
    (Int
subjectNum, Int
detailNum) = SubjectDetail -> (Int, Int)
encodeSubjectDetail SubjectDetail
sd

parser :: AP.Parser StatusCode
parser :: Parser StatusCode
parser =
  Class -> SubjectDetail -> StatusCode
StatusCode
  (Class -> SubjectDetail -> StatusCode)
-> Parser Text Class -> Parser Text (SubjectDetail -> StatusCode)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Class
classParser
  Parser Text (SubjectDetail -> StatusCode)
-> Parser Text Char -> Parser Text (SubjectDetail -> StatusCode)
forall a b. Parser Text a -> Parser Text b -> Parser Text a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Text Char
AP.char Char
'.'
  Parser Text (SubjectDetail -> StatusCode)
-> Parser Text SubjectDetail -> Parser StatusCode
forall a b. Parser Text (a -> b) -> Parser Text a -> Parser Text b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text SubjectDetail
sdParser
  where
    classParser :: Parser Text Class
classParser =
      Int -> Maybe Class
decodeClass (Int -> Maybe Class)
-> Parser Text Int -> Parser Text (Maybe Class)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Int
forall a. Integral a => Parser a
AP.decimal
      Parser Text (Maybe Class)
-> (Maybe Class -> Parser Text Class) -> Parser Text Class
forall a b. Parser Text a -> (a -> Parser Text b) -> Parser Text b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Parser Text Class
-> (Class -> Parser Text Class) -> Maybe Class -> Parser Text Class
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> Parser Text Class
forall a. String -> Parser Text a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"invalid class") Class -> Parser Text Class
forall a. a -> Parser Text a
forall (f :: * -> *) a. Applicative f => a -> f a
pure
    sdParser :: Parser Text SubjectDetail
sdParser =
      Int -> Int -> Maybe SubjectDetail
decodeSubjectDetail
        (Int -> Int -> Maybe SubjectDetail)
-> Parser Text Int -> Parser Text (Int -> Maybe SubjectDetail)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Parser Text Int
forall a. Integral a => Parser a
AP.decimal
        Parser Text (Int -> Maybe SubjectDetail)
-> Parser Text Char -> Parser Text (Int -> Maybe SubjectDetail)
forall a b. Parser Text a -> Parser Text b -> Parser Text a
forall (f :: * -> *) a b. Applicative f => f a -> f b -> f a
<* Char -> Parser Text Char
AP.char Char
'.'
        Parser Text (Int -> Maybe SubjectDetail)
-> Parser Text Int -> Parser Text (Maybe SubjectDetail)
forall a b. Parser Text (a -> b) -> Parser Text a -> Parser Text b
forall (f :: * -> *) a b. Applicative f => f (a -> b) -> f a -> f b
<*> Parser Text Int
forall a. Integral a => Parser a
AP.decimal
      Parser Text (Maybe SubjectDetail)
-> (Maybe SubjectDetail -> Parser Text SubjectDetail)
-> Parser Text SubjectDetail
forall a b. Parser Text a -> (a -> Parser Text b) -> Parser Text b
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Parser Text SubjectDetail
-> (SubjectDetail -> Parser Text SubjectDetail)
-> Maybe SubjectDetail
-> Parser Text SubjectDetail
forall b a. b -> (a -> b) -> Maybe a -> b
maybe (String -> Parser Text SubjectDetail
forall a. String -> Parser Text a
forall (m :: * -> *) a. MonadFail m => String -> m a
fail String
"invalid subject/detail") SubjectDetail -> Parser Text SubjectDetail
forall a. a -> Parser Text a
forall (f :: * -> *) a. Applicative f => a -> f a
pure