module Main where import qualified Data.Aeson as J import qualified Data.ByteString.Lazy as BS import qualified Data.ByteString.Lazy.Char8 as BS8 import qualified Data.Eben as E import qualified Data.HashMap.Strict as HM import qualified Data.Map.Strict as M import Data.Scientific (floatingOrInteger) import qualified Data.Vector as V import Data.Text.Encoding (encodeUtf8) convert :: J.Value -> Either String E.Value convert (J.Array as) = (E.List . V.toList) `fmap` traverse convert as convert (J.Object os) = (E.Dict . M.fromList) `fmap` sequence [ sequence (encodeUtf8 k, convert v) | (k, v) <- HM.toList os ] convert (J.String ts) = pure (E.String (encodeUtf8 ts)) convert (J.Number n) = case floatingOrInteger n of Left f -> pure (E.Float f) Right i -> pure (E.Integer i) convert (J.Bool _) = Left "No Eben repr for bool" convert J.Null = Left "No Eben repr for null" main :: IO () main = do cs <- BS.getContents case J.decode cs of Nothing -> putStrLn "Not valid JSON" Just vs -> case convert vs of Left err -> putStrLn err Right eb -> BS8.putStrLn (E.encode eb)