Skip to content

Commit

Permalink
Merge pull request #5 from Chemaclass/apply-psalm-immutable
Browse files Browse the repository at this point in the history
Applying psalm immutable + psalm.level=1
  • Loading branch information
Chemaclass committed May 31, 2020
2 parents f27e952 + e671dd4 commit 6a73f4b
Show file tree
Hide file tree
Showing 23 changed files with 209 additions and 291 deletions.
54 changes: 29 additions & 25 deletions example.php
Expand Up @@ -3,6 +3,7 @@
declare(strict_types=1);

use EdifactParser\EdifactParser;

use EdifactParser\Segments\BGMBeginningOfMessage;
use EdifactParser\Segments\CNTControl;
use EdifactParser\Segments\DTMDateTimePeriod;
Expand All @@ -28,7 +29,7 @@
CNT+11:1:PCE'
RFF+CU:ValidationSet1'
TDT+20'
NAD+CZ+0410106314:160:Z12++Comany Returns Centre+c/o Carrier AB+City1++12345+DE'
NAD+CZ+0410106314:160:Z12++Company Centre+c/o Carrier AB+City1++12345+DE'
NAD+CN+++Person Name+Street Nr 2+City2++12345+DE'
CTA+IC+:Person Name'
COM+?+46980100:AL'
Expand All @@ -47,7 +48,7 @@
CNT+11:1:PCE'
RFF+CU:ValidationSet2'
TDT+20'
NAD+CZ+0410106314:160:Z12++Comany Returns Centre+c/o Carrier AB+City1++12345+DE'
NAD+CZ+0410106314:160:Z12++Company Returns+c/o Carrier AB+City1++12345+DE'
NAD+CN+++Person Name+Street Nr 2+City2++12345+DE'
CTA+IC+:Person Name'
COM+?+46980100:AL'
Expand All @@ -63,39 +64,42 @@

$transactionResult = EdifactParser::create()->parse($fileContent);

