view src/Replacer/Replacer.php @ 21:f0b0d014e448 main-dev

Cleaning up code based on AI overlord review
author Luka Sitas <sitas.luka.97@gmail.com>
date Wed, 26 Feb 2025 19:45:08 -0500
parents 19b7a8de0019
children 827efbf4d73c
line wrap: on
line source

<?php

namespace Wizard\MagicForger\Replacer;

use Illuminate\Support\Str;

trait Replacer
{
    /**
     * Prefix and Suffix for controller.
     * Usage is up to the user.
     *
     * @var string
     */
    protected string $controller_prefix = '';

    /**
     * Prefix and Suffix for controller.
     * Usage is up to the user.
     *
     * @var string
     */
    protected string $controller_suffix = 'Controller';

    /**
     * Finds all places in a string that could be replaced.
     * Returns an array of all potential replacements as they appear in the target.
     *
     * @param string $target
     * @return array
     */
    public function get_all_keywords(string $target): array
    {
        // find all matches to our expected syntax
        $matches = [];
        preg_match_all('/{{[\sa-zA-Z\-_]+}}/', $target, $matches);
        // sort the array and return unique values
        sort($matches[0]);

        return array_values(array_unique($matches[0]));
    }

    /**
     * Apply replacements to the target string.
     *
     * @param string $target
     * @return string
     */
    public function apply_replacements(string $target): string
    {
        $inserts = $this->get_all_keywords($target);
        $available_replacements = $this->get_available_replacements();

        return str_replace(
            array_keys($available_replacements),
            $available_replacements,
            $target
        );
    }

    /**
     * Get available replacements for string replacements.
     *
     * @return array
     */
    public function get_available_replacements(): array
    {
        $table_name = $this->getTableInput();

        return [
            '{{ class }}' => $this->getClassName($table_name),
            '{{ controllerName }}' => $this->controller_name($table_name),
            '{{ model }}' => $this->model_name($table_name),
            '{{ modelVariable }}' => $this->model_variable($table_name),
            '{{ namespace }}' => $this->{'get' . $this->type . 'Namespace'}($table_name),
            '{{ namespacedModel }}' => $this->getNamespacedModel($table_name),
            '{{ requestUses }}' => $this->getRequestUses($table_name),
            '{{ rootNamespace }}' => $this->getRootNamespace(),
            '{{ storeRequest }}' => $this->store_request_name($table_name),
            '{{ tableName }}' => $table_name,
            '{{ updateRequest }}' => $this->update_request_name($table_name),
        ];
    }

    // Model and Controller Naming

    /**
     * Generate model name in Studly case.
     *
     * @param string $name
     * @return string
     */
    public function model_name(string $name): string
    {
        return Str::singular(Str::studly($name));
    }

    /**
     * Generate singular model variable name.
     *
     * @param string $name
     * @return string
     */
    public function model_variable(string $name): string
    {
        return Str::singular($name);
    }

    /**
     * Generate controller name using prefix/suffix and studly case.
     *
     * @param string $name
     * @return string
     */
    public function controller_name(string $name): string
    {
        return $this->controller_prefix .
            $this->model_name($name) .
            $this->controller_suffix;
    }

    /**
     * Generate the store request name.
     *
     * @param string $name
     * @return string
     */
    public function store_request_name(string $name): string
    {
        return 'Store' . $this->model_name($name) . 'Request';
    }

    /**
     * Generate the update request name.
     *
     * @param string $name
     * @return string
     */
    public function update_request_name(string $name): string
    {
        return 'Update' . $this->model_name($name) . 'Request';
    }

    // Namespace Methods
    // These methods handle the formation of various namespaces used within the replacements.

    /**
     * Get the root namespace for the application.
     *
     * @return string
     */
    public function getRootNamespace(): string
    {
        return $this->laravel->getNamespace();
    }

    /**
     * Get the model namespace.
     *
     * @param string $name
     * @return string
     */
    public function getModelNamespace(string $name = ''): string
    {
        return $this->getRootNamespace() . 'Models';
    }

    /**
     * Get the fully-qualified namespaced model class.
     *
     * @param string $name
     * @return string
     */
    public function getNamespacedModel(string $name = ''): string
    {
        return $this->getModelNamespace() . '\\' . $this->model_name($name);
    }

    /**
     * Get the controller namespace.
     *
     * @param string $name
     * @return string
     */
    public function getControllerNamespace(string $name = ''): string
    {
        return $this->getRootNamespace() . 'Http\\Controllers';
    }

    /**
     * Get the request namespace.
     *
     * @param string $name
     * @return string
     */
    public function getRequestNamespace(string $name): string
    {
        return $this->getRootNamespace() . 'Http\\Requests\\' . $this->model_name($name);
    }

    /**
     * Get the store request namespace.
     *
     * @param string $name
     * @return string
     */
    public function getStoreRequestNamespace(string $name): string
    {
        return $this->getRequestNamespace($name);
    }

    /**
     * Get the update request namespace.
     *
     * @param string $name
     * @return string
     */
    public function getUpdateRequestNamespace(string $name): string
    {
        return $this->getRequestNamespace($name);
    }

    /**
     * Get the request uses string for replacement.
     *
     * @param string $name
     * @return string
     */
    public function getRequestUses(string $name): string
    {
        return implode("\n", [
            'use ' . $this->getRequestNamespace($name) . '\\' . $this->store_request_name($name) . ';',
            'use ' . $this->getRequestNamespace($name) . '\\' . $this->update_request_name($name) . ';',
        ]);
    }

    // Text Manipulation

    /**
     * Convert a string to a human-readable format.
     * Assumes camel case input.
     *
     * @param string $name
     * @return string
     */
    public function human_readable(string $name): string
    {
        return Str::title(Str::replace('_', ' ', $name));
    }

    /**
     * Convert a string to a lowercase human-readable format.
     * Assumes camel case input.
     *
     * @param string $name
     * @return string
     */
    public function human_readable_lc(string $name): string
    {
        return Str::lower($this->human_readable($name));
    }
}