module Snap.Internal.Parsing where
import Control.Monad
import Data.Attoparsec.Char8 hiding (Done)
import qualified Data.Attoparsec.Char8 as Atto
import Data.ByteString.Char8 (ByteString)
import Data.ByteString.Nums.Careless.Int (int)
import Data.Int
fullyParse :: ByteString -> Parser a -> Either String a
fullyParse s p =
case r' of
(Fail _ _ e) -> Left e
(Partial _) -> Left "parse failed"
(Atto.Done _ x) -> Right x
where
r = parse p s
r' = feed r ""
parseNum :: Parser Int64
parseNum = liftM int $ Atto.takeWhile1 Atto.isDigit