{-# LANGUAGE OverloadedStrings #-}

module Network.DomainAuth.SPF.Types where

import Data.IP
import Network.DNS (Domain)
import Data.ByteString (ByteString)

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

-- See DAResult in Network.DomainAuth.Types
data Qualifier = Q_Pass | Q_HardFail | Q_Softfail | Q_Neutral
                 deriving (Qualifier -> Qualifier -> Bool
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Qualifier -> Qualifier -> Bool
$c/= :: Qualifier -> Qualifier -> Bool
== :: Qualifier -> Qualifier -> Bool
$c== :: Qualifier -> Qualifier -> Bool
Eq,Int -> Qualifier
Qualifier -> Int
Qualifier -> [Qualifier]
Qualifier -> Qualifier
Qualifier -> Qualifier -> [Qualifier]
Qualifier -> Qualifier -> Qualifier -> [Qualifier]
forall a.
(a -> a)
-> (a -> a)
-> (Int -> a)
-> (a -> Int)
-> (a -> [a])
-> (a -> a -> [a])
-> (a -> a -> [a])
-> (a -> a -> a -> [a])
-> Enum a
enumFromThenTo :: Qualifier -> Qualifier -> Qualifier -> [Qualifier]
$cenumFromThenTo :: Qualifier -> Qualifier -> Qualifier -> [Qualifier]
enumFromTo :: Qualifier -> Qualifier -> [Qualifier]
$cenumFromTo :: Qualifier -> Qualifier -> [Qualifier]
enumFromThen :: Qualifier -> Qualifier -> [Qualifier]
$cenumFromThen :: Qualifier -> Qualifier -> [Qualifier]
enumFrom :: Qualifier -> [Qualifier]
$cenumFrom :: Qualifier -> [Qualifier]
fromEnum :: Qualifier -> Int
$cfromEnum :: Qualifier -> Int
toEnum :: Int -> Qualifier
$ctoEnum :: Int -> Qualifier
pred :: Qualifier -> Qualifier
$cpred :: Qualifier -> Qualifier
succ :: Qualifier -> Qualifier
$csucc :: Qualifier -> Qualifier
Enum,Qualifier
forall a. a -> a -> Bounded a
maxBound :: Qualifier
$cmaxBound :: Qualifier
minBound :: Qualifier
$cminBound :: Qualifier
Bounded,Int -> Qualifier -> ShowS
[Qualifier] -> ShowS
Qualifier -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [Qualifier] -> ShowS
$cshowList :: [Qualifier] -> ShowS
show :: Qualifier -> [Char]
$cshow :: Qualifier -> [Char]
showsPrec :: Int -> Qualifier -> ShowS
$cshowsPrec :: Int -> Qualifier -> ShowS
Show)

-- Depends on Qualifier
qualifierSymbol :: ByteString
qualifierSymbol :: ByteString
qualifierSymbol = ByteString
"+-~?"

data SPF = SPF_IPv4Range Qualifier (AddrRange IPv4)
         | SPF_IPv6Range Qualifier (AddrRange IPv6)
         | SPF_Address   Qualifier (Maybe Domain) (Int,Int)
         | SPF_MX        Qualifier (Maybe Domain) (Int,Int)
         | SPF_Include   Qualifier Domain
         | SPF_All       Qualifier
         | SPF_Redirect            Domain
           deriving Int -> SPF -> ShowS
[SPF] -> ShowS
SPF -> [Char]
forall a.
(Int -> a -> ShowS) -> (a -> [Char]) -> ([a] -> ShowS) -> Show a
showList :: [SPF] -> ShowS
$cshowList :: [SPF] -> ShowS
show :: SPF -> [Char]
$cshow :: SPF -> [Char]
showsPrec :: Int -> SPF -> ShowS
$cshowsPrec :: Int -> SPF -> ShowS
Show

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

data SpfSeq = SS_All        Qualifier
            | SS_IPv4Range  Qualifier (AddrRange IPv4)
            | SS_IPv6Range  Qualifier (AddrRange IPv6)
            | SS_IPv4Ranges Qualifier [AddrRange IPv4]
            | SS_IPv6Ranges Qualifier [AddrRange IPv6]
            | SS_IF_Pass    Qualifier [IO SpfSeq]
            | SS_SpfSeq               [IO SpfSeq]