fn-0.3.0.0: fn.cabal
name: fn
version: 0.3.0.0
synopsis: A functional web framework.
description:
A Haskell web framework where you write plain old functions.
.
/Provided you have/ <https://github.com/commercialhaskell/stack#readme stack> /installed, you can run this example like a shell script (it'll listen on port 3000):/
.
@
#!\/usr\/bin\/env stack
\-\- stack --resolver lts-5.5 --install-ghc runghc --package fn --package warp
{-# LANGUAGE OverloadedStrings #-}
import Data.Monoid ((<>))
import Data.Text (Text)
import Network.Wai (Response)
import Network.Wai.Handler.Warp (run)
import Web.Fn
.
data Ctxt = Ctxt { _req :: FnRequest }
instance RequestContext Ctxt where
  getRequest = _req
  setRequest c r = c { _req = r }
.
initializer :: IO Ctxt
initializer = return (Ctxt defaultFnRequest)
.
main :: IO ()
main = do ctxt <- initializer
  run 3000 $ toWAI ctxt site
.
site :: Ctxt -> IO Response
site ctxt = route ctxt [ end ==> indexH
  , path "echo" \/\/ param "msg" ==> echoH
  , path "echo" \/\/ segment ==> echoH
  ]
  \`fallthrough\` notFoundText "Page not found."
.
indexH :: Ctxt -> IO (Maybe Response)
indexH _ = okText "Try visiting \/echo?msg='hello' or \/echo\/hello"
.
echoH :: Ctxt -> Text -> IO (Maybe Response)
echoH _ msg = okText $ "Echoing '" <> msg <> "'."
@
.
.
Fn lets you write web code that just looks like normal Haskell code.
.
* An application has some \"context\", which must contain a @Request@,
but can contain other data as well, like database connection pools,
etc. This context will be passed to each of your handlers, updated
with the current HTTP Request.
.
* Routes are declared to capture parameters and/or segments of the url,
and then routed to handler functions that have the appropriate number
and type of arguments. These functions return @IO (Maybe Response)@,
where @Nothing@ indicates to Fn that you want it to keep looking for
matching routes.
.
* All handlers just use plain old @IO@, which means it is easy to call
them from GHCi, @forkIO@, etc.
.
* All of this is a small wrapper around the WAI interface, so you have
the flexilibility to do anything you need to do with HTTP.
.
The name comes from the fact that Fn emphasizes functions (over monads),
where all necessary data is passed via function arguments, and control
flow is mediated by return values.
homepage: http://github.com/dbp/fn#readme
license: ISC
license-file: LICENSE
author: Daniel Patterson <dbp@dbpmail.net>
maintainer: dbp@dbpmail.net
copyright: 2016 Daniel Patterson
category: Web
build-type: Simple
extra-source-files: CHANGELOG.md
README.md
cabal-version: >=1.10
library
hs-source-dirs: src
exposed-modules: Web.Fn
build-depends: base >= 4.7 && < 5
, wai >= 3
, wai-extra >= 3
, http-types
, text
, blaze-builder
, bytestring
, unordered-containers
, filepath
, directory
default-language: Haskell2010
ghc-options: -Wall
test-suite fn-test
type: exitcode-stdio-1.0
hs-source-dirs: test
main-is: Spec.hs
build-depends: base
, fn
, hspec
, text
, http-types
, wai
, wai-extra
, unordered-containers
, filepath
, directory
ghc-options: -threaded -rtsopts -with-rtsopts=-N -Wall
default-language: Haskell2010
source-repository head
type: git
location: https://github.com/dbp/fn