args.ml 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. module Report = Qsp_syntax.Report
  2. let input_files = ref []
  3. let usage =
  4. Printf.sprintf "%s input_file" (Filename.basename Sys.executable_name)
  5. let anon_fun filename = input_files := filename :: !input_files
  6. let level_value = ref None
  7. let reset_line = ref false
  8. let interractive = ref true
  9. type filters = { level : Report.level option }
  10. type t = { reset_line : bool; filters : filters; interractive : bool }
  11. (** All the arguments given from the command line *)
  12. let level : string -> unit =
  13. fun str_level ->
  14. match Report.level_of_string str_level with
  15. | Ok level_ -> level_value := Some level_
  16. | Error e ->
  17. print_endline e;
  18. exit 1
  19. let speclist =
  20. let common_arguments =
  21. [
  22. ( "--version",
  23. Arg.Unit
  24. (fun () ->
  25. Printf.printf "Version %s\n" Tools.Git_hash.revision;
  26. exit 0),
  27. "\tDisplay the version of the application and exit" );
  28. ("--level", Arg.String level, "\tMessage level [debug, warn, error]");
  29. ( "--global",
  30. Arg.Set reset_line,
  31. "\tEach line is refered from the begining of the file and not the \
  32. location" );
  33. ]
  34. and windows_arguments =
  35. match Sys.os_type with
  36. | "Win32" ->
  37. [
  38. ( "--no-prompt",
  39. Arg.Clear interractive,
  40. "\tDo not ask the user to press enter after processing the source"
  41. );
  42. ]
  43. | _ ->
  44. interractive := false;
  45. []
  46. in
  47. common_arguments @ windows_arguments
  48. let parse : unit -> string list * t =
  49. fun () ->
  50. let () = Arg.parse (Arg.align speclist) anon_fun usage in
  51. match !input_files with
  52. | [] ->
  53. Arg.usage (Arg.align speclist) usage;
  54. prerr_endline "";
  55. prerr_endline "Error, you should provide at least one file to parse.";
  56. exit 1
  57. | _ ->
  58. let filters = { level = !level_value } in
  59. ( !input_files,
  60. { reset_line = !reset_line; filters; interractive = !interractive } )