123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153(*********************************************************************************)(* pplumbing - Utility libraries to use with [pp] *)(* SPDX-FileCopyrightText: 2024-2025 Mathieu Barbin <mathieu.barbin@gmail.com> *)(* SPDX-License-Identifier: MIT *)(*********************************************************************************)moduleColor_mode=structincludeErr.Color_modeletto_fmt_style_renderer=function|`Auto->None|`Always->Some`Ansi_tty|`Never->Some`None;;endmoduleLog_level=structincludeErr.Log_levelletof_logs_level:Logs.leveloption->t=function|None->Quiet|SomeApp->App|SomeError->Error|SomeWarning->Warning|SomeInfo->Info|SomeDebug->Debug;;letto_logs_level:t->Logs.leveloption=function|Quiet->None|App->SomeApp|Error->SomeError|Warning->SomeWarning|Info->SomeInfo|Debug->SomeDebug;;endmoduleConfig=structletlog_level_arg=letopenCommand.Stdinlet+verbose_count=Arg.flag_count["verbose";"v"]~doc:"Increase verbosity. Repeatable, but more than twice does not bring more."and+verbosity=Arg.named_opt["log-level";"verbosity"](Param.enumerated(moduleLog_level))~docv:"LEVEL"~doc:"Be more or less verbose. Takes over $(b,v)."and+quiet=Arg.flag["quiet";"q"]~doc:"Be quiet. Takes over $(b,v) and $(b,--verbosity)."inifquietthenLog_level.Quietelse(matchverbositywith|Someverbosity->verbosity|None->(matchverbose_countwith|0->Log_level.Warning|1->Log_level.Info|_->Log_level.Debug));;letcolor_mode_arg=letopenCommand.StdinArg.named_with_default["color"](Param.enumerated(moduleColor_mode))~default:`Auto~docv:"WHEN"~doc:"Colorize the output.";;typet={log_level:Log_level.t;color_mode:Color_mode.t;warn_error:bool}letdefault={log_level=Log_level.Warning;color_mode=`Auto;warn_error=false}letcreate?(log_level=default.log_level)?(color_mode=default.color_mode)?(warn_error=default.warn_error)()={log_level;color_mode;warn_error};;letlog_levelt=t.log_levelletlogs_levelt=Log_level.to_logs_levelt.log_levelletcolor_modet=t.color_modeletfmt_style_renderert=Color_mode.to_fmt_style_renderert.color_modeletwarn_errort=t.warn_errorletarg=letopenCommand.Stdinlet+warn_error=Arg.flag["warn-error"]~doc:"Treat warnings as errors."and+log_level=log_level_argand+color_mode=color_mode_argin{log_level;color_mode;warn_error};;letto_args{log_level;color_mode;warn_error}=List.concat[(matchLog_level.to_logs_levellog_levelwith|None->["--quiet"]|Somelevel->(matchlevelwith|App->["--verbosity";"app"]|Error->["--verbosity";"error"]|Warning->[]|Info->["--verbosity";"info"]|Debug->["--verbosity";"debug"]));(matchcolor_modewith|`Auto->[]|`Always->["--color";"always"]|`Never->["--color";"never"]);(ifwarn_errorthen["--warn-error"]else[])];;endletsetup_log~(config:Config.t)=Fmt_tty.setup_std_outputs?style_renderer:(Color_mode.to_fmt_style_rendererconfig.color_mode)();let()=Err.Private.color_mode:=config.color_modeinLogs.set_level(Log_level.to_logs_levelconfig.log_level);let()=Err.Private.set_log_level~get:(fun()->Log_level.of_logs_level(Logs.level()))~set:(funlevel->(Logs.set_level(Log_level.to_logs_levellevel)[@coverageoff]))inLogs.set_reporter(Logs_fmt.reporter());;letsetup_config~config=setup_log~config;Err.Private.warn_error:=config.warn_error;Err.Private.set_log_counts~err_count:Logs.err_count~warn_count:Logs.warn_count;();;letset_config()=letopenCommand.Stdinlet+config=Config.arginsetup_config~config;;