Re: Question about generating urls with dispatch-rules from imported modules

Dominik Pantůček <dominik.pantucek-9/hJBgj/qzXtwjQa/[email protected]> Sun, 26 Apr 2020 17:50:10 +0200
Newsgroups gmane.comp.lang.racket.user,gmane.lisp.scheme.plt
Message-ID <[email protected]>
Hello,

just a quick and dirty hack I use to get the best of default
dispatch-... for my use-case when dispatching API requests:

(define-for-syntax (dispatch-api-case-helper stx)
  (syntax-parse stx
    (((method:id (path+args:expr ...) proc:id) rest ...)
       #`((("api" path+args ...) #:method #,(symbol->string
(syntax->datum #'method)) proc)
          #,@(dispatch-api-case-helper #'(rest ...))))
    (((else proc:id))
     #'((else proc)))
    (()
     #'())))

(define-syntax (dispatch-api-case stx)
  (syntax-parse stx
    ((_ rest ...)
     #`(dispatch-case
        #,@(dispatch-api-case-helper #'(rest ...))))))

(define dispatch-api-request-real
  (dispatch-api-case
   (get ("number" (number-arg)) api-number-test)
   (get ("ping") api-ping)
   (post ("auth") auth-login)
   (delete ("auth") auth-logout)
   (put ("auth") auth-passwd)
   (get ("auth" "info") auth-user-info)
   (get ("partners") partners-list)
   (get ("partners" (string-arg)) partner-detail)
   (get ("partners" (string-arg) "payments") partner-payments)
   (get ("partners" (string-arg) "debt") partner-debt)
   (get ("debts") partners-debts)
   (get ("partners" (string-arg) "history") partner-debt-history)
   (get ("invoices" "issued") invoices-issued-list)
   (get ("invoices" "issued" (string-arg)) invoice-info)
   (post ("notes") notes-add)
   (else api-404)))

Not very general, but maybe you'll find that useful (especially if the
(string-arg) and similar can make your life easier like it was the case
for me.

When I needed a url-generation function in earlier project, I basically
did the same with more syntax mess around, that used either set! or
parameter from different module to store the dispatch-url -generated
procedure.

Basically it is about customized version of dispatch-rules that does the
dispatch-case and dispatch-url independently and provides the results by
different means.


Cheers,
Dominik

On 26. 04. 20 17:26, Yury Bulka wrote:
> Meanwhile here's my attempt at doing a koyo-like url generation with a
> wrapper around web-server/dispatch's url-generating function:
> 
> (define-values (app-dispatch app-url)
>   (dispatch-rules  ; the standard one
>    [...]))
> 
> (define (app-url/names route-name . args)
>   ;; define a mapping between symbolic names and handlers
>   (define route-names
>     (hash 'item-list item-list-view
>           'item-detail item-detail-view))
>   (apply app-url (hash-ref route-names route-name) args))
> 
> And then I can store the function in a parameter that is used by the
> templates.
> 
> It is of course not a general solution (for instance, the rules in
> dispatch-rules and the route-names can go out of sync if one forgets to
> update either of them) and they are not dynamic.
> 
> But for an ultra-minimalistic application this might do when you don't
> feel like adding a new external dependency.
> 
> --
> Yury Bulka
> https://mamot.fr/@setthemfree
> #NotOnFacebook
> 
> 
> 
> Yury Bulka <setthemfree-tGttlkr9q/[email protected]> writes:
> 
>> Thank you for sharing this!
>>
>> I'm wondering, if this is a common use case, maybe it is worth adding to
>> web-server/dispatch in some form?
>>
>> Or, if not, maybe we can extend the documentation to include some hints
>> on how to approach this otherwise?
>>
>> It is great to have powerful libraries outside the main distribution,
>> but the main distribution is the place where newcomers like me are going
>> to look first.
> 

-- 
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+unsubscribe-/JYPxA39Uh5TLH3MbocFF+G/[email protected]
To view this discussion on the web visit https://groups.google.com/d/msgid/racket-users/304869ce-9ab8-0255-50ca-de7b7db0788d%40trustica.cz.