pipes-aeson-0.2.0: src/Pipes/Aeson/Unsafe.hs
{-# LANGUAGE RankNTypes #-}
-- | This module exports facilities similar to those exported by the
-- "Pipes.Aeson" module, except they do not restrict the 'Ae.Value's
-- that might be encoded or decoded to be just valid top-level values. That is,
-- not only 'Ae.Object's or 'Ae.Array's, according to to the RFC-4627 JSON
-- standard.
module Pipes.Aeson.Unsafe
( -- * Encoding
encode
-- * Decoding
, decode
, decodeMany
) where
import Pipes
import qualified Pipes.Aeson.Internal as I
import qualified Pipes.Attoparsec as PA
import qualified Control.Monad.Trans.State.Strict as S
import qualified Data.Aeson as Ae
import qualified Data.Aeson.Parser as Ae (value')
import qualified Data.ByteString as B
--------------------------------------------------------------------------------
-- | Like 'Pipes.Aeson.encode', except it accepts any 'Ae.ToJSON' instance,
-- not just 'Ae.Array' or 'Ae.Object'.
encode :: (Monad m, Ae.ToJSON a) => a -> Producer B.ByteString m ()
encode = I.fromLazy . Ae.encode
{-# INLINABLE encode #-}
--------------------------------------------------------------------------------
-- | Like 'Pipes.Aeson.decode', except it will decode any 'Ae.ToJSON' instance,
-- not just 'Ae.Array' or 'Ae.Object'.
decode
:: (Monad m, Ae.FromJSON b)
=> S.StateT (Producer B.ByteString m r) m (Either I.DecodingError (Int, b))
decode = do
ev <- PA.parse Ae.value'
return $ do
case ev of
Left e -> Left (I.ParserError e)
Right (len, v) -> do
case Ae.fromJSON v of
Ae.Error e -> Left (I.ValueError e)
Ae.Success b -> Right (len, b)
{-# INLINABLE decode #-}
-- | Like 'Pipes.Aeson.decodeMany', except it will decode any 'Ae.ToJSON'
-- instance, not just 'Ae.Array' or 'Ae.Object'.
decodeMany
:: (Monad m, Ae.FromJSON b)
=> Producer B.ByteString m r -- ^Producer from which to draw JSON.
-> Producer (Int, b) m
(Either (I.DecodingError, Producer B.ByteString m r) r)
decodeMany = I.consecutively decode
{-# INLINABLE decodeMany #-}