let print log_kind t =
let convert_to_string formatted =
SmartPrint.to_string P.line_width P.indent formatted in
let display formatted = convert_to_string formatted |> P.print_string in
let using_colors = P.with_color () in
let no_color t = t in
let normal_color = if using_colors then bold_green else no_color in
let error_color = if using_colors then bold_red else no_color in
let warning_color = if using_colors then bold_yellow else no_color in
let debug_color = if using_colors then greyish else no_color in
let format_log ?(color_h=no_color) ?(color_t=no_color) head t =
let colorless = head % t in
let has_newline =
String.find_index (convert_to_string colorless) ~char:'\n' <> None in
display (
color_h (brakets head)
% string " "
% (if has_newline
then color_t (n % indent t)
else color_t t)
% newline
) in
match log_kind with
| `Normal ->
format_log ~color_h:normal_color (string P.name) t
| `Error ->
format_log ~color_h:error_color (s P.name % s ": ERROR") t
| `Warning ->
format_log ~color_h:warning_color (s P.name % s ": Warning") t
| `Debug level when P.debug_level () >= level ->
format_log ~color_h:debug_color (s P.name %s ": debug")
~color_t:debug_color t
| `Debug _ -> P.do_nothing ()