@@ -37,12 +37,16 @@ module Data.Aeson
3737 , decode'
3838 , eitherDecode
3939 , eitherDecode'
40+ , verboseDecode
41+ , verboseDecode'
4042 , encode
4143 -- ** Variants for strict bytestrings
4244 , decodeStrict
4345 , decodeStrict'
4446 , eitherDecodeStrict
4547 , eitherDecodeStrict'
48+ , verboseDecodeStrict
49+ , verboseDecodeStrict'
4650 -- * Core JSON types
4751 , Value (.. )
4852 , Encoding
@@ -131,9 +135,14 @@ import Prelude.Compat
131135
132136import Data.Aeson.Types.FromJSON (ifromJSON )
133137import Data.Aeson.Encoding (encodingToLazyByteString )
134- import Data.Aeson.Parser.Internal (decodeWith , decodeStrictWith , eitherDecodeWith , eitherDecodeStrictWith , jsonEOF , json , jsonEOF' , json' )
138+ import Data.Aeson.Parser.Internal
139+ ( decodeWith , decodeStrictWith
140+ , eitherDecodeWith , eitherDecodeStrictWith
141+ , verboseDecodeWith , verboseDecodeStrictWith
142+ , jsonEOF , json , jsonEOF' , json' )
135143import Data.Aeson.Types
136- import Data.Aeson.Types.Internal (JSONPath , formatError )
144+ import Data.Aeson.Types.Internal (JSONPath , formatError , formatErrors )
145+ import Data.List.NonEmpty (NonEmpty )
137146import qualified Data.ByteString as B
138147import qualified Data.ByteString.Lazy as L
139148
@@ -221,6 +230,35 @@ eitherDecodeStrict' =
221230 eitherFormatError . eitherDecodeStrictWith jsonEOF' ifromJSON
222231{-# INLINE eitherDecodeStrict' #-}
223232
233+ eitherFormatErrors
234+ :: Either (NonEmpty (JSONPath , String )) a -> Either (NonEmpty String ) a
235+ eitherFormatErrors = either (Left . formatErrors) Right
236+ {-# INLINE eitherFormatErrors #-}
237+
238+ -- | Like 'decode' but returns one or more error messages when decoding fails.
239+ verboseDecode :: (FromJSON a ) => L. ByteString -> Either (NonEmpty String ) a
240+ verboseDecode = eitherFormatErrors . verboseDecodeWith jsonEOF ifromJSON
241+ {-# INLINE verboseDecode #-}
242+
243+ -- | Like 'decodeStrict' but returns one or more error messages when decoding
244+ -- fails.
245+ verboseDecodeStrict :: (FromJSON a ) => B. ByteString -> Either (NonEmpty String ) a
246+ verboseDecodeStrict =
247+ eitherFormatErrors . verboseDecodeStrictWith jsonEOF ifromJSON
248+ {-# INLINE verboseDecodeStrict #-}
249+
250+ -- | Like 'decode'' but returns one or more error messages when decoding fails.
251+ verboseDecode' :: (FromJSON a ) => L. ByteString -> Either (NonEmpty String ) a
252+ verboseDecode' = eitherFormatErrors . verboseDecodeWith jsonEOF' ifromJSON
253+ {-# INLINE verboseDecode' #-}
254+
255+ -- | Like 'decodeStrict'' but returns one or more error messages when decoding
256+ -- fails.
257+ verboseDecodeStrict' :: (FromJSON a ) => B. ByteString -> Either (NonEmpty String ) a
258+ verboseDecodeStrict' =
259+ eitherFormatErrors . verboseDecodeStrictWith jsonEOF' ifromJSON
260+ {-# INLINE verboseDecodeStrict' #-}
261+
224262-- $use
225263--
226264-- This section contains basic information on the different ways to
0 commit comments