module Network.DomainAuth.Mail.Types where

import Data.ByteString (ByteString)
import qualified Data.ByteString.Char8 as BS
import Data.Char
import Data.Sequence

----------------------------------------------------------------

-- | Type for raw e-mail message.
type RawMail = ByteString

type RawHeader = ByteString
type RawBody = ByteString
type RawField = ByteString

-- | Field key for raw e-mail message.
type RawFieldKey = ByteString

-- | Field value for raw e-mail message.
type RawFieldValue = ByteString

-- | Body chunk for raw e-mail message.
type RawBodyChunk = ByteString

----------------------------------------------------------------

-- | Type for parsed e-mail message.
data Mail = Mail
    { Mail -> Header
mailHeader :: Header
    , Mail -> Body
mailBody :: Body
    }
    deriving (Mail -> Mail -> Bool
(Mail -> Mail -> Bool) -> (Mail -> Mail -> Bool) -> Eq Mail
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Mail -> Mail -> Bool
== :: Mail -> Mail -> Bool
$c/= :: Mail -> Mail -> Bool
/= :: Mail -> Mail -> Bool
Eq, Int -> Mail -> ShowS
[Mail] -> ShowS
Mail -> String
(Int -> Mail -> ShowS)
-> (Mail -> String) -> ([Mail] -> ShowS) -> Show Mail
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Mail -> ShowS
showsPrec :: Int -> Mail -> ShowS
$cshow :: Mail -> String
show :: Mail -> String
$cshowList :: [Mail] -> ShowS
showList :: [Mail] -> ShowS
Show)

isEmpty :: Body -> Bool
isEmpty :: Body -> Bool
isEmpty = (Body -> Body -> Bool
forall a. Eq a => a -> a -> Bool
== Body
forall a. Seq a
empty)

-- | Header type for parsed e-mail message.
type Header = [Field]

-- | Field type for parsed e-mail message.
data Field = Field
    { Field -> ByteString
fieldSearchKey :: CanonFieldKey
    , Field -> ByteString
fieldKey :: FieldKey
    , Field -> FieldValue
fieldValue :: FieldValue
    }
    deriving (Field -> Field -> Bool
(Field -> Field -> Bool) -> (Field -> Field -> Bool) -> Eq Field
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Field -> Field -> Bool
== :: Field -> Field -> Bool
$c/= :: Field -> Field -> Bool
/= :: Field -> Field -> Bool
Eq, Int -> Field -> ShowS
Header -> ShowS
Field -> String
(Int -> Field -> ShowS)
-> (Field -> String) -> (Header -> ShowS) -> Show Field
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Field -> ShowS
showsPrec :: Int -> Field -> ShowS
$cshow :: Field -> String
show :: Field -> String
$cshowList :: Header -> ShowS
showList :: Header -> ShowS
Show)

-- | Type for canonicalized field key of parsed e-mail message.
type CanonFieldKey = ByteString

-- | Type for field key of parsed e-mail message.
type FieldKey = ByteString

-- | Type for field value of parsed e-mail message.
type FieldValue = [ByteString]

-- | Type for body of parsed e-mail message.
type Body = Seq ByteString

----------------------------------------------------------------

-- | Canonicalizing 'FieldKey' for search.
canonicalizeKey :: FieldKey -> CanonFieldKey
canonicalizeKey :: ByteString -> ByteString
canonicalizeKey = (Char -> Char) -> ByteString -> ByteString
BS.map Char -> Char
toLower