foreach ($transactionResult->messages() as $i => $message) {
foreach ($transactionResult as $i => $message) {
print "Message number: {$i}" . PHP_EOL;
printMessage($message);
print PHP_EOL;
}

function printMessage(TransactionMessage $message): void
function printMessage(TransactionMessage $section): void
{
$segments = $message->segments();

$unhSubSegmentKey = array_key_first($segments[UNHMessageHeader::class]);
printSegment($segments[UNHMessageHeader::class][$unhSubSegmentKey]);

printSegment($segments[BGMBeginningOfMessage::class]['340']);
printSegment($segments[DTMDateTimePeriod::class]['10']);
printSegment($segments[CNTControl::class]['7']);
printSegment($segments[CNTControl::class]['11']);
printSegment($segments[NADNameAddress::class]['CZ']);
printSegment($segments[MEADimensions::class]['WT']);
printSegment($segments[MEADimensions::class]['VOL']);
printSegment($segments[PCIPackageId::class]['18']);

$untSubSegmentKey = array_key_first($segments[UNTMessageFooter::class]);
printSegment($segments[UNTMessageFooter::class][$untSubSegmentKey]);
if (!$section->segmentByName(UNHMessageHeader::class)) {
print "No `UNHMessageHeader::class` segment was found \n";

return;
}

$unhSubSegmentKey = array_key_first($section->segmentByName(UNHMessageHeader::class));
printSegment($section->segmentByName(UNHMessageHeader::class)[$unhSubSegmentKey]);

printSegment($section->segmentByName(BGMBeginningOfMessage::class)['340']);
printSegment($section->segmentByName(DTMDateTimePeriod::class)['10']);
printSegment($section->segmentByName(CNTControl::class)['7']);
printSegment($section->segmentByName(CNTControl::class)['11']);
printSegment($section->segmentByName(NADNameAddress::class)['CZ']);
printSegment($section->segmentByName(MEADimensions::class)['WT']);
printSegment($section->segmentByName(MEADimensions::class)['VOL']);
printSegment($section->segmentByName(PCIPackageId::class)['18']);

$untSubSegmentKey = array_key_first($section->segmentByName(UNTMessageFooter::class));
printSegment($section->segmentByName(UNTMessageFooter::class)[$untSubSegmentKey]);
}

function printSegment(SegmentInterface $segment): void
{
print sprintf(
'%s - %s <= %s %s',
$segment->name(),
$segment->subSegmentKey(),
json_encode($segment->rawValues()),
PHP_EOL
"%s - %s <| %s \n",
str_pad($segment->name(), 44),
str_pad($segment->subSegmentKey(), 3),
json_encode($segment->rawValues())
);
}
1 change: 0 additions & 1 deletion psalm.xml
@@ -1,6 +1,5 @@
<?xml version="1.0"?>
<psalm
errorLevel="2"
resolveFromConfigFile="true"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="https://getpsalm.org/schema/config"
Expand Down
13 changes: 8 additions & 5 deletions src/EdifactParser.php
Expand Up @@ -6,9 +6,11 @@

use EDI\Parser;
use EdifactParser\Exception\InvalidFile;

use EdifactParser\Segments\SegmentFactory;
use EdifactParser\Segments\SegmentFactoryInterface;

/** @psalm-immutable */
final class EdifactParser
{
private SegmentFactoryInterface $segmentFactory;
Expand All @@ -23,12 +25,13 @@ private function __construct(SegmentFactoryInterface $segmentFactory)
$this->segmentFactory = $segmentFactory;
}

public function __invoke(string $fileContent): TransactionResult
/** @codeCoverageIgnore */
private function __clone()
{
return $this->parse($fileContent);
}

public function parse(string $fileContent): TransactionResult
/** @psalm-return list<TransactionMessage> */
public function parse(string $fileContent): array
{
$parser = new Parser($fileContent);
$errors = $parser->errors();
Expand All @@ -37,8 +40,8 @@ public function parse(string $fileContent): TransactionResult
throw InvalidFile::withErrors($errors);
}

$segmentedValues = SegmentedValues::factory($this->segmentFactory)->fromRaw($parser->get());
$segments = SegmentList::factory($this->segmentFactory)->fromRaw($parser->get());

return TransactionResult::fromSegmentedValues($segmentedValues);
return TransactionMessage::groupSegmentsByMessage(...$segments);
}
}
25 changes: 9 additions & 16 deletions src/SegmentedValues.php → src/SegmentList.php
Expand Up @@ -8,35 +8,28 @@
use EdifactParser\Segments\SegmentFactoryInterface;
use EdifactParser\Segments\SegmentInterface;

