Change Views render function return type.

All Views submodules' render functions now return a Dream_html node promise, rather than the node itself.

Commit
aacec6588c3aebffda6c6221b02622576c85c407
Author
Marius Peter <marius.peter@tutanota.com>
Author date
Committer
Marius Peter <marius.peter@tutanota.com>
Committer date
Changed files
bin/main.ml
index 895bfb86..c30e4fc5 100644..100644
@@ -2,8 +2,9 @@
2 2 Dream.run @@ Dream.logger
3 3 @@ Dream.router
4 4 [
5 Removed: Dream.get "/" (fun _ -> Ogit.Handlers.ogit_root ());
6 Removed: Dream.get "/:repo_name" (fun request ->
7 Removed: Ogit.Handlers.repo_root @@ Dream.param request "repo_name");
5 Added: Dream.get "/" (fun _req -> Ogit.Handlers.ogit_root _req);
6 Added: Dream.get "/:repo_name" (fun req ->
7 Added: let repo_name = Dream.param req "repo_name" in
8 Added: Ogit.Handlers.repo_root repo_name);
8 9 Dream.get "/static/**" (Dream.static "./lib/static");
9 10 ]
lib/config.ml
index 4aab858c..d47101fb 100644..100644
@@ -1,1 +1,2 @@
1 1 let git_directory = Filename.concat (Unix.getenv "HOME") "git"
2 Added: let author = "Marius Peter"
lib/dune
index c091495b..e9511c2c 100644..100644
@@ -1,5 +1,5 @@
1 1 (library
2 2 (name ogit)
3 Removed: (libraries dream dream-html lwt_ppx git-unix)
3 Added: (libraries dream dream-html git-unix)
4 4 (preprocess
5 5 (pps lwt_ppx)))
lib/handlers.ml
index 1f6d920e..7c80bcb4 100644..100644
@@ -1,4 +1,6 @@
1 Removed: let ogit_root _ = Dream_html.respond @@ Views.Ogit_root.render ()
1 Added: open Lwt.Infix
2 2
3 Added: let ogit_root _ = Views.Ogit_root.render () >>= Dream_html.respond
4 Added:
3 5 let repo_root repo_name =
4 Removed: Dream_html.respond @@ Lwt_main.run @@ Views.Repo_root.render repo_name
6 Added: Views.Repo_root.render repo_name >>= Dream_html.respond
lib/views.ml
index 64b003ef..b625ca69 100644..100644
@@ -1,31 +1,19 @@
1 Removed: type page_data = { title : string; main_content : Dream_html.node list }
1 Added: type head_data = { page_title : string }
2 2
3 Added: type body_data = {
4 Added: title : string;
5 Added: subtitle : string;
6 Added: topnav : Dream_html.node;
7 Added: content : Dream_html.node list;
8 Added: }
9 Added:
3 10 module Layout = struct
4 11 open Dream_html
5 12 open HTML
6 13
7 Removed: let header =
8 Removed: null
9 Removed: [
10 Removed: h1 [] [ txt "ogit" ];
11 Removed: h2 [] [ txt "A mobile-friendly Git repository viewer" ];
12 Removed: ]
14 Added: let header title subtitle =
15 Added: null [ h1 [] [ txt "%s" title ]; h2 [] [ txt "%s" subtitle ] ]
13 16
14 Removed: let topnav =
15 Removed: nav
16 Removed: [ id "top" ]
17 Removed: [
18 Removed: ul []
19 Removed: [
20 Removed: li [] [ a [ href "/" ] [ txt "Home" ] ];
21 Removed: li [] [ a [ href "/" ] [ txt "Refs" ] ];
22 Removed: li [] [ a [ href "/" ] [ txt "Log" ] ];
23 Removed: li [] [ a [ href "/" ] [ txt "Tree" ] ];
24 Removed: li [] [ a [ href "/" ] [ txt "Commit" ] ];
25 Removed: li [] [ a [ href "/" ] [ txt "Diff" ] ];
26 Removed: ];
27 Removed: ]
28 Removed:
29 17 let footer name =
30 18 let today = Unix.localtime (Unix.time ()) in
31 19 let year = today.Unix.tm_year + 1900 |> string_of_int in
@@ -33,16 +21,21 @@
33 21 let footer_text = String.concat space [ "©"; year; name ] in
34 22 footer [] [ txt "%s" footer_text ]
35 23
36 Removed: let application page =
24 Added: let head_data = { page_title = "Ogit" }
25 Added:
26 Added: let application ?(head_data = head_data) body_data =
37 27 html []
38 28 [
39 Removed: head [] [ title [] "%s" page.title ];
40 Removed: link [ rel "stylesheet"; href "/static/styles.css" ];
29 Added: head []
30 Added: [
31 Added: title [] "%s" head_data.page_title;
32 Added: link [ rel "stylesheet"; href "/static/styles.css" ];
33 Added: ];
41 34 body []
42 35 [
43 Removed: header;
44 Removed: topnav;
45 Removed: div [ id "main" ] page.main_content;
36 Added: header body_data.title body_data.subtitle;
37 Added: body_data.topnav;
38 Added: div [ id "main" ] body_data.content;
46 39 footer "Marius PETER";
47 40 ];
48 41 ]
@@ -57,13 +50,15 @@
57 50 and li_of_repo repo = li [] [ a [ href "%s" repo ] [ txt "%s" repo ] ] in
58 51 div [ id "repositories" ] [ ul [] @@ List.map li_of_repo repositories ]
59 52
60 Removed: let page_data =
53 Added: let body_data =
61 54 {
62 55 title = "My repositories";
63 Removed: main_content = [ repositories_in Config.git_directory ];
56 Added: subtitle = "Repositories for " ^ Config.author;
57 Added: topnav = null [];
58 Added: content = [ repositories_in Config.git_directory ];
64 59 }
65 60
66 Removed: let render () = Layout.application page_data
61 Added: let render () = Lwt.return @@ Layout.application body_data
67 62 end
68 63
69 64 module Repo_root = struct
@@ -72,7 +67,22 @@
72 67 open Git
73 68 open Lwt.Infix
74 69
75 Removed: let page_promise repo_name =
70 Added: let topnav =
71 Added: nav
72 Added: [ id "top" ]
73 Added: [
74 Added: ul []
75 Added: [
76 Added: li [] [ a [ href "/" ] [ txt "Home" ] ];
77 Added: li [] [ a [ href "/" ] [ txt "Refs" ] ];
78 Added: li [] [ a [ href "/" ] [ txt "Log" ] ];
79 Added: li [] [ a [ href "/" ] [ txt "Tree" ] ];
80 Added: li [] [ a [ href "/" ] [ txt "Commit" ] ];
81 Added: li [] [ a [ href "/" ] [ txt "Diff" ] ];
82 Added: ];
83 Added: ]
84 Added:
85 Added: let render repo_name =
76 86 let repo_path = Filename.concat Config.git_directory repo_name in
77 87
78 88 (* 1. Open the Git repository *)
@@ -84,7 +94,7 @@
84 94
85 95 (* 2. Resolve HEAD to get the latest commit hash *)
86 96 let%lwt commit_hash =
87 Removed: Git_unix.Store.Ref.resolve repo Reference.head >>= function
97 Added: Git_unix.Store.Ref.resolve repo Reference.master >>= function
88 98 | Ok hash -> Lwt.return hash
89 99 | Error _ -> Lwt.fail_with "Failed to resolve HEAD"
90 100 in
@@ -114,23 +124,23 @@
114 124 (* in *)
115 125
116 126 (* 6. Assemble the page *)
117 Removed: let main_content =
118 Removed: [
119 Removed: ul []
120 Removed: [ li [] [ txt "%s" (commit_hash |> Digestif.SHA1.to_raw_string) ] ];
121 Removed: ]
127 Added: let content =
128 Added: [ ul [] [ li [] [ txt "%s" (commit_hash |> Digestif.SHA1.to_hex) ] ] ]
122 129 in
123 Removed: let page_data = { title = repo_name; main_content } in
124 Removed: Lwt.return (Layout.application page_data)
125 Removed:
126 Removed: let render repo_name = page_promise repo_name >>= fun page -> Lwt.return page
130 Added: let title = repo_name in
131 Added: let subtitle = Git_unix.(repo |> Store.root |> Fpath.to_string) in
132 Added: let body_data = { title; subtitle; topnav; content } in
133 Added: Lwt.return @@ Layout.application body_data
127 134 end
128 135
129 136 module Repo_tree = struct
130 137 open Dream_html
138 Added: open HTML
131 139
132 140 let render repo_name =
133 Removed: let title = repo_name and main_content = [ txt "foobar" ] in
134 Removed: let page_data = { title; main_content } in
135 Removed: Layout.application page_data
141 Added: let title = repo_name and content = [ txt "foobar" ] in
142 Added: let subtitle = "Dinglefops" in
143 Added: let topnav = null [] in
144 Added: let body_data = { title; subtitle; topnav; content } in
145 Added: Lwt.return @@ Layout.application body_data
136 146 end