Browse Source

Clean up Messages code

 + Remove file copied from Core_extended, use Textutils functions instead.
 + Make colors a bit softer.
 + May be problem like issue #4.
Leo 8 years ago
parent
commit
7c96c01982

+ 1 - 2
CHANGELOG.md

@@ -68,8 +68,7 @@ This version introduce major changes in the tmp and rc file.
  + Add licence warning.
  + Improve help messages, by rewriting some and display it in a more subtle way
    according to the current internal state.
- + Remove core\_extended dependency, incorporating some code from the library
-   directly in the program, and using Textutils and Re2 library instead.
+ + Remove core\_extended dependency, using Textutils and Re2 library instead.
  + Display debugging information before each message. Flush stdout on each
    message.
  + Some subcommand, such as `run`, take list of ids instead of only one.

+ 0 - 1
src/color_print.ml

@@ -1 +0,0 @@
-third-part/core_extended/color_print.ml

+ 13 - 53
src/messages.ml

@@ -41,6 +41,8 @@ open Core.Std;;
 (* TODO
  * - allow to display bold & underlined messages *)
 
+module A = Textutils.Console.Ansi;;
+
 (* Store whether a message was already displayed to reset if necessary (see
  * function reset) *)
 let already = ref false
@@ -52,55 +54,14 @@ let log_already () =
   | true -> ()
 ;;
 
-(* Types corresponding to some colors & style of the Core_extended.Color_print
- * library *)
-type color =
-  | Green
-  | Red
-  | Dark_red
-  | Yellow
-  | Amber
-  | White
-  | Gray
-  | Plum
-  | Cyan
-;;
-
-type style =
-  | Bold
-  | Underline
-  | Normal
-;;
-
-(* General function to print things *)
-let print ~color ~style message =
-  (* Alias *)
-  let cpcolor = Color_print.color in
+(* Pack around Textutils.Console.Ansi to print things *)
+let print attr message =
   match !Const.no_color with
   | true -> printf "%s" message
   | false -> begin (* Use colors *)
       (* Log that we used colored messages *)
       log_already ();
-      (* This code create proper escapement to display text with bold/color... *)
-      color |>
-      (function
-        | Green -> cpcolor ~color:`Green message
-        | Red -> cpcolor ~color:`Red message
-        | Dark_red -> cpcolor ~color:`Dark_red message
-        | Yellow -> cpcolor ~color:`Yellow message
-        | Amber -> cpcolor ~color:`Amber message
-        | White -> cpcolor ~color:`White message
-        | Gray -> cpcolor ~color:`Gray message
-        | Plum -> cpcolor ~color:`Plum message
-        | Cyan -> cpcolor ~color:`Cyan message
-      ) |> (* Finaly print escaped string *)
-      (fun colored_msg ->
-         let open Color_print in
-         match style with
-         | Bold -> bold_printf "%s" colored_msg
-         | Underline -> underline_printf "%s" colored_msg
-         | Normal -> printf "%s" colored_msg
-      )
+      A.printf attr "%s" message
     end;
     (* Be sure to show the message *)
     Out_channel.(flush stdout);
@@ -127,21 +88,21 @@ let check_verbosity ?debug ~f function_number =
 let debug message =
   check_verbosity ~f:(fun () ->
          let mess = (Time.now() |> Time.to_string) ^ " " ^ message ^ "\n" in
-         print ~color:Plum ~style:Underline mess
+         print [ `Magenta ; `Bright ; `Underscore ] mess
        ) 5
 ;;
 
 let info message =
   check_verbosity ~debug ~f:(fun () ->
          let mess = message ^ "\n" in
-         print ~color:Gray ~style:Bold mess
+         print [ `White ; `Bright ] mess
        ) 3
 ;;
 
 let warning message =
   check_verbosity ~debug ~f:(fun () ->
          let mess = message ^ "\n" in
-         print ~color:Dark_red ~style:Bold mess
+         print [ `Red ] mess
        ) 1
 ;;
 
@@ -166,8 +127,8 @@ let check_assume_yes ~f =
  * test it (display, line return, etc...) *)
 let rec confirm info =
   check_assume_yes ~f:(fun () ->
-         print ~color:Cyan ~style:Normal info;
-         print ~color:Cyan ~style:Normal "\n(Yes/No): ";
+         print [ `Cyan ; `Bright ] info;
+         print [ `Cyan ; `Bright ] "\n(Yes/No): ";
          let str_answer = In_channel.(input_line ~fix_win_eol:true stdin) in
          str_answer |> Option.map ~f:String.lowercase
          |> (function
@@ -183,23 +144,22 @@ let rec confirm info =
 let ok message =
   check_verbosity ~debug ~f:(fun () ->
          let mess = message ^ "\n" in
-         print ~color:Green ~style:Bold mess
+         print [ `Green ; `Bright ] mess
        ) 2
 ;;
 
 let tips message =
   check_verbosity ~debug ~f:(fun () ->
          let mess = message ^ "\n" in
-         print ~color:Amber ~style:Normal mess
+         print [ `Yellow ] mess
        ) 4
 ;;
 
 
 (* Reset printing, to avoid color problem on some terminal (Konsole), the  *)
 let reset () =