final class SegmentedValues
/** @psalm-immutable */
final class SegmentList
{
/** @psalm-var list<SegmentInterface> */
private array $list = [];

private SegmentFactoryInterface $segmentFactory;

/** @psalm-pure */
public static function factory(?SegmentFactoryInterface $segmentFactory = null): self
{
return new self($segmentFactory ?? new SegmentFactory());
}

public function __construct(SegmentFactoryInterface $segmentFactory)
private function __construct(SegmentFactoryInterface $segmentFactory)
{
$this->segmentFactory = $segmentFactory;
}

public function fromRaw(array $rawArrays): self
{
foreach ($rawArrays as $rawArray) {
$this->list[] = $this->segmentFactory->segmentFromArray($rawArray);
}

return $this;
}

/** @return SegmentInterface[] */
public function list(): array
public function fromRaw(array $rawArrays): array
{
return $this->list;
return array_map(
fn (array $raw) => $this->segmentFactory->segmentFromArray($raw),
$rawArrays
);
}
}
3 changes: 2 additions & 1 deletion src/Segments/BGMBeginningOfMessage.php
Expand Up @@ -4,6 +4,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
final class BGMBeginningOfMessage implements SegmentInterface
{
private array $rawValues;
Expand All @@ -20,7 +21,7 @@ public function name(): string

public function subSegmentKey(): string
{
return $this->rawValues[1];
return (string) $this->rawValues[1];
}

public function rawValues(): array
Expand Down
7 changes: 6 additions & 1 deletion src/Segments/CNTControl.php
Expand Up @@ -6,6 +6,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
final class CNTControl implements SegmentInterface
{
private array $rawValues;
Expand All @@ -22,7 +23,11 @@ public function name(): string

public function subSegmentKey(): string
{
return $this->rawValues[1][0];
if (!isset($this->rawValues[1][0])) {
throw new \Exception('missing sub segment key');
}

return (string) $this->rawValues[1][0];
}

public function rawValues(): array
Expand Down
7 changes: 6 additions & 1 deletion src/Segments/DTMDateTimePeriod.php
Expand Up @@ -4,6 +4,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
final class DTMDateTimePeriod implements SegmentInterface
{
private array $rawValues;
Expand All @@ -20,7 +21,11 @@ public function name(): string

public function subSegmentKey(): string
{
return $this->rawValues[1][0];
if (!isset($this->rawValues[1][0])) {
throw new \Exception('missing sub segment key');
}

return (string) $this->rawValues[1][0];
}

public function rawValues(): array
Expand Down
3 changes: 2 additions & 1 deletion src/Segments/MEADimensions.php
Expand Up @@ -6,6 +6,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
final class MEADimensions implements SegmentInterface
{
private array $rawValues;
Expand All @@ -22,7 +23,7 @@ public function name(): string

public function subSegmentKey(): string
{
return $this->rawValues[1];
return (string) $this->rawValues[1];
}

public function rawValues(): array
Expand Down
3 changes: 2 additions & 1 deletion src/Segments/NADNameAddress.php
Expand Up @@ -6,6 +6,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
final class NADNameAddress implements SegmentInterface
{
private array $rawValues;
Expand All @@ -22,7 +23,7 @@ public function name(): string

public function subSegmentKey(): string
{
return $this->rawValues[1];
return (string) $this->rawValues[1];
}

public function rawValues(): array
Expand Down
3 changes: 2 additions & 1 deletion src/Segments/PCIPackageId.php
Expand Up @@ -4,6 +4,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
final class PCIPackageId implements SegmentInterface
{
private array $rawValues;
Expand All @@ -20,7 +21,7 @@ public function name(): string

public function subSegmentKey(): string
{
return $this->rawValues[1];
return (string) $this->rawValues[1];
}

public function rawValues(): array
Expand Down
1 change: 1 addition & 0 deletions src/Segments/SegmentFactory.php
Expand Up @@ -4,6 +4,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
final class SegmentFactory implements SegmentFactoryInterface
{
public function segmentFromArray(array $rawArray): SegmentInterface
Expand Down
1 change: 1 addition & 0 deletions src/Segments/SegmentFactoryInterface.php
Expand Up @@ -4,6 +4,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
interface SegmentFactoryInterface
{
public function segmentFromArray(array $rawArray): SegmentInterface;
Expand Down
1 change: 1 addition & 0 deletions src/Segments/SegmentInterface.php
Expand Up @@ -4,6 +4,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
interface SegmentInterface
{
public function name(): string;
Expand Down
7 changes: 6 additions & 1 deletion src/Segments/UNHMessageHeader.php
Expand Up @@ -4,6 +4,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
final class UNHMessageHeader implements SegmentInterface
{
private array $rawValues;
Expand All @@ -20,7 +21,11 @@ public function name(): string

public function subSegmentKey(): string
{
return $this->rawValues[1][0];
if (!isset($this->rawValues[1][0])) {
throw new \Exception('missing sub segment key');
}

return (string) $this->rawValues[1][0];
}

public function rawValues(): array
Expand Down
3 changes: 2 additions & 1 deletion src/Segments/UNTMessageFooter.php
Expand Up @@ -4,6 +4,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
final class UNTMessageFooter implements SegmentInterface
{
private array $rawValues;
Expand All @@ -20,7 +21,7 @@ public function name(): string

public function subSegmentKey(): string
{
return $this->rawValues[1];
return (string) $this->rawValues[1];
}

public function rawValues(): array
Expand Down
1 change: 1 addition & 0 deletions src/Segments/UnknownSegment.php
Expand Up @@ -4,6 +4,7 @@

namespace EdifactParser\Segments;

/** @psalm-immutable */
final class UnknownSegment implements SegmentInterface
{
private array $rawValues;
Expand Down

0 comments on commit 6a73f4b

Please sign in to comment.