(.module: [lux (#- or) [control [monad (#+ do)] [concurrency ["." promise]]] [data ["." maybe] ["." text ("#/." equivalence)]]] ["." // (#+ URI Server) ["//." status] ["//." response]]) (do-template [ ] [(def: #export ( server) (-> Server Server) (function (_ (^@ request [identification protocol resource message])) (case (get@ #//.scheme protocol) (server request) _ (promise.resolved //response.not-found))))] [#//.HTTP http] [#//.HTTPS https] ) (do-template [ ] [(def: #export ( server) (-> Server Server) (function (_ (^@ request [identification protocol resource message])) (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 (_ [identification protocol resource message]) (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)))))