diff --git a/src/Schema/JsonDocument.php b/src/Schema/JsonDocument.php index f4b491f..fd5ad93 100644 --- a/src/Schema/JsonDocument.php +++ b/src/Schema/JsonDocument.php @@ -9,6 +9,8 @@ class JsonDocument { private bool $hasError = false; + /** @var callable */ + private $errorCallback; public function __construct( private ?JsonObject $jsonObject = null, @@ -77,6 +79,13 @@ public function error( } $this->hasError = true; + if(isset($this->errorCallback)) { + call_user_func($this->errorCallback, $message, $context); + } + } + + public function setErrorCallback(callable $callback):void { + $this->errorCallback = $callback; } /** diff --git a/test/phpunit/Schema/JsonDocumentTest.php b/test/phpunit/Schema/JsonDocumentTest.php index ecc7be5..9ad57f4 100644 --- a/test/phpunit/Schema/JsonDocumentTest.php +++ b/test/phpunit/Schema/JsonDocumentTest.php @@ -163,4 +163,33 @@ public function testError_disallowsSetAfterError():void { $sut->error("This is an error"); $sut->set("one", "example"); } + + public function testSetErrorCallback():void { + $calls = []; + $callback = function(string $message, ?array $context = null)use(&$calls):void { + array_push($calls, [$message, $context]); + }; + + $sut = new JsonDocument(); + $sut->setErrorCallback($callback); + + $sut->error("Test"); + self::assertCount(1, $calls); + self::assertSame("Test", $calls[0][0]); + self::assertNull($calls[0][1]); + } + + public function testSetErrorCallback_context():void { + $calls = []; + $callback = function(string $message, ?array $context = null)use(&$calls):void { + array_push($calls, [$message, $context]); + }; + + $sut = new JsonDocument(); + $sut->setErrorCallback($callback); + + $sut->error("Test", ["example" => "message"]); + self::assertCount(1, $calls); + self::assertSame(["example" => "message"], $calls[0][1]); + } }