Skip to content

Commit

Permalink
Move factory make to circuit breaker
Browse files Browse the repository at this point in the history
  • Loading branch information
stfndamjanovic committed Jan 11, 2024
1 parent 383795e commit baf2b41
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 21 deletions.
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ composer require stfndamjanovic/php-circuit-breaker
## Usage

```php
use Stfn\CircuitBreaker\CircuitBreakerFactory;
use Stfn\CircuitBreaker\CircuitBreaker;
use Stfn\CircuitBreaker\Exceptions\CircuitHalfOpenFailException;

$factory = CircuitBreakerFactory::make()
$factory = CircuitBreaker::factory()
->for('3rd-party-api')
->failWhen(function ($result) {
if ($result->status > 400) {
Expand Down
8 changes: 8 additions & 0 deletions src/CircuitBreaker.php
Original file line number Diff line number Diff line change
Expand Up @@ -114,4 +114,12 @@ public function addListener(CircuitBreakerListener $listener)
{
$this->listeners[] = $listener;
}

/**
* @return CircuitBreakerFactory
*/
public static function factory()
{
return new CircuitBreakerFactory(new self());
}
}
23 changes: 10 additions & 13 deletions src/CircuitBreakerFactory.php
Original file line number Diff line number Diff line change
Expand Up @@ -6,62 +6,59 @@

class CircuitBreakerFactory
{
public CircuitBreaker $circuitBreaker;
public CircuitBreaker $breaker;

public static function make()
public function __construct(CircuitBreaker $breaker)
{
$object = new self();
$object->circuitBreaker = new CircuitBreaker();

return $object;
$this->breaker = $breaker;
}

public function for(string $service)
{
$this->circuitBreaker->storage->setService($service);
$this->breaker->storage->setService($service);

return $this;
}

public function withOptions(array $options): self
{
$this->circuitBreaker->config = Config::make($options);
$this->breaker->config = Config::make($options);

return $this;
}

public function withListeners(array $listeners): self
{
foreach ($listeners as $listener) {
$this->circuitBreaker->addListener($listener);
$this->breaker->addListener($listener);
}

return $this;
}

public function skipFailure(\Closure $closure)
{
$this->circuitBreaker->skipFailureCallback = $closure;
$this->breaker->skipFailureCallback = $closure;

return $this;
}

public function failWhen(\Closure $closure)
{
$this->circuitBreaker->failWhenCallback = $closure;
$this->breaker->failWhenCallback = $closure;

return $this;
}

public function storage(CircuitBreakerStorage $storage)
{
$this->circuitBreaker->storage = $storage;
$this->breaker->storage = $storage;

return $this;
}

public function call(\Closure $action, ...$args)
{
return $this->circuitBreaker->call($action, $args);
return $this->breaker->call($action, $args);
}
}
11 changes: 5 additions & 6 deletions tests/CircuitBreakerTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@

use PHPUnit\Framework\TestCase;
use Stfn\CircuitBreaker\CircuitBreaker;
use Stfn\CircuitBreaker\CircuitBreakerFactory;
use Stfn\CircuitBreaker\CircuitBreakerListener;
use Stfn\CircuitBreaker\CircuitState;
use Stfn\CircuitBreaker\Config;
Expand Down Expand Up @@ -184,7 +183,7 @@ public function onFail($exception): void
}
};

$factory = CircuitBreakerFactory::make()
$factory = CircuitBreaker::factory()
->withOptions(['failure_threshold' => 10])
->withListeners([$object]);

Expand Down Expand Up @@ -213,7 +212,7 @@ public function test_if_it_can_skip_some_exception()
{
$testException = new class () extends \Exception {};

$factory = CircuitBreakerFactory::make()
$factory = CircuitBreaker::factory()
->skipFailure(function (\Exception $exception) use ($testException) {
return $exception instanceof $testException;
});
Expand All @@ -222,12 +221,12 @@ public function test_if_it_can_skip_some_exception()
throw $testException;
});

$this->assertEquals(0, $factory->circuitBreaker->storage->getFailuresCount());
$this->assertEquals(0, $factory->breaker->storage->getFailuresCount());
}

public function test_if_it_can_fail_even_without_exception()
{
$factory = CircuitBreakerFactory::make()
$factory = CircuitBreaker::factory()
->failWhen(function ($result) {
if ($result instanceof \stdClass) {
throw new \Exception();
Expand All @@ -240,7 +239,7 @@ public function test_if_it_can_fail_even_without_exception()

}

$this->assertEquals(1, $factory->circuitBreaker->storage->getFailuresCount());
$this->assertEquals(1, $factory->breaker->storage->getFailuresCount());
}

// public function test_if_redis_work()
Expand Down

0 comments on commit baf2b41

Please sign in to comment.