urlpath: Painfully simple URL writing combinators

[ bsd3, data, library, web ] [ Propose Tags ]

Simple URL DSL for Haskell.

This library tries to make it easier for people to write Url strings, structurally. Packages like Yesod Routes do a wonderful job at implementing string-free routing and references, but sometimes we have to compromise. This tries to make that compromise less painful.

Use bare combinators to render your strings (kinda useless):

 expandRelative $ "foo.php" <?> ("key1","bar") <&> ("key2","baz")

 ↪ "foo.php?key1=bar&key2=baz"

... or use the MonadReader instance for a configurable host:

 let path = runAbsoluteUrl $ url $ "foo.php" <?> ("key1","bar") <&> ("key2","baz")
 path "example.com"

 ↪ "example.com/foo.php?key1=bar&key2=baz"

url puts the UrlString in a MonadReader that we can use for applying our host. We use different monads for different deployment schemes (currently we have 3 - RelativeUrl, GroundedUrl, and AbsoluteUrl), which we can integrate in different libraries, like Lucid:

 (runAbsoluteUrl $ renderTextT $ do
     foo <- lift $ url $ "foo" <?> ("bar","baz")
     script_ [src_ foo] "" )
 ) "example.com"

 ↪ "<script src=\"example.com/foo?bar=baz\"></script>"

... and in Scotty ...

 main :: IO ()
 main = scottyT 3000
     rootConf
     rootConf
     run

   where
     rootConf = flip runAbsoluteT "http://example.com"

     run :: ( MonadIO m
            , MonadReader T.Text m
            , Url T.Text m ) =>
            ScottyT LT.Text m ()
     run = get "/" $ do
       path <- lift $ url $ "foo" <?> ("bar","baz")
       text $ LT.fromStrict path

 λ> curl localhost:3000/
 ↪ "http://example.com/foo?bar=baz"

Note that in the scotty example, we don't use one of our deployment schemes - this is because the scottyT function expects it's underlying monad to be an instance of MonadIO, which we can only instantiate in our monad transformers.

Please take mind - the string type underlying the Url rendering is generalized to Data.String.IsString for convenient use with -XOverloadedStrings. However, due to that generality, we need to specify the monomorphic type (like Data.Text.Text above).

Versions [faq] 0.0.1, 0.0.2, 0.0.3, 0.0.4, 0.0.5, 0.0.6, 0.1, 0.1.0.1, 0.2, 1.0.0, 1.1.0, 2.0.0, 2.1.0, 3.0.0, 3.1.0, 3.1.1, 3.2.0, 3.2.1, 3.2.1.1, 3.3.0, 4.0.0, 4.0.0.1, 4.1.0, 4.2.0, 5.0.0, 5.0.0.1, 6.0.0, 6.0.1, 6.0.2, 6.0.3, 6.0.4, 7.0.0, 7.0.1, 7.0.2, 7.1.0, 8.0.0, 8.0.1, 8.1.0, 8.2.0, 9.0.0, 9.0.0.1, 9.0.1 (info)
Dependencies base (==4.*), mtl, transformers [details]
License MIT
Author Athan Clark <athan.clark@gmail.com>
Maintainer Athan Clark <athan.clark@gmail.com>
Category Web
Source repo head: git clone https://github.com/athanclark/urlpath.git
Uploaded by athanclark at Fri Dec 19 14:46:39 UTC 2014
Distributions LTSHaskell:9.0.1, NixOS:9.0.1, Stackage:9.0.1
Downloads 10483 total (412 in the last 30 days)
Rating (no votes yet) [estimated by rule of succession]
Your Rating
  • λ
  • λ
  • λ
Status Hackage Matrix CI
Docs available [build log]
Last success reported on 2014-12-21 [all 1 reports]

Modules

[Index]

Downloads

Maintainer's Corner

For package maintainers and hackage trustees