@@ -74,7 +74,7 @@ import Control.Monad.Compat
7474import Control.DeepSeq
7575 (NFData)
7676import Data.Aeson
77− (FromJSON (..))
77+ (FromJSON (..), ToJSON (..), encode)
7878import Data.Aeson.Parser
7979 (value)
8080import Data.Aeson.Types
@@ -102,7 +102,7 @@ import qualified Network.HTTP.Media as M
102102import Prelude ()
103103import Prelude.Compat
104104import Web.FormUrlEncoded
105− (FromForm, urlDecodeAsForm)
105+ (FromForm, ToForm, urlDecodeAsForm, urlEncodeAsForm)
106106
107107-- * Provided content types
108108data JSON deriving Typeable
@@ -327,6 +327,18 @@ instance ( MimeUnrender ctyp a
327327--------------------------------------------------------------------------
328328-- * MimeRender Instances
329329
330+-- | `encode`
331+instance {-# OVERLAPPABLE #-}
332+ ToJSON a => MimeRender JSON a where
333+ mimeRender _ = encode
334+
335+-- | @urlEncodeAsForm@
336+-- Note that the @mimeUnrender p (mimeRender p x) == Right x@ law only
337+-- holds if every element of x is non-null (i.e., not @("", "")@)
338+instance {-# OVERLAPPABLE #-}
339+ ToForm a => MimeRender FormUrlEncoded a where
340+ mimeRender _ = urlEncodeAsForm
341+
330342-- | `TextL.encodeUtf8`
331343instance MimeRender PlainText TextL.Text where
332344 mimeRender _ = TextL.encodeUtf8
@@ -376,6 +388,16 @@ eitherDecodeLenient input =
376388 <* skipSpace
377389 <* (endOfInput <?> "trailing junk after valid JSON")
378390
391+-- | `eitherDecode`
392+instance FromJSON a => MimeUnrender JSON a where
393+ mimeUnrender _ = eitherDecodeLenient
394+
395+-- | @urlDecodeAsForm@
396+-- Note that the @mimeUnrender p (mimeRender p x) == Right x@ law only
397+-- holds if every element of x is non-null (i.e., not @("", "")@)
398+instance FromForm a => MimeUnrender FormUrlEncoded a where
399+ mimeUnrender _ = left TextS.unpack . urlDecodeAsForm
400+
379401-- | @left show . TextL.decodeUtf8'@
380402instance MimeUnrender PlainText TextL.Text where
381403 mimeUnrender _ = left show . TextL.decodeUtf8'