218 lines
8.1 KiB
PHP
218 lines
8.1 KiB
PHP
<?php
|
|
namespace nur\b\params;
|
|
|
|
use nur\A;
|
|
use nur\b\ValueException;
|
|
use nur\data\types\Metadata;
|
|
use nur\md;
|
|
use nur\php\Autogen;
|
|
use nur\prop;
|
|
use nur\str;
|
|
|
|
class parametrable_utils {
|
|
private static function get_pp_property(string $key): string {
|
|
return str::us2camel("pp_$key");
|
|
}
|
|
|
|
private static function get_pp_setter(string $key, ?Metadata $md=null) {
|
|
if ($md !== null) return "pp_".$md->getType($key)->getSetterName($key);
|
|
else return "pp_".prop::get_setter_name($key);
|
|
}
|
|
|
|
private static function get_getter(string $key, ?Metadata $md=null) {
|
|
if ($md !== null) return $md->getType($key)->getGetterName($key);
|
|
else return prop::get_getter_name($key);
|
|
}
|
|
|
|
private static function get_setter(string $key, ?Metadata $md=null) {
|
|
if ($md !== null) return $md->getType($key)->getSetterName($key);
|
|
else return prop::get_setter_name($key);
|
|
}
|
|
|
|
static function set_param(object $parametrable, string $key, $value, ?Metadata $md=null): void {
|
|
if ($md !== null) {
|
|
$property = self::get_pp_property($key);
|
|
$setter = self::get_pp_setter($key, $md);
|
|
prop::set($parametrable, $property, $value, $setter);
|
|
} else {
|
|
$property = self::get_pp_property($key);
|
|
$setter = self::get_pp_setter($key);
|
|
prop::set($parametrable, $property, $value, $setter);
|
|
}
|
|
}
|
|
|
|
static function set_defaults(?array $parametrables, IParametrable $defaultParametrable, $schema): void {
|
|
if ($schema === null) return;
|
|
if ($schema instanceof Metadata) {
|
|
$sfields = $schema->getSfields();
|
|
foreach ($sfields as $key => $sfield) {
|
|
$default = $sfield["default"];
|
|
if ($default !== null) {
|
|
$parametrable = A::get($parametrables, $key, $defaultParametrable);
|
|
self::set_param($parametrable, $key, $default, $schema);
|
|
}
|
|
}
|
|
} else {
|
|
md::normalize_schema($schema);
|
|
foreach ($schema as $key => $sfield) {
|
|
$default = $sfield["default"];
|
|
if ($default !== null) {
|
|
$parametrable = A::get($parametrables, $key, $defaultParametrable);
|
|
self::set_param($parametrable, $key, $default);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
static function set_params(?array $parametables, IParametrable $defaultParametrable, ?array $params, $schema): array {
|
|
if ($params === null || $schema === null) return [];
|
|
$modifiedKeys = [];
|
|
if ($schema instanceof Metadata) {
|
|
foreach ($schema->getKeys() as $key) {
|
|
if ($schema->has($params, $key)) {
|
|
$parametrable = A::get($parametables, $key, $defaultParametrable);
|
|
$value = $schema->get($params, $key);
|
|
self::set_param($parametrable, $key, $value, $schema);
|
|
$modifiedKeys[] = $key;
|
|
}
|
|
}
|
|
} else {
|
|
$indexes = md::normalize_schema($schema);
|
|
foreach (array_keys($schema) as $key) {
|
|
if (md::_has($params, $key, $schema, $indexes)) {
|
|
$parametrable = A::get($parametables, $key, $defaultParametrable);
|
|
$value = md::_get($params, $key, $schema, null, true, $indexes);
|
|
self::set_param($parametrable, $key, $value);
|
|
$modifiedKeys[] = $key;
|
|
}
|
|
}
|
|
}
|
|
return $modifiedKeys;
|
|
}
|
|
|
|
/** générer une liste de nom de méthodes pour les clés du schéma */
|
|
static function _auto_getters($schema, ?string $class=null): array {
|
|
$md = Metadata::with($schema);
|
|
$class_methods = get_class_methods($class);
|
|
$auto_setters = [];
|
|
foreach ($md->getKeys() as $key) {
|
|
$ppSetter = self::get_pp_setter($key, $md);
|
|
if ($class_methods !== null && in_array($ppSetter, $class_methods)) {
|
|
# ne pas générer de getter s'il existe un ppSetter
|
|
continue;
|
|
}
|
|
$method = self::get_getter($key, $md);
|
|
$auto_setters[$method] = $key;
|
|
}
|
|
return $auto_setters;
|
|
}
|
|
|
|
/** générer une liste de nom de méthodes pour les clés du schéma */
|
|
static function _auto_setters($schema): array {
|
|
$md = Metadata::with($schema);
|
|
$auto_setters = [];
|
|
foreach ($md->getKeys() as $key) {
|
|
$method = self::get_setter($key, $md);
|
|
$auto_setters[$method] = $key;
|
|
}
|
|
return $auto_setters;
|
|
}
|
|
|
|
/** générer une liste de signatures de méthodes getters pour les clés du schéma */
|
|
static function _autogen_methods_getters($schema, ?string $class=null): array {
|
|
$md = Metadata::with($schema);
|
|
$class_methods = get_class_methods($class);
|
|
$auto_getters = self::_auto_getters($md, $class);
|
|
$methods = [];
|
|
foreach ($auto_getters as $method => $key) {
|
|
if ($class_methods !== null && in_array($method, $class_methods)) continue;
|
|
$property = self::get_pp_property($key);
|
|
if (!property_exists($class, $property)) continue;
|
|
[$phpType, $returnType] = Autogen::fix_type($md->getType($key)->getPhpType());
|
|
$method .= "()";
|
|
if ($phpType !== null) $method = "$returnType $method";
|
|
$methods[] = $method;
|
|
}
|
|
return $methods;
|
|
}
|
|
|
|
/** générer une liste de signatures de méthodes setters pour les clés du schéma */
|
|
static function _autogen_methods_setters($schema, ?string $class=null): array {
|
|
$md = Metadata::with($schema);
|
|
$class_methods = get_class_methods($class);
|
|
$auto_setters = self::_auto_setters($md);
|
|
$methods = [];
|
|
foreach ($auto_setters as $method => $key) {
|
|
if ($class_methods !== null && in_array($method, $class_methods)) continue;
|
|
[$phpType, $returnType] = Autogen::fix_type($md->getType($key)->getPhpType());
|
|
if ($phpType !== null) $method .= "($phpType \$value)";
|
|
else $method .= "(\$value)";
|
|
if ($phpType !== null) $method = "$returnType $method";
|
|
$methods[] = $method;
|
|
}
|
|
return $methods;
|
|
}
|
|
|
|
/** vérifier si le nom de la méthode spécifiée est une méthode automatique */
|
|
static function should_call(string $name, ?array $auto_getters, ?array $auto_setters, $schema): bool {
|
|
$md = Metadata::with($schema);
|
|
|
|
if ($auto_setters === null) $auto_setters = self::_auto_setters($schema);
|
|
$key = A::get($auto_setters, $name);
|
|
if ($key !== null && $md->isKey($key)) return true;
|
|
|
|
if ($auto_getters === null) $auto_getters = self::_auto_getters($schema);
|
|
$key = A::get($auto_getters, $name);
|
|
if ($key !== null && $md->isKey($key)) return true;
|
|
|
|
return false;
|
|
}
|
|
|
|
/** appeler la méthode automatique spécifiée pour mettre à jour un paramètre */
|
|
static function call(IParametrable $parametrable, string $name, array $args, ?array $auto_getters, ?array $auto_setters, $schema) {
|
|
if ($auto_setters === null) $auto_setters = self::_auto_setters($schema);
|
|
$key = A::get($auto_setters, $name);
|
|
if ($key !== null) {
|
|
$schema = Metadata::with($schema);
|
|
$value = $schema->getType($key)->with(A::first($args));
|
|
$property = self::get_pp_property($key);
|
|
$setter = self::get_pp_setter($key, $schema);
|
|
$oldValue = prop::get($parametrable, $property);
|
|
prop::set($parametrable, $property, $value, $setter);
|
|
return $oldValue;
|
|
}
|
|
if ($auto_getters === null) $auto_getters = self::_auto_getters($schema);
|
|
$key = A::get($auto_getters, $name);
|
|
if ($key !== null) {
|
|
$property = self::get_pp_property($key);
|
|
return prop::get($parametrable, $property);
|
|
}
|
|
throw ValueException::invalid_value($name);
|
|
}
|
|
|
|
static function _autogen_literals($schema, ?string $class=null, bool $dynamicSchema=false): array {
|
|
$literals = [
|
|
[self::class, '\\nur\\b\\params\\parametrable_utils::class'],
|
|
];
|
|
if ($class !== null) $literals[] = [$class, "self::class"];
|
|
if (!$dynamicSchema) {
|
|
$literals[] = [$schema, "self::PARAMETRABLE_PARAMS_SCHEMA"];
|
|
}
|
|
return $literals;
|
|
}
|
|
static function _autogen_methods($schema, ?string $class=null): array {
|
|
return [
|
|
[self::class, "_autogen_methods_getters", $schema, $class],
|
|
[self::class, "_autogen_methods_setters", $schema, $class],
|
|
];
|
|
}
|
|
static function _AUTOGEN_CONSTS($schema, ?string $class=null, bool $dynamicSchema=false): array {
|
|
return [
|
|
"_AUTOGEN_LITERALS" => self::_autogen_literals($schema, $class, $dynamicSchema),
|
|
"_AUTOGEN_METHODS" => self::_autogen_methods($schema, $class),
|
|
"_AUTO_GETTERS" => self::_auto_getters($schema, $class),
|
|
"_AUTO_SETTERS" => self::_auto_setters($schema),
|
|
];
|
|
}
|
|
}
|