modifs.mineures sans commentaires

This commit is contained in:
Jephté Clain 2025-03-08 12:25:53 +04:00
parent 7227cd7bdd
commit 4335a63d76
6 changed files with 27 additions and 12 deletions

View File

@ -1,5 +1,8 @@
# nulib\schema # nulib\schema
* ScalarSchema::from_property()
* AssocSchema === ScalarSchema(["array", "" => ["scalar", "subtype" => "assoc"]])
* ListSchema === ScalarSchema(["array", "" => ["scalar", "subtype" => "list"]])
* possibilité de spécifier un type via sa classe, e.g * possibilité de spécifier un type via sa classe, e.g
~~~php ~~~php
Schema::ns($schema, [ Schema::ns($schema, [
@ -15,7 +18,6 @@
~~~ ~~~
MyClass ne doit pas implémenter IType, et le type correspondant est créé avec MyClass ne doit pas implémenter IType, et le type correspondant est créé avec
`new tgeneric(MyClass::class)` `new tgeneric(MyClass::class)`
* ScalarSchema::from_property()
* dans AssocSchema, support `[key_prefix]` qui permet de spécifier un préfixe * dans AssocSchema, support `[key_prefix]` qui permet de spécifier un préfixe
commun aux champs dans le tableau destination, e.g commun aux champs dans le tableau destination, e.g

View File

@ -172,12 +172,12 @@ class ScalarSchema extends Schema {
if (count($types) == 1 && $types[0] !== null) { if (count($types) == 1 && $types[0] !== null) {
foreach ($types as $key => $name) { foreach ($types as $key => $name) {
if ($key === 0) { if ($key === 0) {
$params = null; $args = null;
} else { } else {
$params = $name; $args = $name;
$name = $key; $name = $key;
} }
$definition["type"] = types::get($nullable, $name, $params, $definition); $definition["type"] = types::get($nullable, $name, $args, $definition);
} }
} }

View File

@ -106,12 +106,12 @@ class ScalarWrapper extends Wrapper {
foreach ($schemaTypes as $key => $name) { foreach ($schemaTypes as $key => $name) {
if ($key === $index) { if ($key === $index) {
$index++; $index++;
$params = null; $args = null;
} else { } else {
$params = $name; $args = $name;
$name = $key; $name = $key;
} }
$type = types::get($schema->nullable, $name, $params, $this->schema->getDefinition()); $type = types::get($schema->nullable, $name, $args, $this->schema->getDefinition());
if ($firstType === null) $firstType = $type; if ($firstType === null) $firstType = $type;
$types[] = $type; $types[] = $type;
if ($type->isAvailable($input, $valueKey)) { if ($type->isAvailable($input, $valueKey)) {

View File

@ -31,8 +31,8 @@ class types {
return self::$registry; return self::$registry;
} }
static function get(bool $nullable, ?string $name, ?array $params=null, ?array $definition=null): IType { static function get(bool $nullable, ?string $name, ?array $args=null, ?array $definition=null): IType {
return self::registry()->get($nullable, $name, $params, $definition); return self::registry()->get($nullable, $name, $args, $definition);
} }
static function rawstring(bool $nullable=true): trawstring { return self::get($nullable, "rawstring"); } static function rawstring(bool $nullable=true): trawstring { return self::get($nullable, "rawstring"); }

View File

@ -30,12 +30,21 @@ class Registry {
/** @var IType[] */ /** @var IType[] */
protected $types; protected $types;
function get(bool $nullable, ?string $name, ?array $params=null, ?array $definition=null): IType { function get(bool $nullable, ?string $name, ?array $args=null, ?array $definition=null): IType {
$name ??= "raw"; $name ??= "raw";
$class = self::TYPES[$name]; $class = self::TYPES[$name];
if (cl::is_list($args)) {
$key = array_key_last($args);
$params = $args[$key];
unset($args[$key]);
} else {
$params = $args;
$args = null;
}
$params = cl::merge($class::get_params_from_definition($definition), $params); $params = cl::merge($class::get_params_from_definition($definition), $params);
if ($params !== null) { if ($args || $params !== null) {
return func::with([$class, false, $nullable, $params])->invoke(); $args ??= [];
return func::with([$class, false, ...$args, $nullable, $params])->invoke();
} }
if ($nullable) $name = "?$name"; if ($nullable) $name = "?$name";
$type = cl::get($this->types, $name); $type = cl::get($this->types, $name);

View File

@ -15,6 +15,10 @@ abstract class _tsimple implements IType {
return null; return null;
} }
/**
* $nullable et $params doivent toujours être les derniers arguments du
* constructeur
*/
function __construct(bool $nullable, ?array $params=null) { function __construct(bool $nullable, ?array $params=null) {
$this->nullable = $nullable; $this->nullable = $nullable;
$this->params = $params; $this->params = $params;