-- |
-- Module      : Net.DNSBase.EDNS.Internal.OptNum
-- Description : TBD
-- Copyright   : (c) Viktor Dukhovni, 2026
-- License     : BSD-3-Clause
-- Maintainer  : ietf-dane@dukhovni.org
-- Stability   : unstable
module Net.DNSBase.EDNS.Internal.OptNum
    ( OptNum( ..
            , LLQ
            , UL
            , NSID
            , DAU
            , DHU
            , N3U
            , ECS
            , EXPIRE
            , COOKIE
            , TCPKEEPALIVE
            , PADDING
            , CHAIN
            , KEYTAG
            , EDE
            , CLIENTTAG
            , SERVERTAG
            )
    ) where

import Net.DNSBase.Internal.Present
import Net.DNSBase.Internal.Util

-- | EDNS Option Code (RFC 6891).
newtype OptNum = OptNum Word16
    deriving newtype (OptNum -> OptNum -> Bool
(OptNum -> OptNum -> Bool)
-> (OptNum -> OptNum -> Bool) -> Eq OptNum
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: OptNum -> OptNum -> Bool
== :: OptNum -> OptNum -> Bool
$c/= :: OptNum -> OptNum -> Bool
/= :: OptNum -> OptNum -> Bool
Eq, Eq OptNum
Eq OptNum =>
(OptNum -> OptNum -> Ordering)
-> (OptNum -> OptNum -> Bool)
-> (OptNum -> OptNum -> Bool)
-> (OptNum -> OptNum -> Bool)
-> (OptNum -> OptNum -> Bool)
-> (OptNum -> OptNum -> OptNum)
-> (OptNum -> OptNum -> OptNum)
-> Ord OptNum
OptNum -> OptNum -> Bool
OptNum -> OptNum -> Ordering
OptNum -> OptNum -> OptNum
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 :: OptNum -> OptNum -> Ordering
compare :: OptNum -> OptNum -> Ordering
$c< :: OptNum -> OptNum -> Bool
< :: OptNum -> OptNum -> Bool
$c<= :: OptNum -> OptNum -> Bool
<= :: OptNum -> OptNum -> Bool
$c> :: OptNum -> OptNum -> Bool
> :: OptNum -> OptNum -> Bool
$c>= :: OptNum -> OptNum -> Bool
>= :: OptNum -> OptNum -> Bool
$cmax :: OptNum -> OptNum -> OptNum
max :: OptNum -> OptNum -> OptNum
$cmin :: OptNum -> OptNum -> OptNum
min :: OptNum -> OptNum -> OptNum
Ord, Int -> OptNum
OptNum -> Int
OptNum -> [OptNum]
OptNum -> OptNum
OptNum -> OptNum -> [OptNum]
OptNum -> OptNum -> OptNum -> [OptNum]
(OptNum -> OptNum)
-> (OptNum -> OptNum)
-> (Int -> OptNum)
-> (OptNum -> Int)
-> (OptNum -> [OptNum])
-> (OptNum -> OptNum -> [OptNum])
-> (OptNum -> OptNum -> [OptNum])
-> (OptNum -> OptNum -> OptNum -> [OptNum])
-> Enum OptNum
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 :: OptNum -> OptNum
succ :: OptNum -> OptNum
$cpred :: OptNum -> OptNum
pred :: OptNum -> OptNum
$ctoEnum :: Int -> OptNum
toEnum :: Int -> OptNum
$cfromEnum :: OptNum -> Int
fromEnum :: OptNum -> Int
$cenumFrom :: OptNum -> [OptNum]
enumFrom :: OptNum -> [OptNum]
$cenumFromThen :: OptNum -> OptNum -> [OptNum]
enumFromThen :: OptNum -> OptNum -> [OptNum]
$cenumFromTo :: OptNum -> OptNum -> [OptNum]
enumFromTo :: OptNum -> OptNum -> [OptNum]
$cenumFromThenTo :: OptNum -> OptNum -> OptNum -> [OptNum]
enumFromThenTo :: OptNum -> OptNum -> OptNum -> [OptNum]
Enum, OptNum
OptNum -> OptNum -> Bounded OptNum
forall a. a -> a -> Bounded a
$cminBound :: OptNum
minBound :: OptNum
$cmaxBound :: OptNum
maxBound :: OptNum
Bounded, Integer -> OptNum
OptNum -> OptNum
OptNum -> OptNum -> OptNum
(OptNum -> OptNum -> OptNum)
-> (OptNum -> OptNum -> OptNum)
-> (OptNum -> OptNum -> OptNum)
-> (OptNum -> OptNum)
-> (OptNum -> OptNum)
-> (OptNum -> OptNum)
-> (Integer -> OptNum)
-> Num OptNum
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: OptNum -> OptNum -> OptNum
+ :: OptNum -> OptNum -> OptNum
$c- :: OptNum -> OptNum -> OptNum
- :: OptNum -> OptNum -> OptNum
$c* :: OptNum -> OptNum -> OptNum
* :: OptNum -> OptNum -> OptNum
$cnegate :: OptNum -> OptNum
negate :: OptNum -> OptNum
$cabs :: OptNum -> OptNum
abs :: OptNum -> OptNum
$csignum :: OptNum -> OptNum
signum :: OptNum -> OptNum
$cfromInteger :: Integer -> OptNum
fromInteger :: Integer -> OptNum
Num, Num OptNum
Ord OptNum
(Num OptNum, Ord OptNum) => (OptNum -> Rational) -> Real OptNum
OptNum -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: OptNum -> Rational
toRational :: OptNum -> Rational
Real, Enum OptNum
Real OptNum
(Real OptNum, Enum OptNum) =>
(OptNum -> OptNum -> OptNum)
-> (OptNum -> OptNum -> OptNum)
-> (OptNum -> OptNum -> OptNum)
-> (OptNum -> OptNum -> OptNum)
-> (OptNum -> OptNum -> (OptNum, OptNum))
-> (OptNum -> OptNum -> (OptNum, OptNum))
-> (OptNum -> Integer)
-> Integral OptNum
OptNum -> Integer
OptNum -> OptNum -> (OptNum, OptNum)
OptNum -> OptNum -> OptNum
forall a.
(Real a, Enum a) =>
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> (a, a))
-> (a -> a -> (a, a))
-> (a -> Integer)
-> Integral a
$cquot :: OptNum -> OptNum -> OptNum
quot :: OptNum -> OptNum -> OptNum
$crem :: OptNum -> OptNum -> OptNum
rem :: OptNum -> OptNum -> OptNum
$cdiv :: OptNum -> OptNum -> OptNum
div :: OptNum -> OptNum -> OptNum
$cmod :: OptNum -> OptNum -> OptNum
mod :: OptNum -> OptNum -> OptNum
$cquotRem :: OptNum -> OptNum -> (OptNum, OptNum)
quotRem :: OptNum -> OptNum -> (OptNum, OptNum)
$cdivMod :: OptNum -> OptNum -> (OptNum, OptNum)
divMod :: OptNum -> OptNum -> (OptNum, OptNum)
$ctoInteger :: OptNum -> Integer
toInteger :: OptNum -> Integer
Integral, Int -> OptNum -> ShowS
[OptNum] -> ShowS
OptNum -> String
(Int -> OptNum -> ShowS)
-> (OptNum -> String) -> ([OptNum] -> ShowS) -> Show OptNum
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> OptNum -> ShowS
showsPrec :: Int -> OptNum -> ShowS
$cshow :: OptNum -> String
show :: OptNum -> String
$cshowList :: [OptNum] -> ShowS
showList :: [OptNum] -> ShowS
Show, ReadPrec [OptNum]
ReadPrec OptNum
Int -> ReadS OptNum
ReadS [OptNum]
(Int -> ReadS OptNum)
-> ReadS [OptNum]
-> ReadPrec OptNum
-> ReadPrec [OptNum]
-> Read OptNum
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS OptNum
readsPrec :: Int -> ReadS OptNum
$creadList :: ReadS [OptNum]
readList :: ReadS [OptNum]
$creadPrec :: ReadPrec OptNum
readPrec :: ReadPrec OptNum
$creadListPrec :: ReadPrec [OptNum]
readListPrec :: ReadPrec [OptNum]
Read)

