You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Automatically push context parameters into endpoints when safe #463
If a context would be inferred as dynamic, we can push the context into each body form. Then we can proceed to handle individual cases, but the advantage is it automatically handles hybrid static/dynamic contexts. The inner contexts that are static will be inferred as static, ditto dynamic.
(let [f (fn [] (GET"/bar" [] "body just for doc and coercion"))]
(context"/foo" []
:body [body s/Str]
(GET"/bar" [] body)
(f)))
=>
(let [f (fn [] (GET"/bar" [] "body just for doc and coercion"))]
(vector
(context"/foo" []
:body [body s/Str]
(GET"/bar" [] body))
(context"/foo" []
:body [body s/Str]
(f))))
=>
(let [f (fn [] (GET"/bar" [] "body just for doc and coercion"))]
(vector
(context"/foo" []
(GET"/bar" []
:body [body s/Str]
body))
(context"/foo" []
(-> (f)
(update:handler (let [g (partial coercion/coerce-request! s/Str :body-params:bodytruefalse)]
#(comp % g)))
(update-in [:info:public:parameters:body] #(or % s/Str))))))
Another insight is that if all :lets and :letks bindings are never used in the body, we can treat it like a static context. This is because the bindings are just side effects, and as long as we update the handler with the side effect and any :info needed, it's equivalent.
This is a useful observation if the context body calls a function. If the function doesn't get passed the body, then we can just update the route after it's been evaluated.
(let [f (fn [] (GET"/bar" [] "body just for doc and coercion"))]
(context"/foo" []
:body [body s/Str]
(f)))
=>
(let [f (fn [] (GET"/bar" [] "body just for doc and coercion"))]
(context"/foo" []
(-> (f)
...for each route...
(update:handler (let [g (partial coercion/coerce-request! s/Str :body-params:bodytruefalse)]
#(comp % g)))
(update-in [:info:public:parameters:body] #(or % s/Str)))))
Activity
ikitommi commentedon Apr 23, 2024
Great idea!
frenchy64 commentedon Apr 29, 2024
If a context would be inferred as dynamic, we can push the context into each body form. Then we can proceed to handle individual cases, but the advantage is it automatically handles hybrid static/dynamic contexts. The inner contexts that are static will be inferred as static, ditto dynamic.
frenchy64 commentedon Apr 29, 2024
Another insight is that if all
:letsand:letksbindings are never used in the body, we can treat it like a static context. This is because the bindings are just side effects, and as long as we update the handler with the side effect and any:infoneeded, it's equivalent.This is a useful observation if the context body calls a function. If the function doesn't get passed the body, then we can just update the route after it's been evaluated.