diff --git a/src/schema/Wrapper.php b/src/schema/Wrapper.php index 12049c0..4f621c5 100644 --- a/src/schema/Wrapper.php +++ b/src/schema/Wrapper.php @@ -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,19 +28,16 @@ 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) { - $this->normalize($params); - } + if ($context->analyzed && ($params["normalize"] ?? $context->normalize)) { + $this->normalize($params); } } @@ -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) { diff --git a/src/schema/WrapperContext.php b/src/schema/WrapperContext.php index d005ea9..a47bfd7 100644 --- a/src/schema/WrapperContext.php +++ b/src/schema/WrapperContext.php @@ -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 */ diff --git a/src/schema/_assoc/AssocWrapper.php b/src/schema/_assoc/AssocWrapper.php index 0b8ff08..18b7737 100644 --- a/src/schema/_assoc/AssocWrapper.php +++ b/src/schema/_assoc/AssocWrapper.php @@ -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(); } diff --git a/src/schema/_assoc/AssocWrapperContext.php b/src/schema/_assoc/AssocWrapperContext.php index 01c417e..a75321b 100644 --- a/src/schema/_assoc/AssocWrapperContext.php +++ b/src/schema/_assoc/AssocWrapperContext.php @@ -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; } diff --git a/src/schema/_scalar/ScalarWrapper.php b/src/schema/_scalar/ScalarWrapper.php index 72f1e40..0aceea6 100644 --- a/src/schema/_scalar/ScalarWrapper.php +++ b/src/schema/_scalar/ScalarWrapper.php @@ -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 */