yesod/yesod-json/Yesod/Json.hs
Michael Snoyman 83813b1df4 Add 'yesod-json/' from commit '41a198225f137610cae208190aca443c56efd332'
git-subtree-dir: yesod-json
git-subtree-mainline: 6f5459f70f
git-subtree-split: 41a198225f
2011-07-22 08:59:57 +03:00

62 lines
1.8 KiB
Haskell

{-# LANGUAGE TypeSynonymInstances #-}
{-# OPTIONS_GHC -fno-warn-orphans #-}
module Yesod.Json
( -- * Convert from a JSON value
defaultLayoutJson
, jsonToRepJson
-- * Compatibility wrapper for old API
, 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.Aeson as J
import qualified Data.Aeson.Encode as JE
import Data.Aeson.Encode (fromValue)
import Data.Text (pack)
import Control.Arrow (first)
import Data.Map (fromList)
import qualified Data.Vector as V
import Text.Julius (ToJavascript (..))
import Data.Text.Lazy.Builder (fromLazyText)
import Data.Text.Lazy.Encoding (decodeUtf8)
instance ToContent J.Value where
toContent = flip ContentBuilder Nothing . fromValue
-- | Provide both an HTML and JSON representation for a piece of data, using
-- the default layout for the HTML output ('defaultLayout').
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
-- | Wraps the 'Content' generated by 'jsonToContent' in a 'RepJson'.
jsonToRepJson :: J.Value -> GHandler sub master RepJson
jsonToRepJson = return . RepJson . toContent
type Json = J.Value
jsonScalar :: String -> Json
jsonScalar = J.String . pack
jsonList :: [Json] -> Json
jsonList = J.Array . V.fromList
jsonMap :: [(String, Json)] -> Json
jsonMap = J.Object . fromList . map (first pack)
instance ToJavascript J.Value where
toJavascript = fromLazyText . decodeUtf8 . JE.encode