content: {-# OPTIONS_HADDOCK hide #-}
  
  module Network.DNS.Decode.Internal (
      -- ** Internal message component decoders for tests
      decodeDNSHeader
    , decodeDNSFlags
    , decodeDomain
    , decodeMailbox
    , decodeResourceRecordAt
    , decodeResourceRecord
    ) where
  
  import Network.DNS.Decode.Parsers
  import Network.DNS.Imports
  import Network.DNS.StateBinary
  import Network.DNS.Types.Internal
  
  ----------------------------------------------------------------
  
  -- | Decode the 'DNSFlags' field of 'DNSHeader'.  This is an internal function
  -- exposed only for testing.
  --
  decodeDNSFlags :: ByteString -> Either DNSError DNSFlags
  decodeDNSFlags bs = fst <$> runSGet getDNSFlags bs
  
  -- | Decode the 'DNSHeader' of a message.  This is an internal function.
  -- exposed only for testing.
  --
  decodeDNSHeader :: ByteString -> Either DNSError DNSHeader
  decodeDNSHeader bs = fst <$> runSGet getHeader bs
  
  -- | Decode a domain name.  Since DNS names may use name compression, it is not
  -- generally possible to decode the names separately from the enclosing DNS
  -- message.  This is an internal function exposed only for testing.
  --
  decodeDomain :: ByteString -> Either DNSError Domain
  decodeDomain bs = fst <$> runSGet getDomain bs
  
  -- | Decode a mailbox name (e.g. the SOA record /rname/ field).  Since DNS names
  -- may use name compression, it is not generally possible to decode the names
  -- separately from the enclosing DNS message.  This is an internal function.
  --
  decodeMailbox :: ByteString -> Either DNSError Mailbox
  decodeMailbox bs = fst <$> runSGet getMailbox bs
  
  -- | Decoding resource records.
  
  -- | Decode a resource record (RR) with any DNS timestamps interpreted at the
  -- nominal epoch time (see 'decodeAt').  Since RRs may use name compression,
  -- it is not generally possible to decode resource record separately from the
  -- enclosing DNS message.  This is an internal function.
  --
  decodeResourceRecord :: ByteString -> Either DNSError ResourceRecord
  decodeResourceRecord bs = fst <$> runSGet getResourceRecord bs
  
  -- | Decode a resource record (RR) with DNS timestamps interpreted at the
  -- supplied epoch time.  Since RRs may use DNS name compression, it is not
  -- generally possible to decode resource record separately from the enclosing
  -- DNS message.  This is an internal function.
  --
  decodeResourceRecordAt :: Int64      -- ^ current epoch time
                         -> ByteString -- ^ encoded resource record
                         -> Either DNSError ResourceRecord
  decodeResourceRecordAt t bs = fst <$> runSGetAt t getResourceRecord bs
  