edmondscommerce/doctrine-static-meta

View on GitHub
src/CodeGeneration/Generator/Field/IdTrait.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

declare(strict_types=1);

namespace EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\Field;

use EdmondsCommerce\DoctrineStaticMeta\CodeGeneration\Generator\FindAndReplaceHelper;
use LogicException;

class IdTrait
{
    public const ID_FIELD_TRAIT               = 1;
    public const INTEGER_ID_FIELD_TRAIT       = 2;
    public const NON_BINARY_UUID_TRAIT        = 4;
    public const UUID_FIELD_TRAIT             = 8;
    public const NON_ORDERED_UUID_FIELD_TRAIT = 16;
    /**
     * @var FindAndReplaceHelper
     */
    protected $findAndReplaceHelper;

    private $idTraitToUse = self::UUID_FIELD_TRAIT;

    public function __construct(FindAndReplaceHelper $findAndReplaceHelper)
    {
        $this->findAndReplaceHelper = $findAndReplaceHelper;
    }

    public function setIdTrait(int $type): void
    {
        switch ($type) {
            case self::ID_FIELD_TRAIT:
            case self::INTEGER_ID_FIELD_TRAIT:
            case self::NON_BINARY_UUID_TRAIT:
            case self::UUID_FIELD_TRAIT:
            case self::NON_ORDERED_UUID_FIELD_TRAIT:
                $this->idTraitToUse = $type;
                break;
            default:
                throw new LogicException("Unknown ID trait of $type given");
        }
    }

    public function updateEntity(string $filePath): void
    {
        if ($this->idTraitToUse === self::ID_FIELD_TRAIT) {
            return;
        }
        $useStatement = $this->getUseStatement();
        $this->findAndReplaceHelper->findReplace(
            'use DSM\Fields\Traits\PrimaryKey\IdFieldTrait;',
            $useStatement,
            $filePath
        );
    }

    private function getUseStatement(): string
    {
        switch ($this->idTraitToUse) {
            case self::ID_FIELD_TRAIT:
                $useStatement = 'use DSM\Fields\Traits\PrimaryKey\IdFieldTrait;';
                break;
            case self::INTEGER_ID_FIELD_TRAIT:
                $useStatement = 'use DSM\Fields\Traits\PrimaryKey\IntegerIdFieldTrait;';
                break;
            case self::NON_BINARY_UUID_TRAIT:
                $useStatement = 'use DSM\Fields\Traits\PrimaryKey\NonBinaryUuidFieldTrait;';
                break;
            case self::UUID_FIELD_TRAIT:
                $useStatement = 'use DSM\Fields\Traits\PrimaryKey\UuidFieldTrait;';
                break;
            case self::NON_ORDERED_UUID_FIELD_TRAIT:
                $useStatement = 'use DSM\Fields\Traits\PrimaryKey\NonOrderedUuidFieldTrait;';
                break;
            default:
                throw new LogicException('Unknown trait selected');
        }

        return $useStatement;
    }
}