-  let open Color_print in
   match !already with
   | true -> debug "Reseted colors";
-    normal "" |> printf "%s\n"
+    A.printf [] "\n"
   | false -> debug "Not resetted"; ()
 ;;

+ 0 - 13
src/third-part/core_extended/INRIA-DISCLAIMER.txt

@@ -1,13 +0,0 @@
-THIS SOFTWARE IS PROVIDED BY INRIA AND CONTRIBUTORS "AS IS" AND ANY
-EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
-IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
-PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL INRIA OR ITS CONTRIBUTORS BE
-LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
-CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
-SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
-BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
-WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
-OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
-IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-

+ 0 - 203
src/third-part/core_extended/LICENSE.txt

@@ -1,203 +0,0 @@
-
-                                 Apache License
-                           Version 2.0, January 2004
-                        http://www.apache.org/licenses/
-
-   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
-
-   1. Definitions.
-
-      "License" shall mean the terms and conditions for use, reproduction,
-      and distribution as defined by Sections 1 through 9 of this document.
-
-      "Licensor" shall mean the copyright owner or entity authorized by
-      the copyright owner that is granting the License.
-
-      "Legal Entity" shall mean the union of the acting entity and all
-      other entities that control, are controlled by, or are under common
-      control with that entity. For the purposes of this definition,
-      "control" means (i) the power, direct or indirect, to cause the
-      direction or management of such entity, whether by contract or
-      otherwise, or (ii) ownership of fifty percent (50%) or more of the
-      outstanding shares, or (iii) beneficial ownership of such entity.
-
-      "You" (or "Your") shall mean an individual or Legal Entity
-      exercising permissions granted by this License.
-
-      "Source" form shall mean the preferred form for making modifications,
-      including but not limited to software source code, documentation
-      source, and configuration files.
-
-      "Object" form shall mean any form resulting from mechanical
-      transformation or translation of a Source form, including but
-      not limited to compiled object code, generated documentation,
-      and conversions to other media types.
-
-      "Work" shall mean the work of authorship, whether in Source or
-      Object form, made available under the License, as indicated by a
-      copyright notice that is included in or attached to the work
-      (an example is provided in the Appendix below).
-
-      "Derivative Works" shall mean any work, whether in Source or Object
-      form, that is based on (or derived from) the Work and for which the
-      editorial revisions, annotations, elaborations, or other modifications
-      represent, as a whole, an original work of authorship. For the purposes
-      of this License, Derivative Works shall not include works that remain
-      separable from, or merely link (or bind by name) to the interfaces of,
-      the Work and Derivative Works thereof.
-
-      "Contribution" shall mean any work of authorship, including
-      the original version of the Work and any modifications or additions
-      to that Work or Derivative Works thereof, that is intentionally
-      submitted to Licensor for inclusion in the Work by the copyright owner
-      or by an individual or Legal Entity authorized to submit on behalf of
-      the copyright owner. For the purposes of this definition, "submitted"
-      means any form of electronic, verbal, or written communication sent
-      to the Licensor or its representatives, including but not limited to
-      communication on electronic mailing lists, source code control systems,
-      and issue tracking systems that are managed by, or on behalf of, the
-      Licensor for the purpose of discussing and improving the Work, but
-      excluding communication that is conspicuously marked or otherwise
-      designated in writing by the copyright owner as "Not a Contribution."
-
-      "Contributor" shall mean Licensor and any individual or Legal Entity
-      on behalf of whom a Contribution has been received by Licensor and
-      subsequently incorporated within the Work.
-
-   2. Grant of Copyright License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      copyright license to reproduce, prepare Derivative Works of,
-      publicly display, publicly perform, sublicense, and distribute the
-      Work and such Derivative Works in Source or Object form.
-
-   3. Grant of Patent License. Subject to the terms and conditions of
-      this License, each Contributor hereby grants to You a perpetual,
-      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
-      (except as stated in this section) patent license to make, have made,
-      use, offer to sell, sell, import, and otherwise transfer the Work,
-      where such license applies only to those patent claims licensable
-      by such Contributor that are necessarily infringed by their
-      Contribution(s) alone or by combination of their Contribution(s)
-      with the Work to which such Contribution(s) was submitted. If You
-      institute patent litigation against any entity (including a
-      cross-claim or counterclaim in a lawsuit) alleging that the Work
-      or a Contribution incorporated within the Work constitutes direct
-      or contributory patent infringement, then any patent licenses
-      granted to You under this License for that Work shall terminate
-      as of the date such litigation is filed.
-
-   4. Redistribution. You may reproduce and distribute copies of the
-      Work or Derivative Works thereof in any medium, with or without
-      modifications, and in Source or Object form, provided that You
-      meet the following conditions:
-
-      (a) You must give any other recipients of the Work or
-          Derivative Works a copy of this License; and
-
-      (b) You must cause any modified files to carry prominent notices
-          stating that You changed the files; and
-
-      (c) You must retain, in the Source form of any Derivative Works
-          that You distribute, all copyright, patent, trademark, and
-          attribution notices from the Source form of the Work,
-          excluding those notices that do not pertain to any part of
-          the Derivative Works; and
-
-      (d) If the Work includes a "NOTICE" text file as part of its
-          distribution, then any Derivative Works that You distribute must
-          include a readable copy of the attribution notices contained
-          within such NOTICE file, excluding those notices that do not
-          pertain to any part of the Derivative Works, in at least one
-          of the following places: within a NOTICE text file distributed
-          as part of the Derivative Works; within the Source form or
-          documentation, if provided along with the Derivative Works; or,
-          within a display generated by the Derivative Works, if and
-          wherever such third-party notices normally appear. The contents
-          of the NOTICE file are for informational purposes only and
-          do not modify the License. You may add Your own attribution
-          notices within Derivative Works that You distribute, alongside
-          or as an addendum to the NOTICE text from the Work, provided
-          that such additional attribution notices cannot be construed
-          as modifying the License.
-
-      You may add Your own copyright statement to Your modifications and
-      may provide additional or different license terms and conditions
-      for use, reproduction, or distribution of Your modifications, or
-      for any such Derivative Works as a whole, provided Your use,
-      reproduction, and distribution of the Work otherwise complies with
-      the conditions stated in this License.
-
-   5. Submission of Contributions. Unless You explicitly state otherwise,
-      any Contribution intentionally submitted for inclusion in the Work
-      by You to the Licensor shall be under the terms and conditions of
-      this License, without any additional terms or conditions.
-      Notwithstanding the above, nothing herein shall supersede or modify
-      the terms of any separate license agreement you may have executed
-      with Licensor regarding such Contributions.
-
-   6. Trademarks. This License does not grant permission to use the trade
-      names, trademarks, service marks, or product names of the Licensor,
-      except as required for reasonable and customary use in describing the
-      origin of the Work and reproducing the content of the NOTICE file.
-
-   7. Disclaimer of Warranty. Unless required by applicable law or
-      agreed to in writing, Licensor provides the Work (and each
-      Contributor provides its Contributions) on an "AS IS" BASIS,
-      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
-      implied, including, without limitation, any warranties or conditions
-      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
-      PARTICULAR PURPOSE. You are solely responsible for determining the
-      appropriateness of using or redistributing the Work and assume any
-      risks associated with Your exercise of permissions under this License.
-
-   8. Limitation of Liability. In no event and under no legal theory,
-      whether in tort (including negligence), contract, or otherwise,
-      unless required by applicable law (such as deliberate and grossly
-      negligent acts) or agreed to in writing, shall any Contributor be
-      liable to You for damages, including any direct, indirect, special,
-      incidental, or consequential damages of any character arising as a
-      result of this License or out of the use or inability to use the
-      Work (including but not limited to damages for loss of goodwill,
-      work stoppage, computer failure or malfunction, or any and all
-      other commercial damages or losses), even if such Contributor
-      has been advised of the possibility of such damages.
-
-   9. Accepting Warranty or Additional Liability. While redistributing
-      the Work or Derivative Works thereof, You may choose to offer,
-      and charge a fee for, acceptance of support, warranty, indemnity,
-      or other liability obligations and/or rights consistent with this
-      License. However, in accepting such obligations, You may act only
-      on Your own behalf and on Your sole responsibility, not on behalf
-      of any other Contributor, and only if You agree to indemnify,
-      defend, and hold each Contributor harmless for any liability
-      incurred by, or claims asserted against, such Contributor by reason
-      of your accepting any such warranty or additional liability.
-
-   END OF TERMS AND CONDITIONS
-
-   APPENDIX: How to apply the Apache License to your work.
-
-      To apply the Apache License to your work, attach the following
-      boilerplate notice, with the fields enclosed by brackets "[]"
-      replaced with your own identifying information. (Don't include
-      the brackets!)  The text should be enclosed in the appropriate
-      comment syntax for the file format. We also recommend that a
-      file or class name and description of purpose be included on the
-      same "printed page" as the copyright notice for easier
-      identification within third-party archives.
-
-   Copyright [yyyy] [name of copyright owner]
-
-   Licensed under the Apache License, Version 2.0 (the "License");
-   you may not use this file except in compliance with the License.
-   You may obtain a copy of the License at
-
-       http://www.apache.org/licenses/LICENSE-2.0
-
-   Unless required by applicable law or agreed to in writing, software
-   distributed under the License is distributed on an "AS IS" BASIS,
-   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-   See the License for the specific language governing permissions and
-   limitations under the License.
-

