on master help sign in
Added eitherDecode and eitherDecode'

They are just like decode and decode' respectively but return an error message when decoding fails.

commit83078ea3b22142ee540d901cb8d4124989cdcda7 authorBas van Dijk <v.dijk.bas@gmail.com> dateMon 13 Feb 2012, 11:22 (15 years ago) parent5079559
2 files changed+23−1
Data/Aeson.hs+13−1 Data/Aeson/Parser/Internal.hs+10
Data/Aeson.hs+13−1
@@ -16,6 +16,8 @@ module Data.Aeson
1616 -- * Encoding and decoding
1717 decode
1818 , decode'
19+ , eitherDecode
20+ , eitherDecode'
1921 , encode
2022 -- * Core JSON types
2123 , Value(..)
@@ -40,7 +42,7 @@ module Data.Aeson
4042 ) where
4143
4244import Data.Aeson.Encode (encode)
43−import Data.Aeson.Parser.Internal (decodeWith, json, json')
45+import Data.Aeson.Parser.Internal (decodeWith, eitherDecodeWith, json, json')
4446import Data.Aeson.Types
4547import qualified Data.ByteString.Lazy as L
4648
@@ -63,3 +65,13 @@ decode = decodeWith json fromJSON
6365decode' :: (FromJSON a) => L.ByteString -> Maybe a
6466decode' = decodeWith json' fromJSON
6567{-# INLINE decode' #-}
68+
69+-- | Like 'decode' but returns an error message when decoding fails.
70+eitherDecode :: (FromJSON a) => L.ByteString -> Either String a
71+eitherDecode = eitherDecodeWith json fromJSON
72+{-# INLINE eitherDecode #-}
73+
74+-- | Like 'decode'' but returns an error message when decoding fails.
75+eitherDecode' :: (FromJSON a) => L.ByteString -> Either String a
76+eitherDecode' = eitherDecodeWith json' fromJSON
77+{-# INLINE eitherDecode' #-}
Data/Aeson/Parser/Internal.hs+10
@@ -23,6 +23,7 @@ module Data.Aeson.Parser.Internal
2323 , value'
2424 -- * Helpers
2525 , decodeWith
26+ , eitherDecodeWith
2627 ) where
2728
2829import Blaze.ByteString.Builder (fromByteString, toByteString)
@@ -238,6 +239,15 @@ decodeWith p to s =
238239 _ -> Nothing
239240{-# INLINE decodeWith #-}
240241
242+eitherDecodeWith :: Parser Value -> (Value -> Result a) -> L.ByteString -> Either String a
243+eitherDecodeWith p to s =
244+ case L.parse p s of
245+ L.Done _ v -> case to v of
246+ Success a -> Right a
247+ Error msg -> Left msg
248+ L.Fail _ _ msg -> Left msg
249+{-# INLINE eitherDecodeWith #-}
250+
241251-- $lazy
242252--
243253-- The 'json' and 'value' parsers decouple identification from