Skip to content

teh-monad/miku

 
 

Repository files navigation

miku

A tiny web dev DSL

Example

{-# LANGUAGE OverloadedStrings #-}

import           Network.Miku
import           Network.Wai.Handler.Warp (run)

main :: IO ()
main = run 3000 . miku $ get "/" (text "miku power")

Installation

cabal

 cabal update
 cabal install miku
 cabal install warp 

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

 runghc myapp.hs

stack

 stack new miku-project && cd miku-project
 stack install miku
 stack install warp
 stack build
 stack exec miku-project-exe

check: http://localhost:3000

Quick reference

https://github.com/nfjinjing/miku/blob/master/test/RouteExample.hs

Routes

Verbs

{-# 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
    -- ..

Captures

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

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

WAI integration

Use WAI middleware

import Network.Wai.Middleware.RequestLogger

middleware logStdout

Convert miku into a WAI application

-- in Network.Miku.Engine

miku :: MikuMonad -> Application

Hints

  • 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 in ReaderT monad to get the Request, then use helper methods for wai 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 miku.

Reference

About

A tiny web dev DSL

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Haskell 89.2%
  • Nix 10.8%