on master help sign in
better MimeRender/Unrender instances
commitc2af6e775d1d36f2011d43aff230bb502f8fba63 authorAlp Mestanogullari <alpmestan@gmail.com> dateMon 6 Dec 2021, 17:31 (5 years ago) parent3ed24fd
1 file changed+10−8
servant/src/Servant/API/UVerb.hs+10−8
servant/src/Servant/API/UVerb.hs+10−8
@@ -33,12 +33,14 @@ module Servant.API.UVerb
3333 )
3434where
3535
36+import Data.Aeson
3637import Data.Proxy (Proxy (Proxy))
3738import GHC.TypeLits (Nat)
3839import Network.HTTP.Types (Status, StdMethod)
3940import Servant.API.ContentTypes (JSON, PlainText, FormUrlEncoded, OctetStream, NoContent, MimeRender(mimeRender), MimeUnrender(mimeUnrender))
4041import Servant.API.Status (KnownStatus, statusVal)
4142import Servant.API.UVerb.Union
43+import Web.FormUrlEncoded
4244
4345class KnownStatus (StatusOf a) => HasStatus (a :: *) where
4446 type StatusOf (a :: *) :: Nat
@@ -99,26 +101,26 @@ instance KnownStatus n => HasStatus (WithStatus n a) where
99101-- use 'respond' instead of 'pure' or 'return', so all old handlers would have to be rewritten.
100102data UVerb (method :: StdMethod) (contentTypes :: [*]) (as :: [*])
101103
102−instance {-# OVERLAPPING #-} MimeRender JSON a => MimeRender JSON (WithStatus _status a) where
103− mimeRender contentTypeProxy (WithStatus a) = mimeRender contentTypeProxy a
104+instance ToJSON a => ToJSON (WithStatus _status a) where
105+ toJSON (WithStatus a) = toJSON a
104106
105107instance {-# OVERLAPPING #-} MimeRender PlainText a => MimeRender PlainText (WithStatus _status a) where
106108 mimeRender contentTypeProxy (WithStatus a) = mimeRender contentTypeProxy a
107109
108−instance {-# OVERLAPPING #-} MimeRender FormUrlEncoded a => MimeRender FormUrlEncoded (WithStatus _status a) where
109− mimeRender contentTypeProxy (WithStatus a) = mimeRender contentTypeProxy a
110+instance ToForm a => ToForm (WithStatus _status a) where
111+ toForm (WithStatus a) = toForm a
110112
111113instance {-# OVERLAPPING #-} MimeRender OctetStream a => MimeRender OctetStream (WithStatus _status a) where
112114 mimeRender contentTypeProxy (WithStatus a) = mimeRender contentTypeProxy a
113115
114−instance {-# OVERLAPPING #-} MimeUnrender JSON a => MimeUnrender JSON (WithStatus _status a) where
115− mimeUnrender contentTypeProxy input = WithStatus <$> mimeUnrender contentTypeProxy input
116+instance FromJSON a => FromJSON (WithStatus _status a) where
117+ parseJSON v = WithStatus <$> parseJSON v
116118
117119instance {-# OVERLAPPING #-} MimeUnrender PlainText a => MimeUnrender PlainText (WithStatus _status a) where
118120 mimeUnrender contentTypeProxy input = WithStatus <$> mimeUnrender contentTypeProxy input
119121
120−instance {-# OVERLAPPING #-} MimeUnrender FormUrlEncoded a => MimeUnrender FormUrlEncoded (WithStatus _status a) where
121− mimeUnrender contentTypeProxy input = WithStatus <$> mimeUnrender contentTypeProxy input
122+instance FromForm a => FromForm (WithStatus _status a) where
123+ fromForm v = WithStatus <$> fromForm v
122124
123125instance {-# OVERLAPPING #-} MimeUnrender OctetStream a => MimeUnrender OctetStream (WithStatus _status a) where
124126 mimeUnrender contentTypeProxy input = WithStatus <$> mimeUnrender contentTypeProxy input