packages feed

dnsbase-1.0.0.0: internal/Net/DNSBase/Internal/RCODE.hs

-- |
-- Module      : Net.DNSBase.Internal.RCODE
-- Description : TBD
-- Copyright   : (c) Viktor Dukhovni, 2026
-- License     : BSD-3-Clause
-- Maintainer  : ietf-dane@dukhovni.org
-- Stability   : unstable
module Net.DNSBase.Internal.RCODE
    ( RCODE
        ( RCODE
        , NOERROR
        , FORMERR
        , SERVFAIL
        , NXDOMAIN
        , NOTIMP
        , REFUSED
        , YXDOMAIN
        , YXRRSET
        , NXRRSET
        , NOTAUTH
        , NOTZONE
        , DSOTYPENI
        , BADVERS
        , BADSIG
        , BADKEY
        , BADTIME
        , BADMODE
        , BADNAME
        , BADALG
        , BADTRUNC
        , BADCOOKIE
        )
    , extendRCODE
    ) where

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

-- | The extended (12-bit) DNS RCODE consisting of 4 bits from the basic DNS
-- header, possibly augmented with 8 more bits from the EDNS header.
--
-- Should always be zero in well-formed requests.  When decoding replies, the
-- high eight bits from any EDNS response are combined with the 4-bit RCODE
-- from the DNS header.  When encoding a message, if EDNS is disabled RCODE
-- values larger than 15 are mapped to 'FORMERR'.
--
-- RCODES 12 through 15 are reserved, see
-- [IANA](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-6)
newtype RCODE = RC_ Word16 deriving (Eq, Ord, Enum, Show)

instance Bounded RCODE where
    minBound = RC_ 0
    maxBound = RC_ 0xfff

-- | Smart constructor ensures provided values are valid.
-- Attempts to construct a values larger than 4095 raises an error.
pattern RCODE :: Word16 -> RCODE
pattern RCODE w <- RC_ w where
    RCODE w
        | RC_ w <= maxBound = RC_ w
        | otherwise         = error "RCODE out of range"
{-# COMPLETE RCODE #-}

-- | Combine basic header RCODE (low 4 bits)
-- with EDNS extended RCODE (high 8 bits)
extendRCODE :: RCODE -> Word8 -> RCODE
extendRCODE (RCODE lo) hi =
    RCODE $ (fromIntegral hi `shiftL` 4) .|. (lo .&. 0xF)


instance Presentable RCODE where
    present NOERROR    = present @String "NOERROR"
    present FORMERR    = present @String "FORMERR"
    present SERVFAIL   = present @String "SERVFAIL"
    present NXDOMAIN   = present @String "NXDOMAIN"
    present NOTIMP     = present @String "NOTIMP"
    present REFUSED    = present @String "REFUSED"
    present YXDOMAIN   = present @String "YXDOMAIN"
    present YXRRSET    = present @String "YXRRSET"
    present NXRRSET    = present @String "NXRRSET"
    present NOTAUTH    = present @String "NOTAUTH"
    present NOTZONE    = present @String "NOTZONE"
    present DSOTYPENI  = present @String "DSOTYPENI"
    present BADVERS    = present @String "BADVERS"
    present BADSIG     = present @String "BADSIG"
    present BADKEY     = present @String "BADKEY"
    present BADTIME    = present @String "BADTIME"
    present BADMODE    = present @String "BADMODE"
    present BADNAME    = present @String "BADNAME"
    present BADALG     = present @String "BADALG"
    present BADTRUNC   = present @String "BADTRUNC"
    present BADCOOKIE  = present @String "BADCOOKIE"
    present (RC_ rc)   = present @String "RCODE" . present rc

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

-- | NOERROR - [RFC1035]
pattern NOERROR :: RCODE
pattern NOERROR = RCODE 0

-- | FORMERR - [RFC1035]
pattern FORMERR :: RCODE
pattern FORMERR = RCODE 1

-- | SERVFAIL - [RFC1035]
pattern SERVFAIL :: RCODE
pattern SERVFAIL = RCODE 2

-- | NXDOMAIN - [RFC1035]
pattern NXDOMAIN     :: RCODE
pattern NXDOMAIN     = RCODE 3

-- | NOTIMP - [RFC1035]
pattern NOTIMP       :: RCODE
pattern NOTIMP       = RCODE 4

-- | REFUSED - [RFC1035]
pattern REFUSED      :: RCODE
pattern REFUSED      = RCODE 5

-- | YXDOMAIN - [RFC2136][RFC6672]
pattern YXDOMAIN     :: RCODE
pattern YXDOMAIN     = RCODE 6

-- | YXRRSET - [RFC2136]
pattern YXRRSET      :: RCODE
pattern YXRRSET      = RCODE 7

-- | NXRRSET - [RFC2136]
pattern NXRRSET      :: RCODE
pattern NXRRSET      = RCODE 8

-- | NOTAUTH - [RFC2136]
pattern NOTAUTH      :: RCODE
pattern NOTAUTH      = RCODE 9

-- | NOTZONE - [RFC2136]
pattern NOTZONE      :: RCODE
pattern NOTZONE      = RCODE 10

-- | DSOTYPENI - [RFC8490]
pattern DSOTYPENI    :: RCODE
pattern DSOTYPENI    = RCODE 11

-- | BADVERS - [RFC6891]
pattern BADVERS      :: RCODE
pattern BADVERS      = RCODE 16

-- | BADSIG - [RFC2845]
pattern BADSIG       :: RCODE
pattern BADSIG       = RCODE 16

-- | BADKEY - [RFC2845]
pattern BADKEY       :: RCODE
pattern BADKEY       = RCODE 17

-- | BADTIME - [RFC2845]
pattern BADTIME      :: RCODE
pattern BADTIME      = RCODE 18

-- | BADMODE - [RFC2930]
pattern BADMODE      :: RCODE
pattern BADMODE      = RCODE 19

-- | BADNAME - [RFC2930]
pattern BADNAME      :: RCODE
pattern BADNAME      = RCODE 20

-- | BADALG - [RFC2930]
pattern BADALG       :: RCODE
pattern BADALG       = RCODE 21

-- | BADTRUNC - [RFC4635]
pattern BADTRUNC     :: RCODE
pattern BADTRUNC     = RCODE 22

-- | BADCOOKIE - [RFC7873]
pattern BADCOOKIE    :: RCODE
pattern BADCOOKIE    = RCODE 23