35 lines
889 B
OCaml
35 lines
889 B
OCaml
|
|
open Import
|
||
|
|
|
||
|
|
type t =
|
||
|
|
| Sexp
|
||
|
|
| Csexp
|
||
|
|
|
||
|
|
let all = [ "sexp", Sexp; "csexp", Csexp ]
|
||
|
|
|
||
|
|
let arg =
|
||
|
|
let doc = Printf.sprintf "$(docv) must be %s" (Arg.doc_alts_enum all) in
|
||
|
|
Arg.(value & opt (enum all) Sexp & info [ "format" ] ~docv:"FORMAT" ~doc)
|
||
|
|
;;
|
||
|
|
|
||
|
|
let print_as_sexp dyn =
|
||
|
|
let rec dune_lang_of_sexp : Sexp.t -> Dune_lang.t = function
|
||
|
|
| Atom s -> Dune_lang.atom_or_quoted_string s
|
||
|
|
| List l -> List (List.map l ~f:dune_lang_of_sexp)
|
||
|
|
in
|
||
|
|
let cst =
|
||
|
|
dyn
|
||
|
|
|> Sexp.of_dyn
|
||
|
|
|> dune_lang_of_sexp
|
||
|
|
|> Dune_lang.Ast.add_loc ~loc:Loc.none
|
||
|
|
|> Dune_lang.Cst.concrete
|
||
|
|
in
|
||
|
|
let version = Dune_lang.Syntax.greatest_supported_version_exn Stanza.syntax in
|
||
|
|
Pp.to_fmt Stdlib.Format.std_formatter (Dune_lang.Format.pp_top_sexps ~version [ cst ])
|
||
|
|
;;
|
||
|
|
|
||
|
|
let print_dyn t dyn =
|
||
|
|
match t with
|
||
|
|
| Csexp -> Csexp.to_channel stdout (Sexp.of_dyn dyn)
|
||
|
|
| Sexp -> print_as_sexp dyn
|
||
|
|
;;
|