messages.ml 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. (******************************************************************************)
  2. (* Copyright © Joly Clément, 2014-2015-2016 *)
  3. (* *)
  4. (* leowzukw@vmail.me *)
  5. (* *)
  6. (* Ce logiciel est un programme informatique servant à exécuter *)
  7. (* automatiquement des programmes à l'ouverture du terminal. *)
  8. (* *)
  9. (* Ce logiciel est régi par la licence CeCILL soumise au droit français et *)
  10. (* respectant les principes de diffusion des logiciels libres. Vous pouvez *)
  11. (* utiliser, modifier et/ou redistribuer ce programme sous les conditions *)
  12. (* de la licence CeCILL telle que diffusée par le CEA, le CNRS et l'INRIA *)
  13. (* sur le site "http://www.cecill.info". *)
  14. (* *)
  15. (* En contrepartie de l'accessibilité au code source et des droits de copie, *)
  16. (* de modification et de redistribution accordés par cette licence, il n'est *)
  17. (* offert aux utilisateurs qu'une garantie limitée. Pour les mêmes raisons, *)
  18. (* seule une responsabilité restreinte pèse sur l'auteur du programme, le *)
  19. (* titulaire des droits patrimoniaux et les concédants successifs. *)
  20. (* *)
  21. (* A cet égard l'attention de l'utilisateur est attirée sur les risques *)
  22. (* associés au chargement, à l'utilisation, à la modification et/ou au *)
  23. (* développement et à la reproduction du logiciel par l'utilisateur étant *)
  24. (* donné sa spécificité de logiciel libre, qui peut le rendre complexe à *)
  25. (* manipuler et qui le réserve donc à des développeurs et des professionnels *)
  26. (* avertis possédant des connaissances informatiques approfondies. Les *)
  27. (* utilisateurs sont donc invités à charger et tester l'adéquation du *)
  28. (* logiciel à leurs besoins dans des conditions permettant d'assurer la *)
  29. (* sécurité de leurs systèmes et ou de leurs données et, plus généralement, *)
  30. (* à l'utiliser et l'exploiter dans les mêmes conditions de sécurité. *)
  31. (* *)
  32. (* Le fait que vous puissiez accéder à cet en-tête signifie que vous avez *)
  33. (* pris connaissance de la licence CeCILL, et que vous en avez accepté les *)
  34. (* termes. *)
  35. (******************************************************************************)
  36. open Core.Std;;
  37. (* Modules to manage output messages, with color *)
  38. (* TODO
  39. * - allow to display bold & underlined messages *)
  40. (* Store whether a message was already displayed to reset if necessary (see
  41. * function reset) *)
  42. let already = ref false
  43. (* Function to keep a trace of colored messages *)
  44. let log_already () =
  45. match !already with
  46. | false -> already := true
  47. | true -> ()
  48. ;;
  49. (* Types corresponding to some colors & style of the Core_extended.Color_print
  50. * library *)
  51. type color =
  52. | Green
  53. | Red
  54. | Yellow
  55. | White
  56. | Plum
  57. | Cyan
  58. ;;
  59. type style =
  60. | Bold
  61. | Underline
  62. | Normal
  63. ;;
  64. (* General function to print things *)
  65. let print ~color ~style message =
  66. (* Alias *)
  67. let cpcolor = Color_print.color in
  68. match !Const.no_color with
  69. | true -> printf "%s" message
  70. | false -> begin (* Use colors *)
  71. (* Log that we used colored messages *)
  72. log_already ();
  73. (* This code create proper escapement to display text with bold/color... *)
  74. color |>
  75. (function
  76. | Green -> cpcolor ~color:`Green message
  77. | Red -> cpcolor ~color:`Red message
  78. | Yellow -> cpcolor ~color:`Yellow message
  79. | White -> cpcolor ~color:`White message
  80. | Plum -> cpcolor ~color:`Plum message
  81. | Cyan -> cpcolor ~color:`Cyan message
  82. ) |> (* Finaly print escaped string *)
  83. (fun colored_msg ->
  84. let open Color_print in
  85. match style with
  86. | Bold -> bold_printf "%s" colored_msg
  87. | Underline -> underline_printf "%s" colored_msg
  88. | Normal -> printf "%s" colored_msg
  89. )
  90. end
  91. ;;
  92. (* Behave in a conform way to verbosity
  93. * The higher is the number, the more important the message is, the lower
  94. * verbosity value display it *)
  95. let check_verbosity ~f function_number =
  96. match function_number <= !Const.verbosity with
  97. true -> (* Display the message *)
  98. f ()
  99. | false -> ()
  100. ;;
  101. (* Print debugging, information, important... messages *)
  102. let debug message =
  103. check_verbosity ~f:(fun () ->
  104. let mess = (Time.now() |> Time.to_string) ^ " " ^ message ^ "\n" in
  105. print ~color:Plum ~style:Underline mess
  106. ) 5
  107. ;;
  108. let info message =
  109. check_verbosity ~f:(fun () ->
  110. let mess = message ^ "\n" in
  111. print ~color:White ~style:Normal mess
  112. ) 3
  113. ;;
  114. let warning message =
  115. check_verbosity ~f:(fun () ->
  116. let mess = message ^ "\n" in
  117. print ~color:Red ~style:Bold mess
  118. ) 1
  119. ;;
  120. (* Type for the answers *)
  121. type answer = Yes | No;;
  122. (* Usefull to display result *)
  123. let answer2str = function
  124. Yes -> "Yes" | No -> "No"
  125. ;;
  126. (* State of the program, if you should always answer yes, no or ask to the user
  127. * (default)*)
  128. (* TODO Put it in Const *)
  129. let assume_yes = None;;
  130. (* Allow to assume yes or no like with a --yes option *)
  131. let check_assume_yes ~f =
  132. match assume_yes with
  133. | Some true -> Yes (* --yes *)
  134. | Some false -> No (* --no *)
  135. | None -> f ()
  136. ;;
  137. (* Get confirmation
  138. * TODO:
  139. * allow option like -y
  140. * test it (display, line return, etc...) *)
  141. let rec confirm info =
  142. check_assume_yes ~f:(fun () ->
  143. print ~color:Cyan ~style:Normal info;
  144. print ~color:Cyan ~style:Normal "\n(Yes/No): ";
  145. (* XXX Be sure to show the message *)
  146. Out_channel.(flush stdout);
  147. let str_answer = In_channel.(input_line ~fix_win_eol:true stdin) in
  148. str_answer |> (function
  149. | Some "Y" | Some "y" | Some "Yes" | Some "YES" | Some "yes" -> Yes
  150. | Some "N" | Some "n" | Some "No" | Some "NO" | Some "no" -> No
  151. | Some _ | None ->
  152. warning "Please enter 'yes' or 'no' or 'y' or 'n'.";
  153. confirm info)
  154. )
  155. ;;
  156. let ok message =
  157. check_verbosity ~f:(fun () ->
  158. let mess = message ^ "\n" in
  159. print ~color:Green ~style:Bold mess
  160. ) 2
  161. ;;
  162. let tips message =
  163. check_verbosity ~f:(fun () ->
  164. let mess = message ^ "\n" in
  165. print ~color:Yellow ~style:Normal mess
  166. ) 4
  167. ;;
  168. (* Reset printing, to avoid color problem on some terminal (Konsole), the *)
  169. let reset () =
  170. let open Color_print in
  171. match !already with
  172. | true -> debug "Reseted colors";
  173. normal "" |> printf "%s\n"
  174. | false -> debug "Not resetted"; ()
  175. ;;