{-# LANGUAGE BangPatterns #-}
module HaskellWorks.Data.Json.Internal.Slurp
( JsonState(..)
, slurpText
, slurpNumber
) where
import Data.Text
import Data.Word
import Data.Word8
import HaskellWorks.Data.Json.Standard.Cursor.Internal.Word8
import Prelude hiding (drop)
import qualified Data.Aeson.Parser.Internal as AP
import qualified Data.Attoparsec.ByteString as PBS
import qualified Data.ByteString as BS
import qualified Data.Text as T
data JsonState
= Escaped
| InJson
| InString
| InNumber
| InIdent
slurpText :: BS.ByteString -> Either Text Text
slurpText :: ByteString -> Either Text Text
slurpText ByteString
bs = case forall a. Parser a -> ByteString -> Either String a
PBS.parseOnly Parser Text
AP.jstring ByteString
bs of
Right Text
t -> forall a b. b -> Either a b
Right Text
t
Left String
e -> forall a b. a -> Either a b
Left (String -> Text
T.pack String
e)
slurpNumber :: BS.ByteString -> BS.ByteString
slurpNumber :: ByteString -> ByteString
slurpNumber ByteString
bs = let (!ByteString
cs, Maybe (JsonState, ByteString)
_) = forall a.
Int -> (a -> Maybe (Word8, a)) -> a -> (ByteString, Maybe a)
BS.unfoldrN (ByteString -> Int
BS.length ByteString
bs) (JsonState, ByteString) -> Maybe (Word8, (JsonState, ByteString))
genNumber (JsonState
InJson, ByteString
bs) in ByteString
cs
where genNumber :: (JsonState, BS.ByteString) -> Maybe (Word8, (JsonState, BS.ByteString))
genNumber :: (JsonState, ByteString) -> Maybe (Word8, (JsonState, ByteString))
genNumber (JsonState
InJson, ByteString
cs) = case ByteString -> Maybe (Word8, ByteString)
BS.uncons ByteString
cs of
Just (!Word8
d, !ByteString
ds) | Word8 -> Bool
isLeadingDigit Word8
d -> forall a. a -> Maybe a
Just (Word8
d , (JsonState
InNumber , ByteString
ds))
Just (!Word8
d, !ByteString
ds) -> forall a. a -> Maybe a
Just (Word8
d , (JsonState
InJson , ByteString
ds))
Maybe (Word8, ByteString)
Nothing -> forall a. Maybe a
Nothing
genNumber (JsonState
InNumber, ByteString
cs) = case ByteString -> Maybe (Word8, ByteString)
BS.uncons ByteString
cs of
Just (!Word8
d, !ByteString
ds) | Word8 -> Bool
isTrailingDigit Word8
d -> forall a. a -> Maybe a
Just (Word8
d , (JsonState
InNumber , ByteString
ds))
Just (!Word8
d, !ByteString
ds) | Word8
d forall a. Eq a => a -> a -> Bool
== Word8
_quotedbl -> forall a. a -> Maybe a
Just (Word8
_parenleft , (JsonState
InString , ByteString
ds))
Maybe (Word8, ByteString)
_ -> forall a. Maybe a
Nothing
genNumber (JsonState
_, ByteString
_) = forall a. Maybe a
Nothing