Skip to content
Extremely simple URL combinator DSL thing
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
benchmarks
src/Data
.gitignore
.travis.yml
LICENSE
README.md
Setup.hs
package.yaml
stack.yaml
urlpath.cabal

README.md

urlpath

Build Status Coverage Status Chat Room MIT License Hackage Waffle Issues

Dirt-simple, embarrassing, horribly unimaginative URL combinator library for Haskell.

Installation

λ> cabal install urlpath

Usage

You can use the combinators purely, if you're into that:

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

 "foo.asp?key1=bar&key2=baz"

Or you can use them with a configurable root, via the Reader monad:

λ> runReader
     (runAbsoluteUrl $ url $ "foo.asp" <?> ("key1","bar") <&> ("key2","baz"))
     "http://example.com"

 "http://example.com/foo.asp?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 - RelativeUrlT, GroundedUrlT, and AbsoluteUrlT), 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"

How to run tests

λ> cabal install hspec --enable-tests && cabal test --show-details=always

Contributing

I would prefer it that any inquiries and questions go to the Gitter Chat room, while any suggestions, complaints, or requests go in the GitHub Issues / Waffle Dashboard. All ideas are welcome! (Except really gross ones. I've got limits.)

You can’t perform that action at this time.