Skip to content

Commit e485790

Browse files
author
Mitsutoshi Aoe
committed
Handle error objects properly
* Handle top-level error objects * Do not ignore error objects in the results object (fixes #66)
1 parent a15387b commit e485790

File tree

1 file changed

+20
-7
lines changed

1 file changed

+20
-7
lines changed

src/Database/InfluxDB/JSON.hs

+20-7
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,9 @@ module Database.InfluxDB.JSON
3434
import Control.Applicative
3535
import Control.Exception
3636
import Control.Monad
37+
import Data.Foldable
3738
import Data.Maybe
39+
import Prelude
3840

3941
import Data.Aeson
4042
import Data.HashMap.Strict (HashMap)
@@ -81,13 +83,26 @@ parseResultsWithDecoder
8183
-- to construct a value.
8284
-> Value
8385
-> A.Parser (Vector a)
84-
parseResultsWithDecoder Decoder {..} row val0 = success
86+
parseResultsWithDecoder Decoder {..} row val0 = do
87+
r <- foldr1 (<|>)
88+
[ Left <$> parseErrorObject val0
89+
, Right <$> success
90+
]
91+
case r of
92+
Left err -> fail err
93+
Right vec -> return vec
8594
where
8695
success = do
8796
results <- parseResultsObject val0
8897

89-
(join -> series) <- V.forM results $ \val ->
90-
parseSeriesObject val <|> parseErrorObject val
98+
(join -> series) <- V.forM results $ \val -> do
99+
r <- foldr1 (<|>)
100+
[ Left <$> parseErrorObject val
101+
, Right <$> parseSeriesObject val
102+
]
103+
case r of
104+
Left err -> fail err
105+
Right vec -> return vec
91106
values <- V.forM series $ \val -> do
92107
(name, tags, columns, values) <- parseSeriesBody val
93108
decodeFold $ V.forM values $ A.withArray "values" $ \fields -> do
@@ -165,10 +180,8 @@ parseSeriesBody = A.withObject "series" $ \obj -> do
165180
return (name, tags, columns, values)
166181

167182
-- | Parse the common JSON structure used in failure response.
168-
parseErrorObject :: A.Value -> A.Parser a
169-
parseErrorObject = A.withObject "error" $ \obj -> do
170-
message <- obj .: "error"
171-
fail $ T.unpack message
183+
parseErrorObject :: A.Value -> A.Parser String
184+
parseErrorObject = A.withObject "error" $ \obj -> obj .: "error"
172185

173186
-- | Parse either a POSIX timestamp or RFC3339 formatted timestamp as 'UTCTime'.
174187
parseUTCTime :: Precision ty -> A.Value -> A.Parser UTCTime

0 commit comments

Comments
 (0)