packages feed

hsinspect-0.1.0: library/HsInspect/Json.hs

{-# LANGUAGE CPP #-}
{-# LANGUAGE ViewPatterns #-}

module HsInspect.Json where

#if MIN_VERSION_GLASGOW_HASKELL(9,0,0,0)
import qualified GHC.Utils.Json as GHC
import qualified GHC.Utils.Monad as GHC
import qualified GHC.Utils.Outputable as GHC
import qualified GHC.Utils.Misc as GHC
#else
import qualified Json as GHC
import qualified MonadUtils as GHC
import qualified Outputable as GHC
import qualified Util as GHC
#endif

import qualified Data.Text as T
import HsInspect.Sexp

encodeJson :: GHC.JsonDoc -> String
encodeJson j = GHC.showSDocUnsafe . GHC.renderJSON $ j

sexpToJson :: Sexp -> Either String GHC.JsonDoc
sexpToJson SexpNil = Right GHC.JSNull
sexpToJson (toAList -> Just kvs) = GHC.JSObject . GHC.mapFst T.unpack <$> GHC.mapSndM sexpToJson kvs
sexpToJson (toList -> Just as) = GHC.JSArray <$> traverse sexpToJson as
sexpToJson (SexpCons _ _) = Left $ "cons cell has no JSON equivalent"
sexpToJson (SexpString s) = Right . GHC.JSString $ T.unpack s
sexpToJson (SexpSymbol s) = Right . GHC.JSString $ T.unpack s -- nobody said it had to roundtrip
sexpToJson (SexpInt i) = Right $ GHC.JSInt i
-- TODO write our own JSON repr to avoid a ghc dep and improve perf