module Network.Wai.Predicate.MediaType where
import Data.ByteString (ByteString)
import Data.Singletons
import Data.Singletons.TypeLits
#if MIN_VERSION_singletons(2,3,0)
import Data.Text.Encoding (encodeUtf8)
#else
import Data.ByteString.Char8 (pack)
#endif
data Media (t :: Symbol) (s :: Symbol) = Media
{ rawType :: !ByteString
, rawSubTypes :: !ByteString
, mediaQuality :: !Double
, mediaParams :: ![(ByteString, ByteString)]
} deriving (Eq, Show)
mediaType :: KnownSymbol t => Media t s -> ByteString
mediaType m = withSing (f m)
where
f :: Media t s -> Sing t -> ByteString
#if MIN_VERSION_singletons(2,3,0)
f _ t = encodeUtf8 (fromSing t)
#else
f _ t = pack (fromSing t)
#endif
mediaSubType :: KnownSymbol s => Media t s -> ByteString
mediaSubType m = withSing (f m)
where
f :: Media t s -> Sing s -> ByteString
#if MIN_VERSION_singletons(2,3,0)
f _ s = encodeUtf8 (fromSing s)
#else
f _ s = pack (fromSing s)
#endif