Skip to content

Commit

Permalink
Extract base class
Browse files Browse the repository at this point in the history
  • Loading branch information
Stratadox committed Jan 29, 2020
1 parent cb463cf commit b11a9d1
Show file tree
Hide file tree
Showing 3 changed files with 58 additions and 82 deletions.
43 changes: 2 additions & 41 deletions src/CondensedXmlFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,52 +3,13 @@
namespace Stratadox\RestResource;

use SimpleXMLElement;
use Throwable;
use function is_array;
use function is_numeric;
use function sprintf;
use function str_replace;

final class CondensedXmlFormatter implements ResourceFormatter
final class CondensedXmlFormatter extends XmlFormatter
{
use LinkRetrieval;

/** @var string */
private $baseUri;
/** @var Singularizer */
private $singularizer;

public function __construct(string $baseUri, Singularizer $singularizer = null)
{
$this->baseUri = $baseUri;
$this->singularizer = $singularizer ?: BoogieSingularizer::default();
}

public static function in(
string $locale,
string $baseUri
): ResourceFormatter {
return new self($baseUri, BoogieSingularizer::in($locale));
}

public function from(RestResource $resource): string
{
$xml = new SimpleXMLElement(sprintf(
'<?xml version="1.0"?><%s />',
$resource->name()
));
try {
$this->toSimpleXML(
$resource->body() + $this->linksOf($resource, $this->baseUri),
$xml
);
return (string) $xml->asXML();
} catch (Throwable $exception) {
throw CannotFormatXml::because($resource, $exception);
}
}

private function toSimpleXML(
protected function toSimpleXML(
array $input,
SimpleXMLElement $parent,
bool $alreadySingularized = false
Expand Down
43 changes: 2 additions & 41 deletions src/DefaultXmlFormatter.php
Original file line number Diff line number Diff line change
Expand Up @@ -3,54 +3,15 @@
namespace Stratadox\RestResource;

use SimpleXMLElement;
use Throwable;
use function htmlspecialchars;
use function is_array;
use function is_numeric;
use function sprintf;
use function str_replace;
use const ENT_XML1;

final class DefaultXmlFormatter implements ResourceFormatter
final class DefaultXmlFormatter extends XmlFormatter
{
use LinkRetrieval;

/** @var string */
private $baseUri;
/** @var Singularizer */
private $singularizer;

public function __construct(string $baseUri, Singularizer $singularizer = null)
{
$this->baseUri = $baseUri;
$this->singularizer = $singularizer ?: BoogieSingularizer::default();
}

public static function in(
string $locale,
string $baseUri
): ResourceFormatter {
return new self($baseUri, BoogieSingularizer::in($locale));
}

public function from(RestResource $resource): string
{
$xml = new SimpleXMLElement(sprintf(
'<?xml version="1.0"?><%s />',
$resource->name()
));
try {
$this->toSimpleXML(
$resource->body() + $this->linksOf($resource, $this->baseUri),
$xml
);
return (string) $xml->asXML();
} catch (Throwable $exception) {
throw CannotFormatXml::because($resource, $exception);
}
}

private function toSimpleXML(
protected function toSimpleXML(
array $input,
SimpleXMLElement $parent,
bool $alreadySingularized = false
Expand Down
54 changes: 54 additions & 0 deletions src/XmlFormatter.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
<?php declare(strict_types=1);

namespace Stratadox\RestResource;

use SimpleXMLElement;
use Throwable;
use function sprintf;

abstract class XmlFormatter implements ResourceFormatter
{
use LinkRetrieval;

/** @var string */
private $baseUri;
/** @var Singularizer */
protected $singularizer;

public function __construct(string $baseUri, Singularizer $singularizer = null)
{
$this->baseUri = $baseUri;
$this->singularizer = $singularizer ?: BoogieSingularizer::default();
}

public static function in(
string $locale,
string $baseUri
): ResourceFormatter {
return new static($baseUri, BoogieSingularizer::in($locale));
}

public function from(RestResource $resource): string
{
$xml = new SimpleXMLElement(sprintf(
'<?xml version="1.0"?><%s />',
$resource->name()
));
try {
$this->toSimpleXML(
$resource->body() + $this->linksOf($resource, $this->baseUri),
$xml
);
return (string) $xml->asXML();
} catch (Throwable $exception) {
throw CannotFormatXml::because($resource, $exception);
}
}

// @todo inject serializer instead
abstract protected function toSimpleXML(
array $input,
SimpleXMLElement $parent,
bool $alreadySingularized = false
): void;
}

0 comments on commit b11a9d1

Please sign in to comment.