diff --git a/src/schema/TODO.md b/src/schema/TODO.md index 65c4212..8cdcee8 100644 --- a/src/schema/TODO.md +++ b/src/schema/TODO.md @@ -20,6 +20,8 @@ * cela pourrait servir pour générer automatiquement des tables SQL * ou pour modéliser un schéma FSV +* support allowed_values + * valeurs composite/computed * analyse / vérification de la valeur complète après calcul du résultat, si tous les résultats sont bons diff --git a/src/schema/_assoc/AssocSchema.php b/src/schema/_assoc/AssocSchema.php index 4b6b753..6c0156b 100644 --- a/src/schema/_assoc/AssocSchema.php +++ b/src/schema/_assoc/AssocSchema.php @@ -82,7 +82,15 @@ class AssocSchema extends Schema { # cf le code similaire dans AssocWrapper::__construct() $dontAnalyze = $value === null && $wrapper === null; if (!($wrapper instanceof AssocWrapper)) $wrapper = $this->newWrapper(); + + # le schéma peut contenir des paramètres par défaut + $nature = $this->definition[""]; + foreach (array_keys(ref_schema::ASSOC_PARAMS_SCHEMA) as $key) { + $value = $nature[$key] ?? null; + if ($value !== null) $params[$key] = $value; + } if ($params !== null) $wrapper->resetParams($params); + return $wrapper->reset($value, $valueKey, $dontAnalyze? ["analyze" => false]: null); } } diff --git a/src/schema/_assoc/AssocWrapper.php b/src/schema/_assoc/AssocWrapper.php index 71210d1..1c8f179 100644 --- a/src/schema/_assoc/AssocWrapper.php +++ b/src/schema/_assoc/AssocWrapper.php @@ -89,13 +89,13 @@ class AssocWrapper extends Wrapper { * @param AssocWrapper $wrapper */ static function _analyze(WrapperContext $context, Wrapper $wrapper, ?array $params): int { - if ($context->ensureArray) { + if ($params["ensure_array"] ?? $context->ensureArray) { $valueKey = $context->valueKey; $array = $context->input->get($valueKey); if ($array === null) $context->input->set([], $valueKey); } - if ($context->ensureAssoc) { + if ($params["ensure_assoc"] ?? $context->ensureAssoc) { $context->input->ensureAssoc($context->schema->getKeys()); } @@ -113,7 +113,7 @@ class AssocWrapper extends Wrapper { } } - #XXX supprimer les clés "missing" ou "unavailable" + #XXX supprimer les clés "missing" ou "unavailable" sauf si $ensureKeys return $what; } @@ -122,8 +122,8 @@ class AssocWrapper extends Wrapper { * @param AssocWrapper $wrapper */ static function _normalize(WrapperContext $context, Wrapper $wrapper, ?array $params): bool { - $ensureKeys = $context->ensureKeys; - $ensureOrder = $context->ensureOrder; + $ensureKeys = $params["ensure_keys"] ?? $context->ensureKeys; + $ensureOrder = $params["ensure_order"] ?? $context->ensureOrder; if ($ensureKeys || $ensureOrder) { $schema = $context->schema; $keys = $schema->getKeys(); diff --git a/src/schema/_scalar/ScalarSchema.php b/src/schema/_scalar/ScalarSchema.php index a9c2ad5..1a5dd8e 100644 --- a/src/schema/_scalar/ScalarSchema.php +++ b/src/schema/_scalar/ScalarSchema.php @@ -84,7 +84,15 @@ class ScalarSchema extends Schema { # cf le code similaire dans ScalarWrapper::__construct() $dontAnalyze = $value === null && $wrapper === null; if (!($wrapper instanceof ScalarWrapper)) $wrapper = $this->newWrapper(); + + # le schéma peut contenir des paramètres par défaut + $nature = $this->definition[""]; + foreach (array_keys(ref_schema::SCALAR_PARAMS_SCHEMA) as $key) { + $value = $nature[$key] ?? null; + if ($value !== null) $params[$key] = $value; + } if ($params !== null) $wrapper->resetParams($params); + return $wrapper->reset($value, $valueKey, $dontAnalyze? ["analyze" => false]: null); } } diff --git a/tests/wip/schema/_assoc/AssocSchemaTest.php b/tests/wip/schema/_assoc/AssocSchemaTest.php index cdd1567..cf5e9d4 100644 --- a/tests/wip/schema/_assoc/AssocSchemaTest.php +++ b/tests/wip/schema/_assoc/AssocSchemaTest.php @@ -13,9 +13,10 @@ class AssocSchemaTest extends TestCase { "assoc", "compute_func" => null, "validate_func" => null, - "ensure_array" => false, - "ensure_keys" => true, - "ensure_order" => true, + "ensure_array" => null, + "ensure_assoc" => null, + "ensure_keys" => null, + "ensure_order" => null, ], "schema" => null, "type" => [null],