X-Git-Url: https://git.rkrishnan.org/?p=functorrent.git;a=blobdiff_plain;f=src%2FFuncTorrent%2FMagnetURI.hs;fp=src%2FFuncTorrent%2FMagnetURI.hs;h=506a169e156e88d43ade708efb772570e05098eb;hp=7a9b20ed01a89dc67e2564b16724627f3422cb72;hb=ee331360e1f6585f79218c56d73ed7406e9527bf;hpb=9d57d0353054fc75922282a91d971fe81b0ff7eb diff --git a/src/FuncTorrent/MagnetURI.hs b/src/FuncTorrent/MagnetURI.hs index 7a9b20e..506a169 100644 --- a/src/FuncTorrent/MagnetURI.hs +++ b/src/FuncTorrent/MagnetURI.hs @@ -69,13 +69,17 @@ magnetBody = do pairs <- kvpair `sepBy1` (char '&') -- walk through pairs, populate Magnetinfo (fold?) return $ foldl f magnetInfo pairs - where f magnetRecord pair = let (k, v) = pair in - case k of - "xt" -> magnetRecord { infoHash = pack v } - "tr" -> let trVal = trackerlist magnetRecord in - magnetRecord { trackerlist = trVal ++ [urlDecode v] } - "dn" -> magnetRecord { name = urlDecode v } - "xl" -> magnetRecord { xlen = Just (read v :: Integer) } + where f magnetRecord pair = + let (k, v) = pair + in + case k of + "xt" -> magnetRecord { infoHash = pack v } + "tr" -> let trVal = trackerlist magnetRecord + in + magnetRecord { trackerlist = trVal ++ [urlDecode v] } + "dn" -> magnetRecord { name = urlDecode v } + "xl" -> magnetRecord { xlen = Just (read v :: Integer) } + _ -> magnetInfo magnetInfo = Magnetinfo { infoHash = mempty , trackerlist = mempty , name = mempty @@ -84,5 +88,8 @@ magnetBody = do magnetUri :: ParsecBS.Parser Magnetinfo magnetUri = magnetHdr >> magnetBody -parseMagneturi :: ByteString -> Either ParseError Magnetinfo -parseMagneturi input = parse magnetUri "magnetParse" input +parseMagneturi :: ByteString -> Either String Magnetinfo +parseMagneturi input = + case parse magnetUri "magnetParse" input of + Right minfo -> Right minfo + Left e -> Left $ "Cannot parse the magnet URI: " ++ show e