summaryrefslogtreecommitdiff
path: root/vendor/phar-io/manifest/src/ManifestDocumentMapper.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/phar-io/manifest/src/ManifestDocumentMapper.php')
-rw-r--r--vendor/phar-io/manifest/src/ManifestDocumentMapper.php150
1 files changed, 150 insertions, 0 deletions
diff --git a/vendor/phar-io/manifest/src/ManifestDocumentMapper.php b/vendor/phar-io/manifest/src/ManifestDocumentMapper.php
new file mode 100644
index 000000000..8e539d5f1
--- /dev/null
+++ b/vendor/phar-io/manifest/src/ManifestDocumentMapper.php
@@ -0,0 +1,150 @@
+<?php declare(strict_types = 1);
+/*
+ * This file is part of PharIo\Manifest.
+ *
+ * (c) Arne Blankerts <[email protected]>, Sebastian Heuer <[email protected]>, Sebastian Bergmann <[email protected]>
+ *
+ * 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
+ );
+ }
+ }
+}