This commit is contained in:
parent
aa2ff7b2f0
commit
2f3113f55d
11742 changed files with 1223940 additions and 0 deletions
57
unikernel/duniverse/dune_/bin/format_dune_file.ml
Normal file
57
unikernel/duniverse/dune_/bin/format_dune_file.ml
Normal file
|
|
@ -0,0 +1,57 @@
|
|||
open Import
|
||||
|
||||
let doc = "Format dune files."
|
||||
|
||||
let man =
|
||||
[ `S "DESCRIPTION"
|
||||
; `P
|
||||
{|$(b,dune format-dune-file) reads a dune file and outputs a formatted
|
||||
version. This is a low-level command, meant to implement editor
|
||||
support for example. To reformat a dune project, see the "Automatic
|
||||
formatting" section in the manual.|}
|
||||
]
|
||||
;;
|
||||
|
||||
let info = Cmd.info "format-dune-file" ~doc ~man
|
||||
|
||||
let format_file ~version ~input =
|
||||
let with_input =
|
||||
match input with
|
||||
| Some path -> fun f -> Io.with_lexbuf_from_file path ~f
|
||||
| None ->
|
||||
fun f ->
|
||||
Exn.protect
|
||||
~f:(fun () -> f (Lexing.from_channel stdin))
|
||||
~finally:(fun () -> close_in_noerr stdin)
|
||||
in
|
||||
match with_input Dune_lang.Format.parse with
|
||||
| Sexps sexps ->
|
||||
Format.fprintf
|
||||
Format.std_formatter
|
||||
"%a%!"
|
||||
Pp.to_fmt
|
||||
(Dune_lang.Format.pp_top_sexps ~version sexps)
|
||||
| OCaml_syntax loc ->
|
||||
(match input with
|
||||
| None -> User_error.raise ~loc [ Pp.text "OCaml syntax is not supported." ]
|
||||
| Some path -> Io.with_file_in path ~f:(fun ic -> Io.copy_channels ic stdout))
|
||||
;;
|
||||
|
||||
let term =
|
||||
let+ path_opt =
|
||||
let docv = "FILE" in
|
||||
let doc = "Path to the dune file to parse." in
|
||||
Arg.(value & pos 0 (some path) None & info [] ~docv ~doc)
|
||||
and+ version =
|
||||
let docv = "VERSION" in
|
||||
let doc = "Which version of Dune language to use." in
|
||||
let default =
|
||||
Dune_lang.Syntax.greatest_supported_version_exn Dune_lang.Stanza.syntax
|
||||
in
|
||||
Arg.(value & opt version default & info [ "dune-version" ] ~docv ~doc)
|
||||
in
|
||||
let input = Option.map ~f:Arg.Path.path path_opt in
|
||||
format_file ~version ~input
|
||||
;;
|
||||
|
||||
let command = Cmd.v info term
|
||||
Loading…
Add table
Add a link
Reference in a new issue