nur-sery/src/output/std/ProxyMessenger.php

122 lines
4.4 KiB
PHP
Raw Normal View History

2023-12-28 11:54:15 +04:00
<?php
namespace nur\sery\output\std;
2024-05-16 18:03:21 +04:00
use Exception;
2023-12-28 11:54:15 +04:00
use nur\sery\output\IMessenger;
/**
* Class ProxyMessenger: un proxy vers ou un plusieurs instances de IMessenger
2024-05-02 14:41:27 +04:00
*
* NB: si cette classe est instanciée sans argument, elle agit comme un
* "NullMessenger", c'est à dire une instance qui envoie tous les messages vers
* /dev/null
2023-12-28 11:54:15 +04:00
*/
class ProxyMessenger implements IMessenger {
function __construct(?IMessenger ...$msgs) {
$this->msgs = [];
foreach ($msgs as $msg) {
if ($msg !== null) $this->msgs[] = $msg;
}
}
/** @var IMessenger[] */
protected $msgs;
function resetParams(?array $params=null): void { foreach ($this->msgs as $msg) { $msg->resetParams($params); } }
function clone(?array $params=null): self {
$clone = clone $this;
foreach ($clone->msgs as &$msg) {
$msg = $msg->clone($params);
}; unset($msg);
return $clone;
}
2023-12-28 15:10:14 +04:00
function section($content, ?callable $func=null, ?int $level=null): void {
$useFunc = false;
foreach ($this->msgs as $msg) {
$msg->section($content, null, $level);
if ($msg instanceof _IMessenger) $useFunc = true;
}
if ($useFunc && $func !== null) {
try {
$func($this);
} finally {
/** @var _IMessenger $msg */
foreach ($this->msgs as $msg) {
$msg->_endSection();
}
}
}
}
function title($content, ?callable $func=null, ?int $level=null): void {
$useFunc = false;
$untils = [];
foreach ($this->msgs as $msg) {
if ($msg instanceof _IMessenger) {
$useFunc = true;
$untils[] = $msg->_getTitleMark();
}
2024-05-03 08:07:18 +04:00
$msg->title($content, null, $level);
2023-12-28 15:10:14 +04:00
}
if ($useFunc && $func !== null) {
try {
$func($this);
} finally {
/** @var _IMessenger $msg */
$index = 0;
foreach ($this->msgs as $msg) {
2024-05-03 08:07:18 +04:00
if ($msg instanceof _IMessenger) {
$msg->_endTitle($untils[$index++]);
}
2023-12-28 15:10:14 +04:00
}
}
}
}
2023-12-28 11:54:15 +04:00
function desc($content, ?int $level=null): void { foreach ($this->msgs as $msg) { $msg->desc($content, $level); } }
2023-12-28 15:10:14 +04:00
function action($content, ?callable $func=null, ?int $level=null): void {
$useFunc = false;
$untils = [];
foreach ($this->msgs as $msg) {
$msg->action($content, null, $level);
if ($msg instanceof _IMessenger) {
$useFunc = true;
2024-05-16 17:51:05 +04:00
$untils[] = $msg->_getActionMark();
2023-12-28 15:10:14 +04:00
}
}
if ($useFunc && $func !== null) {
try {
2024-05-16 18:03:21 +04:00
$result = $func($this);
2024-05-22 15:33:19 +04:00
/** @var _IMessenger $msg */
$index = 0;
foreach ($this->msgs as $msg) {
if ($msg->_getActionMark() > $untils[$index++]) {
$msg->aresult($result);
2024-05-16 18:03:21 +04:00
}
}
} catch (Exception $e) {
/** @var _IMessenger $msg */
foreach ($this->msgs as $msg) {
$msg->afailure($e);
}
throw $e;
2023-12-28 15:10:14 +04:00
} finally {
/** @var _IMessenger $msg */
$index = 0;
foreach ($this->msgs as $msg) {
$msg->_endAction($untils[$index++]);
}
}
}
}
2023-12-28 11:54:15 +04:00
function step($content, ?int $level=null): void { foreach ($this->msgs as $msg) { $msg->step($content, $level); } }
2024-05-02 14:36:53 +04:00
function asuccess($content=null, ?int $overrideLevel=null): void { foreach ($this->msgs as $msg) { $msg->asuccess($content, $overrideLevel); } }
function afailure($content=null, ?int $overrideLevel=null): void { foreach ($this->msgs as $msg) { $msg->afailure($content, $overrideLevel); } }
function adone($content=null, ?int $overrideLevel=null): void { foreach ($this->msgs as $msg) { $msg->adone($content, $overrideLevel); } }
2024-05-22 15:33:19 +04:00
function aresult($result=null, ?int $overrideLevel=null): void { foreach ($this->msgs as $msg) { $msg->aresult($result, $overrideLevel); } }
2023-12-28 11:54:15 +04:00
function print($content, ?int $level=null): void { foreach ($this->msgs as $msg) { $msg->print($content, $level); } }
function info($content, ?int $level=null): void { foreach ($this->msgs as $msg) { $msg->info($content, $level); } }
function note($content, ?int $level=null): void { foreach ($this->msgs as $msg) { $msg->note($content, $level); } }
function warning($content, ?int $level=null): void { foreach ($this->msgs as $msg) { $msg->warning($content, $level); } }
2023-12-28 11:54:15 +04:00
function error($content, ?int $level=null): void { foreach ($this->msgs as $msg) { $msg->error($content, $level); } }
function end(bool $all=false): void { foreach ($this->msgs as $msg) { $msg->end($all); } }
}