]> git.rkrishnan.org Git - functorrent.git/blobdiff - src/FuncTorrent/Bencode.hs
quickcheck: size limit randomly generated Benc structures
[functorrent.git] / src / FuncTorrent / Bencode.hs
index fd521dcb58a774bbcc384db8da9b7c1b431e4589..b55b3fe15509e5e4745a5451fd9509d842eb7c05 100644 (file)
 {-# LANGUAGE OverloadedStrings #-}
 module FuncTorrent.Bencode
     (BVal(..)
-    , bValToBList
-    , bValToBytestr
-    , bValToInfoDict
     , bValToInteger
     , bstrToString
     , decode
+    , decodeWithLeftOvers
     , encode
     ) where
 
@@ -33,7 +31,7 @@ import Prelude hiding (length, concat)
 
 import Data.ByteString (ByteString, length, concat)
 import Data.ByteString.Char8 (unpack, pack)
-import Data.Char (isLetter, isNumber, isPrint, isAscii)
+import Data.Char (isLetter, isAscii)
 import Data.Map.Strict (Map, fromList, toList)
 import Text.ParserCombinators.Parsec
 import qualified Text.Parsec.ByteString as ParsecBS
@@ -61,9 +59,9 @@ instance Arbitrary BVal where
                                , Bstr <$> arbitrary]
                 bval n = oneof [ Bint <$> arbitrary
                                , Bstr <$> arbitrary
-                               , Blist <$> vectorOf n (bval (n `div` 4))
-                               , do keys <- vectorOf n genNonEmptyString
-                                    vals <- vectorOf n (bval (n `div` 4))
+                               , Blist <$> vectorOf (n `div` 2) (bval (n `div` 4))
+                               , do keys <- vectorOf (n `div` 2) genNonEmptyString
+                                    vals <- vectorOf (n `div` 2) (bval (n `div` 4))
                                     return $ Bdict $ fromList $ zip keys vals ]
 
 -- getters
@@ -75,14 +73,6 @@ bValToBytestr :: BVal  -> Maybe ByteString
 bValToBytestr (Bstr bs) = Just bs
 bValToBytestr _         = Nothing
 
-bValToBList :: BVal    -> Maybe [BVal]
-bValToBList (Blist lst) = Just lst
-bValToBList _           = Nothing
-
-bValToInfoDict :: BVal     -> Maybe (Map String BVal)
-bValToInfoDict (Bdict dict) = Just dict
-bValToInfoDict _            = Nothing
-
 bstrToString :: BVal -> Maybe String
 bstrToString bval     = unpack <$> bValToBytestr bval
 
@@ -163,7 +153,7 @@ bencDict = between (char 'd') (char 'e') $ fromList <$> many kvpair
                     return (k, v)
         bdictKey = do
           ds <- many1 digit <* char ':'
-          s <- count (read ds) alphaNum
+          s <- count (read ds) anyChar
           return s
 
 
@@ -176,6 +166,10 @@ bencVal = Bstr <$> bencStr <|>
 decode :: ByteString -> Either ParseError BVal
 decode = parse bencVal "BVal"
 
+decodeWithLeftOvers :: ByteString -> Either ParseError (BVal, ByteString)
+decodeWithLeftOvers = parse ((,) <$> bencVal <*> (fmap pack leftOvers)) "BVal with LeftOvers"
+  where leftOvers = manyTill anyToken eof
+
 -- Encode BVal into a bencoded ByteString. Inverse of decode
 
 -- TODO: Use builders and lazy byte string to get O(1) concatenation over O(n)