You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.9 KiB
151 lines
4.9 KiB
<?php declare(strict_types = 1);
|
|
/*
|
|
* This file is part of PharIo\Manifest.
|
|
*
|
|
* (c) Arne Blankerts <arne@blankerts.de>, Sebastian Heuer <sebastian@phpeople.de>, Sebastian Bergmann <sebastian@phpunit.de>
|
|
*
|
|
* For the full copyright and license information, please view the LICENSE
|
|
* file that was distributed with this source code.
|
|
*/
|
|
namespace PharIo\Manifest;
|
|
|
|
use PharIo\Version\Exception as VersionException;
|
|
use PharIo\Version\Version;
|
|
use PharIo\Version\VersionConstraintParser;
|
|
|
|
class ManifestDocumentMapper {
|
|
public function map(ManifestDocument $document): Manifest {
|
|
try {
|
|
$contains = $document->getContainsElement();
|
|
$type = $this->mapType($contains);
|
|
$copyright = $this->mapCopyright($document->getCopyrightElement());
|
|
$requirements = $this->mapRequirements($document->getRequiresElement());
|
|
$bundledComponents = $this->mapBundledComponents($document);
|
|
|
|
return new Manifest(
|
|
new ApplicationName($contains->getName()),
|
|
new Version($contains->getVersion()),
|
|
$type,
|
|
$copyright,
|
|
$requirements,
|
|
$bundledComponents
|
|
);
|
|
} catch (VersionException $e) {
|
|
throw new ManifestDocumentMapperException($e->getMessage(), (int)$e->getCode(), $e);
|
|
} catch (Exception $e) {
|
|
throw new ManifestDocumentMapperException($e->getMessage(), (int)$e->getCode(), $e);
|
|
}
|
|
}
|
|
|
|
private function mapType(ContainsElement $contains): Type {
|
|
switch ($contains->getType()) {
|
|
case 'application':
|
|
return Type::application();
|
|
case 'library':
|
|
return Type::library();
|
|
case 'extension':
|
|
return $this->mapExtension($contains->getExtensionElement());
|
|
}
|
|
|
|
throw new ManifestDocumentMapperException(
|
|
\sprintf('Unsupported type %s', $contains->getType())
|
|
);
|
|
}
|
|
|
|
private function mapCopyright(CopyrightElement $copyright): CopyrightInformation {
|
|
$authors = new AuthorCollection();
|
|
|
|
foreach ($copyright->getAuthorElements() as $authorElement) {
|
|
$authors->add(
|
|
new Author(
|
|
$authorElement->getName(),
|
|
new Email($authorElement->getEmail())
|
|
)
|
|
);
|
|
}
|
|
|
|
$licenseElement = $copyright->getLicenseElement();
|
|
$license = new License(
|
|
$licenseElement->getType(),
|
|
new Url($licenseElement->getUrl())
|
|
);
|
|
|
|
return new CopyrightInformation(
|
|
$authors,
|
|
$license
|
|
);
|
|
}
|
|
|
|
private function mapRequirements(RequiresElement $requires): RequirementCollection {
|
|
$collection = new RequirementCollection();
|
|
$phpElement = $requires->getPHPElement();
|
|
$parser = new VersionConstraintParser;
|
|
|
|
try {
|
|
$versionConstraint = $parser->parse($phpElement->getVersion());
|
|
} catch (VersionException $e) {
|
|
throw new ManifestDocumentMapperException(
|
|
\sprintf('Unsupported version constraint - %s', $e->getMessage()),
|
|
(int)$e->getCode(),
|
|
$e
|
|
);
|
|
}
|
|
|
|
$collection->add(
|
|
new PhpVersionRequirement(
|
|
$versionConstraint
|
|
)
|
|
);
|
|
|
|
if (!$phpElement->hasExtElements()) {
|
|
return $collection;
|
|
}
|
|
|
|
foreach ($phpElement->getExtElements() as $extElement) {
|
|
$collection->add(
|
|
new PhpExtensionRequirement($extElement->getName())
|
|
);
|
|
}
|
|
|
|
return $collection;
|
|
}
|
|
|
|
private function mapBundledComponents(ManifestDocument $document): BundledComponentCollection {
|
|
$collection = new BundledComponentCollection();
|
|
|
|
if (!$document->hasBundlesElement()) {
|
|
return $collection;
|
|
}
|
|
|
|
foreach ($document->getBundlesElement()->getComponentElements() as $componentElement) {
|
|
$collection->add(
|
|
new BundledComponent(
|
|
$componentElement->getName(),
|
|
new Version(
|
|
$componentElement->getVersion()
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
return $collection;
|
|
}
|
|
|
|
private function mapExtension(ExtensionElement $extension): Extension {
|
|
try {
|
|
$versionConstraint = (new VersionConstraintParser)->parse($extension->getCompatible());
|
|
|
|
return Type::extension(
|
|
new ApplicationName($extension->getFor()),
|
|
$versionConstraint
|
|
);
|
|
} catch (VersionException $e) {
|
|
throw new ManifestDocumentMapperException(
|
|
\sprintf('Unsupported version constraint - %s', $e->getMessage()),
|
|
(int)$e->getCode(),
|
|
$e
|
|
);
|
|
}
|
|
}
|
|
}
|