Deprecated

In favour of

loli

A minimum web dev DSL in Haskell http://github.com/nfjinjing/loli

Latest on Hackage:2011.6.24

This package is not currently in any snapshots. If you're interested in using it, we recommend adding it to Stackage Nightly. Doing so will make builds more reliable, and allow stackage.org to host generated Haddocks.

BSD3 licensed by Jinjing Wang
Maintained by Jinjing Wang

loli

A minimum web dev DSL

Example

import Network.Loli
import Hack.Handler.Happstack

main = run . loli $ get "/" (text "loli power")

Installation

cabal update
cabal install loli
cabal install hack-handler-happstack

-- copy and paste the above example to myapp.hs

ghc --make myapp.hs
./myapp

check: http://localhost:3000

Quick reference

http://github.com/nfjinjing/loli/blob/master/src/Test/Test.hs

Routes

Verbs

-- use - instead of $ for clarity
import MPS.Light ((-))
import Prelude hiding ((-))

import Network.Loli
import Hack.Handler.Happstack

main = run . loli - do

  get "/" - do
    -- something for a get request

  post "/" - do
    -- for a post request

  put "/" - do
    -- put ..

  delete "/" - do
    -- ..

Captures

get "/say/:user/:message" - do
  text . show =<< captures

-- /say/jinjing/hello will output
-- [("user","jinjing"),("message","hello")]

Static

-- public serve, only allows `./src`
public (Just ".") ["/src"]

Mime types

-- treat .hs extension as text/plain
mime "hs" "text/plain"

Filters

-- before takes a function of type (Env -> IO Env)
before - \e -> do
  putStrLn "before called"
  return e

-- after takes that of type (Response -> IO Response)
after return

Hack integration

Use hack middleware

-- note both etag and lambda middleware are removed ... for somce ghc 7.0 compatability ><

import Hack.Contrib.Middleware.ETag
import Hack.Contrib.Middleware.Lambda

middleware etag
middleware lambda

Convert loli into a hack application

-- in Network.Loli.Engine

loli :: Unit -> Application

Hints

  • It's recommended to use your own html combinator / template engine, loli's template system is for completeness rather then usefulness... The author has removed the section on view from this readme. Examples can still be found in src/Test/Test.hs. Try DIY with, e.g. moe. The template code will stay for, say, a few years, but will eventually fade away.
  • Example view using custom html combinator (moe in this case)
  • When inspecting the request, use ask defined in ReaderT monad to get the Hack.Environment, then use helper method defined in Hack.Contrib.Request to query it.
  • Response is in StateT, html and text are simply helper methods that update the state, i.e. setting the response body, content-type, etc.
  • You do need to understand monad transformers to reach the full power of loli.
  • For mac users, use GHC 6.12.1 if you have trouble running the server.

Reference


Changes

2010.10.9

Fix

  • compile again ...

2009.10.13

Fix

  • compatible with lastest mps

2009.8.18

Feature

  • use new hack-contrib

2009.8.16

Feature

  • use hackCache for performance
  • no $ noise

2009.7.2

Features

  • before / after filter
  • On the fly router switcher

Fix

  • safari display weird header

2009.6.29

Features

  • Initial hackage release

2009.6.27

Features

  • add template
  • add local binding
  • env and response are in reader and state monad respectively

2009.6.26

Features

  • add route

2009.6.25

Init

comments powered byDisqus