-- | [Long-lived queries](https://www.rfc-editor.org/rfc/rfc8764.html)
pattern LLQ             :: OptNum
pattern $mLLQ :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bLLQ :: OptNum
LLQ              = OptNum 1
-- | [Dynamic DNS Update Leases](https://datatracker.ietf.org/doc/html/draft-ietf-dnssd-update-lease-08#section-9)
pattern UL              :: OptNum
pattern $mUL :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bUL :: OptNum
UL               = OptNum 2
-- | [NSID](https://www.rfc-editor.org/rfc/rfc5001.html#section-4)
pattern NSID            :: OptNum
pattern $mNSID :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bNSID :: OptNum
NSID             = OptNum 3
-- | [DNSSEC Algorithm Understood](https://www.rfc-editor.org/rfc/rfc6975.html#section-8)
pattern DAU             :: OptNum
pattern $mDAU :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bDAU :: OptNum
DAU              = OptNum 5
-- | [DS Hash Understood](https://www.rfc-editor.org/rfc/rfc6975.html#section-8)
pattern DHU             :: OptNum
pattern $mDHU :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bDHU :: OptNum
DHU              = OptNum 6
-- | [NSEC3 Hash Understood](https://www.rfc-editor.org/rfc/rfc6975.html#section-8)
pattern N3U             :: OptNum
pattern $mN3U :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bN3U :: OptNum
N3U              = OptNum 7
-- | [Client Subnet](https://www.rfc-editor.org/rfc/rfc7871.html#section-8)
pattern ECS             :: OptNum
pattern $mECS :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bECS :: OptNum
ECS              = OptNum 8
-- | [Expire](https://www.rfc-editor.org/rfc/rfc7314.html#section-5)
pattern EXPIRE          :: OptNum
pattern $mEXPIRE :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bEXPIRE :: OptNum
EXPIRE           = OptNum 9
-- | [Cookie](https://www.rfc-editor.org/rfc/rfc7873.html#section-8)
pattern COOKIE          :: OptNum
pattern $mCOOKIE :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bCOOKIE :: OptNum
COOKIE           = OptNum 10
-- | [TCP Keepalive](https://www.rfc-editor.org/rfc/rfc7828.html#section-6)
pattern TCPKEEPALIVE    :: OptNum
pattern $mTCPKEEPALIVE :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bTCPKEEPALIVE :: OptNum
TCPKEEPALIVE     = OptNum 11
-- | [Padding](https://www.rfc-editor.org/rfc/rfc7830.html#section-5)
pattern PADDING         :: OptNum
pattern $mPADDING :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bPADDING :: OptNum
PADDING          = OptNum 12
-- | [DNSSEC Chain](https://www.rfc-editor.org/rfc/rfc7901.html#section-9)
pattern CHAIN           :: OptNum
pattern $mCHAIN :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bCHAIN :: OptNum
CHAIN            = OptNum 13
-- | [Key Tag](https://www.rfc-editor.org/rfc/rfc8145.html#section-6)
pattern KEYTAG          :: OptNum
pattern $mKEYTAG :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bKEYTAG :: OptNum
KEYTAG           = OptNum 14
-- | [EDNS Error](https://www.rfc-editor.org/rfc/rfc8914.html#section-5.1)
pattern EDE             :: OptNum
pattern $mEDE :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bEDE :: OptNum
EDE              = OptNum 15
-- | [Client Tag](https://datatracker.ietf.org/doc/html/draft-bellis-dnsop-edns-tags-01#section-7)
pattern CLIENTTAG       :: OptNum
pattern $mCLIENTTAG :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bCLIENTTAG :: OptNum
CLIENTTAG        = OptNum 16
-- | [Server Tag](https://datatracker.ietf.org/doc/html/draft-bellis-dnsop-edns-tags-01#section-7)
pattern SERVERTAG       :: OptNum
pattern $mSERVERTAG :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bSERVERTAG :: OptNum
SERVERTAG        = OptNum 17
-- | [Report Channel](https://datatracker.ietf.org/doc/html/rfc9567#section-7)
pattern REPORTCHAN      :: OptNum
pattern $mREPORTCHAN :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bREPORTCHAN :: OptNum
REPORTCHAN       = OptNum 18
-- | [Zone Version](https://datatracker.ietf.org/doc/html/rfc9660#section-6.1)
pattern ZONEVERSION     :: OptNum
pattern $mZONEVERSION :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bZONEVERSION :: OptNum
ZONEVERSION      = OptNum 19
-- | [MQTYPE Query](https://datatracker.ietf.org/doc/html/draft-ietf-dnssd-multi-qtypes-12#section-5)
pattern MQTQUERY        :: OptNum
pattern $mMQTQUERY :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bMQTQUERY :: OptNum
MQTQUERY         = OptNum 20
-- | [MQTYPE Response](https://datatracker.ietf.org/doc/html/draft-ietf-dnssd-multi-qtypes-12#section-5)
pattern MQTRESPONSE     :: OptNum
pattern $mMQTRESPONSE :: forall {r}. OptNum -> ((# #) -> r) -> ((# #) -> r) -> r
$bMQTRESPONSE :: OptNum
MQTRESPONSE      = OptNum 21

instance Presentable OptNum where
    present :: OptNum -> Builder -> Builder
present OptNum
LLQ          = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"LLQ"
    present OptNum
UL           = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"UL"
    present OptNum
NSID         = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"NSID"
    present OptNum
DAU          = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"DAU"
    present OptNum
DHU          = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"DHU"
    present OptNum
N3U          = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"N3U"
    present OptNum
ECS          = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"ECS"
    present OptNum
EXPIRE       = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"EXPIRE"
    present OptNum
COOKIE       = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"COOKIE"
    present OptNum
TCPKEEPALIVE = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"TCPKEEPALIVE"
    present OptNum
PADDING      = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"PADDING"
    present OptNum
CHAIN        = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"CHAIN"
    present OptNum
KEYTAG       = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"CHAIN"
    present OptNum
EDE          = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"EDE"
    present OptNum
CLIENTTAG    = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"CLIENTTAG"
    present OptNum
SERVERTAG    = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"SERVERTAG"
    present OptNum
REPORTCHAN   = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"REPORTCHAN"
    present OptNum
ZONEVERSION  = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"ZONEVERSION"
    present OptNum
MQTQUERY     = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"MQTQUERY"
    present OptNum
MQTRESPONSE  = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"MQTRESPONSE"
    present OptNum
oc           = String -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present String
"OPTION" (Builder -> Builder) -> (Builder -> Builder) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Word16 -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present (forall a b. Coercible a b => a -> b
forall a b. Coercible a b => a -> b
coerce @_ @Word16 OptNum
oc)