(* -*- mode: tuareg; -*- *) let root _req = Views.root () module Repo = struct let ( let* ) m f = Lwt.bind m @@ function | Ok x -> f x | Error e -> let msg = Format.asprintf "%a" Resolvers.Store.pp_error e in Views.error_page msg let summary req = let repo = Dream.param req "repo" in let* branches = Resolvers.Reference.all repo in let* commits = Resolvers.Commit.recent repo 10 in Views.Repo.summary repo branches commits let commits req = let repo = Dream.param req "repo" in let* commits = Resolvers.Commit.recent repo 100 in Views.Repo.commits repo commits let commit req = let repo = Dream.param req "repo" in let id = Dream.param req "id" in let* commit = Resolvers.Commit.of_id repo id in Views.Repo.commit repo commit let files_at_head req = let repo = Dream.param req "repo" in let* tree = Resolvers.Tree.head repo in Views.Repo.files repo tree let file_id req = let repo = Dream.param req "repo" in let id = Dream.param req "id" in let* res = Resolvers.blob_or_tree repo id in match res with | `Tree tree -> Views.Repo.files repo tree | `Blob blob -> Views.Repo.file repo blob let branches req = let repo = Dream.param req "repo" in let* branches = Resolvers.Reference.branches repo in Views.Repo.branches repo branches let tags req = let repo = Dream.param req "repo" in let* tags = Resolvers.Reference.tags repo in Views.Repo.tags repo tags let readme req = let repo = Dream.param req "repo" in let* readme = Resolvers.Repo.readme repo in match readme with | None -> let content = "README does not exist for " ^ repo in Views.Repo.file repo { content } | Some file -> Views.Repo.file repo file end let all_handlers = let open Dream in [ get "/" root; scope "/:repo" [] Repo. [ get "/" summary; get "/summary/" summary; get "/commits/" commits; get "/commit/:id" commit; get "/files/" files_at_head; get "/file/:id" file_id; get "/branches/" branches; get "/tags/" tags; get "/README" readme; ]; get "/static/**" (static "./lib/static"); ]