Skip to content

Commit 96fb093

Browse files
committed
Better aeson error messages. addresses commercialhaskell#269
This overrides the aeson combinators to have better error messages Just import Data.Aeson.Extended instead of Data.Aeson
1 parent 1b39b02 commit 96fb093

16 files changed

Lines changed: 38 additions & 15 deletions

File tree

src/Data/Aeson/Extended.hs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
-- | The purpose of this module is to provide better failure messages
2+
-- When parsing a key of an object, this makes sure the key itself will show up
3+
module Data.Aeson.Extended (
4+
module Export
5+
, (.:)
6+
, (.:?)
7+
) where
8+
9+
import Data.Aeson as Export hiding ((.:), (.:?))
10+
import qualified Data.Aeson as A
11+
12+
import Data.Aeson.Types hiding ((.:), (.:?))
13+
14+
import Data.Text (unpack, Text)
15+
import Data.Monoid ((<>))
16+
17+
(.:) :: FromJSON a => Object -> Text -> Parser a
18+
(.:) o p = modifyFailure (("failed to parse field " <> unpack p <> ": ") <>) (o A..: p)
19+
{-# INLINE (.:) #-}
20+
21+
(.:?) :: FromJSON a => Object -> Text -> Parser (Maybe a)
22+
(.:?) o p = modifyFailure (("failed to parse field " <> unpack p <> ": ") <>) (o A..:? p)
23+
{-# INLINE (.:?) #-}

src/Network/HTTP/Download.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import Control.Monad.Catch (MonadThrow, throwM)
2626
import Control.Monad.IO.Class (MonadIO, liftIO)
2727
import Control.Monad.Reader (MonadReader, ReaderT, ask,
2828
runReaderT)
29-
import Data.Aeson (FromJSON, parseJSON)
29+
import Data.Aeson.Extended (FromJSON, parseJSON)
3030
import Data.Aeson.Parser (json')
3131
import Data.Aeson.Types (parseEither)
3232
import qualified Data.ByteString as S

src/Stack/Build/Types.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ module Stack.Build.Types where
1313

1414
import Control.DeepSeq
1515
import Control.Exception
16-
import Data.Aeson
16+
import Data.Aeson.Extended
1717
import Data.Binary (Binary(..))
1818
import qualified Data.ByteString as S
1919
import Data.Char (isSpace)

src/Stack/BuildPlan.hs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ import Control.Monad.Reader (asks)
3636
import Control.Monad.State.Strict (State, execState, get, modify,
3737
put)
3838
import Control.Monad.Trans.Control (MonadBaseControl)
39-
import Data.Aeson (FromJSON (..))
40-
import Data.Aeson (withObject, withText, (.:))
39+
import Data.Aeson.Extended (FromJSON (..), withObject, withText, (.:))
4140
import Data.Binary.VersionTagged (taggedDecodeOrLoad)
4241
import Data.ByteString (ByteString)
4342
import qualified Data.ByteString.Char8 as S8

src/Stack/Config.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ import Control.Monad.Logger hiding (Loc)
3636
import Control.Monad.Reader (MonadReader, ask, runReaderT)
3737
import Control.Monad.Trans.Control (MonadBaseControl)
3838
import qualified Crypto.Hash.SHA256 as SHA256
39-
import Data.Aeson
39+
import Data.Aeson.Extended
4040
import qualified Data.ByteString.Base16 as B16
4141
import qualified Data.ByteString.Lazy as L
4242
import Data.Either (partitionEithers)

src/Stack/Docker.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ import Control.Monad.Catch (MonadThrow, throwM)
2626
import Control.Monad.IO.Class (MonadIO,liftIO)
2727
import Control.Monad.Logger (MonadLogger,logError,logInfo,logWarn)
2828
import Control.Monad.Writer (execWriter,runWriter,tell)
29-
import Data.Aeson (FromJSON(..),(.:),(.:?),(.!=),eitherDecode)
29+
import Data.Aeson.Extended (FromJSON(..),(.:),(.:?),(.!=),eitherDecode)
3030
import Data.ByteString.Builder (stringUtf8,charUtf8,toLazyByteString)
3131
import qualified Data.ByteString.Char8 as BS
3232
import qualified Data.ByteString.Lazy.Char8 as LBS

src/Stack/PackageIndex.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ import Control.Monad.Logger (MonadLogger, logDebug,
3333
logInfo, logWarn)
3434
import Control.Monad.Reader (asks)
3535

36-
import Data.Aeson
36+
import Data.Aeson.Extended
3737
import qualified Data.Binary as Binary
3838
import Data.Binary.VersionTagged (taggedDecodeOrLoad)
3939
import Data.ByteString (ByteString)

src/Stack/Setup.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ import Control.Monad.Reader (MonadReader, ReaderT (..), asks)
2424
import Control.Monad.State (get, put, modify)
2525
import Control.Monad.Trans.Control
2626

27-
import Data.Aeson
27+
import Data.Aeson.Extended
2828
import qualified Data.ByteString as S
2929
import qualified Data.ByteString.Char8 as S8
3030
import Data.Conduit (Conduit, ($$), (=$), await, yield, awaitForever)

src/Stack/Types/Config.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import Control.Exception
1414
import Control.Monad (liftM, mzero)
1515
import Control.Monad.Catch (MonadThrow, throwM)
1616
import Control.Monad.Reader (MonadReader, ask, asks, MonadIO, liftIO)
17-
import Data.Aeson (ToJSON, toJSON, FromJSON, parseJSON, withText, withObject, object
17+
import Data.Aeson.Extended (ToJSON, toJSON, FromJSON, parseJSON, withText, withObject, object
1818
,(.=), (.:?), (.!=), (.:), Value (String))
1919
import Data.Binary (Binary)
2020
import Data.ByteString (ByteString)

src/Stack/Types/Docker.hs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
module Stack.Types.Docker where
66

77
import Control.Applicative
8-
import Data.Aeson
8+
import Data.Aeson.Extended
99
import Data.Monoid
1010
import Data.Text (Text)
1111
import Path

0 commit comments

Comments
 (0)