From b95131b97c293b8abbadc4961b9629e4faa6f7d3 Mon Sep 17 00:00:00 2001 From: Mateusz Charytoniuk <mateusz.charytoniuk@protonmail.com> Date: Wed, 6 Mar 2024 19:33:40 +0100 Subject: [PATCH] chore: reference entire request in rpc messages --- README.md | 2 +- app/Template/StaticPageLayout/Turbo.php | 3 +++ .../docs/features/websockets/protocols.md | 2 +- docs/pages/index.md | 2 +- resources/css/docs-common.css | 23 ++++--------------- resources/css/docs-page-homepage.css | 2 +- src/Constraint/StringConstraint.php | 3 ++- src/Constraint/TupleConstraintTest.php | 15 ++++++++++++ src/ConstraintResult.php | 1 + src/ConstraintResultErrorMessage.php | 7 +++--- src/InputValidator/RPCMessageValidator.php | 3 +-- src/RPCResponse.php | 5 ++-- 12 files changed, 38 insertions(+), 30 deletions(-) diff --git a/README.md b/README.md index 69499896..520007af 100644 --- a/README.md +++ b/README.md @@ -70,7 +70,7 @@ final readonly class EchoResponder extends WebSocketRPCResponder RPCRequest $rpcRequest, ): void { $webSocketConnection->push(new RPCResponse( - $rpcRequest->requestId, + $rpcRequest, $rpcRequest->payload, )); } diff --git a/app/Template/StaticPageLayout/Turbo.php b/app/Template/StaticPageLayout/Turbo.php index b15cf247..0ed9d79e 100644 --- a/app/Template/StaticPageLayout/Turbo.php +++ b/app/Template/StaticPageLayout/Turbo.php @@ -73,6 +73,9 @@ abstract readonly class Turbo extends StaticPageLayout <meta name="turbo-refresh-method" content="morph"> <meta name="turbo-refresh-scroll" content="preserve"> <title>{$staticPage->frontMatter->title}</title> + <link rel="preconnect" href="https://fonts.googleapis.com"> + <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> + <link href="https://fonts.googleapis.com/css2?family=Noto+Sans+Mono:wght@100..900&family=Noto+Sans:ital,wght@0,100..900;1,100..900&family=Noto+Serif:ital,wght@0,100..900;1,100..900&display=swap" rel="stylesheet"> HTML; yield from $this->renderMeta($staticPage); yield $renderedPreloads; diff --git a/docs/pages/docs/features/websockets/protocols.md b/docs/pages/docs/features/websockets/protocols.md index a7026726..79763e44 100644 --- a/docs/pages/docs/features/websockets/protocols.md +++ b/docs/pages/docs/features/websockets/protocols.md @@ -90,7 +90,7 @@ final readonly class EchoResponder extends WebSocketRPCResponder RPCRequest $rpcRequest, ): void { $webSocketConnection->push(new RPCResponse( - $rpcRequest->requestId, + $rpcRequest, $rpcRequest->payload, )); } diff --git a/docs/pages/index.md b/docs/pages/index.md index f532ee2d..ea8919bf 100644 --- a/docs/pages/index.md +++ b/docs/pages/index.md @@ -164,7 +164,7 @@ final readonly class EchoResponder extends WebSocketRPCResponder RPCRequest $rpcRequest, ): void { $webSocketConnection->push(new RPCResponse( - $rpcRequest->requestId, + $rpcRequest, $rpcRequest->payload, )); } diff --git a/resources/css/docs-common.css b/resources/css/docs-common.css index d5072db9..dbc84f30 100644 --- a/resources/css/docs-common.css +++ b/resources/css/docs-common.css @@ -18,8 +18,8 @@ --color-tag-background: transparent; --color-tag-border: var(--color-body-font); --color-tag-font: var(--color-body-font); - --font-family-body: sans-serif; - --font-family-serif: Garamond, Georgia, serif; + --font-family-body: "Noto Sans", sans-serif; + --font-family-serif: "Noto Serif", Garamond, Georgia, serif; --font-family-monospace: monospace; --height-primary-navigation: 70px; --height-aside-filter: 70px; @@ -29,32 +29,19 @@ --z-index-documentation-aside-filter: 2; --z-index-primary-navigation: 3; --z-index-edit-on-github: 4; -} -@media screen and (max-width: 1023px) { - :root { + @media screen and (max-height: 1199px) { --font-size-base: 18px; --font-size-code: 16px; - --font-size-code-smaller: 14px; --font-size-smaller: 16px; } -} -@media screen and (min-width: 1024px) { - :root { + @media screen and (min-height: 1200px) { --font-size-base: 20px; --font-size-code: 18px; - --font-size-code-smaller: 18px; --font-size-smaller: 18px; } } -@media screen and (min-width: 2000px) { - :root { - --font-size-base: 22px; - --font-size-code: 18px; - --font-size-code-smaller: 18px; - --font-size-smaller: 20px; - } -} + ::-webkit-scrollbar { background-color: transparent; diff --git a/resources/css/docs-page-homepage.css b/resources/css/docs-page-homepage.css index 0d5e0735..80e4cec9 100644 --- a/resources/css/docs-page-homepage.css +++ b/resources/css/docs-page-homepage.css @@ -27,7 +27,7 @@ row-gap: 20px; } @media screen and (min-width: 1024px) { - row-gap: 120px; + row-gap: 60px; } } diff --git a/src/Constraint/StringConstraint.php b/src/Constraint/StringConstraint.php index 85936e32..1b69eea4 100644 --- a/src/Constraint/StringConstraint.php +++ b/src/Constraint/StringConstraint.php @@ -83,9 +83,10 @@ final readonly class StringConstraint extends Constraint protected function doValidate(mixed $notValidatedData, ConstraintPath $path): ConstraintResult { - if (!is_string($notValidatedData) || (!$this->isEmptyAllowed && empty($notValidatedData))) { + if (!is_string($notValidatedData) || (!$this->isEmptyAllowed && 0 === strlen($notValidatedData))) { return new ConstraintResult( castedData: $notValidatedData, + comment: 'Expected string, got '.gettype($notValidatedData), path: $path, reason: ConstraintReason::InvalidDataType, status: ConstraintResultStatus::Invalid, diff --git a/src/Constraint/TupleConstraintTest.php b/src/Constraint/TupleConstraintTest.php index 07a87ac0..11ad9521 100644 --- a/src/Constraint/TupleConstraintTest.php +++ b/src/Constraint/TupleConstraintTest.php @@ -13,6 +13,21 @@ use PHPUnit\Framework\TestCase; #[CoversClass(TupleConstraint::class)] final class TupleConstraintTest extends TestCase { + public function test_data_is_mapped(): void + { + $constraint = new TupleConstraint( + items: [ + new StringConstraint(), + new NumberConstraint(), + ] + ); + + $validatedResult = $constraint->validate(['hi', 5]); + + self::assertTrue($validatedResult->status->isValid()); + self::assertEquals(['hi', 5], $validatedResult->castedData); + } + public function test_is_converted_optionally_to_json_schema(): void { $constraint = new TupleConstraint( diff --git a/src/ConstraintResult.php b/src/ConstraintResult.php index 88a3c3d2..1853c0a7 100644 --- a/src/ConstraintResult.php +++ b/src/ConstraintResult.php @@ -17,6 +17,7 @@ readonly class ConstraintResult public ConstraintResultStatus $status, public ConstraintReason $reason, public array $nested = [], + public ?string $comment = null, ) {} /** diff --git a/src/ConstraintResultErrorMessage.php b/src/ConstraintResultErrorMessage.php index c5a60c19..4dcfce2f 100644 --- a/src/ConstraintResultErrorMessage.php +++ b/src/ConstraintResultErrorMessage.php @@ -19,10 +19,11 @@ readonly class ConstraintResultErrorMessage implements Stringable $message[] = sprintf('"%s" -> %s', $name, $errorCode); } - // var_dump($constraintResult->castedData); - $this->message = sprintf( - '%s', + '%s%s', + is_string($constraintResult->comment) + ? $constraintResult->comment.":\n" + : '', implode("\n", $message), ); } diff --git a/src/InputValidator/RPCMessageValidator.php b/src/InputValidator/RPCMessageValidator.php index 68cfd78c..49a731c4 100644 --- a/src/InputValidator/RPCMessageValidator.php +++ b/src/InputValidator/RPCMessageValidator.php @@ -11,7 +11,6 @@ use Distantmagic\Resonance\Constraint\AnyConstraint; use Distantmagic\Resonance\Constraint\EnumConstraint; use Distantmagic\Resonance\Constraint\StringConstraint; use Distantmagic\Resonance\Constraint\TupleConstraint; -use Distantmagic\Resonance\ConstraintStringFormat; use Distantmagic\Resonance\Feature; use Distantmagic\Resonance\InputValidatedData\RPCMessage; use Distantmagic\Resonance\InputValidator; @@ -46,7 +45,7 @@ readonly class RPCMessageValidator extends InputValidator items: [ new EnumConstraint($this->rpcMethodValidator->values()), new AnyConstraint(), - (new StringConstraint(format: ConstraintStringFormat::Uuid))->nullable(), + (new StringConstraint())->nullable(), ], ); } diff --git a/src/RPCResponse.php b/src/RPCResponse.php index a25f63fb..15d1a8e9 100644 --- a/src/RPCResponse.php +++ b/src/RPCResponse.php @@ -9,15 +9,16 @@ use Stringable; readonly class RPCResponse implements Stringable { public function __construct( - private string $requestId, + private RPCRequest $rpcRequest, private mixed $content, ) {} public function __toString(): string { return json_encode([ - $this->requestId, + $this->rpcRequest->method, $this->content, + $this->rpcRequest->requestId, ]); } } -- GitLab