{-|
Module      : Net.DNSBase.RData.SVCB.SVCParamKey
Description : SVCB / HTTPS service-parameter key codes
Copyright   : (c) Viktor Dukhovni, 2026
License     : BSD-3-Clause
Maintainer  : ietf-dane@dukhovni.org
Stability   : unstable

The 16-bit numeric keys that select among service-parameter
values inside an @SVCB@ or @HTTPS@ resource record.  The keys
that were initially registered are listed in
[RFC 9460 section 14.3.2](https://datatracker.ietf.org/doc/html/rfc9460#section-14.3.2),
with subsequent additions tracked in the
[SvcParamKey IANA registry](https://www.iana.org/assignments/dns-svcb/dns-svcb.xhtml).
The bidirectional patterns below cover the keys that have
standardised value formats in this library; unknown keys are
carried as 'Net.DNSBase.RData.SVCB.OpaqueSPV' values.
-}

module Net.DNSBase.RData.SVCB.SVCParamKey where

import Data.Word (Word16)

import Net.DNSBase.Present


-- | A service-parameter key code
-- ([RFC 9460 section 2.1](https://datatracker.ietf.org/doc/html/rfc9460#section-2.1)).
-- The pattern synonyms below name the keys that have standardised
-- value formats; an unrecognised code keeps its numeric form and
-- presents as @keyN@.
newtype SVCParamKey = SVCParamKey Word16
    deriving newtype (SVCParamKey -> SVCParamKey -> Bool
(SVCParamKey -> SVCParamKey -> Bool)
-> (SVCParamKey -> SVCParamKey -> Bool) -> Eq SVCParamKey
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: SVCParamKey -> SVCParamKey -> Bool
== :: SVCParamKey -> SVCParamKey -> Bool
$c/= :: SVCParamKey -> SVCParamKey -> Bool
/= :: SVCParamKey -> SVCParamKey -> Bool
Eq, Eq SVCParamKey
Eq SVCParamKey =>
(SVCParamKey -> SVCParamKey -> Ordering)
-> (SVCParamKey -> SVCParamKey -> Bool)
-> (SVCParamKey -> SVCParamKey -> Bool)
-> (SVCParamKey -> SVCParamKey -> Bool)
-> (SVCParamKey -> SVCParamKey -> Bool)
-> (SVCParamKey -> SVCParamKey -> SVCParamKey)
-> (SVCParamKey -> SVCParamKey -> SVCParamKey)
-> Ord SVCParamKey
SVCParamKey -> SVCParamKey -> Bool
SVCParamKey -> SVCParamKey -> Ordering
SVCParamKey -> SVCParamKey -> SVCParamKey
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 :: SVCParamKey -> SVCParamKey -> Ordering
compare :: SVCParamKey -> SVCParamKey -> Ordering
$c< :: SVCParamKey -> SVCParamKey -> Bool
< :: SVCParamKey -> SVCParamKey -> Bool
$c<= :: SVCParamKey -> SVCParamKey -> Bool
<= :: SVCParamKey -> SVCParamKey -> Bool
$c> :: SVCParamKey -> SVCParamKey -> Bool
> :: SVCParamKey -> SVCParamKey -> Bool
$c>= :: SVCParamKey -> SVCParamKey -> Bool
>= :: SVCParamKey -> SVCParamKey -> Bool
$cmax :: SVCParamKey -> SVCParamKey -> SVCParamKey
max :: SVCParamKey -> SVCParamKey -> SVCParamKey
$cmin :: SVCParamKey -> SVCParamKey -> SVCParamKey
min :: SVCParamKey -> SVCParamKey -> SVCParamKey
Ord, Int -> SVCParamKey
SVCParamKey -> Int
SVCParamKey -> [SVCParamKey]
SVCParamKey -> SVCParamKey
SVCParamKey -> SVCParamKey -> [SVCParamKey]
SVCParamKey -> SVCParamKey -> SVCParamKey -> [SVCParamKey]
(SVCParamKey -> SVCParamKey)
-> (SVCParamKey -> SVCParamKey)
-> (Int -> SVCParamKey)
-> (SVCParamKey -> Int)
-> (SVCParamKey -> [SVCParamKey])
-> (SVCParamKey -> SVCParamKey -> [SVCParamKey])
-> (SVCParamKey -> SVCParamKey -> [SVCParamKey])
-> (SVCParamKey -> SVCParamKey -> SVCParamKey -> [SVCParamKey])
-> Enum SVCParamKey
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 :: SVCParamKey -> SVCParamKey
succ :: SVCParamKey -> SVCParamKey
$cpred :: SVCParamKey -> SVCParamKey
pred :: SVCParamKey -> SVCParamKey
$ctoEnum :: Int -> SVCParamKey
toEnum :: Int -> SVCParamKey
$cfromEnum :: SVCParamKey -> Int
fromEnum :: SVCParamKey -> Int
$cenumFrom :: SVCParamKey -> [SVCParamKey]
enumFrom :: SVCParamKey -> [SVCParamKey]
$cenumFromThen :: SVCParamKey -> SVCParamKey -> [SVCParamKey]
enumFromThen :: SVCParamKey -> SVCParamKey -> [SVCParamKey]
$cenumFromTo :: SVCParamKey -> SVCParamKey -> [SVCParamKey]
enumFromTo :: SVCParamKey -> SVCParamKey -> [SVCParamKey]
$cenumFromThenTo :: SVCParamKey -> SVCParamKey -> SVCParamKey -> [SVCParamKey]
enumFromThenTo :: SVCParamKey -> SVCParamKey -> SVCParamKey -> [SVCParamKey]
Enum, SVCParamKey
SVCParamKey -> SVCParamKey -> Bounded SVCParamKey
forall a. a -> a -> Bounded a
$cminBound :: SVCParamKey
minBound :: SVCParamKey
$cmaxBound :: SVCParamKey
maxBound :: SVCParamKey
Bounded, Integer -> SVCParamKey
SVCParamKey -> SVCParamKey
SVCParamKey -> SVCParamKey -> SVCParamKey
(SVCParamKey -> SVCParamKey -> SVCParamKey)
-> (SVCParamKey -> SVCParamKey -> SVCParamKey)
-> (SVCParamKey -> SVCParamKey -> SVCParamKey)
-> (SVCParamKey -> SVCParamKey)
-> (SVCParamKey -> SVCParamKey)
-> (SVCParamKey -> SVCParamKey)
-> (Integer -> SVCParamKey)
-> Num SVCParamKey
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: SVCParamKey -> SVCParamKey -> SVCParamKey
+ :: SVCParamKey -> SVCParamKey -> SVCParamKey
$c- :: SVCParamKey -> SVCParamKey -> SVCParamKey
- :: SVCParamKey -> SVCParamKey -> SVCParamKey
$c* :: SVCParamKey -> SVCParamKey -> SVCParamKey
* :: SVCParamKey -> SVCParamKey -> SVCParamKey
$cnegate :: SVCParamKey -> SVCParamKey
negate :: SVCParamKey -> SVCParamKey
$cabs :: SVCParamKey -> SVCParamKey
abs :: SVCParamKey -> SVCParamKey
$csignum :: SVCParamKey -> SVCParamKey
signum :: SVCParamKey -> SVCParamKey
$cfromInteger :: Integer -> SVCParamKey
fromInteger :: Integer -> SVCParamKey
Num, Num SVCParamKey
Ord SVCParamKey
(Num SVCParamKey, Ord SVCParamKey) =>
(SVCParamKey -> Rational) -> Real SVCParamKey
SVCParamKey -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: SVCParamKey -> Rational
toRational :: SVCParamKey -> Rational
Real, Enum SVCParamKey
Real SVCParamKey
(Real SVCParamKey, Enum SVCParamKey) =>
(SVCParamKey -> SVCParamKey -> SVCParamKey)
-> (SVCParamKey -> SVCParamKey -> SVCParamKey)
-> (SVCParamKey -> SVCParamKey -> SVCParamKey)
-> (SVCParamKey -> SVCParamKey -> SVCParamKey)
-> (SVCParamKey -> SVCParamKey -> (SVCParamKey, SVCParamKey))
-> (SVCParamKey -> SVCParamKey -> (SVCParamKey, SVCParamKey))
-> (SVCParamKey -> Integer)
-> Integral SVCParamKey
SVCParamKey -> Integer
SVCParamKey -> SVCParamKey -> (SVCParamKey, SVCParamKey)
SVCParamKey -> SVCParamKey -> SVCParamKey
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 :: SVCParamKey -> SVCParamKey -> SVCParamKey
quot :: SVCParamKey -> SVCParamKey -> SVCParamKey
$crem :: SVCParamKey -> SVCParamKey -> SVCParamKey
rem :: SVCParamKey -> SVCParamKey -> SVCParamKey
$cdiv :: SVCParamKey -> SVCParamKey -> SVCParamKey
div :: SVCParamKey -> SVCParamKey -> SVCParamKey
$cmod :: SVCParamKey -> SVCParamKey -> SVCParamKey
mod :: SVCParamKey -> SVCParamKey -> SVCParamKey
$cquotRem :: SVCParamKey -> SVCParamKey -> (SVCParamKey, SVCParamKey)
quotRem :: SVCParamKey -> SVCParamKey -> (SVCParamKey, SVCParamKey)
$cdivMod :: SVCParamKey -> SVCParamKey -> (SVCParamKey, SVCParamKey)
divMod :: SVCParamKey -> SVCParamKey -> (SVCParamKey, SVCParamKey)
$ctoInteger :: SVCParamKey -> Integer
toInteger :: SVCParamKey -> Integer
Integral, Int -> SVCParamKey -> ShowS
[SVCParamKey] -> ShowS
SVCParamKey -> String
(Int -> SVCParamKey -> ShowS)
-> (SVCParamKey -> String)
-> ([SVCParamKey] -> ShowS)
-> Show SVCParamKey
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> SVCParamKey -> ShowS
showsPrec :: Int -> SVCParamKey -> ShowS
$cshow :: SVCParamKey -> String
show :: SVCParamKey -> String
$cshowList :: [SVCParamKey] -> ShowS
showList :: [SVCParamKey] -> ShowS
Show, ReadPrec [SVCParamKey]
ReadPrec SVCParamKey
Int -> ReadS SVCParamKey
ReadS [SVCParamKey]
(Int -> ReadS SVCParamKey)
-> ReadS [SVCParamKey]
-> ReadPrec SVCParamKey
-> ReadPrec [SVCParamKey]
-> Read SVCParamKey
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS SVCParamKey
readsPrec :: Int -> ReadS SVCParamKey
$creadList :: ReadS [SVCParamKey]
readList :: ReadS [SVCParamKey]
$creadPrec :: ReadPrec SVCParamKey
readPrec :: ReadPrec SVCParamKey
$creadListPrec :: ReadPrec [SVCParamKey]
readListPrec :: ReadPrec [SVCParamKey]
Read)

-- | Keys the client must understand to use this RR
-- [RFC9460, Section 14.3.2](https://datatracker.ietf.org/doc/html/rfc9460#section-14.3.2)
pattern MANDATORY     :: SVCParamKey ; pattern $mMANDATORY :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bMANDATORY :: SVCParamKey
MANDATORY     = SVCParamKey 0

-- | Application-Layer Protocol Negotiation identifiers
-- [RFC9460, Section 14.3.2](https://datatracker.ietf.org/doc/html/rfc9460#section-14.3.2)
pattern ALPN          :: SVCParamKey ; pattern $mALPN :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bALPN :: SVCParamKey
ALPN          = SVCParamKey 1

-- | Suppress the default ALPN for this scheme
-- [RFC9460, Section 14.3.2](https://datatracker.ietf.org/doc/html/rfc9460#section-14.3.2)
pattern NODEFAULTALPN :: SVCParamKey ; pattern $mNODEFAULTALPN :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bNODEFAULTALPN :: SVCParamKey
NODEFAULTALPN = SVCParamKey 2

-- | Alternative TCP/UDP port
-- [RFC9460, Section 14.3.2](https://datatracker.ietf.org/doc/html/rfc9460#section-14.3.2)
pattern PORT          :: SVCParamKey ; pattern $mPORT :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bPORT :: SVCParamKey
PORT          = SVCParamKey 3

-- | Speculative IPv4 address hints
-- [RFC9460, Section 14.3.2](https://datatracker.ietf.org/doc/html/rfc9460#section-14.3.2)
pattern IPV4HINT      :: SVCParamKey ; pattern $mIPV4HINT :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bIPV4HINT :: SVCParamKey
IPV4HINT      = SVCParamKey 4

-- | Encrypted Client Hello configuration
-- [RFC9848, IANA Considerations](https://datatracker.ietf.org/doc/html/rfc9848#name-iana-considerations)
pattern ECH           :: SVCParamKey ; pattern $mECH :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bECH :: SVCParamKey
ECH           = SVCParamKey 5

-- | Speculative IPv6 address hints
-- [RFC9460, Section 14.3.2](https://datatracker.ietf.org/doc/html/rfc9460#section-14.3.2)
pattern IPV6HINT      :: SVCParamKey ; pattern $mIPV6HINT :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bIPV6HINT :: SVCParamKey
IPV6HINT      = SVCParamKey 6

-- | URI template for DNS-over-HTTPS resolver discovery
-- [RFC9461, Section 4](https://datatracker.ietf.org/doc/html/rfc9461#section-4)
pattern DOHPATH       :: SVCParamKey ; pattern $mDOHPATH :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bDOHPATH :: SVCParamKey
DOHPATH       = SVCParamKey 7

-- | Oblivious HTTP support indicator
-- [RFC9540, Section 4](https://datatracker.ietf.org/doc/html/rfc9540#section-4)
pattern OHTTP         :: SVCParamKey ; pattern $mOHTTP :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bOHTTP :: SVCParamKey
OHTTP         = SVCParamKey 8

-- | TLS supported groups
-- [draft-ietf-tls-key-share-prediction-04, section 5](https://datatracker.ietf.org/doc/html/draft-ietf-tls-key-share-prediction-04#section-5)
pattern TLSGROUPS     :: SVCParamKey ; pattern $mTLSGROUPS :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bTLSGROUPS :: SVCParamKey
TLSGROUPS     = SVCParamKey 9

-- | DNS over CoAP path [RFC9953, Section 3](https://datatracker.ietf.org/doc/html/rfc9953#section-8.2)
pattern DOCPATH       :: SVCParamKey ; pattern $mDOCPATH :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bDOCPATH :: SVCParamKey
DOCPATH       = SVCParamKey 10

-- | Provisioning Domain [RFC-ietf-intarea-proxy-config-14, Section 7.5](https://datatracker.ietf.org/doc/html/draft-ietf-intarea-proxy-config-14#section-7.5)
pattern PVD           :: SVCParamKey ; pattern $mPVD :: forall {r}. SVCParamKey -> ((# #) -> r) -> ((# #) -> r) -> r
$bPVD :: SVCParamKey
PVD           = SVCParamKey 11

instance Presentable SVCParamKey where
    present :: SVCParamKey -> Builder -> Builder
present SVCParamKey
MANDATORY       = forall a. Presentable a => a -> Builder -> Builder
present @String String
"mandatory"
    present SVCParamKey
ALPN            = forall a. Presentable a => a -> Builder -> Builder
present @String String
"alpn"
    present SVCParamKey
NODEFAULTALPN   = forall a. Presentable a => a -> Builder -> Builder
present @String String
"no-default-alpn"
    present SVCParamKey
PORT            = forall a. Presentable a => a -> Builder -> Builder
present @String String
"port"
    present SVCParamKey
IPV4HINT        = forall a. Presentable a => a -> Builder -> Builder
present @String String
"ipv4hint"
    present SVCParamKey
ECH             = forall a. Presentable a => a -> Builder -> Builder
present @String String
"ech"
    present SVCParamKey
IPV6HINT        = forall a. Presentable a => a -> Builder -> Builder
present @String String
"ipv6hint"
    present SVCParamKey
DOHPATH         = forall a. Presentable a => a -> Builder -> Builder
present @String String
"dohpath"
    present SVCParamKey
OHTTP           = forall a. Presentable a => a -> Builder -> Builder
present @String String
"ohttp"
    present SVCParamKey
TLSGROUPS       = forall a. Presentable a => a -> Builder -> Builder
present @String String
"tls-supported-groups"
    present SVCParamKey
DOCPATH         = forall a. Presentable a => a -> Builder -> Builder
present @String String
"docpath"
    present SVCParamKey
PVD             = forall a. Presentable a => a -> Builder -> Builder
present @String String
"pvd"
    present (SVCParamKey Word16
n) = forall a. Presentable a => a -> Builder -> Builder
present @String String
"key" (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 Word16
n