+ 0 - 15
src/third-part/core_extended/README

@@ -1,15 +0,0 @@
-Files in this directory are based on the file with the same name of the
-Core_extended library, published under Apache-2.0 as follow:
-
-(C) 2008-2016 Jane Street Group LLC <opensource@janestreet.com>
-Apache-2.0
-
-You may find a copy of the Apache licence in the LICENSE.txt file in this
-folder. The THIRD-PARTY.txt, LICENSE.txt (in this folder) and
-INRIA-DISCLAIMER.txt have been reproduced as they were in commit
-987a5b7994104e6cb41867bb4775ac970fb64830.
-
-The file color_print.ml is as it was in commit
-7351d453b3a7a8d2c77fdff817f19ebf1df1400d. It is symbolic linked in src/ folder,
-for convenience.
-

+ 0 - 19
src/third-part/core_extended/THIRD-PARTY.txt

@@ -1,19 +0,0 @@
-The repository contains 3rd-party code in the following locations and
-under the following licenses:
-
-- type_conv, sexplib and bin_prot: based on Tywith, by Martin
-  Sandin.  License can be found in base/sexplib/LICENSE-Tywith.txt,
-  base/type_conv/LICENSE-Tywith.txt, and base/bin_prot/LICENSE-Tywith.txt.
-
-- Core's implementation of union-find: based on an implementation by
-  Henry Matthew Fluet, Suresh Jagannathan, and Stephen Weeks. License
-  can be found in base/core/MLton-license.
-
-- Various Core libraries are based on INRIA's OCaml
-  distribution. Relicensed under Apache 2.0, as permitted under the
-  Caml License for Consortium members:
-
-     http://caml.inria.fr/consortium/license.en.html
-
-  See also the disclaimer INRIA-DISCLAIMER.txt.
-

