module Control.Proxy.Aeson.Internal
( DecodingError(..)
, skipSpace
, fromLazy
) where
import qualified Control.Proxy.Attoparsec as PA
import qualified Control.Proxy.Trans.State as P
import Control.Exception (Exception)
import qualified Control.Proxy as P
import qualified Control.Proxy.Parse as Pp
import qualified Data.ByteString.Char8 as B
import qualified Data.ByteString.Lazy.Internal as BLI
import qualified Data.Char as Char
import Data.Data (Data, Typeable)
import Data.Function (fix)
data DecodingError
= ParserError PA.ParsingError
| ValueError String
deriving (Show, Eq, Data, Typeable)
instance Exception DecodingError
skipSpace
:: (Monad m, P.Proxy p)
=> P.StateP [B.ByteString] p () (Maybe B.ByteString) y' y m ()
skipSpace = fix $ \loop -> do
ma <- Pp.draw
case ma of
Nothing -> return ()
Just a -> do
let a' = B.dropWhile Char.isSpace a
if B.null a'
then loop
else Pp.unDraw a'
fromLazy
:: (Monad m, P.Proxy p)
=> BLI.ByteString -> p x' x y' B.ByteString m ()
fromLazy =
P.runIdentityP . BLI.foldrChunks (\e a -> P.respond e >> a) (return ())