modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2025-04-18 13:52:52 +04:00
parent 4353f482a4
commit e592e8b9c4
5 changed files with 51 additions and 31 deletions

View File

@ -19,7 +19,7 @@ abstract class Wrapper implements ArrayAccess, IteratorAggregate {
$this->context->resetParams($params); $this->context->resetParams($params);
} }
protected function resetContext($resetSelectedKey): void { protected function resetContext(bool $resetSelectedKey): void {
$context = $this->context; $context = $this->context;
$type = $context->schema->type; $type = $context->schema->type;
if (is_array($type)) $type = $type[0]; if (is_array($type)) $type = $type[0];
@ -28,19 +28,16 @@ abstract class Wrapper implements ArrayAccess, IteratorAggregate {
$context->result->reset(); $context->result->reset();
$context->analyzed = false; $context->analyzed = false;
$context->normalized = false; $context->normalized = false;
if ($resetSelectedKey) $context->selectedKey = null;
} }
protected function afterModify(?array $params, $resetSelectedKey=false): void { protected function afterModify(?array $params, bool $resetSelectedKey=false): void {
$context = $this->context; $context = $this->context;
$this->resetContext($resetSelectedKey); $this->resetContext($resetSelectedKey);
if ($params["analyze"] ?? $context->analyze) { if ($params["analyze"] ?? $context->analyze) {
$this->analyze($params); $this->analyze($params);
} }
if ($context->analyzed) { if ($context->analyzed && ($params["normalize"] ?? $context->normalize)) {
if ($params["normalize"] ?? $context->normalize) { $this->normalize($params);
$this->normalize($params);
}
} }
} }
@ -80,6 +77,15 @@ abstract class Wrapper implements ArrayAccess, IteratorAggregate {
/** normaliser la valeur */ /** normaliser la valeur */
abstract static function _normalize(WrapperContext $context, Wrapper $wrapper, ?array $params): bool; abstract static function _normalize(WrapperContext $context, Wrapper $wrapper, ?array $params): bool;
protected function checkResult(): void {
$context = $this->context;
/** @var ScalarResult $result */
$result = $context->result;
if (!$result->valid) {
$result->throw($params["throw"] ?? $context->throw);
}
}
function normalize(?array $params=null): bool { function normalize(?array $params=null): bool {
$context = $this->context; $context = $this->context;
@ -95,11 +101,7 @@ abstract class Wrapper implements ArrayAccess, IteratorAggregate {
$modified = false; $modified = false;
} }
/** @var ScalarResult $result */ $this->checkResult();
$result = $context->result;
if (!$result->valid) {
$result->throw($params["throw"] ?? $context->throw);
}
return $modified; return $modified;
} }
@ -115,7 +117,7 @@ abstract class Wrapper implements ArrayAccess, IteratorAggregate {
* @param string|int|null $key * @param string|int|null $key
* @return Wrapper $this * @return Wrapper $this
*/ */
abstract function select($key): Wrapper; abstract function select($key=null): Wrapper;
function getIterator() { function getIterator() {
foreach ($this->getKeys() as $key) { foreach ($this->getKeys() as $key) {

View File

@ -37,8 +37,6 @@ class WrapperContext {
/** @var mixed */ /** @var mixed */
public $value = null; public $value = null;
/** @var string|int|null clé sélectionnée */
public $selectedKey = null;
/** type de la valeur de la clé sélectionnée après analyse */ /** type de la valeur de la clé sélectionnée après analyse */
public ?IType $type = null; public ?IType $type = null;
/** résultat de l'analyse de la valeur de la clé sélectionnée */ /** résultat de l'analyse de la valeur de la clé sélectionnée */

View File

@ -14,23 +14,25 @@ use nulib\schema\WrapperContext;
class AssocWrapper extends Wrapper { class AssocWrapper extends Wrapper {
function __construct(AssocSchema $schema, &$value=null, $valueKey=null, ?array $params=null) { function __construct(AssocSchema $schema, &$value=null, $valueKey=null, ?array $params=null) {
$keys = $schema->getKeys(); $this->context = $context = new AssocWrapperContext($schema, null, null, $params);
$keyParams = cl::merge($params, [ $paramsNoThrow = cl::merge($params, [
"throw" => false, "throw" => false,
]); ]);
$keys = $schema->getKeys();
$keyWrappers = []; $keyWrappers = [];
foreach ($keys as $key) { foreach ($keys as $key) {
$value = null; $keyDummy = null;
$keyWrappers[$key] = $schema->getSchema($key)->getWrapper($value, null, $keyParams); $keyWrappers[$key] = $schema->getSchema($key)->getWrapper($keyDummy, null, $paramsNoThrow);
} }
$this->context = $context = new AssocWrapperContext($schema, null, null, $params);
$arrayParams = cl::merge($params, [
"throw" => false,
]);
$context->arrayWrapper = new ScalarWrapper($schema, $dummy, null, $arrayParams, $context);
$context->keys = $keys; $context->keys = $keys;
$context->keyWrappers = $keyWrappers; $context->keyWrappers = $keyWrappers;
$arrayDummy = null;
$context->arrayWrapper = new ScalarWrapper($schema, $arrayDummy, null, $paramsNoThrow, $context);
$context->assocResult = new ScalarResult();#XX AssocResult
if ($value !== null) { if ($value !== null) {
# n'initialiser que si $value n'est pas null # n'initialiser que si $value n'est pas null
$this->reset($value, $valueKey); $this->reset($value, $valueKey);
@ -40,13 +42,14 @@ class AssocWrapper extends Wrapper {
/** @var AssocWrapperContext */ /** @var AssocWrapperContext */
protected WrapperContext $context; protected WrapperContext $context;
protected function resetContext($resetSelectedKey): void { protected function resetContext(bool $resetSelectedKey): void {
parent::resetContext($resetSelectedKey); parent::resetContext($resetSelectedKey);
$context = $this->context; $context = $this->context;
$context->arrayWrapper->getResult()->reset(); $context->arrayWrapper->getResult()->reset();
foreach ($context->keyWrappers as $wrapper) { foreach ($context->keyWrappers as $wrapper) {
$wrapper->getResult()->reset(); $wrapper->getResult()->reset();
} }
if ($resetSelectedKey) $context->selectedKey = null;
} }
function reset(&$value, $valueKey=null, ?array $params=null): Wrapper { function reset(&$value, $valueKey=null, ?array $params=null): Wrapper {
@ -69,7 +72,7 @@ class AssocWrapper extends Wrapper {
protected function _getWrapper($key): Wrapper { protected function _getWrapper($key): Wrapper {
$context = $this->context; $context = $this->context;
if ($key === null) return $context->arrayWrapper; if ($key === null || $key === "") return $context->arrayWrapper;
$wrapper = $context->keyWrappers[$key] ?? null; $wrapper = $context->keyWrappers[$key] ?? null;
if ($wrapper === null) throw ValueException::invalid_key($key); if ($wrapper === null) throw ValueException::invalid_key($key);
return $wrapper; return $wrapper;
@ -99,9 +102,10 @@ class AssocWrapper extends Wrapper {
$what = ScalarWrapper::_analyze($context, $wrapper, $params); $what = ScalarWrapper::_analyze($context, $wrapper, $params);
/** @var ScalarResult $result */ /** @var ScalarResult $result */
$result = $context->result; if (!$context->result->valid) return $what;
if (!$result->valid) return $what;
$result = $context->assocResult;
$result->setValid();
foreach ($context->keyWrappers as $keyWrapper) { foreach ($context->keyWrappers as $keyWrapper) {
$keyWrapper->analyze($params); $keyWrapper->analyze($params);
if ($keyWrapper->isValid()) continue; if ($keyWrapper->isValid()) continue;
@ -155,7 +159,17 @@ class AssocWrapper extends Wrapper {
return $modified; return $modified;
} }
protected function checkResult(): void {
$context = $this->context;
/** @var ScalarResult $result */
$result = $context->assocResult;
if (!$result->valid) {
$result->throw($params["throw"] ?? $context->throw);
}
}
function getResult($key=false): Result { function getResult($key=false): Result {
if ($key === null) return $this->context->assocResult;
if ($key === false) $key = $this->context->selectedKey; if ($key === false) $key = $this->context->selectedKey;
return $this->_getWrapper($key)->getResult(); return $this->_getWrapper($key)->getResult();
} }

View File

@ -2,6 +2,7 @@
namespace nulib\schema\_assoc; namespace nulib\schema\_assoc;
use nulib\ref\schema\ref_schema; use nulib\ref\schema\ref_schema;
use nulib\schema\_scalar\ScalarResult;
use nulib\schema\_scalar\ScalarWrapper; use nulib\schema\_scalar\ScalarWrapper;
use nulib\schema\Wrapper; use nulib\schema\Wrapper;
use nulib\schema\WrapperContext; use nulib\schema\WrapperContext;
@ -28,4 +29,9 @@ class AssocWrapperContext extends WrapperContext {
/** @var Wrapper[] */ /** @var Wrapper[] */
public array $keyWrappers; public array $keyWrappers;
public ScalarResult $assocResult;
/** @var string|int|null clé sélectionnée */
public $selectedKey = null;
} }

View File

@ -40,9 +40,9 @@ class ScalarWrapper extends Wrapper {
} }
/** @param string|int|null $key */ /** @param string|int|null $key */
function select($key): ScalarWrapper { function select($key=null): ScalarWrapper {
if ($key !== null) throw ValueException::invalid_key($key); if ($key === null || $key === "") return $this;
return $this; throw ValueException::invalid_key($key);
} }
/** analyser la valeur et résoudre son type */ /** analyser la valeur et résoudre son type */