modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2023-12-28 13:29:39 +04:00
parent 4753afdb2b
commit bdbc80d3c1
4 changed files with 104 additions and 39 deletions

View File

@ -6,6 +6,7 @@ namespace nur\sery\output;
*/ */
interface IMessenger { interface IMessenger {
const LEVEL_DEBUG = -1, LEVEL_NORMAL = 0, LEVEL_MAJOR = 1, LEVEL_NONE = 2; const LEVEL_DEBUG = -1, LEVEL_NORMAL = 0, LEVEL_MAJOR = 1, LEVEL_NONE = 2;
const MIN_LEVEL = self::LEVEL_DEBUG, MAX_LEVEL = self::LEVEL_MAJOR;
/** réinitialiser les paramètres de l'objet */ /** réinitialiser les paramètres de l'objet */
function resetParams(?array $params=null): void; function resetParams(?array $params=null): void;

View File

@ -2,8 +2,9 @@
## TOOD ## TOOD
* [ ] affichage des exceptions en message technique. * [ ] section(), title() et action() acceptent une fonction qui fait le travail
si pas de message, prendre le message de l'exception par défaut avec en premier argument l'instance de messenger, et qui termine l'objet
l'objet ensuite
* [ ] possibilité de paramétrer le nom du fichier destination pour faire une * [ ] possibilité de paramétrer le nom du fichier destination pour faire une
rotation des logs rotation des logs
* [ ] support quiet (uniquement major), very-quiet (aucun message n'est affiché) * [ ] support quiet (uniquement major), very-quiet (aucun message n'est affiché)

View File

@ -3,7 +3,10 @@ namespace nur\sery\output\std;
use Exception; use Exception;
use nulib\cl; use nulib\cl;
use nulib\ExceptionShadow;
use nulib\UserException;
use nur\sery\output\IMessenger; use nur\sery\output\IMessenger;
use Throwable;
class StdMessenger implements IMessenger { class StdMessenger implements IMessenger {
const INDENT = " "; const INDENT = " ";
@ -22,7 +25,12 @@ class StdMessenger implements IMessenger {
"none" => self::LEVEL_NONE, "silent" => self::LEVEL_NONE, "none" => self::LEVEL_NONE, "silent" => self::LEVEL_NONE,
]; ];
protected static function verifix_level($level, int $max_level=self::LEVEL_MAJOR): int { protected static function decr_level(int $level): int {
if (--$level < self::MIN_LEVEL) $level = self::MIN_LEVEL;
return $level;
}
protected static function verifix_level($level, int $max_level=self::MAX_LEVEL): int {
if (!in_array($level, self::VALID_LEVELS, true)) { if (!in_array($level, self::VALID_LEVELS, true)) {
$level = cl::get(self::LEVEL_MAP, $level, $level); $level = cl::get(self::LEVEL_MAP, $level, $level);
} }
@ -65,7 +73,7 @@ class StdMessenger implements IMessenger {
"error" => ["debugE", "<color r>e</color><color -r>", "</color>"], "error" => ["debugE", "<color r>e</color><color -r>", "</color>"],
"warn" => ["debugW", "<color y>w</color><color -y>", "</color>"], "warn" => ["debugW", "<color y>w</color><color -y>", "</color>"],
"note" => ["debugN", "<color b>i</color>", ""], "note" => ["debugN", "<color b>i</color>", ""],
"info" => ["debugI", "<color @w>D</color><color w>", "</color>"], "info" => ["debug", "<color @w>D</color><color w>", "</color>"],
"step" => ["*", "<color @w>.</color>", ""], "step" => ["*", "<color @w>.</color>", ""],
"print" => [null, null, null], "print" => [null, null, null],
], ],
@ -201,6 +209,18 @@ class StdMessenger implements IMessenger {
return $level >= $this->minLevel; return $level >= $this->minLevel;
} }
protected function getIndentLevel(bool $withActions=true): int {
$indentLevel = count($this->titles) - 1;
if ($indentLevel < 0) $indentLevel = 0;
if ($withActions) {
foreach ($this->actions as $action) {
if ($action["level"] < $this->minLevel) continue;
$indentLevel++;
}
}
return $indentLevel;
}
protected function _printTitle(?string $linePrefix, int $level, protected function _printTitle(?string $linePrefix, int $level,
string $type, $content, string $type, $content,
int $indentLevel, StdOutput $out): void { int $indentLevel, StdOutput $out): void {
@ -319,8 +339,9 @@ class StdMessenger implements IMessenger {
} }
} }
protected function _printGeneric(int $level, string $type, $content, int $indentLevel, StdOutput $out): void { protected function _printGeneric(?string $linePrefix, int $level,
$linePrefix = $this->getLinePrefix(); string $type, $content,
int $indentLevel, StdOutput $out): void {
$prefixes = self::GENERIC_PREFIXES[$level][$type]; $prefixes = self::GENERIC_PREFIXES[$level][$type];
if ($out->isColor()) { if ($out->isColor()) {
$prefix = $prefixes[1]; $prefix = $prefixes[1];
@ -350,6 +371,53 @@ class StdMessenger implements IMessenger {
} }
} }
protected function _printGenericOrException(?int $level, string $type, $content, int $indentLevel, StdOutput $out): void {
$linePrefix = $this->getLinePrefix();
# si $content contient des exceptions, les afficher avec un level moindre
$exceptions = null;
if (is_array($content)) {
$valueContent = null;
foreach ($content as $value) {
if ($value instanceof Throwable || $value instanceof ExceptionShadow) {
$exceptions[] = $value;
} else {
$valueContent[] = $value;
}
}
$content = $valueContent;
} elseif ($content instanceof Throwable || $content instanceof ExceptionShadow) {
$exceptions[] = $content;
$content = null;
}
$printActions = true;
$showContent = $this->checkLevel($level);
if ($content !== null && $showContent) {
$this->printActions(); $printActions = false;
$this->_printGeneric($linePrefix, $level, $type, $content, $indentLevel, $out);
}
if ($exceptions !== null) {
$level1 = self::decr_level($level);
$showTraceback = $this->checkLevel($level1);
foreach ($exceptions as $exception) {
# tout d'abord userMessage
$userMessage = UserException::get_user_message($exception);
if ($userMessage !== null && $showContent) {
if ($printActions) { $this->printActions(); $printActions = false; }
$this->_printGeneric($linePrefix, $level, $type, $userMessage, $indentLevel, $out);
}
# puis summary et traceback
if ($showTraceback) {
if ($printActions) { $this->printActions(); $printActions = false; }
$summary = UserException::get_summary($exception);
$traceback = UserException::get_traceback($exception);
$this->_printGeneric($linePrefix, $level1, $type, $summary, $indentLevel, $out);
$this->_printGeneric($linePrefix, $level1, $type, $traceback, $indentLevel, $out);
}
}
}
}
/** @var bool est-on dans une section? */ /** @var bool est-on dans une section? */
protected $inSection; protected $inSection;
@ -370,7 +438,7 @@ class StdMessenger implements IMessenger {
protected function printSection() { protected function printSection() {
$section =& $this->section; $section =& $this->section;
if ($section["print_content"]) { if ($section !== null && $section["print_content"]) {
$this->_printTitle( $this->_printTitle(
$section["line_prefix"], $section["level"], $section["line_prefix"], $section["level"],
"section", $section["content"], "section", $section["content"],
@ -384,18 +452,6 @@ class StdMessenger implements IMessenger {
$this->section = null; $this->section = null;
} }
protected function getIndentLevel(bool $withActions=true): int {
$indentLevel = count($this->titles) - 1;
if ($indentLevel < 0) $indentLevel = 0;
if ($withActions) {
foreach ($this->actions as $action) {
if ($action["level"] < $this->minLevel) continue;
$indentLevel++;
}
}
return $indentLevel;
}
/** @var array */ /** @var array */
protected $titles; protected $titles;
@ -440,7 +496,10 @@ class StdMessenger implements IMessenger {
} }
if ($title["print_descs"]) { if ($title["print_descs"]) {
foreach ($title["descs"] as $desc) { foreach ($title["descs"] as $desc) {
$this->_printGeneric($desc["level"], "desc", $desc["content"], $indentLevel, $err); $this->_printGeneric(
$desc["line_prefix"], $desc["level"],
"desc", $desc["content"],
$indentLevel, $err);
} }
$title["descs"] = []; $title["descs"] = [];
$title["print_descs"] = false; $title["print_descs"] = false;
@ -511,10 +570,7 @@ class StdMessenger implements IMessenger {
} }
function step($content, ?int $level=null): void { function step($content, ?int $level=null): void {
if (!$this->checkLevel($level)) return; $this->_printGenericOrException($level, "step", $content, $this->getIndentLevel(), $this->err);
if (!$this->actions) $this->action(null);
$this->printActions();
$this->_printGeneric($level, "step", $content, $this->getIndentLevel(), $this->err);
} }
function asuccess($content=null): void { function asuccess($content=null): void {
@ -552,33 +608,23 @@ class StdMessenger implements IMessenger {
} }
function print($content, ?int $level=null): void { function print($content, ?int $level=null): void {
if (!$this->checkLevel($level)) return; $this->_printGenericOrException($level, "print", $content, $this->getIndentLevel(), $this->out);
$this->printActions();
$this->_printGeneric($level, "print", $content, $this->getIndentLevel(), $this->out);
} }
function info($content, ?int $level=null): void { function info($content, ?int $level=null): void {
if (!$this->checkLevel($level)) return; $this->_printGenericOrException($level, "info", $content, $this->getIndentLevel(), $this->err);
$this->printActions();
$this->_printGeneric($level, "info", $content, $this->getIndentLevel(), $this->err);
} }
function note($content, ?int $level=null): void { function note($content, ?int $level=null): void {
if (!$this->checkLevel($level)) return; $this->_printGenericOrException($level, "note", $content, $this->getIndentLevel(), $this->err);
$this->printActions();
$this->_printGeneric($level, "note", $content, $this->getIndentLevel(), $this->err);
} }
function warn($content, ?int $level=null): void { function warn($content, ?int $level=null): void {
if (!$this->checkLevel($level)) return; $this->_printGenericOrException($level, "warn", $content, $this->getIndentLevel(), $this->err);
$this->printActions();
$this->_printGeneric($level, "warn", $content, $this->getIndentLevel(), $this->err);
} }
function error($content, ?int $level=null): void { function error($content, ?int $level=null): void {
if (!$this->checkLevel($level)) return; $this->_printGenericOrException($level, "error", $content, $this->getIndentLevel(), $this->err);
$this->printActions();
$this->_printGeneric($level, "error", $content, $this->getIndentLevel(), $this->err);
} }
function end(bool $all=false): void { function end(bool $all=false): void {

View File

@ -2,6 +2,7 @@
<?php <?php
require(__DIR__.'/../vendor/autoload.php'); require(__DIR__.'/../vendor/autoload.php');
use nulib\UserException;
use nur\sery\output\std\StdMessenger; use nur\sery\output\std\StdMessenger;
$params = []; $params = [];
@ -140,3 +141,19 @@ $c->action("multi-line\naction");
$c->step("multi-line\nstep"); $c->step("multi-line\nstep");
$c->adone("multi-line\ndone"); $c->adone("multi-line\ndone");
$c->end(true); $c->end(true);
$exception = new Exception("message");
$userException1 = new UserException("userMessage");
$userException2 = new UserException("userMessage", "techMessage");
$c->section("Exceptions");
$c->title("avec message");
$c->info(["exception", $exception]);
$c->info(["userException1", $userException1]);
$c->info(["userException2", $userException2]);
$c->end();
$c->title("sans message");
$c->info($exception);
$c->info($userException1);
$c->info($userException2);
$c->end();