{-# LANGUAGE OverloadedStrings #-} module Language.Symantic.HTTP.Media where import Data.Function (($), (.), id) import Data.Proxy (Proxy(..)) import Data.String (String) import qualified Data.ByteString as BS import qualified Data.ByteString.Lazy as BSL import qualified Data.ByteString.Lazy.Char8 as BSLC import qualified Data.Text as T import qualified Data.Text.Encoding as T import qualified Data.Text.Lazy as TL import qualified Data.Text.Lazy.Encoding as TL import qualified Network.HTTP.Media as Media -- * Class 'MediaTypeable' class MediaTypeable mt where mediaType :: Proxy mt -> MediaType mediaTypes :: Proxy mt -> [MediaType] mediaTypes mt = [mediaType mt] type MediaType = Media.MediaType charsetUTF8 :: MediaType -> MediaType charsetUTF8 = (Media./: ("charset", "utf-8")) anyMediaType :: MediaType anyMediaType = "*/*" -- ** Type 'JSON' data JSON json :: Proxy JSON json = Proxy instance MediaTypeable JSON where mediaType _mt = charsetUTF8 $ "application"Media.//"json" mediaTypes mt = [mediaType mt, "application"Media.//"json"] -- ** Type 'HTML' data HTML html :: Proxy HTML html = Proxy instance MediaTypeable HTML where mediaType _mt = charsetUTF8 $ "text"Media.//"html" mediaTypes mt = [mediaType mt, "text"Media.//"html"] -- ** Type 'FormUrlEncoded' data FormUrlEncoded formUrlEncoded :: Proxy FormUrlEncoded formUrlEncoded = Proxy instance MediaTypeable FormUrlEncoded where mediaType _mt = "application"Media.//"x-www-form-urlencoded" -- ** Type 'OctetStream' data OctetStream octetStream :: Proxy OctetStream octetStream = Proxy instance MediaTypeable OctetStream where mediaType _mt = "application"Media.//"octet-stream" -- ** Type 'PlainText' data PlainText plainText :: Proxy PlainText plainText = Proxy instance MediaTypeable PlainText where mediaType _mt = charsetUTF8 $ "text"Media.//"plain" instance MediaTypeable () where mediaType _mt = mediaType (Proxy::Proxy PlainText) -- * Class 'ToMediaType' class MediaTypeable mt => ToMediaType mt a where toMediaType :: Proxy mt -> a -> BSL.ByteString instance ToMediaType PlainText () where toMediaType _mt () = BSL.empty instance ToMediaType PlainText T.Text where toMediaType _mt = BSL.fromStrict . T.encodeUtf8 instance ToMediaType PlainText TL.Text where toMediaType _mt = TL.encodeUtf8 instance ToMediaType PlainText String where toMediaType _mt = BSLC.pack instance ToMediaType OctetStream BS.ByteString where toMediaType _mt = BSL.fromStrict instance ToMediaType OctetStream BSL.ByteString where toMediaType _mt = id {- TODO: uncomment when Web is imported instance ToMediaType FormUrlEncoded a where toMediaType _mt = Web.urlEncodeAsForm -}