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