Skip to content

Commit

Permalink
Added callback extractor.
Browse files Browse the repository at this point in the history
  • Loading branch information
jojo1981 committed Mar 6, 2020
1 parent f8cddf4 commit eb3dded
Show file tree
Hide file tree
Showing 5 changed files with 171 additions and 0 deletions.
39 changes: 39 additions & 0 deletions src/Builder/Extractor/CallbackExtractorBuilder.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
/*
* This file is part of the jojo1981/data-resolver package
*
* Copyright (c) 2020 Joost Nijhuis <jnijhuis81@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed in the root of the source code
*/
namespace Jojo1981\DataResolver\Builder\Extractor;

use Jojo1981\DataResolver\Builder\ExtractorBuilderInterface;
use Jojo1981\DataResolver\Extractor\CallbackExtractor;
use Jojo1981\DataResolver\Extractor\ExtractorInterface;

/**
* @package Jojo1981\DataResolver\Builder\Extractor
*/
class CallbackExtractorBuilder implements ExtractorBuilderInterface
{
/** @var callable */
private $callback;

/**
* @param callable $callback
*/
public function __construct(callable $callback)
{
$this->callback = $callback;
}

/**
* @return CallbackExtractor
*/
public function build(): ExtractorInterface
{
return new CallbackExtractor($this->callback);
}
}
12 changes: 12 additions & 0 deletions src/Builder/ResolverBuilder.php
Original file line number Diff line number Diff line change
Expand Up @@ -90,6 +90,18 @@ public function flatten(ResolverBuilder $resolverBuilder): self
return $result;
}

/**
* @param callable $callback
* @return $this
*/
public function callback(callable $callback): self
{
$result = clone $this;
$result->extractors[] = $this->extractorBuilderFactory->getCallbackExtractorBuilder($callback)->build();

return $result;
}

/**
* @param PredicateBuilderInterface $predicateBuilder
* @return Resolver
Expand Down
39 changes: 39 additions & 0 deletions src/Extractor/CallbackExtractor.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
<?php
/*
* This file is part of the jojo1981/data-resolver package
*
* Copyright (c) 2020 Joost Nijhuis <jnijhuis81@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed in the root of the source code
*/
namespace Jojo1981\DataResolver\Extractor;

use Jojo1981\DataResolver\Resolver\Context;
use function call_user_func;

/**
* @package Jojo1981\DataResolver\Extractor
*/
class CallbackExtractor implements ExtractorInterface
{
/** @var callable */
private $callback;

/**
* @param callable $callback
*/
public function __construct(callable $callback)
{
$this->callback = $callback;
}

/**
* @param Context $context
* @return mixed
*/
public function extract(Context $context)
{
return call_user_func($this->callback, $context->copy()->getData());
}
}
10 changes: 10 additions & 0 deletions src/Factory/ExtractorBuilderFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
namespace Jojo1981\DataResolver\Factory;

use Jojo1981\DataResolver\Builder\Extractor\AllExtractorBuilder;
use Jojo1981\DataResolver\Builder\Extractor\CallbackExtractorBuilder;
use Jojo1981\DataResolver\Builder\Extractor\CompositeExtractorBuilder;
use Jojo1981\DataResolver\Builder\Extractor\CountExtractorBuilder;
use Jojo1981\DataResolver\Builder\Extractor\HasPropertyExtractorBuilder;
Expand Down Expand Up @@ -128,6 +129,15 @@ public function getCountExtractorBuilder(): CountExtractorBuilder
return new CountExtractorBuilder($this->sequenceHandler);
}

/**
* @param callable $callback
* @return CallbackExtractorBuilder
*/
public function getCallbackExtractorBuilder(callable $callback): CallbackExtractorBuilder
{
return new CallbackExtractorBuilder($callback);
}

/**
* @return SumExtractorBuilder
*/
Expand Down
71 changes: 71 additions & 0 deletions tests/Extractor/CallbackExtractorTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
<?php
/*
* This file is part of the jojo1981/data-resolver package
*
* Copyright (c) 2020 Joost Nijhuis <jnijhuis81@gmail.com>
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed in the root of the source code
*/
namespace tests\Jojo1981\DataResolver\Extractor;

use Jojo1981\DataResolver\Extractor\CallbackExtractor;
use Jojo1981\DataResolver\Resolver\Context;
use PHPUnit\Framework\ExpectationFailedException;
use PHPUnit\Framework\TestCase;
use Prophecy\Exception\Doubler\ClassNotFoundException;
use Prophecy\Exception\Doubler\DoubleException;
use Prophecy\Exception\Doubler\InterfaceNotFoundException;
use Prophecy\Exception\Prophecy\ObjectProphecyException;
use Prophecy\Prophecy\ObjectProphecy;
use SebastianBergmann\RecursionContext\InvalidArgumentException;

/**
* @package tests\Jojo1981\DataResolver\Extractor
*/
class CallbackExtractorTest extends TestCase
{
/** @var ObjectProphecy|Context */
private $originalContext;

/** @var ObjectProphecy|Context */
private $copiedContext;

/**
* @throws DoubleException
* @throws InterfaceNotFoundException
* @throws ClassNotFoundException
* @return void
*/
protected function setUp(): void
{
$this->originalContext = $this->prophesize(Context::class);
$this->copiedContext = $this->prophesize(Context::class);
}


/**
* @test
*
* @throws InvalidArgumentException
* @throws ObjectProphecyException
* @throws ExpectationFailedException
* @return void
*/
public function extractShouldReturnTheResultFromTheCallback(): void
{
$this->originalContext->copy()->willReturn($this->copiedContext)->shouldBeCalled();
$this->originalContext->getData()->shouldNotBeCalled();
$this->copiedContext->getData()->willReturn('my-data')->shouldBeCalledOnce();

$invokerCounter = 0;
$callback = function (string $item) use (&$invokerCounter): string {
$this->assertEquals('my-data', $item);
$invokerCounter++;

return 'newResult';
};
$this->assertEquals('newResult', (new CallbackExtractor($callback))->extract($this->originalContext->reveal()));
$this->assertEquals(1, $invokerCounter);
}
}

0 comments on commit eb3dded

Please sign in to comment.