module Data.BEncode.Lexer where
import Data.Char
import qualified Data.ByteString.Lazy.Char8 as L
data Token
= TDict
| TList
| TInt
| TString L.ByteString
| TNumber Integer
| TEnd
deriving (Show,Eq)
lexer :: L.ByteString -> [Token]
lexer fs | L.null fs = []
lexer fs
= case ch of
'd' -> TDict : lexer rest
'l' -> TList : lexer rest
'i' -> TInt : lexer rest
'e' -> TEnd : lexer rest
'-' -> let (digits,rest') = L.span isDigit rest
number = read (L.unpack digits)
in TNumber (number) : lexer rest'
_ | isDigit ch
-> let (digits,rest') = L.span isDigit fs
number = read (L.unpack digits)
in if L.null rest'
then [TNumber number]
else case L.head rest' of
':' -> let (str, rest'') = L.splitAt (fromIntegral number) (L.tail rest')
in TString str : lexer rest''
_ -> TNumber number : lexer rest'
| otherwise -> error "Lexer error."
where ch = L.head fs
rest = L.tail fs