Major refactoring cleanup: - Add new controller architecture (class-controller-*.php) - Add new settings-v2 UI (views/settings-v2/) - Add new CSS architecture (agentic-sidebar.css, tokens) - Add esbuild build pipeline (scripts/build.js, package.json) - Add composer dependencies (vendor/) - Add frontend src directory (assets/js/src/index.jsx) - Add documentation files - Remove old/obsolete files (class-settings.php, old CSS) This commits all pending changes from previous refactoring efforts.
94 lines
2.7 KiB
PHP
94 lines
2.7 KiB
PHP
<?php
|
|
|
|
/**
|
|
* League.Csv (https://csv.thephpleague.com)
|
|
*
|
|
* (c) Ignace Nyamagana Butera <nyamsprod@gmail.com>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace League\Csv\Serializer;
|
|
|
|
use ReflectionParameter;
|
|
use ReflectionProperty;
|
|
|
|
/**
|
|
* @implements TypeCasting<?string>
|
|
*/
|
|
final class CastToString implements TypeCasting
|
|
{
|
|
private readonly bool $isNullable;
|
|
private readonly Type $type;
|
|
private ?string $default = null;
|
|
private readonly TypeCastingInfo $variableName;
|
|
|
|
public function __construct(ReflectionProperty|ReflectionParameter $reflectionProperty)
|
|
{
|
|
[$this->type, $this->isNullable] = $this->init($reflectionProperty);
|
|
$this->variableName = TypeCastingInfo::fromAccessor($reflectionProperty);
|
|
}
|
|
|
|
public function info(): TypeCastingInfo
|
|
{
|
|
return $this->variableName;
|
|
}
|
|
|
|
public function setOptions(
|
|
?string $default = null,
|
|
bool $emptyStringAsNull = false,
|
|
): void {
|
|
$this->default = $default;
|
|
}
|
|
|
|
/**
|
|
* @throws TypeCastingFailed
|
|
*/
|
|
public function toVariable(mixed $value): ?string
|
|
{
|
|
$returnedValue = match (true) {
|
|
is_string($value) => $value,
|
|
$this->isNullable => $this->default,
|
|
default => throw TypeCastingFailed::dueToNotNullableType($this->type->value, info: $this->variableName),
|
|
};
|
|
|
|
return match (true) {
|
|
Type::Null->equals($this->type) && null !== $returnedValue => throw TypeCastingFailed::dueToInvalidValue(match (true) {
|
|
null === $value => 'null',
|
|
'' === $value => 'empty string',
|
|
default => $value,
|
|
}, $this->type->value, info: $this->variableName),
|
|
default => $returnedValue,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* @return array{0:Type, 1:bool}
|
|
*/
|
|
private function init(ReflectionProperty|ReflectionParameter $reflectionProperty): array
|
|
{
|
|
if (null === $reflectionProperty->getType()) {
|
|
return [Type::Mixed, true];
|
|
}
|
|
|
|
$type = null;
|
|
$isNullable = false;
|
|
foreach (Type::list($reflectionProperty) as $found) {
|
|
if (!$isNullable && $found[1]->allowsNull()) {
|
|
$isNullable = true;
|
|
}
|
|
|
|
if (null === $type && $found[0]->isOneOf(Type::String, Type::Mixed, Type::Null)) {
|
|
$type = $found;
|
|
}
|
|
}
|
|
|
|
null !== $type || throw throw MappingFailed::dueToTypeCastingUnsupportedType($reflectionProperty, $this, 'string', 'mixed', 'null');
|
|
|
|
return [$type[0], $isNullable];
|
|
}
|
|
}
|