From 3f4c196b71148e2192f4cf3fd584568e6a4b3901 Mon Sep 17 00:00:00 2001 From: Alex Biehl Date: Wed, 7 Feb 2024 12:28:33 +0100 Subject: [PATCH] Remove usage of Data.Aeson.Parser --- Request.template.hs | 36 +++++------------ src/Tie/Codegen/Imports.hs | 4 -- test/golden/additional-properties.yaml.out | 41 +++++--------------- test/golden/bug-1.yaml.out | 38 +++++------------- test/golden/bug-2.yaml.out | 42 +++++--------------- test/golden/csv.yaml.out | 39 +++++-------------- test/golden/datetime.yaml.out | 39 +++++-------------- test/golden/enum-bug.yaml.out | 43 +++++---------------- test/golden/enum.yaml.out | 45 +++++----------------- test/golden/haskell-ext.yaml.out | 40 +++++-------------- test/golden/headers.yaml.out | 41 +++++--------------- test/golden/lists.yaml.out | 45 +++++----------------- test/golden/numbers.yaml.out | 39 +++++-------------- test/golden/object-without-type.yaml.out | 38 +++++------------- test/golden/oneof.yaml.out | 45 +++++----------------- test/golden/petstore.yaml.out | 43 +++++---------------- test/golden/test1.yaml.out | 44 +++++---------------- 17 files changed, 160 insertions(+), 502 deletions(-) diff --git a/Request.template.hs b/Request.template.hs index a9edfc3..e6e2d93 100644 --- a/Request.template.hs +++ b/Request.template.hs @@ -18,8 +18,7 @@ module Tie.Template.Request_ ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -267,7 +266,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -294,35 +293,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> diff --git a/src/Tie/Codegen/Imports.hs b/src/Tie/Codegen/Imports.hs index 7bac1a7..48cc340 100644 --- a/src/Tie/Codegen/Imports.hs +++ b/src/Tie/Codegen/Imports.hs @@ -92,10 +92,6 @@ codegenModuleHeader moduleName = <> PP.line <> "import" <+> "qualified" - <+> "Data.Aeson.Parser" - <> PP.line - <> "import" - <+> "qualified" <+> "Data.Aeson.Types" <> PP.line <> "import" diff --git a/test/golden/additional-properties.yaml.out b/test/golden/additional-properties.yaml.out index 2c00188..846984e 100644 --- a/test/golden/additional-properties.yaml.out +++ b/test/golden/additional-properties.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -105,8 +104,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -354,7 +352,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -381,35 +379,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -469,7 +452,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -520,7 +502,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -611,7 +592,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -679,7 +659,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/bug-1.yaml.out b/test/golden/bug-1.yaml.out index eae24a2..9861381 100644 --- a/test/golden/bug-1.yaml.out +++ b/test/golden/bug-1.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -91,8 +90,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -340,7 +338,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -367,35 +365,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -455,7 +438,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/bug-2.yaml.out b/test/golden/bug-2.yaml.out index a37cf36..8746c50 100644 --- a/test/golden/bug-2.yaml.out +++ b/test/golden/bug-2.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -91,8 +90,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -340,7 +338,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -367,35 +365,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -455,7 +438,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -506,7 +488,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -567,7 +548,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -640,7 +620,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -706,7 +685,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/csv.yaml.out b/test/golden/csv.yaml.out index 64bdbc9..3383681 100644 --- a/test/golden/csv.yaml.out +++ b/test/golden/csv.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -105,8 +104,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -354,7 +352,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -381,35 +379,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -469,7 +452,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -522,7 +504,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/datetime.yaml.out b/test/golden/datetime.yaml.out index b4dd669..fe1ba4f 100644 --- a/test/golden/datetime.yaml.out +++ b/test/golden/datetime.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -91,8 +90,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -340,7 +338,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -367,35 +365,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -455,7 +438,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -506,7 +488,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/enum-bug.yaml.out b/test/golden/enum-bug.yaml.out index 73ad722..113bc02 100644 --- a/test/golden/enum-bug.yaml.out +++ b/test/golden/enum-bug.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -94,8 +93,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -343,7 +341,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -370,35 +368,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -458,7 +441,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -509,7 +491,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -598,7 +579,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -687,7 +667,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -745,7 +724,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -825,7 +803,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/enum.yaml.out b/test/golden/enum.yaml.out index b8c1502..c7a480c 100644 --- a/test/golden/enum.yaml.out +++ b/test/golden/enum.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -158,8 +157,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -407,7 +405,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -434,35 +432,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -522,7 +505,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -573,7 +555,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -663,7 +644,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -747,7 +727,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -798,7 +777,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -849,7 +827,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -928,7 +905,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -1001,7 +977,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/haskell-ext.yaml.out b/test/golden/haskell-ext.yaml.out index 3aa0317..20b0064 100644 --- a/test/golden/haskell-ext.yaml.out +++ b/test/golden/haskell-ext.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -109,8 +108,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -358,7 +356,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -385,35 +383,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -473,7 +456,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -524,7 +506,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -596,7 +577,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/headers.yaml.out b/test/golden/headers.yaml.out index 4445152..06fed75 100644 --- a/test/golden/headers.yaml.out +++ b/test/golden/headers.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -122,8 +121,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -371,7 +369,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -398,35 +396,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -486,7 +469,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -537,7 +519,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -588,7 +569,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -639,7 +619,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/lists.yaml.out b/test/golden/lists.yaml.out index 5417d24..f3ba781 100644 --- a/test/golden/lists.yaml.out +++ b/test/golden/lists.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -155,8 +154,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -404,7 +402,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -431,35 +429,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -519,7 +502,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -570,7 +552,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -621,7 +602,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -672,7 +652,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -723,7 +702,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -774,7 +752,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -837,7 +814,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -898,7 +874,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/numbers.yaml.out b/test/golden/numbers.yaml.out index 6069d49..53ae705 100644 --- a/test/golden/numbers.yaml.out +++ b/test/golden/numbers.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -91,8 +90,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -340,7 +338,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -367,35 +365,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -455,7 +438,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -506,7 +488,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/object-without-type.yaml.out b/test/golden/object-without-type.yaml.out index ff7e6f5..d2ec9c6 100644 --- a/test/golden/object-without-type.yaml.out +++ b/test/golden/object-without-type.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -91,8 +90,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -340,7 +338,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -367,35 +365,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -455,7 +438,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/oneof.yaml.out b/test/golden/oneof.yaml.out index d863fab..1f2c586 100644 --- a/test/golden/oneof.yaml.out +++ b/test/golden/oneof.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -121,8 +120,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -370,7 +368,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -397,35 +395,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -485,7 +468,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -536,7 +518,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -587,7 +568,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -638,7 +618,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -720,7 +699,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -819,7 +797,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -944,7 +921,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -1005,7 +981,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/petstore.yaml.out b/test/golden/petstore.yaml.out index 90ca27c..12713f1 100644 --- a/test/golden/petstore.yaml.out +++ b/test/golden/petstore.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -122,8 +121,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -371,7 +369,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -398,35 +396,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -486,7 +469,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -541,7 +523,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -597,7 +578,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -653,7 +633,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -718,7 +697,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -786,7 +764,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString diff --git a/test/golden/test1.yaml.out b/test/golden/test1.yaml.out index 22b06d3..d788c71 100644 --- a/test/golden/test1.yaml.out +++ b/test/golden/test1.yaml.out @@ -15,7 +15,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -125,8 +124,7 @@ module Test.Request ) where -import Data.Aeson (FromJSON, parseJSON) -import qualified Data.Aeson.Parser +import qualified Data.Aeson import qualified Data.Aeson.Types import Data.Attoparsec.ByteString (eitherResult, parseWith) import Data.ByteString (ByteString) @@ -374,7 +372,7 @@ data BodyParser a Network.HTTP.Media.MediaType ((a -> Wai.Application) -> Wai.Application) -jsonBodyParser :: (FromJSON a) => BodyParser a +jsonBodyParser :: (Data.Aeson.FromJSON a) => BodyParser a jsonBodyParser = BodyParser "application/json" parseRequestBodyJSON {-# INLINE jsonBodyParser #-} @@ -401,35 +399,20 @@ parseRequestBody parsers withBody = \request respond -> do respond (Wai.responseBuilder (toEnum 415) [] mempty) {-# INLINE parseRequestBody #-} -parseRequestBodyJSON :: (FromJSON a) => (a -> Wai.Application) -> Wai.Application +parseRequestBodyJSON :: (Data.Aeson.FromJSON a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyJSON withBody = \request respond -> do - result <- parseWith (Wai.getRequestBodyChunk request) Data.Aeson.Parser.json' mempty - case eitherResult result of - Left _err -> + body <- Wai.lazyRequestBody request + case Data.Aeson.decode' body of + Nothing -> respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right value -> - case Data.Aeson.Types.parseEither Data.Aeson.parseJSON value of - Left _err -> - respond (Wai.responseBuilder (toEnum 400) [] mempty) - Right body -> - withBody body request respond + Just body -> + withBody body request respond {-# INLINEABLE parseRequestBodyJSON #-} parseRequestBodyForm :: (FromForm a) => (a -> Wai.Application) -> Wai.Application parseRequestBodyForm withBody = \request respond -> do - -- Reads the body using lazy IO. Not great but it gets us - -- going and is pretty local. - let getBodyBytes :: IO [ByteString] - getBodyBytes = do - chunk <- Wai.getRequestBodyChunk request - case chunk of - "" -> pure [] - _ -> do - rest <- unsafeInterleaveIO getBodyBytes - pure (chunk : rest) - - bytes <- getBodyBytes - case urlDecodeAsForm (LBS.fromChunks bytes) of + body <- Wai.lazyRequestBody request + case urlDecodeAsForm body of Left _err -> respond (Wai.responseBuilder (toEnum 400) [] mempty) Right form -> @@ -489,7 +472,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -582,7 +564,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -637,7 +618,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -713,7 +693,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -810,7 +789,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -962,7 +940,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString @@ -1048,7 +1025,6 @@ import qualified Control.Monad import qualified Control.Monad.IO.Class import qualified Data.Aeson import qualified Data.Aeson.Encoding -import qualified Data.Aeson.Parser import qualified Data.Aeson.Types import qualified Data.Attoparsec.ByteString import qualified Data.ByteString