Skip to content

Commit

Permalink
string filters can be used as class
Browse files Browse the repository at this point in the history
  • Loading branch information
MartkCz committed Dec 1, 2021
1 parent 7db6402 commit 63b8a95
Show file tree
Hide file tree
Showing 10 changed files with 165 additions and 70 deletions.
13 changes: 11 additions & 2 deletions src/Bridge/Gumlet/GumletLinkGenerator.php
Expand Up @@ -4,8 +4,11 @@

use Contributte\Imagist\Entity\EmptyImageInterface;
use Contributte\Imagist\Entity\PersistentImageInterface;
use Contributte\Imagist\Filter\Context\ContextFactory;
use Contributte\Imagist\Filter\Context\ContextFactoryInterface;
use Contributte\Imagist\Filter\FilterNormalizerInterface;
use Contributte\Imagist\Filter\StringFilter\StringFilterCollectionInterface;
use Contributte\Imagist\Filter\StringFilter\StringFilterFacade;
use Contributte\Imagist\LinkGeneratorInterface;
use Contributte\Imagist\PathInfo\PathInfoFactoryInterface;
use Contributte\Imagist\Resolver\DefaultImageResolverInterface;
Expand All @@ -31,6 +34,8 @@ final class GumletLinkGenerator implements LinkGeneratorInterface

private FilterNormalizerInterface $filterNormalizer;

private ?StringFilterCollectionInterface $stringFilterCollection;

private ContextFactoryInterface $contextFactory;

