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.

Reply via email to