Removed Yesod.Json, using json-types
This commit is contained in:
parent
2211503e02
commit
e2ace86bb9
3
Yesod.hs
3
Yesod.hs
@ -7,7 +7,6 @@ module Yesod
|
|||||||
, module Yesod.Handler
|
, module Yesod.Handler
|
||||||
, module Yesod.Dispatch
|
, module Yesod.Dispatch
|
||||||
, module Yesod.Hamlet
|
, module Yesod.Hamlet
|
||||||
, module Yesod.Json
|
|
||||||
, module Yesod.Widget
|
, module Yesod.Widget
|
||||||
, Application
|
, Application
|
||||||
, lift
|
, lift
|
||||||
@ -20,13 +19,11 @@ module Yesod
|
|||||||
|
|
||||||
#if TEST
|
#if TEST
|
||||||
import Yesod.Content hiding (testSuite)
|
import Yesod.Content hiding (testSuite)
|
||||||
import Yesod.Json hiding (testSuite)
|
|
||||||
import Yesod.Dispatch hiding (testSuite)
|
import Yesod.Dispatch hiding (testSuite)
|
||||||
import Yesod.Yesod hiding (testSuite)
|
import Yesod.Yesod hiding (testSuite)
|
||||||
import Yesod.Handler hiding (runHandler, testSuite)
|
import Yesod.Handler hiding (runHandler, testSuite)
|
||||||
#else
|
#else
|
||||||
import Yesod.Content
|
import Yesod.Content
|
||||||
import Yesod.Json
|
|
||||||
import Yesod.Dispatch
|
import Yesod.Dispatch
|
||||||
import Yesod.Yesod
|
import Yesod.Yesod
|
||||||
import Yesod.Handler hiding (runHandler)
|
import Yesod.Handler hiding (runHandler)
|
||||||
|
|||||||
@ -73,6 +73,9 @@ import Data.Enumerator (Enumerator)
|
|||||||
import Blaze.ByteString.Builder (Builder, fromByteString, fromLazyByteString)
|
import Blaze.ByteString.Builder (Builder, fromByteString, fromLazyByteString)
|
||||||
import Data.Monoid (mempty)
|
import Data.Monoid (mempty)
|
||||||
|
|
||||||
|
import qualified Data.JSON.Types as J
|
||||||
|
import qualified Text.JSON.Enumerator as J
|
||||||
|
|
||||||
data Content = ContentBuilder Builder
|
data Content = ContentBuilder Builder
|
||||||
| ContentEnum (forall a. Enumerator Builder IO a)
|
| ContentEnum (forall a. Enumerator Builder IO a)
|
||||||
| ContentFile FilePath
|
| ContentFile FilePath
|
||||||
@ -98,6 +101,8 @@ instance ToContent Text where
|
|||||||
toContent = toContent . Data.Text.Lazy.Encoding.encodeUtf8
|
toContent = toContent . Data.Text.Lazy.Encoding.encodeUtf8
|
||||||
instance ToContent String where
|
instance ToContent String where
|
||||||
toContent = toContent . T.pack
|
toContent = toContent . T.pack
|
||||||
|
instance ToContent J.Value where
|
||||||
|
toContent = ContentBuilder . J.renderValue
|
||||||
|
|
||||||
-- | A function which gives targetted representations of content based on the
|
-- | A function which gives targetted representations of content based on the
|
||||||
-- content-types the user accepts.
|
-- content-types the user accepts.
|
||||||
|
|||||||
141
Yesod/Json.hs
141
Yesod/Json.hs
@ -1,141 +0,0 @@
|
|||||||
-- | Efficient generation of JSON documents.
|
|
||||||
-- FIXME remove this module, possibly make a blaze-json
|
|
||||||
{-# LANGUAGE GeneralizedNewtypeDeriving #-}
|
|
||||||
{-# LANGUAGE CPP #-}
|
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
|
||||||
module Yesod.Json
|
|
||||||
( -- * Monad
|
|
||||||
Json
|
|
||||||
, jsonToContent
|
|
||||||
, jsonToRepJson
|
|
||||||
-- * Generate Json output
|
|
||||||
, jsonScalar
|
|
||||||
, jsonList
|
|
||||||
, jsonMap
|
|
||||||
, jsonRaw
|
|
||||||
#if TEST
|
|
||||||
, testSuite
|
|
||||||
#endif
|
|
||||||
)
|
|
||||||
where
|
|
||||||
|
|
||||||
import qualified Data.ByteString.Char8 as S
|
|
||||||
import Data.Char (isControl)
|
|
||||||
import Yesod.Handler (GHandler)
|
|
||||||
import Numeric (showHex)
|
|
||||||
import Data.Monoid (Monoid (..))
|
|
||||||
import Blaze.ByteString.Builder
|
|
||||||
import Blaze.ByteString.Builder.Char.Utf8 (writeChar)
|
|
||||||
import Blaze.ByteString.Builder.Internal.Write (fromWriteList)
|
|
||||||
|
|
||||||
#if TEST
|
|
||||||
import Test.Framework (testGroup, Test)
|
|
||||||
import Test.Framework.Providers.HUnit
|
|
||||||
import Test.HUnit hiding (Test)
|
|
||||||
import Data.ByteString.Lazy.Char8 (unpack)
|
|
||||||
import Yesod.Content hiding (testSuite)
|
|
||||||
#else
|
|
||||||
import Yesod.Content
|
|
||||||
#endif
|
|
||||||
|
|
||||||
-- | A monad for generating Json output. It wraps the Builder monoid from the
|
|
||||||
-- blaze-builder package.
|
|
||||||
--
|
|
||||||
-- This is an opaque type to avoid any possible insertion of non-JSON content.
|
|
||||||
-- Due to the limited nature of the JSON format, you can create any valid JSON
|
|
||||||
-- document you wish using only 'jsonScalar', 'jsonList' and 'jsonMap'.
|
|
||||||
newtype Json = Json { unJson :: Builder }
|
|
||||||
deriving Monoid
|
|
||||||
|
|
||||||
-- | Extract the final result from the given 'Json' value.
|
|
||||||
--
|
|
||||||
-- See also: applyLayoutJson in "Yesod.Yesod".
|
|
||||||
jsonToContent :: Json -> GHandler sub master Content
|
|
||||||
jsonToContent = return . toContent . toLazyByteString . unJson
|
|
||||||
|
|
||||||
-- | Wraps the 'Content' generated by 'jsonToContent' in a 'RepJson'.
|
|
||||||
jsonToRepJson :: Json -> GHandler sub master RepJson
|
|
||||||
jsonToRepJson = fmap RepJson . jsonToContent
|
|
||||||
|
|
||||||
-- | Outputs a single scalar. This function essentially:
|
|
||||||
--
|
|
||||||
-- * Performs JSON encoding.
|
|
||||||
--
|
|
||||||
-- * Wraps the resulting string in quotes.
|
|
||||||
jsonScalar :: String -> Json
|
|
||||||
jsonScalar s = Json $ mconcat
|
|
||||||
[ fromByteString "\""
|
|
||||||
, fromWriteList writeJsonChar s
|
|
||||||
, fromByteString "\""
|
|
||||||
]
|
|
||||||
where
|
|
||||||
writeJsonChar '\b' = writeByteString "\\b"
|
|
||||||
writeJsonChar '\f' = writeByteString "\\f"
|
|
||||||
writeJsonChar '\n' = writeByteString "\\n"
|
|
||||||
writeJsonChar '\r' = writeByteString "\\r"
|
|
||||||
writeJsonChar '\t' = writeByteString "\\t"
|
|
||||||
writeJsonChar '"' = writeByteString "\\\""
|
|
||||||
writeJsonChar '\\' = writeByteString "\\\\"
|
|
||||||
writeJsonChar c
|
|
||||||
| not $ isControl c = writeChar c
|
|
||||||
| c < '\x10' = writeString $ '\\' : 'u' : '0' : '0' : '0' : hexxs
|
|
||||||
| c < '\x100' = writeString $ '\\' : 'u' : '0' : '0' : hexxs
|
|
||||||
| c < '\x1000' = writeString $ '\\' : 'u' : '0' : hexxs
|
|
||||||
where hexxs = showHex (fromEnum c) ""
|
|
||||||
writeJsonChar c = writeChar c
|
|
||||||
writeString = writeByteString . S.pack
|
|
||||||
|
|
||||||
-- | Outputs a JSON list, eg [\"foo\",\"bar\",\"baz\"].
|
|
||||||
jsonList :: [Json] -> Json
|
|
||||||
jsonList [] = Json $ fromByteString "[]"
|
|
||||||
jsonList (x:xs) = mconcat
|
|
||||||
[ Json $ fromByteString "["
|
|
||||||
, x
|
|
||||||
, mconcat $ map go xs
|
|
||||||
, Json $ fromByteString "]"
|
|
||||||
]
|
|
||||||
where
|
|
||||||
go = mappend (Json $ fromByteString ",")
|
|
||||||
|
|
||||||
-- | Outputs a JSON map, eg {\"foo\":\"bar\",\"baz\":\"bin\"}.
|
|
||||||
jsonMap :: [(String, Json)] -> Json
|
|
||||||
jsonMap [] = Json $ fromByteString "{}"
|
|
||||||
jsonMap (x:xs) = mconcat
|
|
||||||
[ Json $ fromByteString "{"
|
|
||||||
, go x
|
|
||||||
, mconcat $ map go' xs
|
|
||||||
, Json $ fromByteString "}"
|
|
||||||
]
|
|
||||||
where
|
|
||||||
go' y = mappend (Json $ fromByteString ",") $ go y
|
|
||||||
go (k, v) = mconcat
|
|
||||||
[ jsonScalar k
|
|
||||||
, Json $ fromByteString ":"
|
|
||||||
, v
|
|
||||||
]
|
|
||||||
|
|
||||||
-- | Outputs raw JSON data without performing any escaping. Use with caution:
|
|
||||||
-- this is the only function in this module that allows you to create broken
|
|
||||||
-- JSON documents.
|
|
||||||
jsonRaw :: S.ByteString -> Json
|
|
||||||
jsonRaw = Json . fromByteString
|
|
||||||
|
|
||||||
#if TEST
|
|
||||||
|
|
||||||
testSuite :: Test
|
|
||||||
testSuite = testGroup "Yesod.Json"
|
|
||||||
[ testCase "simple output" caseSimpleOutput
|
|
||||||
]
|
|
||||||
|
|
||||||
caseSimpleOutput :: Assertion
|
|
||||||
caseSimpleOutput = do
|
|
||||||
let j = do
|
|
||||||
jsonMap
|
|
||||||
[ ("foo" , jsonList
|
|
||||||
[ jsonScalar "bar"
|
|
||||||
, jsonScalar "baz"
|
|
||||||
])
|
|
||||||
]
|
|
||||||
"{\"foo\":[\"bar\",\"baz\"]}" @=? unpack (toLazyByteString $ unJson j)
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@ -18,6 +18,7 @@ module Yesod.Yesod
|
|||||||
, maybeAuthorized
|
, maybeAuthorized
|
||||||
, widgetToPageContent
|
, widgetToPageContent
|
||||||
, defaultLayoutJson
|
, defaultLayoutJson
|
||||||
|
, jsonToRepJson
|
||||||
, redirectToPost
|
, redirectToPost
|
||||||
-- * Defaults
|
-- * Defaults
|
||||||
, defaultErrorHandler
|
, defaultErrorHandler
|
||||||
@ -32,12 +33,10 @@ module Yesod.Yesod
|
|||||||
|
|
||||||
#if TEST
|
#if TEST
|
||||||
import Yesod.Content hiding (testSuite)
|
import Yesod.Content hiding (testSuite)
|
||||||
import Yesod.Json hiding (testSuite)
|
|
||||||
import Yesod.Handler hiding (testSuite)
|
import Yesod.Handler hiding (testSuite)
|
||||||
import qualified Data.ByteString.UTF8 as BSU
|
import qualified Data.ByteString.UTF8 as BSU
|
||||||
#else
|
#else
|
||||||
import Yesod.Content
|
import Yesod.Content
|
||||||
import Yesod.Json
|
|
||||||
import Yesod.Handler
|
import Yesod.Handler
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -60,6 +59,7 @@ import Text.Hamlet
|
|||||||
import Text.Cassius
|
import Text.Cassius
|
||||||
import Text.Julius
|
import Text.Julius
|
||||||
import Web.Routes
|
import Web.Routes
|
||||||
|
import qualified Data.JSON.Types as J
|
||||||
|
|
||||||
#if TEST
|
#if TEST
|
||||||
import Test.Framework (testGroup, Test)
|
import Test.Framework (testGroup, Test)
|
||||||
@ -302,12 +302,15 @@ breadcrumbs = do
|
|||||||
-- the default layout for the HTML output ('defaultLayout').
|
-- the default layout for the HTML output ('defaultLayout').
|
||||||
defaultLayoutJson :: Yesod master
|
defaultLayoutJson :: Yesod master
|
||||||
=> GWidget sub master ()
|
=> GWidget sub master ()
|
||||||
-> Json
|
-> J.Value
|
||||||
-> GHandler sub master RepHtmlJson
|
-> GHandler sub master RepHtmlJson
|
||||||
defaultLayoutJson w json = do
|
defaultLayoutJson w json = do
|
||||||
RepHtml html' <- defaultLayout w
|
RepHtml html' <- defaultLayout w
|
||||||
json' <- jsonToContent json
|
return $ RepHtmlJson html' $ toContent json
|
||||||
return $ RepHtmlJson html' json'
|
|
||||||
|
-- | Wraps the 'Content' generated by 'jsonToContent' in a 'RepJson'.
|
||||||
|
jsonToRepJson :: J.Value -> GHandler sub master RepJson
|
||||||
|
jsonToRepJson = return . RepJson . toContent
|
||||||
|
|
||||||
applyLayout' :: Yesod master
|
applyLayout' :: Yesod master
|
||||||
=> Html -- ^ title
|
=> Html -- ^ title
|
||||||
|
|||||||
@ -56,12 +56,13 @@ library
|
|||||||
, monad-peel >= 0.1 && < 0.2
|
, monad-peel >= 0.1 && < 0.2
|
||||||
, enumerator >= 0.4 && < 0.5
|
, enumerator >= 0.4 && < 0.5
|
||||||
, cookie >= 0.0 && < 0.1
|
, cookie >= 0.0 && < 0.1
|
||||||
|
, json-enumerator >= 0.0 && < 0.1
|
||||||
|
, json-types >= 0.1 && < 0.2
|
||||||
exposed-modules: Yesod
|
exposed-modules: Yesod
|
||||||
Yesod.Content
|
Yesod.Content
|
||||||
Yesod.Dispatch
|
Yesod.Dispatch
|
||||||
Yesod.Hamlet
|
Yesod.Hamlet
|
||||||
Yesod.Handler
|
Yesod.Handler
|
||||||
Yesod.Json
|
|
||||||
Yesod.Request
|
Yesod.Request
|
||||||
Yesod.Widget
|
Yesod.Widget
|
||||||
Yesod.Yesod
|
Yesod.Yesod
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user