packages feed

scotty-0.4.6: examples/json.hs

{-# LANGUAGE OverloadedStrings, TemplateHaskell #-}
import Data.Aeson.TH (deriveJSON)

import qualified Data.Text.Lazy as T

import Network.Wai.Middleware.RequestLogger
import Network.Wai.Middleware.Static

import qualified Text.Blaze.Html5 as H
import Text.Blaze.Html5 ((!))
import Text.Blaze.Html5.Attributes as A
import Text.Blaze.Html.Renderer.Text (renderHtml)

import Web.Scotty

-- A rather contrived example to test round-tripping JSON through Scotty
data Foo = Quux
         | Bar Int
         | Baz (Float, String)
    deriving (Eq, Show)

$(deriveJSON Prelude.id ''Foo)

main :: IO ()
main = scotty 3000 $ do
    middleware logStdoutDev
    middleware $ staticPolicy (noDots >-> addBase "static")

    get "/" $ do
        html $ wrapper $ do
            H.form ! A.id "fooform" ! method "post" ! action "#" $ do
                H.h5 "Select a constructor: "
                H.input ! type_ "radio" ! A.id "fooquux" ! name "con" ! value "Quux"
                H.label ! for "fooquux" $ "Quux"
                H.input ! type_ "radio" ! A.id "foobar" ! name "con" ! value "Bar"
                H.label ! for "foobar" $ "Bar"
                H.input ! type_ "radio" ! A.id "foobaz" ! name "con" ! value "Baz"
                H.label ! for "foobaz" $ "Baz"
                H.br
                H.h5 "Enter an int: "
                H.input ! type_ "text" ! class_ "barfields" ! name "Barint"
                H.br
                H.h5 "Enter a float: "
                H.input ! type_ "text" ! class_ "bazfields" ! name "Bazfloat"
                H.h5 "Enter a string: "
                H.input ! type_ "text" ! class_ "bazfields" ! name "Bazstring"
                H.br
                H.input ! type_ "submit"
            H.div ! A.id "foolog" $ ""

    post "/foo" $ do
        v <- jsonData
        json $ case v of
                Quux -> Quux
                Bar i -> Bar $ i + 1
                Baz (f,s) -> Baz (f + 0.5, s)

wrapper :: H.Html -> T.Text
wrapper content' = renderHtml
    $ H.html $ do
        H.header $ do
            -- the first two are libraries, the last is our custom code
            H.script ! type_ "text/javascript" ! src "jquery.js" $ ""
            H.script ! type_ "text/javascript" ! src "jquery-json.js" $ ""
            H.script ! type_ "text/javascript" ! src "json.js" $ ""
        H.body content'