module Network.DNS.Decode (
decodeAt
, decode
, decodeManyAt
, decodeMany
) where
import qualified Data.ByteString as B
import Network.DNS.Decode.Parsers
import Network.DNS.Imports
import Network.DNS.StateBinary
import Network.DNS.Types.Internal
decodeAt :: Int64
-> ByteString
-> Either DNSError DNSMessage
decodeAt :: Int64 -> ByteString -> Either DNSError DNSMessage
decodeAt Int64
t ByteString
bs = (DNSMessage, PState) -> DNSMessage
forall a b. (a, b) -> a
fst ((DNSMessage, PState) -> DNSMessage)
-> Either DNSError (DNSMessage, PState)
-> Either DNSError DNSMessage
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> Int64
-> SGet DNSMessage
-> ByteString
-> Either DNSError (DNSMessage, PState)
forall a.
Int64 -> SGet a -> ByteString -> Either DNSError (a, PState)
runSGetAt Int64
t (Int -> SGet DNSMessage -> SGet DNSMessage
forall a. Int -> SGet a -> SGet a
fitSGet (ByteString -> Int
B.length ByteString
bs) SGet DNSMessage
getResponse) ByteString
bs
decode :: ByteString
-> Either DNSError DNSMessage
decode :: ByteString -> Either DNSError DNSMessage
decode ByteString
bs = (DNSMessage, PState) -> DNSMessage
forall a b. (a, b) -> a
fst ((DNSMessage, PState) -> DNSMessage)
-> Either DNSError (DNSMessage, PState)
-> Either DNSError DNSMessage
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
<$> SGet DNSMessage
-> ByteString -> Either DNSError (DNSMessage, PState)
forall a. SGet a -> ByteString -> Either DNSError (a, PState)
runSGet (Int -> SGet DNSMessage -> SGet DNSMessage
forall a. Int -> SGet a -> SGet a
fitSGet (ByteString -> Int
B.length ByteString
bs) SGet DNSMessage
getResponse) ByteString
bs
decodeManyAt :: Int64
-> ByteString
-> Either DNSError ([DNSMessage], ByteString)
decodeManyAt :: Int64 -> ByteString -> Either DNSError ([DNSMessage], ByteString)
decodeManyAt Int64
t ByteString
bs = (ByteString -> Either DNSError DNSMessage)
-> ByteString -> Either DNSError ([DNSMessage], ByteString)
decodeMParse (Int64 -> ByteString -> Either DNSError DNSMessage
decodeAt Int64
t) ByteString
bs
decodeMany :: ByteString
-> Either DNSError ([DNSMessage], ByteString)
decodeMany :: ByteString -> Either DNSError ([DNSMessage], ByteString)
decodeMany ByteString
bs = (ByteString -> Either DNSError DNSMessage)
-> ByteString -> Either DNSError ([DNSMessage], ByteString)
decodeMParse ByteString -> Either DNSError DNSMessage
decode ByteString
bs
decodeMParse :: (ByteString -> Either DNSError DNSMessage)
-> ByteString
-> Either DNSError ([DNSMessage], ByteString)
decodeMParse :: (ByteString -> Either DNSError DNSMessage)
-> ByteString -> Either DNSError ([DNSMessage], ByteString)
decodeMParse ByteString -> Either DNSError DNSMessage
decoder ByteString
bs = do
(([ByteString]
bss, PState
_), ByteString
leftovers) <- SGet [ByteString]
-> ByteString
-> Either DNSError (([ByteString], PState), ByteString)
forall a.
SGet a -> ByteString -> Either DNSError ((a, PState), ByteString)
runSGetWithLeftovers SGet [ByteString]
lengthEncoded ByteString
bs
[DNSMessage]
msgs <- (ByteString -> Either DNSError DNSMessage)
-> [ByteString] -> Either DNSError [DNSMessage]
forall (t :: * -> *) (m :: * -> *) a b.
(Traversable t, Monad m) =>
(a -> m b) -> t a -> m (t b)
mapM ByteString -> Either DNSError DNSMessage
decoder [ByteString]
bss
([DNSMessage], ByteString)
-> Either DNSError ([DNSMessage], ByteString)
forall (m :: * -> *) a. Monad m => a -> m a
return ([DNSMessage]
msgs, ByteString
leftovers)
where
lengthEncoded :: SGet [ByteString]
lengthEncoded :: SGet [ByteString]
lengthEncoded = StateT PState (Parser ByteString) ByteString -> SGet [ByteString]
forall (f :: * -> *) a. Alternative f => f a -> f [a]
many (StateT PState (Parser ByteString) ByteString -> SGet [ByteString])
-> StateT PState (Parser ByteString) ByteString
-> SGet [ByteString]
forall a b. (a -> b) -> a -> b
$ SGet Int
getInt16 SGet Int
-> (Int -> StateT PState (Parser ByteString) ByteString)
-> StateT PState (Parser ByteString) ByteString
forall (m :: * -> *) a b. Monad m => m a -> (a -> m b) -> m b
>>= Int -> StateT PState (Parser ByteString) ByteString
getNByteString