Hi Allen, Thanks for the feedback!
1) This, and precompiling regexes where possible, is my intention with Silk. 2) I'm not convinced that requiring fully-qualified routes would be a feature. Let's say we have route A which should match "/foo/bar" and route B which should match "/foo/*". If these routes are unordered, route B would have to additionally be constrained with `(not= * "bar")`. It seems like this could make route definition very painful when working in a large application with many routes that match on multiple parts of the URL. On Sat, Aug 9, 2014 at 10:06 AM, Allen Rohner <aroh...@gmail.com> wrote: > I'd like to thank everyone in the community for both Silk, and Secretary. > > I'll throw out some (uninvited) feature requests I'd love to see in a > future route-matching library. > > 1) Make trie-based route dispatching possible. A feature pedestal has/will > soon have, is to compile the routing table into trie, rather than the > compojure-style wrapped functions. This can have a nice speedup on busy > applications. I'm not asking anyone to write this code, just consider the > design such that it's possible to add this behavior in the future. > > 2) I'll claim that making route definition order is a misfeature. Routes > should always be fully qualified, such that re-arranging them doesn't > affect routing behavior (and therefore, the route table should be an > unordered collection, like a map or set, not a vector). One nice > readability reason for this is that if your route order does matter, than > at least one route definition is "lying" about which routes it actually > dispatches on. > > Just things to consider :-) > > Thanks, > Allen > > > On Thursday, August 7, 2014 9:31:56 PM UTC-5, DomKM wrote: > >> Thanks for your feedback, Dylan! >> >> If you define routes with :path and :query, will the route match/unmatch >>> with undefined query keys? If so, how are they handled? If not, I'd suggest >>> making query matching optional, where nils are substituted. >> >> >> I'm not entirely sure what you mean, but I'll give it a shot. Please >> provide some example code if I answered the wrong question. >> >> `nil` is a pattern that matches anything. If your URL pattern query is >> `nil` then the URL query will not be checked. >> A map is a pattern that matches its values against the values of another >> map. Therefore, `nil` and `{}` are equivalent when used as a query pattern. >> You can make a query value pattern optional by wrapped it with >> `silk/option`. >> >> It's a little unclear how your matching functions relate to route. It >>> looks like Silk always breaks at / in path and matches, is that correct? >> >> >> Yes. There is a URL type in Silk and matching is done against instances >> of it. The path is represented as a vector of segments. >> >> The readme is currently very deficient and I apologize for that. >> >> There are some really good things in secretary. What do you think about >>> them? >>> Splat, regex, format matchers. >> >> >> In terms of regex matching, Silk used to have a built-in regex pattern >> but I removed it when I made a big architectural change. I forget why I >> removed it, but I'll re-add it since it does seem like a very common >> requirement. >> >> Currently, part of Secretary's splat exists as a built-in Silk pattern. >> For example, `(silk/composite ["foo" :* "bar"])` would match >> "fooanythingbar" and return `{:* "anything"}`. The `:*` isn't special; it's >> just a keyword. Format is just a specific case of composite: >> `(silk/composite [:* "." :format])`. Unlike Secretary, Silk does not have a >> built-in special syntax for string patterns. This is because special syntax >> strings are not composable and, since Silk matches against unencoded >> strings, who am I to say you can't have ":" or "*" in your URL paths? ;) >> >> Looking at the Secretary readme, there appear to be two ways to use splat >> that Silk currently does not have built-in support for. In Secretary, >> "/foo/*" would match "/foo/bar/baz" and return `{:* "bar/baz"}`. Also, >> "/*/*" would match "/a/b" and return `{:* ["a" "b"]}`. I keep saying >> "built-in" because, while multi-segment path patterns and binding the same >> parameter key to multiple path segments does not currently exist in Silk, >> it is very easy to extend Silk with that functionality. You could easily >> create a pattern that did exactly what Secretary and Clout do by default >> and use it to match a path instead of a vector. However, I do question the >> utility of these two features. Are either of these common requirements and, >> if so, could I see some examples of why they are necessary or helpful? This >> isn't rhetorical; please let me know if Silk is missing something that is >> within its scope and is useful to most consumers. >> >> protocol based render function for multiple arity "unmatching." this is >>> really great. >> >> >> I don't think I fully understand the use cases for this protocol. Do you >> want to be able to look routes up by types? If so, since route names in >> Silk can be anything, you could use a type as a name. Anyway, I put >> together this little gist >> <https://gist.github.com/DomKM/26658b53a50e48f0be70> of ways in which >> Silk could be used similarly to how I *think* someone might use Secretary's >> IRenderRoute. Do these cover the use cases for that protocol? >> >> >> I also agree with everything in Joel's response and look forward to >> working with him on improving the routing story. :) >> >> >> On Thu, Aug 7, 2014 at 2:52 PM, Joel Holdbrooks <cjhold...@gmail.com> >> wrote: >> >>> I'm in agreement that Silk is a step in the right direction. I've >>> reached out to Dom and I think we can learn a lot from each other and work >>> together to improve the routing story in Clojure overall. >>> >>> > There are some really good things in secretary. What do you think >>> about them? >>> > Splat, regex, format matchers. >>> > protocol based render function for multiple arity "unmatching." this >>> is really great. >>> >>> These are definitely nice things and I'm willing to bet Silk would be >>> capable of supporting some of them. >>> >>> It's obvious to me to that if we can iron out the details with Silk, >>> Secretary could built on top of it as a higher level interface while at the >>> same time taking advantage of what Silk has to offer. It might mean some >>> breaking changes in Secretary but those were already slated anyway. >>> >>> -- >>> Note that posts from new members are moderated - please be patient with >>> your first post. >>> --- >>> You received this message because you are subscribed to the Google >>> Groups "ClojureScript" group. >>> To unsubscribe from this group and stop receiving emails from it, send >>> an email to clojurescrip...@googlegroups.com. >>> To post to this group, send email to clojur...@googlegroups.com. >>> >>> Visit this group at http://groups.google.com/group/clojurescript. >>> >> >> -- > You received this message because you are subscribed to the Google > Groups "Clojure" group. > To post to this group, send email to clojure@googlegroups.com > > Note that posts from new members are moderated - please be patient with > your first post. > To unsubscribe from this group, send email to > clojure+unsubscr...@googlegroups.com > For more options, visit this group at > http://groups.google.com/group/clojure?hl=en > --- > You received this message because you are subscribed to the Google Groups > "Clojure" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to clojure+unsubscr...@googlegroups.com. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "Clojure" group. To post to this group, send email to clojure@googlegroups.com Note that posts from new members are moderated - please be patient with your first post. To unsubscribe from this group, send email to clojure+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/clojure?hl=en --- You received this message because you are subscribed to the Google Groups "Clojure" group. To unsubscribe from this group and stop receiving emails from it, send an email to clojure+unsubscr...@googlegroups.com. For more options, visit https://groups.google.com/d/optout.