module Network.HPACK (
  -- * Type
    ByteStream
  , HeaderSet
  , Context
  , newContext
  , DecodeError(..)
  -- * Request
  , encodeRequestHeader
  , decodeRequestHeader
  -- * Response
  , encodeResponseHeader
  , decodeResponseHeader
  ) where

import Control.Applicative ((<$>))
import Control.Arrow (first)
import Network.HPACK.Context
import Network.HPACK.HeaderBlock
import Network.HPACK.Huffman
import Network.HPACK.Types

----------------------------------------------------------------

-- | Converting 'HeaderSet' for HTTP request to the low level format.
encodeRequestHeader :: HeaderSet
                    -> Context
                    -> IO (ByteStream, Context)
encodeRequestHeader hs ctx =
    first (toByteStream huffmanEncodeInRequest) <$> toHeaderBlock hs ctx

-- | Converting the low level format for HTTP request to 'HeaderSet'.
--   'DecodeError' would be thrown.
decodeRequestHeader :: ByteStream
                    -> Context
                    -> IO (HeaderSet, Context)
decodeRequestHeader bs ctx =
    fromHeaderBlock (fromByteStream huffmanDecodeInRequest bs) ctx

----------------------------------------------------------------

-- | Converting 'HeaderSet' for HTTP response to the low level format.
encodeResponseHeader :: HeaderSet
                     -> Context
                     -> IO (ByteStream, Context)
encodeResponseHeader hs ctx =
    first (toByteStream huffmanEncodeInResponse) <$> toHeaderBlock hs ctx

-- | Converting the low level format for HTTP response to 'HeaderSet'.
--   'DecodeError' would be thrown.
decodeResponseHeader :: ByteStream
                    -> Context
                    -> IO (HeaderSet, Context)
decodeResponseHeader bs ctx =
    fromHeaderBlock (fromByteStream huffmanDecodeInResponse bs) ctx