module Serv.Internal.Header (
HeaderName (..),
reflectName,
ReflectName,
ReflectHeaders (..),
ReflectHeaderNames (..),
HeaderEncode (..),
headerEncodeRaw,
headerPair,
HeaderDecode (..),
headerDecodeRaw
) where
import Data.Proxy
import Data.Text.Encoding (encodeUtf8)
import qualified Network.HTTP.Types as HTTP
import Serv.Internal.Header.Name
import Serv.Internal.Header.Serialization
import Serv.Internal.Pair
import Serv.Internal.Rec
class ReflectHeaderNames headers where
reflectHeaderNames :: Proxy headers -> [HTTP.HeaderName]
instance ReflectHeaderNames '[] where
reflectHeaderNames _ = []
instance
(ReflectName name, ReflectHeaderNames hdrs) =>
ReflectHeaderNames (name '::: ty ': hdrs)
where
reflectHeaderNames _ =
reflectName (Proxy :: Proxy name)
: reflectHeaderNames (Proxy :: Proxy hdrs)
class ReflectHeaders headers where
reflectHeaders :: Rec headers -> [HTTP.Header]
instance ReflectHeaders '[] where
reflectHeaders Nil = []
instance
(ReflectName name, HeaderEncode name ty, ReflectHeaders headers) =>
ReflectHeaders ( name '::: ty ': headers )
where
reflectHeaders (Cons val headers) =
case headerEncode proxy val of
Nothing -> reflectHeaders headers
Just txt -> (reflectName proxy, encodeUtf8 txt) : reflectHeaders headers
where
proxy = Proxy :: Proxy name