module Yesod.Json
(
defaultLayoutJson
, jsonToRepJson
, Json
, jsonScalar
, jsonList
, jsonMap
) where
import Yesod.Handler (GHandler)
import Yesod.Content
( ToContent (toContent), RepHtmlJson (RepHtmlJson), RepHtml (RepHtml)
, RepJson (RepJson), Content (ContentBuilder)
)
import Yesod.Core (defaultLayout, Yesod)
import Yesod.Widget (GWidget)
import qualified Data.JSON.Types as J
import qualified Text.JSON.Enumerator as J
import Data.Text.Lazy (pack)
import Control.Arrow (first)
import Data.Map (fromList)
instance ToContent J.Value where
toContent = flip ContentBuilder Nothing . J.renderValue
defaultLayoutJson :: Yesod master
=> GWidget sub master ()
-> J.Value
-> GHandler sub master RepHtmlJson
defaultLayoutJson w json = do
RepHtml html' <- defaultLayout w
return $ RepHtmlJson html' $ toContent json
jsonToRepJson :: J.Value -> GHandler sub master RepJson
jsonToRepJson = return . RepJson . toContent
type Json = J.Value
jsonScalar :: String -> Json
jsonScalar = J.ValueAtom . J.AtomText . pack
jsonList :: [Json] -> Json
jsonList = J.ValueArray
jsonMap :: [(String, Json)] -> Json
jsonMap = J.ValueObject . fromList . map (first pack)