Main.hs 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. {-# LANGUAGE OverloadedStrings #-}
  2. module Main where
  3. import Data.Aeson
  4. import Data.BEncode
  5. import Data.ByteString.Lazy (ByteString, fromStrict)
  6. import qualified Data.ByteString.Lazy.Char8 as BS
  7. import qualified Data.HashMap.Strict as HM
  8. import qualified Data.Map.Lazy as M
  9. import Data.Scientific (isInteger)
  10. import Data.Text (Text, unpack)
  11. import Data.Text.Encoding (encodeUtf8)
  12. import qualified Data.Vector as V
  13. import System.Environment (getArgs)
  14. import System.Exit (die)
  15. byteify :: Text -> ByteString
  16. byteify = fromStrict . encodeUtf8
  17. convert :: Value -> Either String BEncode
  18. convert (Object os) =
  19. (BDict . M.fromList) `fmap` mapM go (HM.toList os)
  20. where go (k, v) = (,) (unpack k) `fmap` convert v
  21. convert (Array as) =
  22. BList `fmap` mapM convert (V.toList as)
  23. convert (Number n)
  24. | isInteger n = return $ BInt (floor n)
  25. | otherwise = Left ("Input contains a non-integer number: " ++ show n)
  26. convert (String ts) =
  27. return $ BString (byteify ts)
  28. convert (Bool b) = Left ("Input contains a boolean: " ++ show b)
  29. convert (Null) = return $ BString ""
  30. main :: IO ()
  31. main = do
  32. content <- do
  33. args <- getArgs
  34. case args of
  35. [] -> BS.getContents
  36. ["-"] -> BS.getContents
  37. [file] -> BS.readFile file
  38. _ -> die "Usage: json2bencode [file]"
  39. case decode content of
  40. Just val -> case convert val of
  41. Right bval -> BS.putStrLn (bPack bval)
  42. Left err -> putStrLn err
  43. Nothing -> putStrLn "Unable to parse JSON"