On Monday, August 19, 2019 at 5:48:29 PM UTC-4, Sorawee Porncharoenwase wrote: > > You could use (splicing) syntax class to help with normalization: > > #lang racket > > (require syntax/parse/define > (for-syntax syntax/parse > racket/syntax)) > > (begin-for-syntax > (define-splicing-syntax-class methods-cls > #:attributes (methods) > (pattern (~seq #:methods (method:expr ...)) > #:with methods #'(list 'method ...)) > (pattern (~seq #:method method:expr) > #:with methods #'(list 'method))) > > (define-syntax-class route-cls > (pattern (route:string > handler:id > (~alt (~optional ms:methods-cls > #:name "#:method, or #:methods option") > (~optional (~seq #:when guard-e:expr) > #:name "#:when option")) ...) > #:with methods #`#,(or (attribute ms.methods) #'(list)) > #:with guard #`#,(attribute guard-e)))) > > (define-simple-macro (routes :route-cls ...) > #:with name (format-id this-syntax "axio-routes") > (define name (list (list route handler methods guard) ...))) > > (define (foo-handler) 0) > (define (bar-handler) 0) > (define (baz-handler) 0) > (define (use-bar-handler?) 0) > > (routes > ("/foo" foo-handler #:method put) > ("/bar" bar-handler #:methods (put update) #:when use-bar-handler?) > ("/baz" baz-handler)) > > axio-routes > > Thanks your idea cleans it up nicely! I've broken up the code into 4 file and placed them in a gist:
https://gist.github.com/lojic/842619ab2c59a2c96960f9ccd30bc136 I'm not thrilled with the fact that the routes macro has to export the axio-routes binding. I expect there is a better way to communicate between the routes macro and find-route function. I'll add interpolation to the URL paths next e.g. (route "/user/~id" ...) -- You received this message because you are subscribed to the Google Groups "Racket Users" group. To unsubscribe from this group and stop receiving emails from it, send an email to racket-users+unsubscr...@googlegroups.com. To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/f7238c4b-6d4c-431c-a305-c4d2d7bdbfb5%40googlegroups.com.