Replace under and apply by scope

This commit is contained in:
Anton Bachin 2021-03-11 19:37:14 +03:00
parent be0b179694
commit 5605742891
6 changed files with 39 additions and 25 deletions

View File

@ -7,7 +7,7 @@ let () =
(fun request ->
Printf.ksprintf Dream.respond "Prefix: %s" (Dream.target request));
Dream.under "/blah" [
Dream.scope "/blah" [] [
Dream.get "/echo/:word"
(fun request ->
request

View File

@ -205,6 +205,7 @@ val reason : response -> string
val identity : middleware
val start : middleware
val pipeline : middleware list -> middleware
val request_id : ?prefix:string -> middleware
val logger : middleware
val catch :
@ -222,8 +223,9 @@ type route
val get : string -> handler -> route
val post : string -> handler -> route
val apply : middleware list -> route list -> route
val under : string -> route list -> route
(* val apply : middleware list -> route list -> route
val under : string -> route list -> route *)
val scope : string -> middleware list -> route list -> route
val router : route list -> middleware
(* TODO LATER Define helpers for other methods. *)

View File

@ -25,7 +25,7 @@ let rec validate = function
| (Literal "")::_ -> false
| _::more -> validate more
(* TODO Permit leading /. *)
(* TODO Permit lack of leading /. *)
(* TODO Permit double /. *)
let parse string =
@ -64,6 +64,11 @@ let parse string =
else
tokens
let rec strip_empty_trailing_token = function
| [] -> []
| [Literal ""] -> []
| token::tokens -> token::(strip_empty_trailing_token tokens)
type node =
@ -93,11 +98,11 @@ let rec apply middlewares routes =
in
pattern, node)
(* TODO Need to handle the prefix extension and path chopping. *)
(* TODO Need to handle variables in the prefix. *)
(* TODO Strip trailing /. *)
let under prefix routes =
[parse prefix, Subsite (List.flatten routes)]
[strip_empty_trailing_token (parse prefix), Subsite (List.flatten routes)]
let scope prefix middlewares routes =
under prefix [apply middlewares routes]

View File

@ -14,8 +14,7 @@ val get : string -> Dream.handler -> route
val post : string -> Dream.handler -> route
(* Route groups. *)
val apply : Dream.middleware list -> route list -> route
val under : string -> route list -> route
val scope : string -> Dream.middleware list -> route list -> route
(* The middleware and the path parameter retriever. With respect to path
parameters ("crumbs"), the middleware is the setter, and the retriever is,

View File

@ -472,6 +472,13 @@ let identity handler request =
let start handler request =
handler request
let rec pipeline middlewares =
let middlewares = List.rev middlewares in
fun handler ->
match middlewares with
| [] -> handler
| middleware::more -> pipeline more (middleware handler)
let sort_headers headers =
List.stable_sort (fun (name, _) (name', _) -> compare name name') headers

View File

@ -233,11 +233,14 @@ let%expect_test _ =
(* Router applies middlewares. *)
let%expect_test _ =
let pipeline = Dream.pipeline [
(fun next_handler request -> print_endline "foo"; next_handler request);
(fun next_handler request -> print_endline "bar"; next_handler request);
] in
show "/abc" @@ Dream.router [
Dream.apply [
(fun next_handler request -> print_endline "foo"; next_handler request);
(fun next_handler request -> print_endline "bar"; next_handler request);
] [
Dream.scope "/" [pipeline] [
Dream.get "/abc" (fun _ -> Dream.respond "baz");
];
];
@ -249,7 +252,7 @@ let%expect_test _ =
let%expect_test _ =
show "/" @@ Dream.router [
Dream.apply [
Dream.scope "/" [
(fun next_handler request -> print_endline "foo"; next_handler request);
(fun next_handler request -> print_endline "bar"; next_handler request);
] [
@ -273,7 +276,7 @@ let%expect_test _ =
let%expect_test _ =
show "/abc/def" @@ Dream.router [
Dream.under "/abc" [
Dream.scope "/abc" [] [
Dream.get "/def" (fun request ->
Dream.respond (Dream.prefix request ^ " " ^ Dream.path request));
];
@ -284,7 +287,7 @@ let%expect_test _ =
let%expect_test _ =
show "/def/abc" @@ Dream.router [
Dream.under "/abc" [
Dream.scope "/abc" [] [
Dream.get "/def" (fun request ->
Dream.respond (Dream.prefix request ^ " " ^ Dream.path request));
];
@ -294,7 +297,7 @@ let%expect_test _ =
let%expect_test _ =
show "/abc/ghi" @@ Dream.router [
Dream.under "/abc" [
Dream.scope "/abc" [] [
Dream.get "/def" (fun request ->
Dream.respond (Dream.prefix request ^ " " ^ Dream.path request));
];
@ -307,7 +310,7 @@ let%expect_test _ =
let%expect_test _ =
show "/abc/def" @@ Dream.router [
Dream.under "/:x" [
Dream.scope "/:x" [] [
Dream.get "/def" (fun request ->
Dream.respond (Dream.crumb "x" request));
];
@ -318,7 +321,7 @@ let%expect_test _ =
let%expect_test _ =
show "/abc/def" @@ Dream.router [
Dream.under "/:x" [
Dream.scope "/:x" [] [
Dream.get "/:x" (fun request ->
Dream.respond (Dream.crumb "x" request));
];
@ -329,14 +332,12 @@ let%expect_test _ =
let%expect_test _ =
show "/abc/def" @@ Dream.router [
Dream.apply [
Dream.scope "/abc" [
(fun next_handler request -> print_endline "foo"; next_handler request);
(fun next_handler request -> print_endline "bar"; next_handler request);
] [
Dream.under "/abc" [
Dream.get "/def" (fun request ->
Dream.respond (Dream.prefix request ^ " " ^ Dream.path request));
];
Dream.get "/def" (fun request ->
Dream.respond (Dream.prefix request ^ " " ^ Dream.path request));
];
];
[%expect {|