@@ -188,7 +188,7 @@ parseIntegralFromScientific :: forall a. Integral a => String -> Scientific -> P
188parseIntegralFromScientific expected s =
188parseIntegralFromScientific expected s =
189 case Scientific.floatingOrInteger s :: Either Double a of
189 case Scientific.floatingOrInteger s :: Either Double a of
190 Right x -> pure x
190 Right x -> pure x
191− Left _ -> fail $ "Floating number specified for " ++ expected ++ ": " ++ show s
191+ Left _ -> fail $ "expected " ++ expected ++ ", encountered floating number " ++ show s
192{-# INLINE parseIntegralFromScientific #-}
192{-# INLINE parseIntegralFromScientific #-}
194parseIntegral :: Integral a => String -> Value -> Parser a
194parseIntegral :: Integral a => String -> Value -> Parser a
@@ -1273,16 +1273,20 @@ instance FromJSONKey Integer where
1273 fromJSONKey = FromJSONKeyTextParser $ parseIntegralText "Integer"
1273 fromJSONKey = FromJSONKeyTextParser $ parseIntegralText "Integer"
1275instance FromJSON Natural where
1275instance FromJSON Natural where
1276− parseJSON = withScientific "Natural" $ \s ->
1276+ parseJSON value = do
1277− if Scientific.coefficient s < 0
1277+ integer :: Integer <- parseIntegral "Natural" value
1278+ if integer < 0 then
1278− then fail $ "Expected a Natural number but got the negative number: " <> show s
1279+ fail $ "expected Natural, encountered negative number " <> show integer
1279− else pure $ truncate s
1280+ else
1281+ pure $ fromIntegral integer
1281instance FromJSONKey Natural where
1283instance FromJSONKey Natural where
1282− fromJSONKey = FromJSONKeyTextParser $ \t -> parseScientificText t >>= \s ->
1284+ fromJSONKey = FromJSONKeyTextParser $ \text -> do
1283− if Scientific.coefficient s < 0
1285+ integer :: Integer <- parseIntegralText "Natural" text
1286+ if integer < 0 then
1284− then fail $ "Expected a Natural number but got the negative number: " <> show s
1287+ fail $ "expected Natural, encountered negative number " <> show integer
1285− else pure $ truncate s
1288+ else
1289+ pure $ fromIntegral integer
1287instance FromJSON Int8 where
1291instance FromJSON Int8 where
1288 parseJSON = parseBoundedIntegral "Int8"
1292 parseJSON = parseBoundedIntegral "Int8"