Michael Snoyman avatar Michael Snoyman committed 8216c04

modifyFailure (bos/aeson#104)

Comments (0)

Files changed (3)

Data/Aeson/Types.hs

     , parseEither
     , parseMaybe
     , ToJSON(..)
+    , modifyFailure
 
     -- * Inspecting @'Value's@
     , withObject

Data/Aeson/Types/Internal.hs

     , parse
     , parseEither
     , parseMaybe
+    , modifyFailure
     -- * Constructors and accessors
     , object
     ) where
 object :: [Pair] -> Value
 object = Object . H.fromList
 {-# INLINE object #-}
+
+-- | If the inner @Parser@ failed, modify the failure message using the
+-- provided function. This allows you to create more meaningful error messages.
+-- For example:
+--
+-- > parseJSON (Object o) = modifyFailure
+-- >     ("Parsing of the Foo value failed: " ++)
+-- >     (Foo <$> o .: "someField")
+--
+-- Since 0.6.2.0
+modifyFailure :: (String -> String) -> Parser a -> Parser a
+modifyFailure f (Parser p) =
+    Parser $ \failure success -> p (modifyFailure' failure) success
+  where
+    modifyFailure' failure original = failure $ f original

tests/Properties.hs

 regress_gh72 ys = G.decode (G.encode m) == Just m
     where m = Map.fromList ys
 
+modifyFailureProp :: String -> String -> Bool
+modifyFailureProp orig added =
+    result == Error (added ++ orig)
+  where
+    parser = const $ modifyFailure (added ++) $ fail orig
+    result :: Result ()
+    result = parse parser ()
+
 data Foo = Foo {
       fooInt :: Int
     , fooDouble :: Double
     ],
   testGroup "genericToFromJSON" [
       testProperty "_UFoo" (genericToFromJSON :: UFoo -> Bool)
+    ],
+  testGroup "failure messages" [
+      testProperty "modify failure" modifyFailureProp
     ]
   ]
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.