Main.hs 1.1 KB

1234567891011121314151617181920212223242526272829303132333435
  1. module Main where
  2. import qualified Data.Aeson as J
  3. import qualified Data.ByteString.Lazy as BS
  4. import qualified Data.ByteString.Lazy.Char8 as BS8
  5. import qualified Data.Eben as E
  6. import qualified Data.HashMap.Strict as HM
  7. import qualified Data.Map.Strict as M
  8. import Data.Scientific (floatingOrInteger)
  9. import qualified Data.Vector as V
  10. import Data.Text.Encoding (encodeUtf8)
  11. convert :: J.Value -> Either String E.Value
  12. convert (J.Array as) =
  13. (E.List . V.toList) `fmap` traverse convert as
  14. convert (J.Object os) =
  15. (E.Dict . M.fromList) `fmap` sequence
  16. [ sequence (encodeUtf8 k, convert v)
  17. | (k, v) <- HM.toList os
  18. ]
  19. convert (J.String ts) = pure (E.String (encodeUtf8 ts))
  20. convert (J.Number n) = case floatingOrInteger n of
  21. Left f -> pure (E.Float f)
  22. Right i -> pure (E.Integer i)
  23. convert (J.Bool _) = Left "No Eben repr for bool"
  24. convert J.Null = Left "No Eben repr for null"
  25. main :: IO ()
  26. main = do
  27. cs <- BS.getContents
  28. case J.decode cs of
  29. Nothing -> putStrLn "Not valid JSON"
  30. Just vs -> case convert vs of
  31. Left err -> putStrLn err
  32. Right eb -> BS8.putStrLn (E.encode eb)