module Language.ASTMonad.Json.Renderer
( renderJson
) where
import Language.ASTMonad
import Language.ASTMonad.Json
import qualified Data.Text.Lazy.IO as TL
import qualified Data.Text.Lazy.Builder as TB
import qualified Data.Text.Lazy.Builder.Int as TB
import Data.Monoid((<>))
import Data.Foldable(fold)
import Data.List(intersperse)
renderJson :: (JsonEnvironment, CodeSeq JsonStatement) -> TB.Builder
renderJson (e, cs) = if null cs'
then ""
else "{" <> ss <> "}"
where cs' = fromCodeSeq cs
ss = fold $ intersperse "," $ map f cs'
f (Code s cs') = beginning <> renderJson (e, cs') <> ending
where (beginning, ending) = renderStatement e s
renderStatement :: JsonEnvironment -> JsonStatement -> (TB.Builder, TB.Builder)
renderStatement _ (JsonString x y) = ("\"" <> x <> "\"" <> ":" <> "\"" <> y <> "\"", "")
renderStatement _ (JsonNumber x y) = ("\"" <> x <> "\"" <> ":" <> TB.decimal y, "")
renderStatement _ (JsonBool x y) = ("\"" <> x <> "\"" <> ":" <> (if y then "true" else "false"), "")
renderStatement _ (JsonArray x) = ("\"" <> x <> "\"" <> ":" <> "", "")