A tiny web dev DSL
{-# LANGUAGE OverloadedStrings #-}
import Network.Miku
import Network.Wai.Handler.Warp (run)
main :: IO ()
main = run 3000 . miku $ get "/" (text "miku power")
cabal update
cabal install miku
cabal install warp
-- copy and paste the above example to myapp.hs
runghc myapp.hs
stack new miku-project && cd miku-project
stack install miku
stack install warp
stack build
stack exec miku-project-exe
check: http://localhost:3000
https://github.com/nfjinjing/miku/blob/master/test/RouteExample.hs
{-# LANGUAGE OverloadedStrings #-}
import Network.Miku
import Network.Miku.Utils ((-))
import Network.Wai.Handler.Warp (run)
import Prelude hiding ((-))
main = run 3000 . miku - do
get "/" - do
-- something for a get request
post "/" - do
-- for a post request
put "/" - do
-- put ..
delete "/" - do
-- ..
get "/say/:user/:message" - do
text . show =<< captures
-- /say/miku/hello will output
-- [("user","miku"),("message","hello")]
import Network.Wai.Middleware.RequestLogger
middleware logStdout
-- in Network.Miku.Engine
miku :: MikuMonad -> Application
- It's recommended to use your own html combinator / template engine. Try DIY with, e.g. moe.
- Example view using custom html combinator (moe in this case)
- When inspecting the request, use
ask
defined inReaderT
monad to get theRequest
, then use helper methods forwai
to query it. Response
is inStateT
,html
andtext
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
miku
.