summaryrefslogtreecommitdiff
path: root/vendor/phar-io/manifest/src/ManifestSerializer.php
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/phar-io/manifest/src/ManifestSerializer.php')
-rw-r--r--vendor/phar-io/manifest/src/ManifestSerializer.php168
1 files changed, 168 insertions, 0 deletions
diff --git a/vendor/phar-io/manifest/src/ManifestSerializer.php b/vendor/phar-io/manifest/src/ManifestSerializer.php
new file mode 100644
index 000000000..e236b5984
--- /dev/null
+++ b/vendor/phar-io/manifest/src/ManifestSerializer.php
@@ -0,0 +1,168 @@
+<?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\AnyVersionConstraint;
+use PharIo\Version\Version;
+use PharIo\Version\VersionConstraint;
+use XMLWriter;
+
+/** @psalm-suppress MissingConstructor */
+class ManifestSerializer {
+ /** @var XMLWriter */
+ private $xmlWriter;
+
+ public function serializeToFile(Manifest $manifest, string $filename): void {
+ \file_put_contents(
+ $filename,
+ $this->serializeToString($manifest)
+ );
+ }
+
+ public function serializeToString(Manifest $manifest): string {
+ $this->startDocument();
+
+ $this->addContains($manifest->getName(), $manifest->getVersion(), $manifest->getType());
+ $this->addCopyright($manifest->getCopyrightInformation());
+ $this->addRequirements($manifest->getRequirements());
+ $this->addBundles($manifest->getBundledComponents());
+
+ return $this->finishDocument();
+ }
+
+ private function startDocument(): void {
+ $xmlWriter = new XMLWriter();
+ $xmlWriter->openMemory();
+ $xmlWriter->setIndent(true);
+ $xmlWriter->setIndentString(\str_repeat(' ', 4));
+ $xmlWriter->startDocument('1.0', 'UTF-8');
+ $xmlWriter->startElement('phar');
+ $xmlWriter->writeAttribute('xmlns', 'https://phar.io/xml/manifest/1.0');
+
+ $this->xmlWriter = $xmlWriter;
+ }
+
+ private function finishDocument(): string {
+ $this->xmlWriter->endElement();
+ $this->xmlWriter->endDocument();
+
+ return $this->xmlWriter->outputMemory();
+ }
+
+ private function addContains(ApplicationName $name, Version $version, Type $type): void {
+ $this->xmlWriter->startElement('contains');
+ $this->xmlWriter->writeAttribute('name', $name->asString());
+ $this->xmlWriter->writeAttribute('version', $version->getVersionString());
+
+ switch (true) {
+ case $type->isApplication(): {
+ $this->xmlWriter->writeAttribute('type', 'application');
+
+ break;
+ }
+
+ case $type->isLibrary(): {
+ $this->xmlWriter->writeAttribute('type', 'library');
+
+ break;
+ }
+
+ case $type->isExtension(): {
+ $this->xmlWriter->writeAttribute('type', 'extension');
+ /* @var $type Extension */
+ $this->addExtension(
+ $type->getApplicationName(),
+ $type->getVersionConstraint()
+ );
+
+ break;
+ }
+
+ default: {
+ $this->xmlWriter->writeAttribute('type', 'custom');
+ }
+ }
+
+ $this->xmlWriter->endElement();
+ }
+
+ private function addCopyright(CopyrightInformation $copyrightInformation): void {
+ $this->xmlWriter->startElement('copyright');
+
+ foreach ($copyrightInformation->getAuthors() as $author) {
+ $this->xmlWriter->startElement('author');
+ $this->xmlWriter->writeAttribute('name', $author->getName());
+ $this->xmlWriter->writeAttribute('email', $author->getEmail()->asString());
+ $this->xmlWriter->endElement();
+ }
+
+ $license = $copyrightInformation->getLicense();
+
+ $this->xmlWriter->startElement('license');
+ $this->xmlWriter->writeAttribute('type', $license->getName());
+ $this->xmlWriter->writeAttribute('url', $license->getUrl()->asString());
+ $this->xmlWriter->endElement();
+
+ $this->xmlWriter->endElement();
+ }
+
+ private function addRequirements(RequirementCollection $requirementCollection): void {
+ $phpRequirement = new AnyVersionConstraint();
+ $extensions = [];
+
+ foreach ($requirementCollection as $requirement) {
+ if ($requirement instanceof PhpVersionRequirement) {
+ $phpRequirement = $requirement->getVersionConstraint();
+
+ continue;
+ }
+
+ if ($requirement instanceof PhpExtensionRequirement) {
+ $extensions[] = $requirement->asString();
+ }
+ }
+
+ $this->xmlWriter->startElement('requires');
+ $this->xmlWriter->startElement('php');
+ $this->xmlWriter->writeAttribute('version', $phpRequirement->asString());
+
+ foreach ($extensions as $extension) {
+ $this->xmlWriter->startElement('ext');
+ $this->xmlWriter->writeAttribute('name', $extension);
+ $this->xmlWriter->endElement();
+ }
+
+ $this->xmlWriter->endElement();
+ $this->xmlWriter->endElement();
+ }
+
+ private function addBundles(BundledComponentCollection $bundledComponentCollection): void {
+ if (\count($bundledComponentCollection) === 0) {
+ return;
+ }
+ $this->xmlWriter->startElement('bundles');
+
+ foreach ($bundledComponentCollection as $bundledComponent) {
+ $this->xmlWriter->startElement('component');
+ $this->xmlWriter->writeAttribute('name', $bundledComponent->getName());
+ $this->xmlWriter->writeAttribute('version', $bundledComponent->getVersion()->getVersionString());
+ $this->xmlWriter->endElement();
+ }
+
+ $this->xmlWriter->endElement();
+ }
+
+ private function addExtension(ApplicationName $applicationName, VersionConstraint $versionConstraint): void {
+ $this->xmlWriter->startElement('extension');
+ $this->xmlWriter->writeAttribute('for', $applicationName->asString());
+ $this->xmlWriter->writeAttribute('compatible', $versionConstraint->asString());
+ $this->xmlWriter->endElement();
+ }
+}