Added Template reps

This commit is contained in:
Michael Snoyman 2009-12-14 20:21:45 +02:00
parent 998ee83a5b
commit c23984b154

View File

@ -32,10 +32,10 @@ module Yesod.Rep
, RepChooser , RepChooser
, ContentPair , ContentPair
, HasReps (..) , HasReps (..)
-- FIXME TemplateFile or some such...
-- * Specific types of representations -- * Specific types of representations
, Plain (..) , Plain (..)
, plain , plain
, Template (..)
#if TEST #if TEST
, testSuite , testSuite
#endif #endif
@ -43,6 +43,7 @@ module Yesod.Rep
import Data.ByteString.Lazy (ByteString) import Data.ByteString.Lazy (ByteString)
import Data.Text.Lazy (Text) import Data.Text.Lazy (Text)
import Data.Maybe (catMaybes)
#if TEST #if TEST
import Data.Object.Html hiding (testSuite) import Data.Object.Html hiding (testSuite)
@ -52,6 +53,7 @@ import Data.Object.Html
import Data.Object.Json import Data.Object.Json
import Data.Convertible.Text import Data.Convertible.Text
import Text.StringTemplate
#if TEST #if TEST
import Test.Framework (testGroup, Test) import Test.Framework (testGroup, Test)
@ -112,12 +114,17 @@ class HasReps a where
chooseRep :: a -> RepChooser chooseRep :: a -> RepChooser
chooseRep a ts = chooseRep a ts =
let (ct, c) = let (ct, c) =
case filter (\(ct', _) -> ct' `elem` ts) reps of case catMaybes $ map helper ts of
(x:_) -> x (x:_) -> x
[] -> case reps of [] -> case reps of
[] -> error "Empty reps" [] -> error "Empty reps"
(x:_) -> x (x:_) -> x
in (ct, c a) in (ct, c a)
where
--helper :: ContentType -> Maybe ContentPair
helper ct = do
c <- lookup ct reps
return (ct, c)
instance HasReps RepChooser where instance HasReps RepChooser where
reps = error "reps of RepChooser" reps = error "reps of RepChooser"
@ -138,6 +145,14 @@ newtype Plain = Plain Text
plain :: ConvertSuccess x Text => x -> Plain plain :: ConvertSuccess x Text => x -> Plain
plain = Plain . cs plain = Plain . cs
data Template = Template (StringTemplate String) HtmlObject
instance HasReps Template where
reps = [ (TypeHtml,
\(Template t h) ->
cs $ toString $ setAttribute "o" h t)
, (TypeJson, \(Template _ ho) -> cs $ unJsonDoc $ cs ho)
]
-- Useful instances of HasReps -- Useful instances of HasReps
instance HasReps HtmlObject where instance HasReps HtmlObject where
reps = reps =
@ -168,9 +183,25 @@ caseChooseRepRaw = do
chooseRep hasreps [bar, foo] @?= (foo, content) chooseRep hasreps [bar, foo] @?= (foo, content)
chooseRep hasreps [bar] @?= (TypeHtml, content) chooseRep hasreps [bar] @?= (TypeHtml, content)
caseChooseRepTemplate :: Assertion
caseChooseRepTemplate = do
let temp = newSTMP "foo:$o.foo$, bar:$o.bar$"
ho = toHtmlObject [ ("foo", toHtmlObject "<fooval>")
, ("bar", toHtmlObject ["bar1", "bar2"])
]
hasreps = Template temp ho
res1 = cs "foo:&lt;fooval&gt;, bar:bar1bar2"
res2 = cs $ "{\"bar\":[\"bar1\",\"bar2\"]," ++
"\"foo\":\"&lt;fooval&gt;\"}"
(1, chooseRep hasreps [TypeHtml]) @?= (1, (TypeHtml, res1))
(2, chooseRep hasreps [TypeJson]) @?= (2, (TypeJson, res2))
(3, chooseRep hasreps [TypeHtml, TypeJson]) @?= (3, (TypeHtml, res1))
(4, chooseRep hasreps [TypeJson, TypeHtml]) @?= (4, (TypeJson, res2))
testSuite :: Test testSuite :: Test
testSuite = testGroup "Yesod.Rep" testSuite = testGroup "Yesod.Rep"
[ testCase "caseChooseRep HtmlObject" caseChooseRepHO [ testCase "caseChooseRep HtmlObject" caseChooseRepHO
, testCase "caseChooseRep raw" caseChooseRepRaw , testCase "caseChooseRep raw" caseChooseRepRaw
, testCase "caseChooseRep Template" caseChooseRepTemplate
] ]
#endif #endif