diff --git a/src/InputValidator.php b/src/InputValidator.php index 5ce18e3..0fa3e56 100644 --- a/src/InputValidator.php +++ b/src/InputValidator.php @@ -4,6 +4,8 @@ namespace Distantmagic\Resonance; +use LogicException; +use Opis\JsonSchema\Exceptions\ParseException; use Swoole\Http\Request; /** @@ -28,15 +30,28 @@ public function __construct(private JsonSchemaValidator $jsonSchemaValidator) $this->jsonSchema = $this->makeSchema(); } + public function getSchema(): JsonSchema + { + return $this->jsonSchema; + } + /** * @return InputValidationResult */ public function validateData(mixed $data): InputValidationResult { - /** - * @var JsonSchemaValidationResult - */ - $jsonSchemaValidationResult = $this->jsonSchemaValidator->validate($this->jsonSchema, $data); + try { + /** + * @var JsonSchemaValidationResult + */ + $jsonSchemaValidationResult = $this->jsonSchemaValidator->validate($this->jsonSchema, $data); + } catch (ParseException $parseException) { + throw new LogicException(sprintf( + 'JSON schema is invalid in: "%s" "%s"', + $this::class, + ), 0, $parseException); + } + $errors = $jsonSchemaValidationResult->errors; if (empty($errors)) { diff --git a/src/InputValidator/FrontMatterValidator.php b/src/InputValidator/FrontMatterValidator.php index 665f644..394cc3b 100644 --- a/src/InputValidator/FrontMatterValidator.php +++ b/src/InputValidator/FrontMatterValidator.php @@ -13,8 +13,8 @@ use Generator; /** - * @extends InputValidator, + * @extends InputValidator, * content_type: string, * description: string, * draft: bool, @@ -30,18 +30,18 @@ { protected function castValidatedData(mixed $data): FrontMatter { - $collections = iterator_to_array($this->normalizeDataCollections($data['collections'])); + $collections = iterator_to_array($this->normalizeDataCollections($data->collections)); return new FrontMatter( collections: $collections, - contentType: StaticPageContentType::from($data['content_type']), - description: trim($data['description']), - isDraft: $data['draft'], - layout: $data['layout'], - next: $data['next'] ?? null, - parent: $data['parent'] ?? null, - registerStylesheets: $data['register_stylesheets'], - title: trim($data['title']), + contentType: StaticPageContentType::from($data->content_type), + description: trim($data->description), + isDraft: $data->draft, + layout: $data->layout, + next: $data->next ?? null, + parent: $data->parent ?? null, + registerStylesheets: $data->register_stylesheets, + title: trim($data->title), ); } @@ -106,10 +106,8 @@ protected function makeSchema(): JsonSchema 'register_stylesheets' => [ 'type' => 'array', 'items' => [ - [ - 'type' => 'string', - 'minLength' => 1, - ], + 'type' => 'string', + 'minLength' => 1, ], 'default' => [], ], @@ -134,8 +132,8 @@ private function normalizeDataCollections(array $collections): Generator yield new FrontMatterCollectionReference($collection, null); } else { yield new FrontMatterCollectionReference( - $collection['name'], - $collection['next'], + $collection->name, + $collection->next, ); } } diff --git a/src/InputValidator/RPCMessageValidator.php b/src/InputValidator/RPCMessageValidator.php index fa595bc..3acf1f7 100644 --- a/src/InputValidator/RPCMessageValidator.php +++ b/src/InputValidator/RPCMessageValidator.php @@ -46,16 +46,13 @@ protected function makeSchema(): JsonSchema [ 'type' => 'string', 'enum' => $this->rpcMethodValidator->names(), - 'required' => true, ], [ - 'required' => true, ], [ 'type' => 'string', 'format' => 'uuid', 'nullable' => true, - 'required' => true, ], ], ]); diff --git a/src/SingletonProvider/ConfigurationProvider/StaticPageConfigurationProvider.php b/src/SingletonProvider/ConfigurationProvider/StaticPageConfigurationProvider.php index b5f87b6..02c121c 100644 --- a/src/SingletonProvider/ConfigurationProvider/StaticPageConfigurationProvider.php +++ b/src/SingletonProvider/ConfigurationProvider/StaticPageConfigurationProvider.php @@ -34,27 +34,22 @@ protected function makeSchema(): JsonSchema 'base_url' => [ 'type' => 'string', 'minLength' => 1, - 'required' => true, ], 'esbuild_metafile' => [ 'type' => 'string', 'minLength' => 1, - 'required' => true, ], 'input_directory' => [ 'type' => 'string', 'minLength' => 1, - 'required' => true, ], 'output_directory' => [ 'type' => 'string', 'minLength' => 1, - 'required' => true, ], 'sitemap' => [ 'type' => 'string', 'minLength' => 1, - 'required' => true, ], ], 'required' => ['base_url', 'esbuild_metafile', 'input_directory', 'output_directory', 'sitemap'],