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);
}
protected function resetContext($resetSelectedKey): void {
protected function resetContext(bool $resetSelectedKey): void {
$context = $this->context;
$type = $context->schema->type;
if (is_array($type)) $type = $type[0];
@ -28,21 +28,18 @@ abstract class Wrapper implements ArrayAccess, IteratorAggregate {
$context->result->reset();
$context->analyzed = 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;
$this->resetContext($resetSelectedKey);
if ($params["analyze"] ?? $context->analyze) {
$this->analyze($params);
}
if ($context->analyzed) {
if ($params["normalize"] ?? $context->normalize) {
if ($context->analyzed && ($params["normalize"] ?? $context->normalize)) {
$this->normalize($params);
}
}
}
protected function newInput(&$value): Input {
return new Input($value);
@ -80,6 +77,15 @@ abstract class Wrapper implements ArrayAccess, IteratorAggregate {
/** normaliser la valeur */
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 {
$context = $this->context;
@ -95,11 +101,7 @@ abstract class Wrapper implements ArrayAccess, IteratorAggregate {
$modified = false;
}
/** @var ScalarResult $result */
$result = $context->result;
if (!$result->valid) {
$result->throw($params["throw"] ?? $context->throw);
}
$this->checkResult();
return $modified;
}
@ -115,7 +117,7 @@ abstract class Wrapper implements ArrayAccess, IteratorAggregate {
* @param string|int|null $key
* @return Wrapper $this
*/
abstract function select($key): Wrapper;
abstract function select($key=null): Wrapper;
function getIterator() {
foreach ($this->getKeys() as $key) {

View File

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

View File

@ -2,6 +2,7 @@
namespace nulib\schema\_assoc;
use nulib\ref\schema\ref_schema;
use nulib\schema\_scalar\ScalarResult;
use nulib\schema\_scalar\ScalarWrapper;
use nulib\schema\Wrapper;
use nulib\schema\WrapperContext;
@ -28,4 +29,9 @@ class AssocWrapperContext extends WrapperContext {
/** @var Wrapper[] */
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 */
function select($key): ScalarWrapper {
if ($key !== null) throw ValueException::invalid_key($key);
return $this;
function select($key=null): ScalarWrapper {
if ($key === null || $key === "") return $this;
throw ValueException::invalid_key($key);
}
/** analyser la valeur et résoudre son type */