{-# LANGUAGE OverloadedStrings #-}

module Network.DomainAuth.SPF.Types where

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

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

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