{-|
Module      : Net.DNSBase.RData.CSYNC
Description : Child-to-parent signalling records (CSYNC and DSYNC)
Copyright   : (c) Viktor Dukhovni, 2026
License     : BSD-3-Clause
Maintainer  : ietf-dane@dukhovni.org
Stability   : unstable

Two unrelated child-to-parent signalling RR types live here.
'T_csync' (RFC 7477) tells the parent zone which delegation
records the child wishes to have synchronized; 'T_dsync'
(generalised DNS notifications, draft-ietf-dnsop-generalized-notify)
advertises the per-RR-type endpoints a child operator wishes
the parent to send notifications to.  They share neither wire
format nor purpose beyond the broad child-to-parent direction.
-}
{-# LANGUAGE RecordWildCards #-}

module Net.DNSBase.RData.CSYNC
    ( -- * CSYNC RData
      T_csync(..)
    , NsecTypes
    , nsecTypesFromList
    , nsecTypesToList
    , hasRRtype
      -- * DSYNC RData
    , T_dsync(..)
    , Dscheme(.., NOTIFY)
    ) where

import Net.DNSBase.Internal.Util

import Net.DNSBase.Decode.Domain
import Net.DNSBase.Decode.State
import Net.DNSBase.Domain
import Net.DNSBase.Encode.State
import Net.DNSBase.NsecTypes
import Net.DNSBase.Present
import Net.DNSBase.RData
import Net.DNSBase.RRTYPE

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

-- | The @CSYNC@ resource record
-- ([RFC 7477 section 2.1.1](https://www.rfc-editor.org/rfc/rfc7477.html#section-2.1.1))
-- — the child zone's request to its parent to synchronise NS / A /
-- AAAA records from the child to the parent.  Three fields: the
-- child's current SOA serial, processing flags, and an 'NsecTypes'
-- bitmap naming the RR types to be synchronised.
--
-- >                      1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
-- >  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-- > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-- > |                          SOA Serial                           |
-- > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-- > |       Flags                   |            Type Bit Map       /
-- > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-- > /                     Type Bit Map (continued)                  /
-- > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
--
-- See 'T_dsync' for the other child-to-parent signalling RR type
-- defined in this module.
data T_csync = T_CSYNC
    { T_csync -> Word32
csyncSerial :: Word32    -- ^ Zone serial number
    , T_csync -> Word16
csyncFlags  :: Word16    -- ^ flag Bits
    , T_csync -> NsecTypes
csyncTypes  :: NsecTypes -- ^ Type Bitmap
    } deriving (T_csync -> T_csync -> Bool
(T_csync -> T_csync -> Bool)
-> (T_csync -> T_csync -> Bool) -> Eq T_csync
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: T_csync -> T_csync -> Bool
== :: T_csync -> T_csync -> Bool
$c/= :: T_csync -> T_csync -> Bool
/= :: T_csync -> T_csync -> Bool
Eq, Int -> T_csync -> ShowS
[T_csync] -> ShowS
T_csync -> String
(Int -> T_csync -> ShowS)
-> (T_csync -> String) -> ([T_csync] -> ShowS) -> Show T_csync
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> T_csync -> ShowS
showsPrec :: Int -> T_csync -> ShowS
$cshow :: T_csync -> String
show :: T_csync -> String
$cshowList :: [T_csync] -> ShowS
showList :: [T_csync] -> ShowS
Show)

instance Ord T_csync where
    T_csync
a compare :: T_csync -> T_csync -> Ordering
`compare` T_csync
b = T_csync -> Word32
csyncSerial T_csync
a Word32 -> Word32 -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` T_csync -> Word32
csyncSerial T_csync
b
                 Ordering -> Ordering -> Ordering
forall a. Semigroup a => a -> a -> a
<> T_csync -> Word16
csyncFlags  T_csync
a Word16 -> Word16 -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` T_csync -> Word16
csyncFlags  T_csync
b
                 Ordering -> Ordering -> Ordering
forall a. Semigroup a => a -> a -> a
<> T_csync -> NsecTypes
csyncTypes  T_csync
a NsecTypes -> NsecTypes -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` T_csync -> NsecTypes
csyncTypes  T_csync
b

instance Presentable T_csync where
    present :: T_csync -> Builder -> Builder
present T_CSYNC{Word16
Word32
NsecTypes
csyncSerial :: T_csync -> Word32
csyncFlags :: T_csync -> Word16
csyncTypes :: T_csync -> NsecTypes
csyncSerial :: Word32
csyncFlags :: Word16
csyncTypes :: NsecTypes
..} =
        Word32 -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present     Word32
csyncSerial
        (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
presentSp Word16
csyncFlags
        (Builder -> Builder) -> (Builder -> Builder) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. NsecTypes -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
presentSp NsecTypes
csyncTypes

instance KnownRData T_csync where
    rdType :: forall b -> (b ~ T_csync) => RRTYPE
rdType _ = RRTYPE
CSYNC
    {-# INLINE rdType #-}
    rdEncode :: forall s. T_csync -> SPut s RData
rdEncode T_CSYNC{Word16
Word32
NsecTypes
csyncSerial :: T_csync -> Word32
csyncFlags :: T_csync -> Word16
csyncTypes :: T_csync -> NsecTypes
csyncSerial :: Word32
csyncFlags :: Word16
csyncTypes :: NsecTypes
..} = do
        SizedBuilder -> SPut s RData
forall r s. ErrorContext r => SizedBuilder -> SPut s r
putSizedBuilder (SizedBuilder -> SPut s RData) -> SizedBuilder -> SPut s RData
forall a b. (a -> b) -> a -> b
$
           Word32 -> SizedBuilder
mbWord32 Word32
csyncSerial
           SizedBuilder -> SizedBuilder -> SizedBuilder
forall a. Semigroup a => a -> a -> a
<> Word16 -> SizedBuilder
mbWord16 Word16
csyncFlags
        NsecTypes -> SPut s RData
forall s. NsecTypes -> SPut s RData
putNsecTypes NsecTypes
csyncTypes
    rdDecode :: forall b ->
(b ~ T_csync) => RDataExtensionVal T_csync -> Int -> SGet RData
rdDecode _ RDataExtensionVal T_csync
_ Int
len = do
        csyncSerial <- SGet Word32
get32
        csyncFlags  <- get16
        csyncTypes <- getNsecTypes (len - 6)
        pure $ RData T_CSYNC{..}

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

-- | DSYNC scheme numbers.  The 'Presentable' instance displays the registered
-- mnemonic of the scheme name for known types, or else just the decimal value.
-- See the
-- [IANA registry](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dsync-location-of-synchronization-endpoints)
-- for the known mnemonics.
--
newtype Dscheme = DSCHEME Word8
    deriving newtype ( Dscheme -> Dscheme -> Bool
(Dscheme -> Dscheme -> Bool)
-> (Dscheme -> Dscheme -> Bool) -> Eq Dscheme
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: Dscheme -> Dscheme -> Bool
== :: Dscheme -> Dscheme -> Bool
$c/= :: Dscheme -> Dscheme -> Bool
/= :: Dscheme -> Dscheme -> Bool
Eq, Eq Dscheme
Eq Dscheme =>
(Dscheme -> Dscheme -> Ordering)
-> (Dscheme -> Dscheme -> Bool)
-> (Dscheme -> Dscheme -> Bool)
-> (Dscheme -> Dscheme -> Bool)
-> (Dscheme -> Dscheme -> Bool)
-> (Dscheme -> Dscheme -> Dscheme)
-> (Dscheme -> Dscheme -> Dscheme)
-> Ord Dscheme
Dscheme -> Dscheme -> Bool
Dscheme -> Dscheme -> Ordering
Dscheme -> Dscheme -> Dscheme
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 :: Dscheme -> Dscheme -> Ordering
compare :: Dscheme -> Dscheme -> Ordering
$c< :: Dscheme -> Dscheme -> Bool
< :: Dscheme -> Dscheme -> Bool
$c<= :: Dscheme -> Dscheme -> Bool
<= :: Dscheme -> Dscheme -> Bool
$c> :: Dscheme -> Dscheme -> Bool
> :: Dscheme -> Dscheme -> Bool
$c>= :: Dscheme -> Dscheme -> Bool
>= :: Dscheme -> Dscheme -> Bool
$cmax :: Dscheme -> Dscheme -> Dscheme
max :: Dscheme -> Dscheme -> Dscheme
$cmin :: Dscheme -> Dscheme -> Dscheme
min :: Dscheme -> Dscheme -> Dscheme
Ord, Int -> Dscheme
Dscheme -> Int
Dscheme -> [Dscheme]
Dscheme -> Dscheme
Dscheme -> Dscheme -> [Dscheme]
Dscheme -> Dscheme -> Dscheme -> [Dscheme]
(Dscheme -> Dscheme)
-> (Dscheme -> Dscheme)
-> (Int -> Dscheme)
-> (Dscheme -> Int)
-> (Dscheme -> [Dscheme])
-> (Dscheme -> Dscheme -> [Dscheme])
-> (Dscheme -> Dscheme -> [Dscheme])
-> (Dscheme -> Dscheme -> Dscheme -> [Dscheme])
-> Enum Dscheme
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 :: Dscheme -> Dscheme
succ :: Dscheme -> Dscheme
$cpred :: Dscheme -> Dscheme
pred :: Dscheme -> Dscheme
$ctoEnum :: Int -> Dscheme
toEnum :: Int -> Dscheme
$cfromEnum :: Dscheme -> Int
fromEnum :: Dscheme -> Int
$cenumFrom :: Dscheme -> [Dscheme]
enumFrom :: Dscheme -> [Dscheme]
$cenumFromThen :: Dscheme -> Dscheme -> [Dscheme]
enumFromThen :: Dscheme -> Dscheme -> [Dscheme]
$cenumFromTo :: Dscheme -> Dscheme -> [Dscheme]
enumFromTo :: Dscheme -> Dscheme -> [Dscheme]
$cenumFromThenTo :: Dscheme -> Dscheme -> Dscheme -> [Dscheme]
enumFromThenTo :: Dscheme -> Dscheme -> Dscheme -> [Dscheme]
Enum, Dscheme
Dscheme -> Dscheme -> Bounded Dscheme
forall a. a -> a -> Bounded a
$cminBound :: Dscheme
minBound :: Dscheme
$cmaxBound :: Dscheme
maxBound :: Dscheme
Bounded, Integer -> Dscheme
Dscheme -> Dscheme
Dscheme -> Dscheme -> Dscheme
(Dscheme -> Dscheme -> Dscheme)
-> (Dscheme -> Dscheme -> Dscheme)
-> (Dscheme -> Dscheme -> Dscheme)
-> (Dscheme -> Dscheme)
-> (Dscheme -> Dscheme)
-> (Dscheme -> Dscheme)
-> (Integer -> Dscheme)
-> Num Dscheme
forall a.
(a -> a -> a)
-> (a -> a -> a)
-> (a -> a -> a)
-> (a -> a)
-> (a -> a)
-> (a -> a)
-> (Integer -> a)
-> Num a
$c+ :: Dscheme -> Dscheme -> Dscheme
+ :: Dscheme -> Dscheme -> Dscheme
$c- :: Dscheme -> Dscheme -> Dscheme
- :: Dscheme -> Dscheme -> Dscheme
$c* :: Dscheme -> Dscheme -> Dscheme
* :: Dscheme -> Dscheme -> Dscheme
$cnegate :: Dscheme -> Dscheme
negate :: Dscheme -> Dscheme
$cabs :: Dscheme -> Dscheme
abs :: Dscheme -> Dscheme
$csignum :: Dscheme -> Dscheme
signum :: Dscheme -> Dscheme
$cfromInteger :: Integer -> Dscheme
fromInteger :: Integer -> Dscheme
Num, Num Dscheme
Ord Dscheme
(Num Dscheme, Ord Dscheme) => (Dscheme -> Rational) -> Real Dscheme
Dscheme -> Rational
forall a. (Num a, Ord a) => (a -> Rational) -> Real a
$ctoRational :: Dscheme -> Rational
toRational :: Dscheme -> Rational
Real, Enum Dscheme
Real Dscheme
(Real Dscheme, Enum Dscheme) =>
(Dscheme -> Dscheme -> Dscheme)
-> (Dscheme -> Dscheme -> Dscheme)
-> (Dscheme -> Dscheme -> Dscheme)
-> (Dscheme -> Dscheme -> Dscheme)
-> (Dscheme -> Dscheme -> (Dscheme, Dscheme))
-> (Dscheme -> Dscheme -> (Dscheme, Dscheme))
-> (Dscheme -> Integer)
-> Integral Dscheme
Dscheme -> Integer
Dscheme -> Dscheme -> (Dscheme, Dscheme)
Dscheme -> Dscheme -> Dscheme
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 :: Dscheme -> Dscheme -> Dscheme
quot :: Dscheme -> Dscheme -> Dscheme
$crem :: Dscheme -> Dscheme -> Dscheme
rem :: Dscheme -> Dscheme -> Dscheme
$cdiv :: Dscheme -> Dscheme -> Dscheme
div :: Dscheme -> Dscheme -> Dscheme
$cmod :: Dscheme -> Dscheme -> Dscheme
mod :: Dscheme -> Dscheme -> Dscheme
$cquotRem :: Dscheme -> Dscheme -> (Dscheme, Dscheme)
quotRem :: Dscheme -> Dscheme -> (Dscheme, Dscheme)
$cdivMod :: Dscheme -> Dscheme -> (Dscheme, Dscheme)
divMod :: Dscheme -> Dscheme -> (Dscheme, Dscheme)
$ctoInteger :: Dscheme -> Integer
toInteger :: Dscheme -> Integer
Integral, Int -> Dscheme -> ShowS
[Dscheme] -> ShowS
Dscheme -> String
(Int -> Dscheme -> ShowS)
-> (Dscheme -> String) -> ([Dscheme] -> ShowS) -> Show Dscheme
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> Dscheme -> ShowS
showsPrec :: Int -> Dscheme -> ShowS
$cshow :: Dscheme -> String
show :: Dscheme -> String
$cshowList :: [Dscheme] -> ShowS
showList :: [Dscheme] -> ShowS
Show, ReadPrec [Dscheme]
ReadPrec Dscheme
Int -> ReadS Dscheme
ReadS [Dscheme]
(Int -> ReadS Dscheme)
-> ReadS [Dscheme]
-> ReadPrec Dscheme
-> ReadPrec [Dscheme]
-> Read Dscheme
forall a.
(Int -> ReadS a)
-> ReadS [a] -> ReadPrec a -> ReadPrec [a] -> Read a
$creadsPrec :: Int -> ReadS Dscheme
readsPrec :: Int -> ReadS Dscheme
$creadList :: ReadS [Dscheme]
readList :: ReadS [Dscheme]
$creadPrec :: ReadPrec Dscheme
readPrec :: ReadPrec Dscheme
$creadListPrec :: ReadPrec [Dscheme]
readListPrec :: ReadPrec [Dscheme]
Read )

-- | [NOTIFY scheme](https://datatracker.ietf.org/doc/html/rfc9859#section-6.2).
pattern NOTIFY      :: Dscheme;     pattern $mNOTIFY :: forall {r}. Dscheme -> ((# #) -> r) -> ((# #) -> r) -> r
$bNOTIFY :: Dscheme
NOTIFY         = DSCHEME 1

instance Presentable Dscheme where
    present :: Dscheme -> Builder -> Builder
present Dscheme
NOTIFY       = forall a. Presentable a => a -> Builder -> Builder
present @String String
"NOTIFY"
    present (DSCHEME Word8
n)  = Word8 -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present Word8
n


-- | The @DSYNC@ resource record
-- ([RFC 9859](https://datatracker.ietf.org/doc/html/rfc9859#section-2.1))
-- — a child zone's published endpoint for generalised DNS
-- notifications: for a given child-side 'RRTYPE', it names the
-- 'Dscheme' (contact method, e.g.\ 'NOTIFY'), the contact 'Word16'
-- port number, and the 'Domain' to address the notification to.
--
-- >                      1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3
-- >  0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
-- > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-- > | RRtype                        | Scheme        | Port
-- > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
-- >                 | Target ...  /
-- > +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-/
--
-- See 'T_csync' for the other child-to-parent signalling RR type
-- defined in this module.
--
-- Target comparison and equality are case-sensitive.
-- The 'Ord' instance is canonical.
data T_dsync = T_DSYNC
    { T_dsync -> RRTYPE
dsyncRRtype :: RRTYPE    -- ^ Supported notification type
    , T_dsync -> Dscheme
dsyncScheme :: Dscheme   -- ^ Contact mode
    , T_dsync -> Word16
dsyncPort   :: Word16    -- ^ Contact port
    , T_dsync -> Domain
dsyncTarget :: Domain    -- ^ Server hostname
    } deriving (T_dsync -> T_dsync -> Bool
(T_dsync -> T_dsync -> Bool)
-> (T_dsync -> T_dsync -> Bool) -> Eq T_dsync
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: T_dsync -> T_dsync -> Bool
== :: T_dsync -> T_dsync -> Bool
$c/= :: T_dsync -> T_dsync -> Bool
/= :: T_dsync -> T_dsync -> Bool
Eq, Int -> T_dsync -> ShowS
[T_dsync] -> ShowS
T_dsync -> String
(Int -> T_dsync -> ShowS)
-> (T_dsync -> String) -> ([T_dsync] -> ShowS) -> Show T_dsync
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> T_dsync -> ShowS
showsPrec :: Int -> T_dsync -> ShowS
$cshow :: T_dsync -> String
show :: T_dsync -> String
$cshowList :: [T_dsync] -> ShowS
showList :: [T_dsync] -> ShowS
Show)

instance Ord T_dsync where
    T_dsync
a compare :: T_dsync -> T_dsync -> Ordering
`compare` T_dsync
b = T_dsync -> RRTYPE
dsyncRRtype T_dsync
a RRTYPE -> RRTYPE -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` T_dsync -> RRTYPE
dsyncRRtype T_dsync
b
                 Ordering -> Ordering -> Ordering
forall a. Semigroup a => a -> a -> a
<> T_dsync -> Dscheme
dsyncScheme T_dsync
a Dscheme -> Dscheme -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` T_dsync -> Dscheme
dsyncScheme T_dsync
b
                 Ordering -> Ordering -> Ordering
forall a. Semigroup a => a -> a -> a
<> T_dsync -> Word16
dsyncPort   T_dsync
a Word16 -> Word16 -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` T_dsync -> Word16
dsyncPort   T_dsync
b
                 Ordering -> Ordering -> Ordering
forall a. Semigroup a => a -> a -> a
<> T_dsync -> Domain
dsyncTarget T_dsync
a Domain -> Domain -> Ordering
forall a. Ord a => a -> a -> Ordering
`compare` T_dsync -> Domain
dsyncTarget T_dsync
b

instance Presentable T_dsync where
    present :: T_dsync -> Builder -> Builder
present T_DSYNC{Word16
RRTYPE
Domain
Dscheme
dsyncRRtype :: T_dsync -> RRTYPE
dsyncScheme :: T_dsync -> Dscheme
dsyncPort :: T_dsync -> Word16
dsyncTarget :: T_dsync -> Domain
dsyncRRtype :: RRTYPE
dsyncScheme :: Dscheme
dsyncPort :: Word16
dsyncTarget :: Domain
..} =
        RRTYPE -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
present     RRTYPE
dsyncRRtype
        (Builder -> Builder) -> (Builder -> Builder) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Dscheme -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
presentSp Dscheme
dsyncScheme
        (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
presentSp Word16
dsyncPort
        (Builder -> Builder) -> (Builder -> Builder) -> Builder -> Builder
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Domain -> Builder -> Builder
forall a. Presentable a => a -> Builder -> Builder
presentSp Domain
dsyncTarget

instance KnownRData T_dsync where
    rdType :: forall b -> (b ~ T_dsync) => RRTYPE
rdType _ = RRTYPE
DSYNC
    {-# INLINE rdType #-}
    rdEncode :: forall s. T_dsync -> SPut s RData
rdEncode T_DSYNC{Word16
RRTYPE
Domain
Dscheme
dsyncRRtype :: T_dsync -> RRTYPE
dsyncScheme :: T_dsync -> Dscheme
dsyncPort :: T_dsync -> Word16
dsyncTarget :: T_dsync -> Domain
dsyncRRtype :: RRTYPE
dsyncScheme :: Dscheme
dsyncPort :: Word16
dsyncTarget :: Domain
..} = SizedBuilder -> SPut s RData
forall r s. ErrorContext r => SizedBuilder -> SPut s r
putSizedBuilder (SizedBuilder -> SPut s RData) -> SizedBuilder -> SPut s RData
forall a b. (a -> b) -> a -> b
$
        Word16 -> SizedBuilder
mbWord16 (RRTYPE -> Word16
forall a b. Coercible a b => a -> b
coerce RRTYPE
dsyncRRtype)
        SizedBuilder -> SizedBuilder -> SizedBuilder
forall a. Semigroup a => a -> a -> a
<> Word8 -> SizedBuilder
mbWord8 (Dscheme -> Word8
forall a b. Coercible a b => a -> b
coerce Dscheme
dsyncScheme)
        SizedBuilder -> SizedBuilder -> SizedBuilder
forall a. Semigroup a => a -> a -> a
<> Word16 -> SizedBuilder
mbWord16 Word16
dsyncPort
        SizedBuilder -> SizedBuilder -> SizedBuilder
forall a. Semigroup a => a -> a -> a
<> Domain -> SizedBuilder
mbWireForm Domain
dsyncTarget
    rdDecode :: forall b ->
(b ~ T_dsync) => RDataExtensionVal T_dsync -> Int -> SGet RData
rdDecode _ RDataExtensionVal T_dsync
_ Int
_ = do
        dsyncRRtype <- Word16 -> RRTYPE
RRTYPE (Word16 -> RRTYPE) -> SGet Word16 -> SGet RRTYPE
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SGet Word16
get16
        dsyncScheme <- DSCHEME <$> get8
        dsyncPort   <- get16
        dsyncTarget <- getDomainNC
        pure $ RData T_DSYNC{..}