corrections tarray
This commit is contained in:
parent
5dd9ebbf65
commit
fea5cb8b87
@ -127,7 +127,6 @@ abstract class Schema implements ArrayAccess {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
# type
|
# type
|
||||||
$types = [];
|
|
||||||
$deftype = $definition["type"];
|
$deftype = $definition["type"];
|
||||||
$nullable = $definition["nullable"] ?? false;
|
$nullable = $definition["nullable"] ?? false;
|
||||||
if ($deftype === null) {
|
if ($deftype === null) {
|
||||||
@ -138,7 +137,17 @@ abstract class Schema implements ArrayAccess {
|
|||||||
if (!is_string($deftype)) throw SchemaException::invalid_type($deftype);
|
if (!is_string($deftype)) throw SchemaException::invalid_type($deftype);
|
||||||
$deftype = explode("|", $deftype);
|
$deftype = explode("|", $deftype);
|
||||||
}
|
}
|
||||||
foreach ($deftype as $type) {
|
$types = [];
|
||||||
|
$unionTypes = [];
|
||||||
|
$index = 0;
|
||||||
|
foreach ($deftype as $key => $type) {
|
||||||
|
$args = null;
|
||||||
|
if ($key === $index) {
|
||||||
|
$index++;
|
||||||
|
} else {
|
||||||
|
$args = $type;
|
||||||
|
$type = $key;
|
||||||
|
}
|
||||||
if ($type !== null) $type = trim($type);
|
if ($type !== null) $type = trim($type);
|
||||||
if ($type === null || $type === "null") {
|
if ($type === null || $type === "null") {
|
||||||
$nullable = true;
|
$nullable = true;
|
||||||
@ -151,10 +160,18 @@ abstract class Schema implements ArrayAccess {
|
|||||||
}
|
}
|
||||||
if ($type === "") throw SchemaException::invalid_type($type);
|
if ($type === "") throw SchemaException::invalid_type($type);
|
||||||
$type = cl::get(ref_types::ALIASES, $type, $type);
|
$type = cl::get(ref_types::ALIASES, $type, $type);
|
||||||
$types = array_merge($types, explode("|", $type));
|
if ($args === null) {
|
||||||
|
$unionTypes = array_merge($unionTypes, explode("|", $type));
|
||||||
|
} else {
|
||||||
|
$types = array_merge($types, [$type => $args]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!$types && !$unionTypes) throw SchemaException::invalid_schema("scalar: type is required");
|
||||||
|
foreach ($unionTypes as $type) {
|
||||||
|
if (!array_key_exists($type, $types)) {
|
||||||
|
$types[] = $type;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
if (!$types) throw SchemaException::invalid_schema("scalar: type is required");
|
|
||||||
$types = array_keys(array_fill_keys($types, true));
|
|
||||||
}
|
}
|
||||||
$definition["type"] = $types;
|
$definition["type"] = $types;
|
||||||
$definition["nullable"] = $nullable;
|
$definition["nullable"] = $nullable;
|
||||||
@ -224,7 +241,7 @@ abstract class Schema implements ArrayAccess {
|
|||||||
$types = $definition["type"];
|
$types = $definition["type"];
|
||||||
$nullable = $definition["nullable"];
|
$nullable = $definition["nullable"];
|
||||||
# s'il n'y a qu'une seul type, l'instancier tout de suite
|
# s'il n'y a qu'une seul type, l'instancier tout de suite
|
||||||
if (is_array($types) && count($types) == 1 && $types[0] !== null) {
|
if (is_array($types) && count($types) == 1 && cl::first($types) !== null) {
|
||||||
foreach ($types as $key => $name) {
|
foreach ($types as $key => $name) {
|
||||||
if ($key === 0) {
|
if ($key === 0) {
|
||||||
$args = null;
|
$args = null;
|
||||||
|
@ -5,19 +5,45 @@ use nulib\cl;
|
|||||||
use nulib\schema\_scalar\ScalarSchema;
|
use nulib\schema\_scalar\ScalarSchema;
|
||||||
use nulib\schema\Result;
|
use nulib\schema\Result;
|
||||||
use nulib\schema\Schema;
|
use nulib\schema\Schema;
|
||||||
|
use nulib\str;
|
||||||
|
|
||||||
class tarray extends _tstring {
|
class tarray extends _tstring {
|
||||||
const NAME = "array";
|
const NAME = "array";
|
||||||
|
|
||||||
const SPLIT_PATTERN = '/\s+/';
|
const TRIM = true;
|
||||||
const FORMAT = " ";
|
const NORM_NL = true;
|
||||||
|
|
||||||
|
const SEP_MAP = [
|
||||||
|
"space" => "spaces",
|
||||||
|
"lines" => "line",
|
||||||
|
];
|
||||||
|
const STD_SEPS = [
|
||||||
|
"spaces" => [" ", '/\s+/', true],
|
||||||
|
"line" => ["\n", "\n", false],
|
||||||
|
];
|
||||||
|
|
||||||
|
const DEFAULT_SEP = self::STD_SEPS["spaces"];
|
||||||
|
const DEFAULT_PARSE_SEP = self::DEFAULT_SEP[1];
|
||||||
|
const DEFAULT_FORMAT_SEP = self::DEFAULT_SEP[0];
|
||||||
|
|
||||||
public static function get_params_from_definition(?array $definition): ?array {
|
public static function get_params_from_definition(?array $definition): ?array {
|
||||||
$params = parent::get_params_from_definition($definition);
|
$params = parent::get_params_from_definition($definition);
|
||||||
$splitPattern = $definition["split_pattern"] ?? null;
|
$sep = $definition["sep"] ?? null;
|
||||||
if ($splitPattern !== null) $params["split_pattern"] = $splitPattern;
|
if ($sep !== null) {
|
||||||
$format = $definition["format"] ?? null;
|
if (!is_array($sep)) {
|
||||||
if ($format !== null) $params["format"] = $format;
|
$sep = cl::get(self::SEP_MAP, $sep, $sep);
|
||||||
|
$sep = self::STD_SEPS[$sep] ?? [$sep, $sep, false];
|
||||||
|
}
|
||||||
|
$params["parse_sep"] = $sep[1] ?? $sep[0];
|
||||||
|
$params["format_sep"] = $sep[0];
|
||||||
|
$params["trim"] ??= $sep[2] ?? static::TRIM;
|
||||||
|
$params["norm_nl"] ??= $sep[3] ?? static::NORM_NL;
|
||||||
|
} else {
|
||||||
|
$parseSep = $definition["parse_sep"] ?? null;
|
||||||
|
if ($parseSep !== null) $params["parse_sep"] = $parseSep;
|
||||||
|
$formatSep = $definition["format_sep"] ?? null;
|
||||||
|
if ($formatSep !== null) $params["format_sep"] = $formatSep;
|
||||||
|
}
|
||||||
return $params;
|
return $params;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,8 +69,9 @@ class tarray extends _tstring {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function parse(string $value) {
|
function parse(string $value) {
|
||||||
$pattern = $this->params["split_pattern"] ?? static::SPLIT_PATTERN;
|
$sep = $this->params["parse_sep"] ?? static::DEFAULT_PARSE_SEP;
|
||||||
return preg_split($pattern, $value);
|
if ($sep !== false) $value = str::split($sep, $value);
|
||||||
|
return $value;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -63,7 +90,7 @@ class tarray extends _tstring {
|
|||||||
|
|
||||||
function format($value, $format=null): string {
|
function format($value, $format=null): string {
|
||||||
if ($value === null) return "";
|
if ($value === null) return "";
|
||||||
$format ??= $this->params["format"] ?? static::FORMAT;
|
$format ??= $this->params["format"] ?? static::DEFAULT_FORMAT_SEP;
|
||||||
return implode($format, $value);
|
return implode($format, $value);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
56
tests/schema/types/arrayTest.php
Normal file
56
tests/schema/types/arrayTest.php
Normal file
@ -0,0 +1,56 @@
|
|||||||
|
<?php
|
||||||
|
namespace nulib\schema\types;
|
||||||
|
|
||||||
|
use nulib\schema\Schema;
|
||||||
|
use nur\t\TestCase;
|
||||||
|
|
||||||
|
class arrayTest extends TestCase {
|
||||||
|
function testSchema() {
|
||||||
|
$value = " first second ";
|
||||||
|
Schema::nw($value, null, "array");
|
||||||
|
self::assertSame(["first", "second"], $value);
|
||||||
|
|
||||||
|
$value = " first second ";
|
||||||
|
Schema::nw($value, null, [
|
||||||
|
"array", "sep" => "spaces",
|
||||||
|
]);
|
||||||
|
self::assertSame(["first", "second"], $value);
|
||||||
|
|
||||||
|
$value = " first second ";
|
||||||
|
Schema::nw($value, null, [
|
||||||
|
"array",
|
||||||
|
"sep" => "spaces", "trim" => false,
|
||||||
|
]);
|
||||||
|
self::assertSame(["", "first", "second", ""], $value);
|
||||||
|
|
||||||
|
$value = " first second ";
|
||||||
|
Schema::nw($value, null, [
|
||||||
|
"array",
|
||||||
|
"sep" => "line",
|
||||||
|
]);
|
||||||
|
self::assertSame([" first second "], $value);
|
||||||
|
|
||||||
|
$value = " first second ";
|
||||||
|
Schema::nw($value, null, [
|
||||||
|
"array",
|
||||||
|
"sep" => "line", "trim" => true,
|
||||||
|
]);
|
||||||
|
self::assertSame(["first second"], $value);
|
||||||
|
}
|
||||||
|
|
||||||
|
function testxxx() {
|
||||||
|
$value = " first second ";
|
||||||
|
Schema::nw($value, null, [
|
||||||
|
"array", "sep" => "spaces",
|
||||||
|
]);
|
||||||
|
self::assertSame(["first", "second"], $value);
|
||||||
|
|
||||||
|
# équivalent à...
|
||||||
|
$value = " first second ";
|
||||||
|
Schema::nw($value, null, [
|
||||||
|
"type" => ["array" => [["sep" => "spaces"]]],
|
||||||
|
"" => ["scalar"],
|
||||||
|
]);
|
||||||
|
self::assertSame(["first", "second"], $value);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user