Today marks the first release of elm-route, a type safe route parsing DSL built on top of elm-combine. Its main additions to the world of type safe route parsing are:
- A generic DSL for expressing arbitrarily-nested dynamic routes (at the cost of uglier route constructors as the depth increases).
- An automatic way to do reverse routing that when coupled with a small amount of boilerplate should provide the safest approach to reverse routing that the Elm language can currently support.
You can see a working demo here (source). Note that direct linking to routes in the demo does not work due to a limitation of Gihub Pages.
Related work
elm-route-parser is another type safe route parsing library. In
contrast to elm-route, its more rigid matchers make it possible to have
cleaner route constructors (for example, HomeR instead of HomeR ()).
It does not yet provide automatic reverse routing support.
Example
Here's a short taste of what the DSL looks like:
type Sitemap
= HomeR ()
| UsersR ()
| UserR Int
| UserPostR (Int, String)
homeR = HomeR := static ""
usersR = UsersR := static "users"
userR = UserR := "users" <//> int
userPostR = UserPostR := "users" <//> int </> string
sitemap = router [homeR, usersR, userR, userPostR]
match : String -> Maybe Sitemap
match = Route.match sitemap
route : Sitemap -> String
route r =
case r of
HomeR () -> reverse homeR []
UsersR () -> reverse usersR []
UserR id -> reverse userR [toString id]
UserPostR (uid, pid) -> reverse userPostR [toString uid, pid]