From 4ddbc26a1e30a9323ac4f55bdf6992c540bbe207 Mon Sep 17 00:00:00 2001 From: Eduardo Julian Date: Wed, 9 Jan 2019 20:15:07 -0400 Subject: Added routing. --- stdlib/source/lux/world/net/http/route.lux | 82 ++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) create mode 100644 stdlib/source/lux/world/net/http/route.lux (limited to 'stdlib') diff --git a/stdlib/source/lux/world/net/http/route.lux b/stdlib/source/lux/world/net/http/route.lux new file mode 100644 index 000000000..188508a5d --- /dev/null +++ b/stdlib/source/lux/world/net/http/route.lux @@ -0,0 +1,82 @@ +(.module: + [lux (#- or) + [control + [monad (#+ do)] + [concurrency + ["." promise]]] + [data + ["." maybe] + ["." text ("text/." Equivalence)]]] + ["." // (#+ URI Server) + ["//." status] + ["//." response]]) + +(do-template [ ] + [(def: #export ( server) + (-> Server Server) + (function (_ request) + (let [[identification protocol resource message] request] + (case (get@ #//.scheme protocol) + + (server request) + + _ + (promise.resolved //response.not-found)))))] + + [#//.HTTP http] + [#//.HTTPS https] + ) + +(do-template [ ] + [(def: #export ( server) + (-> Server Server) + (function (_ request) + (let [[identification protocol resource message] request] + (case (get@ #//.method resource) + + (server request) + + _ + (promise.resolved //response.not-found)))))] + + [#//.Get get] + [#//.Post post] + [#//.Put put] + [#//.Patch patch] + [#//.Delete delete] + [#//.Head head] + [#//.Connect connect] + [#//.Options options] + [#//.Trace trace] + ) + +(def: #export (uri path server) + (-> URI Server Server) + (function (_ request) + (let [[identification protocol resource message] request] + (if (text/= path (get@ #//.uri resource)) + (server request) + (promise.resolved //response.not-found))))) + +(def: #export (sub path server) + (-> URI Server Server) + (function (_ request) + (let [[identification protocol resource message] request] + (if (text.starts-with? path (get@ #//.uri resource)) + (server [identification + protocol + (update@ #//.uri + (|>> (text.clip' (text.size path)) maybe.assume) + resource) + message]) + (promise.resolved //response.not-found))))) + +(def: #export (or primary alternative) + (-> Server Server Server) + (function (_ request) + (do promise.Monad + [response (primary request) + #let [[status message] response]] + (if (n/= //status.not-found status) + (alternative request) + (wrap response))))) -- cgit v1.2.3