modifs.mineures sans commentaires
This commit is contained in:
parent
8cbdf25372
commit
4a9eecbda8
@ -4,6 +4,7 @@ namespace nulib\app;
|
||||
use nulib\A;
|
||||
use nulib\cl;
|
||||
use nulib\cv;
|
||||
use nulib\file;
|
||||
use nulib\str;
|
||||
|
||||
class args {
|
||||
@ -71,17 +72,102 @@ class args {
|
||||
return $array;
|
||||
}
|
||||
|
||||
/**
|
||||
* convertir une liste d'arguments en tableau qui est utilisable comme un
|
||||
* filtre de base de données ou des données d'une requête REST. les arguments
|
||||
* peuvent être de la forme:
|
||||
* - "name=value"
|
||||
* qui devient dans le tableau ["name" => "value"]
|
||||
* - "+arg" ou "arg"
|
||||
* qui devient dans le tableau ["arg" => true]
|
||||
* - "-arg" ou "~arg"
|
||||
* qui est stocké dans le tableau $query ["arg" => false]
|
||||
*
|
||||
* si $allow_file == true, les formes d'arguments suivantes sont reconnues
|
||||
* aussi:
|
||||
* - "name=@file" (1 argument) OU
|
||||
* "name=@" "file" (2 arguments)
|
||||
* qui deviennent ["name" => new FileReader(file)]
|
||||
*/
|
||||
static function build_query(?array $args, bool $allow_file=true): ?array {
|
||||
$query = null;
|
||||
$args ??= [];
|
||||
$keys = array_keys($args);
|
||||
$index = 0;
|
||||
$count = count($keys);
|
||||
while ($index < $count) {
|
||||
$arg = $args[$keys[$index++]];
|
||||
[$name, $value] = str::split_pair($arg, "=");
|
||||
$checkType = true;
|
||||
if ($value === null) {
|
||||
if (str::del_prefix($name, "+")) {
|
||||
$value = true;
|
||||
} elseif (str::del_prefix($name, "-") || str::del_prefix($name, "~")) {
|
||||
$value = false;
|
||||
} else {
|
||||
$value = true;
|
||||
}
|
||||
} elseif ($allow_file) {
|
||||
if ($value === "@") {
|
||||
$value = $args[$keys[$index++]];
|
||||
$value = file::reader($value);
|
||||
$checkType = false;
|
||||
} elseif (substr($value, 0, 1) === "@") {
|
||||
$value = substr($value, 1);
|
||||
$value = file::reader($value);
|
||||
$checkType = false;
|
||||
}
|
||||
}
|
||||
if ($checkType) {
|
||||
if (str::del_suffix($name, ":int")) {
|
||||
if (str::del_suffix($name, ":array")) {
|
||||
$value = array_map([self::class, "tint"], self::tarray($value));
|
||||
} else {
|
||||
$value = self::tint($value);
|
||||
}
|
||||
} elseif (str::del_suffix($name, ":bool")) {
|
||||
if (str::del_suffix($name, ":array")) {
|
||||
$value = array_map([self::class, "tbool"], self::tarray($value));
|
||||
} else {
|
||||
$value = self::tbool($value);
|
||||
}
|
||||
} elseif (str::del_suffix($name, ":array")) {
|
||||
$value = self::tarray($value);
|
||||
if (str::del_suffix($name, ":int")) {
|
||||
$value = array_map([self::class, "tint"], $value);
|
||||
} elseif (str::del_suffix($name, ":bool")) {
|
||||
$value = array_map([self::class, "tbool"], $value);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (cl::has($query, $name)) {
|
||||
A::ensure_array($query[$name]);
|
||||
$query[$name][] = $value;
|
||||
} else {
|
||||
$query[$name] = $value;
|
||||
}
|
||||
}
|
||||
return $query;
|
||||
}
|
||||
|
||||
/**
|
||||
* convertir une liste d'arguments de façon qu'ils soient utilisables pour un
|
||||
* appel de méthode. les arguments peuvent être de la forme:
|
||||
* - "name=value"
|
||||
* qui est stocké dans le tableau $query ["name" => "value"]
|
||||
* il est possible de forcer le type de la valeur avec l'un des suffixes
|
||||
* :int, :bool ou :array, e.g
|
||||
* un entier: "name:int=42"
|
||||
* un tableau de chaines: "name:array=a,b,c"
|
||||
* un tableau d'entiers: "name:array:int=1,2,3"
|
||||
* - "+arg"
|
||||
* qui est stocké dans le tableau $query ["arg" => true]
|
||||
* - "-arg" ou "~arg"
|
||||
* qui est stocké dans le tableau $query ["arg" => false]
|
||||
* - "array:sval,key:aval,..."
|
||||
* qui devient l'argument ["sval", "key" => "aval", ...]
|
||||
* il est possible de forcer le types des éléments avec le préfixe int: ou
|
||||
* bool: e.g "array:int:1,2,3"
|
||||
* - "int:value"
|
||||
* qui devient l'argument intval("value")
|
||||
* - "bool:value"
|
||||
|
@ -24,6 +24,27 @@ class argsTest extends TestCase {
|
||||
self::assertSame(["x", "1", "2", "3", "y"], args::from_array(["x", [1, 2, 3], "y"]));
|
||||
}
|
||||
|
||||
function testBuild_query() {
|
||||
self::assertSame(null, args::build_query(null));
|
||||
self::assertSame(null, args::build_query([]));
|
||||
|
||||
self::assertSame(["a" => true], args::build_query(["a"]));
|
||||
self::assertSame(["a" => true], args::build_query(["+a"]));
|
||||
self::assertSame(["a" => false], args::build_query(["-a"]));
|
||||
self::assertSame(["a" => false], args::build_query(["~a"]));
|
||||
self::assertSame(["x" => "a"], args::build_query(["x=a"]));
|
||||
self::assertSame(["x" => 0], args::build_query(["x:int=0"]));
|
||||
self::assertSame(["x" => 42], args::build_query(["x:int=42"]));
|
||||
self::assertSame(["x" => false], args::build_query(["x:bool=0"]));
|
||||
self::assertSame(["x" => true], args::build_query(["x:bool=42"]));
|
||||
self::assertSame(["x" => ["a", "b"]], args::build_query(["x:array=a,b"]));
|
||||
self::assertSame(["x" => [0, 42]], args::build_query(["x:array:int=0,42"]));
|
||||
self::assertSame(["x" => [0, 42]], args::build_query(["x:int:array=0,42"]));
|
||||
|
||||
self::assertSame(["x" => "a", "y" => "b"], args::build_query(["x=a", "y=b"]));
|
||||
self::assertSame(["x" => ["a", "b"]], args::build_query(["x=a", "x=b"]));
|
||||
}
|
||||
|
||||
function testBuild_method_args() {
|
||||
self::assertSame([], args::build_method_args(null));
|
||||
self::assertSame([], args::build_method_args([]));
|
||||
@ -67,5 +88,7 @@ class argsTest extends TestCase {
|
||||
self::assertSame([["x" => [0, 42]]], args::build_method_args(["x:int:array=0,42"]));
|
||||
|
||||
self::assertSame([["x" => "a", "y" => "b"], "a", "b"], args::build_method_args(["x=a", "a", "y=b", "b"]));
|
||||
|
||||
self::assertSame([["x" => ["a", "b"]]], args::build_method_args(["x=a", "x=b"]));
|
||||
}
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user