jcb-compiler/src/9c2fdd98-ce4e-4b97-a2f8-ee6.../code.php

252 lines
5.6 KiB
PHP

<?php
/**
* @package Joomla.Component.Builder
*
* @created 4th September, 2022
* @author Llewellyn van der Merwe <https://dev.vdm.io>
* @git Joomla Component Builder <https://git.vdm.dev/joomla/Component-Builder>
* @copyright Copyright (C) 2015 Vast Development Method. All rights reserved.
* @license GNU General Public License version 2 or later; see LICENSE.txt
*/
namespace VDM\Joomla\Componentbuilder\Power\Generator;
use VDM\Joomla\Componentbuilder\Power\Generator\Search;
use VDM\Joomla\Componentbuilder\Power\Generator\ClassInjector;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
/**
* Power Class Injector Builder of JCB
*
* @since 3.2.0
*/
final class ClassInjectorBuilder
{
/**
* The Search Class.
*
* @var Search
* @since 3.2.0
*/
protected Search $search;
/**
* The Class Injector Class.
*
* @var ClassInjector
* @since 3.2.0
*/
protected ClassInjector $classinjector;
/**
* Constructor.
*
* @param Search $search The Search Class.
* @param ClassInjector $classinjector The Class Injector Class.
*
* @since 3.2.0
*/
public function __construct(Search $search, ClassInjector $classinjector)
{
$this->search = $search;
$this->classinjector = $classinjector;
}
/**
* Get the injection code.
*
* @param array $power The power being saved
*
* @return string|null
* @since 3.2.0
*/
public function getCode(array $power): ?string
{
$this->setVersion($this->extractSinceVersion($power['description']) ?? $power['power_version'] ?? '1.0.0');
foreach ($power['use_selection'] as $use_selection)
{
if (!$this->valid($use_selection['use']))
{
continue;
}
if (($name = $this->getName($use_selection['use'], $use_selection['as'])) === null)
{
continue;
}
if (($description = $this->getDescription($use_selection['use'])) === null)
{
continue;
}
$this->setProperty($name, $description);
$this->setComment($name, $description);
$this->setArgument($name);
$this->setAssignment($name);
}
return $this->getDependencyInjectionCode();
}
/**
* Check that this is a valid injection class.
*
* @param string $guid The class GUID of the power
*
* @return bool
* @since 3.2.0
*/
private function valid(string $guid): bool
{
return $this->search->validInject($guid);
}
/**
* Get the class name.
*
* @param string $guid The class GUID of the power
* @param string $as The as name
*
* @return string|null
* @since 3.2.0
*/
private function getName(string $guid, string $as = 'default'): ?string
{
return $this->search->name($guid, $as);
}
/**
* Get the class description.
*
* @param string $guid The class GUID of the power
*
* @return string|null
* @since 3.2.0
*/
private function getDescription(string $guid): ?string
{
return $this->search->description($guid);
}
/**
* Get the dependency injection code.
*
* @return string|null
* @since 3.2.0
*/
private function getDependencyInjectionCode(): ?string
{
return $this->classinjector->getCode();
}
/**
* Set the class since version.
*
* @param string $version The class since version
*
* @return void
* @since 3.2.0
*/
private function setVersion(string $version): void
{
$this->classinjector->setVersion($version);
}
/**
* Set the class property.
*
* @param string $name The class name
* @param string $description The class description
*
* @return void
* @since 3.2.0
*/
private function setProperty(string $name, string $description): void
{
$this->classinjector->setProperty(
strtolower($name),
$name,
$description
);
}
/**
* Set the class comment for the constructor parameter.
*
* @param string $name The class name
* @param string $description The class description
*
* @return void
* @since 3.2.0
*/
private function setComment(string $name, string $description): void
{
$this->classinjector->setComment(
strtolower($name),
$name,
$description
);
}
/**
* Set the class constructor argument.
*
* @param string $name The class name
*
* @return void
* @since 3.2.0
*/
private function setArgument(string $name): void
{
$this->classinjector->setArgument(
strtolower($name),
$name
);
}
/**
* Get the assignment code inside the constructor.
*
* @param string $name The class name
*
* @return void
* @since 3.2.0
*/
private function setAssignment(string $name): void
{
$this->classinjector->setAssignment(
strtolower($name)
);
}
/**
* Extract the '@since' version number from a given string.
*
* This function checks the provided string for a '@since' annotation
* and retrieves the subsequent version number. If no '@since'
* annotation is found or no version number is provided after the
* annotation, the function will return null.
*
* @param string $inputString The input string to search.
*
* @return string|null The version number if found, or null if not.
* @since 3.2.0
*/
private function extractSinceVersion(string $inputString): ?string
{
// Use regex to match the @since pattern and capture the version number
if (preg_match('/@since\s+([\d\.]+)/', $inputString, $matches))
{
return $matches[1];
}
// If no match is found, return null
return null;
}
}