jcb-compiler/src/8a2a3ee5-6ce2-4604-91e2-01f.../code.php

304 lines
7.4 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\ServiceProvider;
use VDM\Joomla\Componentbuilder\Compiler\Utilities\Indent;
/**
* Power Service Provider Builder of JCB
*
* @since 3.2.0
*/
final class ServiceProviderBuilder
{
/**
* The Search Class.
*
* @var Search
* @since 3.2.0
*/
protected Search $search;
/**
* The Service Provider Class.
*
* @var ServiceProvider
* @since 3.2.0
*/
protected ServiceProvider $serviceprovider;
/**
* Constructor.
*
* @param Search $search The Search Class.
* @param ServiceProvider $serviceprovider The Service Provider Class.
*
* @since 3.2.0
*/
public function __construct(Search $search, ServiceProvider $serviceprovider)
{
$this->search = $search;
$this->serviceprovider = $serviceprovider;
}
/**
* Get the service provider 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');
if (!empty($power['use_selection']))
{
$this->setRegisterLines($power['use_selection']);
$this->setGetFunctions($power['use_selection']);
}
return $this->getServiceProviderCode();
}
/**
* Set the class alias and share code for the service provider register.
*
* @param array $useSelections The use (in class) selections
*
* @return void
* @since 3.2.0
*/
private function setRegisterLines(array $useSelections): void
{
foreach ($useSelections as $use_selection)
{
if (!$this->valid($use_selection['use']))
{
continue;
}
if (($name = $this->getName($use_selection['use'], $use_selection['as'])) === null)
{
continue;
}
$function_name = $this->getFunctionName($name);
$alias = $this->getAlias($use_selection['use'], $name);
$this->setRegisterLine($name, $function_name, $alias);
}
}
/**
* Set the class get function for the service provider.
*
* @param array $useSelections The use (in class) selections
*
* @return void
* @since 3.2.0
*/
private function setGetFunctions(array $useSelections): void
{
foreach ($useSelections 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;
}
$function_name = $this->getFunctionName($name);
$dependencies = $this->getDependencies($use_selection['use']);
$this->setGetFunction($name, $function_name, "Get $description", $dependencies);
}
}
/**
* 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 function name.
*
* @param string $name The class name
*
* @return string
* @since 3.2.0
*/
private function getFunctionName(string $name): string
{
return "get{$name}";
}
/**
* Get the dependencies of a class
*
* @param string $guid The class GUID of the power
*
* @return array|null
* @since 3.2.0
*/
private function getDependencies(string $guid): ?array
{
return $this->search->dependencies($guid);
}
/**
* 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 class alias
*
* @param string $guid The class GUID of the power
* @param string $className The class name
*
* @return string
* @since 3.2.0
*/
private function getAlias(string $guid, string $className): string
{
return $this->search->alias($guid, $className);
}
/**
* Get the service provider code.
*
* @return string|null
* @since 3.2.0
*/
private function getServiceProviderCode(): ?string
{
return $this->serviceprovider->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->serviceprovider->setVersion($version);
}
/**
* Set the class alias and share code for the service provider register.
*
* @param string $className The variable name in lowerCamelCase format.
* @param string $functionName The function name in lowerCamelCase format.
* @param string $alias The variable alias format.
*
* @return void
* @since 3.2.0
*/
public function setRegisterLine(string $className, string $functionName, string $alias): void
{
$this->serviceprovider->setRegisterLine($className, $functionName, $alias);
}
/**
* Set the class get function for the service provider.
*
* @param string $className The variable name in lowerCamelCase format.
* @param string $functionName The function name in lowerCamelCase format.
* @param string $description The function description.
* @param array|null $dependencies The class dependencies aliases.
*
* @return void
* @since 3.2.0
*/
public function setGetFunction(string $className, string $functionName,
string $description, ?array $dependencies = null): void
{
$this->serviceprovider->setGetFunction($className, $functionName,
$description, $dependencies);
}
/**
* 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;
}
}