From 82f99de39cc346d8dad46fd86c35a0cf2fe5c67d Mon Sep 17 00:00:00 2001 From: Hannes Mehnert Date: Thu, 27 Jan 2022 12:58:01 +0100 Subject: [PATCH] use cmdliner --- app/dune | 2 +- app/main.ml | 91 +++++++++++++++++++++++++++++------------------------ 2 files changed, 51 insertions(+), 42 deletions(-) diff --git a/app/dune b/app/dune index bf82a93..2fe3b23 100644 --- a/app/dune +++ b/app/dune @@ -1,4 +1,4 @@ (executable (name main) (public_name opam_graph) - (libraries cmdliner logs logs.fmt opam-graph)) + (libraries cmdliner logs logs.fmt fmt.cli fmt.tty logs.cli opam-graph)) diff --git a/app/main.ml b/app/main.ml index 2dd5b13..b10ac1e 100644 --- a/app/main.ml +++ b/app/main.ml @@ -11,45 +11,54 @@ let read_file file = invalid_arg ("Error reading file: " ^ file) with _ -> invalid_arg ("Error opening file " ^ file) -let () = - match Sys.argv with - | [| _ ; output_format; file |] -> ( - let switch = read_file file in - let data = OpamFile.SwitchExport.read_from_string switch in - match output_format with - | "text" -> - let graph = Opam_graph.dependencies data in - Format.printf "%a" Opam_graph.pp_graph graph - | "text_transitive" -> - let graph = Opam_graph.dependencies ~transitive:true data in - Format.printf "%a" Opam_graph.pp_graph graph - | "dot" -> - let graph = Opam_graph.dependencies data in - let dot = Opam_graph.Render.Dot.of_graph graph in - Format.printf "%a" Opam_graph.Render.Dot.pp dot - | "dot_ui" -> - let transitive = false in - let graph = Opam_graph.Ui.dependencies ~transitive data in - let dot = Opam_graph.Render.Dot.of_assoc graph in - Format.printf "%a" Opam_graph.Render.Dot.pp dot - | "dot_ui_transitive" -> - let transitive = true in - let graph = Opam_graph.Ui.dependencies ~transitive data in - let dot = Opam_graph.Render.Dot.of_assoc graph in - Format.printf "%a" Opam_graph.Render.Dot.pp dot - | "html_ui" -> - let transitive = false in - let graph = Opam_graph.Ui.dependencies ~transitive data in - let html = Opam_graph.Render.Html.of_assoc graph in - Format.printf "%a" Opam_graph.Render.Html.pp html - | "html_ui_transitive" -> - let transitive = true in - let graph = Opam_graph.Ui.dependencies ~transitive data in - let html = Opam_graph.Render.Html.of_assoc graph in - Format.printf "%a" Opam_graph.Render.Html.pp html - | _ -> failwith "Unsupported output format" - ) - | _ -> - print_endline "expecting exactly one argument"; - exit 1 +let jump () transitive file output_format = + let switch = read_file file in + let data = OpamFile.SwitchExport.read_from_string switch in + match output_format with + | `Text -> + let graph = Opam_graph.dependencies ~transitive data in + Format.printf "%a" Opam_graph.pp_graph graph + | `Dot -> + let graph = Opam_graph.dependencies ~transitive data in + let dot = Opam_graph.Render.Dot.of_graph graph in + Format.printf "%a" Opam_graph.Render.Dot.pp dot + | `Dot_ui -> + let graph = Opam_graph.Ui.dependencies ~transitive data in + let dot = Opam_graph.Render.Dot.of_assoc graph in + Format.printf "%a" Opam_graph.Render.Dot.pp dot + | `Html -> + let graph = Opam_graph.Ui.dependencies ~transitive data in + let html = Opam_graph.Render.Html.of_assoc graph in + Format.printf "%a" Opam_graph.Render.Html.pp html +let setup_log style_renderer level = + Fmt_tty.setup_std_outputs ?style_renderer (); + Logs.set_level level; + Logs.set_reporter (Logs_fmt.reporter ~dst:Format.std_formatter ()) + +open Cmdliner + +let setup_log = + Term.(const setup_log + $ Fmt_cli.style_renderer () + $ Logs_cli.level ()) + +let transitive = + let doc = "Transitive dependencies" in + Arg.(value & flag & info [ "transitive" ] ~doc) + +let formats = [ "html", `Html ; "dot", `Dot ; "dot-ui", `Dot_ui ; "text", `Text ] + +let output_format = + let doc = "Output format" in + Arg.(value & opt (Arg.enum formats) `Text & info [ "output-format" ] ~doc) + +let file = + let doc = "The opam switch export to graph" in + Arg.(required & pos 0 (some file) None & info [ ] ~doc ~docv:"FILE") + +let cmd = + Term.(const jump $ setup_log $ transitive $ file $ output_format), + Term.info "opam_graph" ~version:"%%VERSION%%" + +let () = match Term.eval cmd with `Ok () -> exit 0 | _ -> exit 1