@@ -37,12 +37,16 @@ module Data.Aeson
37
37
, decode'
38
38
, eitherDecode
39
39
, eitherDecode'
40
+ , verboseDecode
41
+ , verboseDecode'
40
42
, encode
41
43
-- ** Variants for strict bytestrings
42
44
, decodeStrict
43
45
, decodeStrict'
44
46
, eitherDecodeStrict
45
47
, eitherDecodeStrict'
48
+ , verboseDecodeStrict
49
+ , verboseDecodeStrict'
46
50
-- * Core JSON types
47
51
, Value (.. )
48
52
, Encoding
@@ -131,9 +135,14 @@ import Prelude.Compat
131
135
132
136
import Data.Aeson.Types.FromJSON (ifromJSON )
133
137
import 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' )
135
143
import 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 )
137
146
import qualified Data.ByteString as B
138
147
import qualified Data.ByteString.Lazy as L
139
148
@@ -221,6 +230,35 @@ eitherDecodeStrict' =
221
230
eitherFormatError . eitherDecodeStrictWith jsonEOF' ifromJSON
222
231
{-# INLINE eitherDecodeStrict' #-}
223
232
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
+
224
262
-- $use
225
263
--
226
264
-- This section contains basic information on the different ways to
0 commit comments