public function __construct(
Expand All @@ -40,7 +45,8 @@ public function __construct(
PathInfoFactoryInterface $pathInfoFactory,
DefaultImageResolverInterface $defaultImageResolver,
FilterNormalizerInterface $filterNormalizer,
ContextFactoryInterface $contextFactory
?StringFilterCollectionInterface $stringFilterCollection = null,
?ContextFactoryInterface $contextFactory = null
)
{
$this->bucket = $bucket;
Expand All @@ -49,7 +55,8 @@ public function __construct(
$this->pathInfoFactory = $pathInfoFactory;
$this->defaultImageResolver = $defaultImageResolver;
$this->filterNormalizer = $filterNormalizer;
$this->contextFactory = $contextFactory;
$this->stringFilterCollection = $stringFilterCollection;
$this->contextFactory = $contextFactory ?? new ContextFactory();

if (!$this->bucket && !$this->customDomain) {
throw new InvalidArgumentException('Bucket or customDomain must be set.');
Expand All @@ -66,6 +73,8 @@ public function setDomain(string $domain): void
*/
public function link(?PersistentImageInterface $image, array $options = []): ?string
{
$image = StringFilterFacade::resolveByNullableImage($this->stringFilterCollection, $image);

if (!$image || $image instanceof EmptyImageInterface) {
return $this->defaultImageResolver->resolve($this, $image, $options);
}
Expand Down
15 changes: 3 additions & 12 deletions src/Bridge/Nette/DI/ImageStorageConfigFiltersExtension.php
Expand Up @@ -2,14 +2,11 @@

namespace Contributte\Imagist\Bridge\Nette\DI;

use Contributte\Imagist\Filter\CompositeFilter;
use Contributte\Imagist\Filter\StringFilter\CompositeStringFilter;
use Contributte\Imagist\Filter\StringFilter\DynamicFilterFactory;
use Contributte\Imagist\Filter\StringFilter\StringFilterCollection;
use Contributte\Imagist\Filter\StringFilter\StringFilterCollectionInterface;
use Nette\DI\CompilerExtension;
use Nette\DI\ContainerBuilder;
use Nette\DI\Definitions\Definition;
use Nette\DI\Definitions\ServiceDefinition;
use Nette\DI\Definitions\Statement;
use Nette\Schema\Expect;
Expand Down Expand Up @@ -73,16 +70,10 @@ private function processFilters(array $statements, array $aliases): array
$statement = $this->processStatement($statement, $aliases);
}

if (is_string($name)) {
if ($statement->getEntity() === DynamicFilterFactory::class) {
if (!isset($statement->arguments[1])) {
$statement->arguments[1] = $name;
}
} else {
$statement = new Statement(CompositeFilter::class, [$name, $statement]);
}
} else {
if (!is_string($name)) {
$name = null;
} else if ($statement->getEntity() === DynamicFilterFactory::class && !isset($statement->arguments[1])) {
$statement->arguments[1] = $name;
}

$return[] = [$statement, $name];
Expand Down
32 changes: 4 additions & 28 deletions src/Bridge/Nette/Latte/LatteImageProvider.php
Expand Up @@ -6,7 +6,7 @@
use Contributte\Imagist\Entity\PersistentImage;
use Contributte\Imagist\Entity\PersistentImageInterface;
use Contributte\Imagist\Filter\FilterInterface;
use Contributte\Imagist\Filter\StringFilter\StringFilterCollectionInterface;
use Contributte\Imagist\Filter\StringFilter\StringFilter;
use Contributte\Imagist\LinkGeneratorInterface;
use LogicException;
use Nette\Utils\Arrays;
Expand All @@ -16,15 +16,9 @@ final class LatteImageProvider

private LinkGeneratorInterface $linkGenerator;

private ?StringFilterCollectionInterface $stringFilterCollection;

public function __construct(
LinkGeneratorInterface $linkGenerator,
?StringFilterCollectionInterface $stringFilterCollection = null
)
public function __construct(LinkGeneratorInterface $linkGenerator)
{
$this->linkGenerator = $linkGenerator;
$this->stringFilterCollection = $stringFilterCollection;
}

/**
Expand All @@ -48,33 +42,15 @@ public function link($id, array $options = []): ?string
if ($filter instanceof FilterInterface) {
$image = $image->withFilter($filter);
} else if (is_string($filter)) {
if (!$this->stringFilterCollection) {
throw new LogicException(
sprintf(
'Class %s have to be set if you want use string filters.',
StringFilterCollectionInterface::class
)
);
}

$image = $image->withFilter($this->stringFilterCollection->get($filter));
$image = $image->withFilter(new StringFilter($filter));
} else if (is_array($filter)) {
if (!$this->stringFilterCollection) {
throw new LogicException(
sprintf(
'Class %s have to be set if you want use string filters.',
StringFilterCollectionInterface::class
)
);
}

$first = Arrays::first($filter);

if (!$first) {
throw new LogicException('Filter cannot be an empty array.');
}

$image = $image->withFilter($this->stringFilterCollection->get($first, array_slice($filter, 1)));
$image = $image->withFilter(new StringFilter($first, array_slice($filter, 1)));
} else {
throw new LogicException(
sprintf(
Expand Down
15 changes: 3 additions & 12 deletions src/Filter/StringFilter/DynamicFilterFactory.php
Expand Up @@ -2,7 +2,6 @@

namespace Contributte\Imagist\Filter\StringFilter;

use Contributte\Imagist\Filter\CompositeFilter;
use Contributte\Imagist\Filter\FilterInterface;

/**
Expand All @@ -12,8 +11,6 @@
final class DynamicFilterFactory
{

private ?string $name;

/**
* @var class-string<T>
*/
Expand All @@ -22,24 +19,18 @@ final class DynamicFilterFactory
/**
* @param class-string<T> $className
*/
public function __construct(string $className, ?string $name = null)
public function __construct(string $className)
{
$this->className = $className;
$this->name = $name;
}

/**
* @param mixed[] $arguments
* @return T|DecorateDynamicFilter
* @return T
*/
public function create(array $arguments): FilterInterface
{
$filter = new ($this->className)(...$arguments);
if ($this->name) {
return new DecorateDynamicFilter($this->name, $filter, $arguments);
}

return $filter;
return new ($this->className)(...$arguments);
}

}
Expand Up @@ -7,39 +7,38 @@
use Contributte\Imagist\Filter\Operation\OperationInterface;

/**
* @internal
* @internal Use only in classes which implement StringFilterCollectionInterface
*/
final class DecorateDynamicFilter implements FilterInterface
final class ParsedStringFilter implements FilterInterface
{

private string $name;

private FilterInterface $filter;

/** @var mixed[] */
private array $arguments;

/** @var OperationInterface[] */
private array $operations;

/**
* @param mixed[] $arguments
* @param OperationInterface[] $operations
*/
public function __construct(string $name, FilterInterface $filter, array $arguments)
public function __construct(string $name, array $arguments, array $operations)
{
$this->name = $name;
$this->filter = $filter;
$this->arguments = $arguments;
$this->operations = $operations;
}

public function getIdentifier(): FilterIdentifier
{
return new FilterIdentifier($this->name, $this->arguments);
}

/**
* @return OperationInterface[]
*/
public function getOperations(): array
{
return $this->filter->getOperations();
return $this->operations;
}

}
54 changes: 54 additions & 0 deletions src/Filter/StringFilter/StringFilter.php
@@ -0,0 +1,54 @@
<?php declare(strict_types = 1);

namespace Contributte\Imagist\Filter\StringFilter;

use Contributte\Imagist\Filter\FilterIdentifier;
use Contributte\Imagist\Filter\FilterInterface;
use LogicException;

final class StringFilter implements FilterInterface
{

private string $name;

/** @var mixed[] */
private array $arguments;

/**
* @param mixed[] $arguments
*/
public function __construct(string $name, array $arguments = [])
{
$this->name = $name;
$this->arguments = $arguments;
}

public function getIdentifier(): FilterIdentifier
{
return new FilterIdentifier($this->name, $this->arguments);
}

public function getName(): string
{
return $this->name;
}

/**
* @return mixed[]
*/
public function getArguments(): array
{
return $this->arguments;
}

public function getOperations(): array
{
throw new LogicException(
sprintf(
'String filter is only case without operations. Please use %s to extract correct filter.',
StringFilterCollectionInterface::class,
)
);
}

}
8 changes: 3 additions & 5 deletions src/Filter/StringFilter/StringFilterCollection.php
Expand Up @@ -45,10 +45,8 @@ public function get(string $name, array $arguments = []): FilterInterface
}

if ($filter instanceof DynamicFilterFactory) {
return $filter->create($arguments);
}

if ($arguments) {
$filter = $filter->create($arguments);
} else if ($arguments) {
throw new LogicException(
sprintf(
'Cannot pass arguments to %s, passing arguments are allowed only for class of type %s.',
Expand All @@ -58,7 +56,7 @@ public function get(string $name, array $arguments = []): FilterInterface
);
}

return $filter;
return new ParsedStringFilter($name, $arguments, $filter->getOperations());
}

}
61 changes: 61 additions & 0 deletions src/Filter/StringFilter/StringFilterFacade.php
@@ -0,0 +1,61 @@
<?php declare(strict_types = 1);

namespace Contributte\Imagist\Filter\StringFilter;

use Contributte\Imagist\Entity\ImageInterface;
use Contributte\Imagist\Filter\FilterInterface;
use LogicException;

final class StringFilterFacade
{

public static function resolveByFilter(
?StringFilterCollectionInterface $collection,
FilterInterface $filter
): FilterInterface
{
if ($filter instanceof StringFilter) {
if (!$collection) {
throw new LogicException(
sprintf(
'Class %s have to be set if you want use string filters.',
StringFilterCollectionInterface::class
)
);
}

return $collection->get($filter->getName(), $filter->getArguments());
}

return $filter;
}

public static function resolveByImage(
?StringFilterCollectionInterface $collection,
ImageInterface $image
): ImageInterface
{
if ($filter = $image->getFilter()) {
return $image->withFilter(self::resolveByFilter($collection, $filter));
}

return $image;
}

public static function resolveByNullableImage(
?StringFilterCollectionInterface $collection,
?ImageInterface $image
): ?ImageInterface
{
if (!$image) {
return null;
}

if ($filter = $image->getFilter()) {
return $image->withFilter(self::resolveByFilter($collection, $filter));
}

return $image;
}

}

0 comments on commit 63b8a95

Please sign in to comment.