    -- | DNS message encoder.
    --
    -- Note: 'Nework.DNS' is a client library, and its focus is on /sending/
    -- /queries/, and /receiving/ /replies/.  Thefore, while this module is
    -- reasonably adept at query generation, building a DNS server with this
    -- module requires additional work to handle message size limits, correct UDP
    -- truncation, proper EDNS negotiation, and so on.  Support for server-side DNS
    -- is at best rudimentary.
    --
    -- For sending queries, in most cases you should be using one of the functions
    -- from 'Network.DNS.Lookup' and 'Network.DNS.LookupRaw', or lastly, if you
    -- want to handle the network reads and writes for yourself (with your own code
    -- for UDP retries, TCP fallback, EDNS fallback, ...), then perhaps
    -- 'Network.DNS.IO.encodeQuestion' (letting 'Network.DNS' do the lookups for
    -- you in an @async@ thread is likely much simpler).
    --
    module Network.DNS.Encode (
        -- * Encode a DNS query (or response).
        encode
      ) where

    import Network.DNS.Imports
    import Network.DNS.StateBinary
    import Network.DNS.Types.Internal
    import Network.DNS.Encode.Builders

    -- | Encode a 'DNSMessage' for transmission over UDP.  For transmission over
    -- TCP encapsulate the result via 'Network.DNS.IO.encodeVC', or use
    -- 'Network.DNS.IO.sendVC', which handles this internally.  If any
    -- 'ResourceRecord' in the message contains incorrectly encoded 'Domain' name
    -- ByteStrings, this function may raise a 'DecodeError'.
    --
    encode :: DNSMessage -> ByteString
    encode :: DNSMessage -> ByteString
    encode = SPut -> ByteString
    runSPut (SPut -> ByteString)
    -> (DNSMessage -> SPut) -> DNSMessage -> ByteString
    forall b c a. (b -> c) -> (a -> b) -> a -> c
    . DNSMessage -> SPut
    putDNSMessage