From 2da6cef41a263b7490f9ded58a86088db10fe750 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 28 Nov 2023 00:20:42 +0400 Subject: [PATCH] modifs.mineures sans commentaires --- src/schema/Result.php | 9 ++++ src/schema/Schema.php | 28 ++++++++---- src/schema/Value.php | 44 +++++++++++++++---- src/schema/_assoc/AssocResult.php | 7 +++ .../{schemas => _assoc}/AssocSchema.php | 6 +-- src/schema/{values => _assoc}/AssocValue.php | 4 +- src/schema/_list/ListResult.php | 7 +++ src/schema/{schemas => _list}/ListSchema.php | 10 ++--- src/schema/{values => _list}/ListValue.php | 2 +- src/schema/_scalar/ScalarResult.php | 7 +++ .../{schemas => _scalar}/ScalarSchema.php | 6 +-- .../{values => _scalar}/ScalarValue.php | 23 +++++----- src/schema/types/IType.php | 14 +----- tests/schema/schemaTest.php | 28 ++++++------ tests/schema/schemas/ScalarSchemaTest.php | 2 +- 15 files changed, 120 insertions(+), 77 deletions(-) create mode 100644 src/schema/_assoc/AssocResult.php rename src/schema/{schemas => _assoc}/AssocSchema.php (89%) rename src/schema/{values => _assoc}/AssocValue.php (91%) create mode 100644 src/schema/_list/ListResult.php rename src/schema/{schemas => _list}/ListSchema.php (82%) rename src/schema/{values => _list}/ListValue.php (91%) create mode 100644 src/schema/_scalar/ScalarResult.php rename src/schema/{schemas => _scalar}/ScalarSchema.php (97%) rename src/schema/{values => _scalar}/ScalarValue.php (84%) diff --git a/src/schema/Result.php b/src/schema/Result.php index 3d299a8..4567c02 100644 --- a/src/schema/Result.php +++ b/src/schema/Result.php @@ -26,6 +26,15 @@ class Result { /** @var array */ protected $result; + /** + * Obtenir la liste des clés valides pour les valeurs accessibles via cet + * objet + */ + abstract function getKeys(): array; + + /** obtenir un objet pour gérer la valeur spécifiée */ + abstract function getResult($key=null): Result; + function __get($name) { return $this->result[$name]; } diff --git a/src/schema/Schema.php b/src/schema/Schema.php index ec96e18..22779ca 100644 --- a/src/schema/Schema.php +++ b/src/schema/Schema.php @@ -4,13 +4,14 @@ namespace nur\sery\schema; use ArrayAccess; use LogicException; use nulib\cl; -use nur\sery\schema\schemas\AssocSchema; -use nur\sery\schema\schemas\ListSchema; -use nur\sery\schema\schemas\ScalarSchema; +use nur\sery\schema\_assoc\AssocSchema; +use nur\sery\schema\_list\ListSchema; +use nur\sery\schema\_scalar\ScalarSchema; abstract class Schema implements ArrayAccess { /** - * créer si besoin une nouvelle instance à partir d'une définition de schéma + * créer si besoin une nouvelle instance de {@link Schema} à partir d'une + * définition de schéma */ static function ns(?Schema &$schema, $definition): self { if ($schema === null) { @@ -27,6 +28,19 @@ abstract class Schema implements ArrayAccess { return $schema; } + /** + * Créer si besoin une nouvelle instance de {@link Value} qui référence la + * variable $dest + */ + static function nv(?Value &$value=null, &$dest=null, $key=null, ?Schema &$schema=null, $definition=null): Value { + if ($definition === null) { + # bien que techniquement, $definition peut être null (il s'agit alors du + # schéma d'un scalaire quelconque), on ne l'autorise pas ici + throw SchemaException::invalid_schema("definition is required"); + } + return self::ns($schema, $definition)->newValue($value, $dest, $key); + } + /** * @var array définition du schéma, à redéfinir le cas échéant dans une classe * dérivée @@ -43,11 +57,7 @@ abstract class Schema implements ArrayAccess { /** retourner true si le schéma est de nature scalaire */ function isScalar(?ScalarSchema &$scalar=null): bool { return false; } - /** - * Créer si besoin une nouvelle instance de {@link Value} qui référence la - * variable $dest - */ - abstract function nv(?Value &$value=null, &$dest=null, $key=null): Value; + abstract function newValue(?Value &$value=null, &$dest=null, $key=null): Value; ############################################################################# # key & properties diff --git a/src/schema/Value.php b/src/schema/Value.php index de04417..47feb68 100644 --- a/src/schema/Value.php +++ b/src/schema/Value.php @@ -1,27 +1,53 @@ getKeys() as $key) { + yield $key => $this->getValue($key); + } + } + + /** retourner le type associé à la valeur */ abstract function getType(): IType; /** retourner true si la valeur existe */ abstract function exists(): bool; + /** supprimer la valeur */ + abstract function unset(): void; + + /** remplacer la valeur */ + abstract function set($value): self; + + /** obtenir le résultat de l'appel de la fonction {@link set()} */ + abstract function result(): Result; + /** retourner true si la valeur est valide */ abstract function valid(): bool; + /** obtenir la valeur */ + abstract function get($default=null); + /** retourner true si la valeur est dans sa forme normalisée */ abstract function normalized(): bool; + + /** formatter la valeur pour affichage */ + abstract function format($format=null): string; } diff --git a/src/schema/_assoc/AssocResult.php b/src/schema/_assoc/AssocResult.php new file mode 100644 index 0000000..295813e --- /dev/null +++ b/src/schema/_assoc/AssocResult.php @@ -0,0 +1,7 @@ +reset($input, $key); + return $value->reset($dest, $key); } } diff --git a/src/schema/values/ListValue.php b/src/schema/_list/ListValue.php similarity index 91% rename from src/schema/values/ListValue.php rename to src/schema/_list/ListValue.php index c2b72b7..bbfa2cf 100644 --- a/src/schema/values/ListValue.php +++ b/src/schema/_list/ListValue.php @@ -1,5 +1,5 @@ reset($dest, $key); } diff --git a/src/schema/values/ScalarValue.php b/src/schema/_scalar/ScalarValue.php similarity index 84% rename from src/schema/values/ScalarValue.php rename to src/schema/_scalar/ScalarValue.php index 116d171..74564c7 100644 --- a/src/schema/values/ScalarValue.php +++ b/src/schema/_scalar/ScalarValue.php @@ -1,9 +1,8 @@ input = $input; - $this->key = $key; + $this->destKey = $destKey; $this->result = null; #XXX résoudre les types ici? if ($verifix) $this->verifix(); @@ -39,18 +38,18 @@ class ScalarValue extends Value { } function exists(): bool { - return $this->input->exists($this->key); + return $this->input->exists($this->destKey); } function get($default=null) { - $key = $this->key; + $destKey = $this->destKey; $input = $this->input; - if ($input->exists($key)) return $input->get($key); + if ($input->exists($destKey)) return $input->get($destKey); else return $default; } function set($value): self { - $this->input->set($value, $this->key); + $this->input->set($value, $this->destKey); return $this; } @@ -58,7 +57,7 @@ class ScalarValue extends Value { protected $type; function getType(): IType { - if ($this->type === null) $this->type = $this->schema->getType($this->key); + if ($this->type === null) $this->type = $this->schema->getType($this->destKey); return $this->type; } @@ -75,7 +74,7 @@ class ScalarValue extends Value { */ function verifix(bool $throw=true, ?Result &$result=null): bool { $type = $this->getType(); - $key = $this->key; + $key = $this->destKey; if ($key === null) $modified = $type->verifix($this->input, $throw, $result); else $modified = $type->verifix($this->input[$key], $throw, $result); $this->result = $result; @@ -91,7 +90,7 @@ class ScalarValue extends Value { function format(?string $format=null): string { $type = $this->getType(); - $key = $this->key; + $key = $this->destKey; if ($key === null) return $type->format($this->input, $format); else return $type->format($this->input[$key], $format); } diff --git a/src/schema/types/IType.php b/src/schema/types/IType.php index 1d544a2..cb59359 100644 --- a/src/schema/types/IType.php +++ b/src/schema/types/IType.php @@ -7,19 +7,7 @@ use nur\sery\schema\Result; * Interface IType: un type de données */ interface IType { - /** - * indiquer si la valeur a été fournie par l'utilisateur (elle doit exister - * et être non vide) - */ - function available($value, $key=null): bool; - - /** - * indiquer si la valeur spécifiée existe. cette méthode permet de distinguer - * les cas "fourni par l'utilisateur mais vide" et "non fourni par l'utilisateur" - */ - function exists($value, $key=null): bool; - function verifix(&$value, bool $throw, ?Result &$result); - function format($value, ?string $format); + function format($value, $format=null); } diff --git a/tests/schema/schemaTest.php b/tests/schema/schemaTest.php index 6e83c85..f70e479 100644 --- a/tests/schema/schemaTest.php +++ b/tests/schema/schemaTest.php @@ -3,13 +3,12 @@ namespace nur\sery\schema; use Exception; use nulib\tests\TestCase; -use nur\sery\schema\values\ScalarValue; +use nur\sery\schema\_scalar\ScalarValue; class schemaTest extends TestCase { function testInt() { - Schema::ns($schema, "int"); /** @var ScalarValue $intv */ - $schema->nv($intv, $int); + Schema::nv($intv, $int, null, $schema, "int"); $f = function($value) use($intv) { return function() use($intv, $value) { $intv->set($value); @@ -40,9 +39,8 @@ class schemaTest extends TestCase { } function testNint() { - Schema::ns($schema, ["?int"]); /** @var ScalarValue $intv */ - $schema->nv($intv, $int); + Schema::nv($intv, $int, null, $schema, "?int"); $f = function($value) use($intv) { return function() use($intv, $value) { $intv->set($value); @@ -84,23 +82,23 @@ class schemaTest extends TestCase { } function testUnionTypes() { - # l'ordre des types est respecté - Schema::ns($schema, ["string|int"]); + ## l'ordre des types doit être respecté + + # string puis int /** @var ScalarValue $siv */ - $schema->nv($siv, $si); + Schema::nv($siv, $si, null, $sis, "string|int"); $siv->set("12"); self::assertSame("12", $si); $siv->set(12); self::assertSame(12, $si); - Schema::ns($schema, ["int|string"]); - /** @var ScalarValue $siv */ - $schema->nv($siv, $si); + # int puis string + Schema::nv($isv, $is, null, $iss, "int|string"); - $siv->set("12"); - self::assertSame(12, $si); - $siv->set(12); - self::assertSame(12, $si); + $isv->set("12"); + self::assertSame(12, $is); + $isv->set(12); + self::assertSame(12, $is); } } diff --git a/tests/schema/schemas/ScalarSchemaTest.php b/tests/schema/schemas/ScalarSchemaTest.php index fcce800..d3afa33 100644 --- a/tests/schema/schemas/ScalarSchemaTest.php +++ b/tests/schema/schemas/ScalarSchemaTest.php @@ -3,7 +3,7 @@ namespace nur\sery\schema\schemas; use nulib\tests\TestCase; use nur\sery\schema\SchemaException; -use nur\sery\schema\schemas\ScalarSchema; +use nur\sery\schema\_scalar\ScalarSchema; class ScalarSchemaTest extends TestCase { const NULL_SCHEMA = [