{-# LANGUAGE OverloadedStrings #-}
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 <> "\"" <> ":" <> "", "")