File: main.ml

package info (click to toggle)
ocaml-odoc 3.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 14,008 kB
  • sloc: ml: 60,567; javascript: 2,572; sh: 566; makefile: 31
file content (83 lines) | stat: -rw-r--r-- 2,586 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
let guess_db_format db_format db_filename =
  match db_format with
  | Some db_format -> db_format
  | None -> begin
      let ext = Filename.extension db_filename in
      let ext_len = String.length ext in
      let ext = if ext_len = 0 then ext else String.sub ext 1 (ext_len - 1) in
      try List.assoc ext Db_store.available_backends with
      | Not_found ->
          Format.fprintf
            Format.err_formatter
            "Unknown db format extension %S (expected: %s)@."
            ext
            (String.concat ", " @@ List.map fst Db_store.available_backends) ;
          exit 1
    end

open Cmdliner

let db_format =
  let env =
    let doc = "Database format" in
    Cmd.Env.info "SHERLODOC_FORMAT" ~doc
  in
  let kind = Arg.enum Db_store.available_backends in
  Arg.(value & opt (some kind) None & info [ "format" ] ~docv:"DB_FORMAT" ~env)

let db_filename =
  let env =
    let doc = "The database to query" in
    Cmd.Env.info "SHERLODOC_DB" ~doc
  in
  Arg.(required & opt (some string) None & info [ "db"; "o" ] ~docv:"DB" ~env)

let db_path =
  let env =
    let doc = "The database to query" in
    Cmd.Env.info "SHERLODOC_DB" ~doc
  in
  Arg.(required & opt (some file) None & info [ "db" ] ~docv:"DB" ~env)

let with_db fn db_path =
  let apply fn db_format db_filename =
    let db_format = guess_db_format db_format db_filename in
    fn db_format db_filename
  in
  Term.(const apply $ fn $ db_format $ db_path)

let cmd_search =
  let info = Cmd.info "search" ~doc:"Command-line search" in
  Cmd.v info (with_db Search.term db_path)

let cmd_index =
  let doc = "Index odocl files to create a Sherlodoc database" in
  let info = Cmd.info "index" ~doc in
  Cmd.v info (with_db Index.term db_filename)

let cmd_serve =
  let doc = "Webserver interface" in
  let info = Cmd.info "serve" ~doc in
  Cmd.v info (with_db Serve.term db_path)

let cmd_jsoo =
  let doc = "For dune/odoc integration, sherlodoc compiled as javascript" in
  let info = Cmd.info "js" ~doc in
  let target =
    let doc = "Name of the file to create" in
    Arg.(value & pos 0 string "" & info [] ~docv:"QUERY" ~doc)
  in
  let emit_js_dep filename =
    let close, h = if filename = "" then false, stdout else true, open_out filename in
    output_string h [%blob "../jsoo/sherlodoc.js"] ;
    if close then close_out h
  in
  Cmd.v info Term.(const emit_js_dep $ target)

let cmd =
  let doc = "Sherlodoc" in
  let version = "0.2" in
  let info = Cmd.info "sherlodoc" ~version ~doc in
  Cmd.group info [ cmd_search; cmd_index; cmd_serve; cmd_jsoo ]

let () = exit (Cmd.eval cmd)