aantron/dream

Match on extension in router

Opened this issue · 3 comments

It would be nice if we could match on a file extension in the router, something like this:

[
  Dream.get "/foo/:bar" @@ html_handler;
  Dream.get "/foo/:bar.html" @@ html_handler;
  Dream.get "/foo/:bar.json" @@ json_handler;
]

The current behaviour is that :bar.html will be parsed as the parameter name.

Would others find it useful to allow the extension to be a parameter as well? Looking at something like reitit in Clojure, they allow a separate syntax for handling this. In Dream it might look like this:

[
Dream.get "/foo/:bar" @@ html_handler;
Dream.get "/foo/{bar}.{ext}" @@ generic_handler;
]

Would it be possible with the same syntax? I.e. /foo/:bar.:ext

I think it would be best to be able to delimit the variable names somehow, so {bar} or :{bar}, etc. Ending a variable name with . seems too implicit, and too specific to extensions in particular. There might be other reasons why someone wants to have a variable for part of a component.