module Network.DNS.Decode (
decode
, decodeMany
, decodeResourceRecord
, decodeDNSHeader
, decodeDNSFlags
, decodeDomain
, decodeMailbox
) where
import Network.DNS.Decode.Internal
import Network.DNS.Imports
import Network.DNS.StateBinary
import Network.DNS.Types
decode :: ByteString -> Either DNSError DNSMessage
decode bs = fst <$> runSGet getResponse bs
decodeMany :: ByteString -> Either DNSError ([DNSMessage], ByteString)
decodeMany bs = do
((bss, _), leftovers) <- runSGetWithLeftovers lengthEncoded bs
msgs <- mapM decode bss
return (msgs, leftovers)
where
lengthEncoded :: SGet [ByteString]
lengthEncoded = many $ do
len <- getInt16
getNByteString len
decodeDNSFlags :: ByteString -> Either DNSError DNSFlags
decodeDNSFlags bs = fst <$> runSGet getDNSFlags bs
decodeDNSHeader :: ByteString -> Either DNSError DNSHeader
decodeDNSHeader bs = fst <$> runSGet getHeader bs
decodeDomain :: ByteString -> Either DNSError Domain
decodeDomain bs = fst <$> runSGet getDomain bs
decodeMailbox :: ByteString -> Either DNSError Mailbox
decodeMailbox bs = fst <$> runSGet getMailbox bs
decodeResourceRecord :: ByteString -> Either DNSError ResourceRecord
decodeResourceRecord bs = fst <$> runSGet getResourceRecord bs