refactor: serialise and validate a configuration

...data object
This commit is contained in:
Oliver Davies 2023-04-07 20:00:25 +01:00
parent a6ff416012
commit e30929e69c
6 changed files with 325 additions and 117 deletions

View file

@ -6,12 +6,16 @@ declare(strict_types=1);
require __DIR__.'/../vendor/autoload.php';
use Illuminate\Support\{Arr, Collection};
use OliverDaviesLtd\BuildConfigs\ConfigurationData;
use OliverDaviesLtd\BuildConfigs\Enum\{Language, WebServer};
use OliverDaviesLtd\BuildConfigs\Validator\ConfigurationValidator;
use Silly\Application;
use Symfony\Component\Console\Style\SymfonyStyle;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\Validator\ConstraintViolationInterface;
use Symfony\Component\Serializer\Encoder\JsonEncoder;
use Symfony\Component\Serializer\NameConverter\CamelCaseToSnakeCaseNameConverter;
use Symfony\Component\Serializer\Normalizer\ObjectNormalizer;
use Symfony\Component\Serializer\Serializer;
use Symfony\Component\Validator\{ConstraintViolationInterface, Validation};
use Symfony\Component\Yaml\Yaml;
use Twig\Environment;
use Twig\Loader\FilesystemLoader;
@ -51,14 +55,20 @@ $app->command(
Yaml::parseFile($configFile),
);
$violations = (new ConfigurationValidator())->validate($configurationData);
// Convert the input to a configuration data object.
$normalizer = new ObjectNormalizer(null, new CamelCaseToSnakeCaseNameConverter());
$serializer = new Serializer([$normalizer], [new JsonEncoder()]);
$configurationDataObject = $serializer->deserialize(json_encode($configurationData), ConfigurationData::class, 'json');
$validator = Validation::createValidatorBuilder()->enableAnnotationMapping()->getValidator();
$violations = $validator->validate($configurationDataObject);
if (0 < $violations->count()) {
$io->error('Configuration is invalid.');
$io->listing(
collect($violations)
->map(fn (ConstraintViolationInterface $v) => "{$v->getInvalidValue()} - {$v->getMessage()}")
->map(fn (ConstraintViolationInterface $v) => "{$v->getPropertyPath()} - {$v->getMessage()}")
->toArray()
);