Skip to content

Commit

Permalink
feat(dumpers): Added mermaid dumper
Browse files Browse the repository at this point in the history
  • Loading branch information
yohang committed Jan 14, 2025
1 parent dd07204 commit 9c45600
Show file tree
Hide file tree
Showing 6 changed files with 84 additions and 9 deletions.
13 changes: 13 additions & 0 deletions src/Dumper/Dumper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace Finite\Dumper;

use Finite\State;

interface Dumper
{
/**
* @param enum-string<State> $stateEnum
*/
public function dump(string $stateEnum): string;
}
34 changes: 34 additions & 0 deletions src/Dumper/MermaidDumper.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
<?php

namespace Finite\Dumper;

use Finite\State;

class MermaidDumper implements Dumper
{
/**
* @param enum-string<State> $stateEnum
*/
public function dump(string $stateEnum): string
{
$output = [
'---',
'title: ' . $stateEnum,
'---',
'stateDiagram-v2',
];

foreach ($stateEnum::getTransitions() as $transition) {
foreach ($transition->getSourceStates() as $state) {
$output[] = sprintf(
' %s --> %s: %s',
$state->value,
$transition->getTargetState()->value,
$transition->getName()
);
}
}

return implode(PHP_EOL, $output);
}
}
6 changes: 3 additions & 3 deletions src/Transition/Transition.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,9 @@ class Transition implements TransitionInterface
{
public function __construct(
public readonly string $name,
/** @var State[] */
/** @var array<int,State&\BackedEnum> */
public readonly array $sourceStates,
public readonly State $targetState,
public readonly State&\BackedEnum $targetState,
/** @var array<string, string> */
public readonly array $properties = []
)
Expand All @@ -28,7 +28,7 @@ public function getSourceStates(): array
return $this->sourceStates;
}

public function getTargetState(): State
public function getTargetState(): State&\BackedEnum
{
return $this->targetState;
}
Expand Down
4 changes: 2 additions & 2 deletions src/Transition/TransitionInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -12,11 +12,11 @@
interface TransitionInterface
{
/**
* @return State[]
* @return array<int, \BackedEnum&State>
*/
public function getSourceStates(): array;

public function getTargetState(): State;
public function getTargetState(): State&\BackedEnum;

public function process(object $object): void;

Expand Down
29 changes: 29 additions & 0 deletions tests/Dumper/MermaidDumperTest.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
<?php

namespace Finite\Tests\Dumper;

use Finite\Dumper\MermaidDumper;
use Finite\Tests\E2E\SimpleArticleState;
use PHPUnit\Framework\TestCase;

class MermaidDumperTest extends TestCase
{
public function test_it_dumps(): void
{
$this->assertSame(
<<<MERMAID
---
title: Finite\Tests\E2E\SimpleArticleState
---
stateDiagram-v2
draft --> published: publish
reported --> published: clear
disabled --> published: clear
published --> reported: report
reported --> disabled: disable
published --> disabled: disable
MERMAID,
(new MermaidDumper)->dump(SimpleArticleState::class)
);
}
}
7 changes: 3 additions & 4 deletions tests/Transition/TransitionTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
namespace Finite\Tests\Transition;

use Finite\State;
use Finite\Tests\E2E\SimpleArticleState;
use Finite\Transition\Transition;
use PHPUnit\Framework\TestCase;

Expand All @@ -13,12 +14,10 @@ class TransitionTest extends TestCase

protected function setUp(): void
{
$targetState = $this->createMock(State::class);

$this->object = new Transition(
'name',
['source'],
$targetState,
[SimpleArticleState::DRAFT],
SimpleArticleState::PUBLISHED,
['property' => 'value', 'property2' => 'value2'],
);
}
Expand Down

0 comments on commit 9c45600

Please sign in to comment.