{-|
Module      : Net.DNSBase.RData
Description : Existential wrapper and extensibility hooks for RR-data payloads
Copyright   : (c) Viktor Dukhovni, 2026
License     : BSD-3-Clause
Maintainer  : ietf-dane@dukhovni.org
Stability   : unstable

The existential 'RData' wrapper holds any 'KnownRData'
instance, so a heterogeneous list of records — an answer
section, a zone — can share a single Haskell type.
'fromRData' and 'rdataType' recover the underlying value or
its type code; 'monoRData' is the bulk form, filtering a list
of 'RData' values by type.

Unrecognised RR types decode into 'OpaqueRData', which
preserves the raw wire bytes under a type-level codepoint and
presents in the generic
[RFC 3597](https://datatracker.ietf.org/doc/html/rfc3597)
@\#@-prefixed form.

Advanced applications can add support for any missing RR types,
not yet supported by the library, by implementing a corresponding
'KnownRData' instance and exposing it to the resolver via
'Net.DNSBase.Resolver.registerRRtype' (see
"Net.DNSBase.Resolver").  'KnownRData' carries any per-type
extension value ('RDataExtensionVal') the codec consumes.
RR types that admit type-driven extension (presently, just SVCB
and HTTPS) /also/ implement a 'TypeExtensible' instance whose
'extendByType' method is invoked by
'Net.DNSBase.Resolver.extendRRwithType'.

The encoder and decoder combinator modules are re-exported for
the benefit of authors of new 'KnownRData' instances; ordinary
callers do not need them.
-}

module Net.DNSBase.RData
    ( -- * Basic RData API
      RData(..)
    , fromRData
    , monoRData
    , rdataType
      -- * Opaque RData
    , OpaqueRData(..)
    , opaqueRData
    , toOpaqueRData
    , fromOpaqueRData
      -- * Extensibility
    , KnownRData(..)
    , TypeExtensible(..)
    , RDataCodec
      -- * Encoder and Decoder combinators
    , module Net.DNSBase.Decode.State
    , module Net.DNSBase.Encode.Metric
    , module Net.DNSBase.Encode.State
    ) where

import Net.DNSBase.Decode.Internal.RData
import Net.DNSBase.Decode.State
import Net.DNSBase.Encode.Metric
import Net.DNSBase.Encode.State
import Net.DNSBase.Extensible
import Net.DNSBase.Internal.RData