mirror of
				https://github.com/aantron/dream.git
				synced 2025-11-04 00:03:38 -05:00 
			
		
		
		
	Replace under and apply by scope
This commit is contained in:
		
							parent
							
								
									be0b179694
								
							
						
					
					
						commit
						5605742891
					
				@ -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
 | 
			
		||||
 | 
			
		||||
@ -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. *)
 | 
			
		||||
 | 
			
		||||
@ -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]
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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,
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -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 {|
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user