+ 0 - 136
src/third-part/core_extended/color_print.ml

@@ -1,136 +0,0 @@
-(* Copyright Jane Street Group, LLC 2012- 2016 *)
-open Core.Std
-
-let ansi_regexp = Memo.unit (fun () -> Re2.Std.Re2.create_exn "\027\\[.*?m")
-
-let ansi_capture_regexp = Memo.unit (fun () -> Re2.Std.Re2.create_exn "(\027\\[.*?m)")
-let normal_capture_regexp = Memo.unit (fun () -> Re2.Std.Re2.create_exn "(\027\\[0m)")
-
-let normal str =
-  Re2.Std.Re2.rewrite_exn (ansi_regexp ()) ~template:"" str
-
-let add_after_ansi str ~code =
-  Re2.Std.Re2.rewrite_exn (ansi_capture_regexp ()) ~template:("\\1" ^ code) str
-let add_after_normal str ~code =
-  Re2.Std.Re2.rewrite_exn (normal_capture_regexp ()) ~template:("\\1" ^ code) str
-
-let ansi_code ~code = "\027[" ^ code ^ "m"
-
-let normal_code    = ansi_code ~code:"0"
-let bold_code      = ansi_code ~code:"1"
-let underline_code = ansi_code ~code:"4"
-let red_code       = ansi_code ~code:"31"
-let green_code     = ansi_code ~code:"32"
-let yellow_code    = ansi_code ~code:"33"
-let blue_code      = ansi_code ~code:"34"
-let magenta_code   = ansi_code ~code:"35"
-let cyan_code      = ansi_code ~code:"36"
-let inverse_code   = ansi_code ~code:"7"
-
-let float_to_int x ~max =
-    if x <= 0. then 0
-    else if x >= 1. then max
-    else Float.iround_exn ~dir:`Nearest (x *. Float.of_int max)
-
-let gray_code ~brightness =
-  let brightness = float_to_int brightness ~max:23 in
-  ansi_code ~code:("38;5;" ^ Int.to_string (brightness + 232))
-let rgbint_code ~r ~g ~b =
-  ansi_code ~code:("38;5;" ^ Int.to_string (16 + r*36 + g*6 + b))
-let rgb_code ~r ~g ~b =
-  let r = float_to_int r ~max:5 in
-  let g = float_to_int g ~max:5 in
-  let b = float_to_int b ~max:5 in
-  rgbint_code ~r ~g ~b
-
-type color = [
-| `Black | `Gray | `Light_gray | `White
-| `Dark_red | `Red | `Pink | `Light_pink
-| `Orange | `Amber
-| `Dark_yellow | `Gold | `Yellow | `Khaki | `Wheat
-| `Chartreuse | `Green_yellow
-| `Dark_green | `Green | `Light_green | `Bright_green
-| `Spring_green | `Medium_spring_green
-| `Dark_cyan | `Sea_green | `Cyan | `Turquoise | `Pale_turquoise
-| `Dodger_blue | `Deep_sky_blue
-| `Dark_blue | `Blue | `Light_slate_blue | `Light_steel_blue
-| `Blue_violet | `Violet
-| `Dark_magenta | `Purple | `Magenta | `Orchid | `Plum
-| `Rose | `Deep_pink
-] [@@deriving sexp, bin_io]
-
-let color_code ~(color:color) =
-  let (r,g,b) =
-    match (color:color) with
-    | `Black -> (0,0,0) | `Gray -> (2,2,2) | `Light_gray -> (3,3,3) | `White -> (5,5,5)
-    | `Dark_red -> (2,0,0) | `Red -> (5,0,0) | `Pink -> (5,2,2) | `Light_pink -> (5,3,3)
-    | `Orange -> (5,2,0) | `Amber -> (5,3,0)
-    | `Dark_yellow -> (2,2,0) | `Gold -> (3,3,0) | `Yellow -> (5,5,0) | `Khaki -> (5,5,2) | `Wheat -> (5,5,3)
-    | `Chartreuse -> (2,5,0) | `Green_yellow -> (3,5,0)
-    | `Dark_green -> (0,2,0) | `Green -> (0,5,0) | `Light_green -> (2,5,2) | `Bright_green -> (3,5,3)
-    | `Spring_green -> (0,5,2) | `Medium_spring_green -> (0,5,3)
-    | `Dark_cyan -> (0,2,2) | `Sea_green -> (0,3,3) | `Cyan -> (0,5,5) | `Turquoise -> (2,5,5) | `Pale_turquoise -> (3,5,5)
-    | `Dodger_blue -> (0,2,5) | `Deep_sky_blue -> (0,3,5)
-    | `Dark_blue -> (0,0,2) | `Blue -> (0,0,5) | `Light_slate_blue -> (2,2,5) | `Light_steel_blue -> (3,3,5)
-    | `Blue_violet -> (2,0,5) | `Violet -> (3,0,5)
-    | `Dark_magenta -> (2,0,2) | `Purple -> (3,0,3) | `Magenta -> (5,0,5) | `Orchid -> (5,2,5) | `Plum -> (5,3,5)
-    | `Rose -> (5,0,2) | `Deep_pink -> (5,0,3)
-  in
-  rgbint_code ~r ~g ~b
-
-
-let wrap ?(override=false) str ~code =
-  code
-  ^ (if override
-     then add_after_ansi str ~code
-     else add_after_normal str ~code)
-  ^ normal_code
-
-let bold      ?override str = wrap ?override str ~code:bold_code
-let underline ?override str = wrap ?override str ~code:underline_code
-let red       ?override str = wrap ?override str ~code:red_code
-let green     ?override str = wrap ?override str ~code:green_code
-let yellow    ?override str = wrap ?override str ~code:yellow_code
-let blue      ?override str = wrap ?override str ~code:blue_code
-let magenta   ?override str = wrap ?override str ~code:magenta_code
-let cyan      ?override str = wrap ?override str ~code:cyan_code
-let inverse   ?override str = wrap ?override str ~code:inverse_code
-
-let gray  ?override str ~brightness = wrap ?override str ~code:(gray_code ~brightness)
-let rgb   ?override str ~r ~g ~b    = wrap ?override str ~code:(rgb_code ~r ~g ~b)
-let color ?override str ~color      = wrap ?override str ~code:(color_code ~color)
-
-let wrap_print ?override ~code fmt =
-  Printf.ksprintf (fun str -> print_string (wrap ?override str ~code)) fmt
-
-let bold_printf      ?override fmt = wrap_print ?override ~code:bold_code      fmt
-let underline_printf ?override fmt = wrap_print ?override ~code:underline_code fmt
-let inverse_printf   ?override fmt = wrap_print ?override ~code:inverse_code   fmt
-let red_printf       ?override fmt = wrap_print ?override ~code:red_code       fmt
-let yellow_printf    ?override fmt = wrap_print ?override ~code:yellow_code    fmt
-let green_printf     ?override fmt = wrap_print ?override ~code:green_code     fmt
-let blue_printf      ?override fmt = wrap_print ?override ~code:blue_code      fmt
-let magenta_printf   ?override fmt = wrap_print ?override ~code:magenta_code   fmt
-let cyan_printf      ?override fmt = wrap_print ?override ~code:cyan_code      fmt
-
-let gray_printf ?override ~brightness fmt = wrap_print ?override ~code:(gray_code ~brightness) fmt
-let rgb_printf ?override ~r ~g ~b     fmt = wrap_print ?override ~code:(rgb_code ~r ~g ~b)     fmt
-let color_printf ?override ~color     fmt = wrap_print ?override ~code:(color_code ~color)     fmt
-
-let wrap_sprint ?override ~code fmt =
-  Printf.ksprintf (fun str -> wrap ?override str ~code) fmt
-
-let bold_sprintf      ?override fmt = wrap_sprint ?override ~code:bold_code      fmt
-let underline_sprintf ?override fmt = wrap_sprint ?override ~code:underline_code fmt
-let inverse_sprintf   ?override fmt = wrap_sprint ?override ~code:inverse_code   fmt
-let red_sprintf       ?override fmt = wrap_sprint ?override ~code:red_code       fmt
-let yellow_sprintf    ?override fmt = wrap_sprint ?override ~code:yellow_code    fmt
-let green_sprintf     ?override fmt = wrap_sprint ?override ~code:green_code     fmt
-let blue_sprintf      ?override fmt = wrap_sprint ?override ~code:blue_code      fmt
-let magenta_sprintf   ?override fmt = wrap_sprint ?override ~code:magenta_code   fmt
-let cyan_sprintf      ?override fmt = wrap_sprint ?override ~code:cyan_code      fmt
-
-let gray_sprintf ?override ~brightness fmt = wrap_sprint ?override ~code:(gray_code ~brightness) fmt
-let rgb_sprintf ?override ~r ~g ~b     fmt = wrap_sprint ?override ~code:(rgb_code ~r ~g ~b)     fmt
-let color_sprintf ?override ~color     fmt = wrap_sprint ?override ~code:(color_code ~color)     fmt
-