diff --git a/src/ncc/CLI/Management/ProjectMenu.php b/src/ncc/CLI/Management/ProjectMenu.php index ff83171..bb77bb0 100644 --- a/src/ncc/CLI/Management/ProjectMenu.php +++ b/src/ncc/CLI/Management/ProjectMenu.php @@ -23,6 +23,7 @@ namespace ncc\CLI\Management; use Exception; + use ncc\Enums\CompilerExtensions; use ncc\Enums\ProjectTemplates; use ncc\Enums\Scopes; use ncc\Managers\CredentialManager; @@ -102,7 +103,12 @@ if(isset($args['ext'])) { - $compiler_extension = $args['ext']; + $compiler_extension = CompilerExtensions::tryFrom($args['ext']); + if($compiler_extension === null) + { + Console::outError('Invalid compiler extension, please specify a valid compiler extension', true, 1); + return 1; + } } else { diff --git a/src/ncc/Managers/ProjectManager.php b/src/ncc/Managers/ProjectManager.php index 62800af..ebecf03 100644 --- a/src/ncc/Managers/ProjectManager.php +++ b/src/ncc/Managers/ProjectManager.php @@ -158,16 +158,16 @@ { $configuration = $this->project_configuration->getBuild()->getBuildConfiguration($build_configuration); - return match (strtolower($this->project_configuration->getProject()->getCompiler()->getExtension())) + return match ($this->project_configuration->getProject()->getCompiler()->getExtension()) { - CompilerExtensions::PHP->value => match (strtolower($configuration->getBuildType())) + CompilerExtensions::PHP => match (strtolower($configuration->getBuildType())) { BuildOutputType::NCC_PACKAGE->value => (new NccCompiler($this))->build($build_configuration, $options), BuildOutputType::EXECUTABLE->value => (new ExecutableCompiler($this))->build($build_configuration, $options), default => throw new BuildException(sprintf('php cannot produce the build type \'%s\'', $configuration->getBuildType())), }, - default => throw new NotSupportedException(sprintf('The compiler extension \'%s\' is not supported', $this->project_configuration->getProject()->getCompiler()->getExtension())), + default => throw new NotSupportedException(sprintf('The compiler extension \'%s\' is not supported', $this->project_configuration->getProject()->getCompiler()->getExtension()->value)), }; } @@ -361,7 +361,7 @@ * @param string $project_path The directory for the project to be initialized in * @param string $name The name of the project eg; ProjectLib * @param string $package The standard package name eg; com.example.project - * @param string $compiler The compiler to use for this project + * @param CompilerExtensions $extension The compiler to use for this project * @param array $options An array of options to use when initializing the project * @return ProjectManager * @throws ConfigurationException @@ -369,7 +369,7 @@ * @throws NotSupportedException * @throws PathNotFoundException */ - public static function initializeProject(string $project_path, string $name, string $package, string $compiler, array $options=[]): ProjectManager + public static function initializeProject(string $project_path, string $name, string $package, CompilerExtensions $extension, array $options=[]): ProjectManager { if(str_ends_with($project_path, DIRECTORY_SEPARATOR)) { @@ -416,7 +416,7 @@ $build->setDefaultConfiguration('release'); $project_configuration = new ProjectConfiguration( - new ProjectConfiguration\Project($compiler), + new ProjectConfiguration\Project($extension), new ProjectConfiguration\Assembly($name, $package), $build ); @@ -485,7 +485,7 @@ throw new IOException(sprintf('Project source directory "%s" was not created', $project_src)); } - $project = new ProjectConfiguration\Project(new ProjectConfiguration\Compiler(CompilerExtensions::PHP->value)); + $project = new ProjectConfiguration\Project(CompilerExtensions::PHP); $assembly = new ProjectConfiguration\Assembly( Resolver::composerName($composer_json->getName()), Resolver::composerNameToPackage($composer_json->getName()), diff --git a/src/ncc/Objects/ProjectConfiguration/Compiler.php b/src/ncc/Objects/ProjectConfiguration/Compiler.php index a118006..318a9da 100644 --- a/src/ncc/Objects/ProjectConfiguration/Compiler.php +++ b/src/ncc/Objects/ProjectConfiguration/Compiler.php @@ -44,40 +44,38 @@ /** * The compiler extension that the project uses * - * @var string + * @var CompilerExtensions */ - private $extension; + private CompilerExtensions $extension; /** * The minimum version that is supported * - * @var string + * @var string|null */ - private $minimum_version; + private ?string $minimum_version; /** * The maximum version that is supported * - * @var string + * @var string|null */ - private $maximum_version; + private ?string $maximum_version; /** * Compiler constructor. * - * @param string $extension + * @param CompilerExtensions $extension * @param string|null $minimum_version * @param string|null $maximum_version * @throws NotSupportedException */ - public function __construct(string $extension, ?string $minimum_version=null, ?string $maximum_version=null) + public function __construct(CompilerExtensions $extension, ?string $minimum_version=null, ?string $maximum_version=null) { - $extension = strtolower($extension); - /** @noinspection DegradedSwitchInspection */ switch($extension) { - case CompilerExtensions::PHP->value: + case CompilerExtensions::PHP: if($minimum_version === null) { @@ -92,7 +90,7 @@ break; default: - throw new NotSupportedException(sprintf('The compiler extension \'%s\' is not supported in ncc', $extension)); + throw new NotSupportedException(sprintf('The compiler extension \'%s\' is not supported in ncc', $extension->value)); } $this->extension = $extension; @@ -101,17 +99,18 @@ } /** - * @return string + * @return CompilerExtensions */ - public function getExtension(): string + public function getExtension(): CompilerExtensions { + // TODO: Update usages from here return $this->extension; } /** - * @param string $extension + * @param CompilerExtensions $extension */ - public function setExtension(string $extension): void + public function setExtension(CompilerExtensions $extension): void { $this->extension = $extension; } @@ -157,11 +156,6 @@ */ public function validate(): bool { - if($this->extension === null) - { - throw new ConfigurationException('The property \'extension\' must not be null.'); - } - if($this->minimum_version === null) { throw new ConfigurationException('The property \'minimum_version\' must not be null.'); @@ -184,11 +178,9 @@ throw new ConfigurationException('Version comparison failed: ' . $e->getMessage()); } - /** @noinspection InArrayMissUseInspection */ - // TODO: Fix this, not a proper use of cases() if(!in_array($this->extension, CompilerExtensions::cases(), true)) { - throw new NotSupportedException('The compiler extension \'' . $this->extension . '\' is not supported'); + throw new NotSupportedException('The compiler extension \'' . $this->extension->value . '\' is not supported'); } /** @noinspection DegradedSwitchInspection */ @@ -198,19 +190,19 @@ if(!in_array($this->maximum_version, CompilerExtensionSupportedVersions::PHP, true)) { - throw new NotSupportedException('The property "project.compiler.maximum_version" does not support version ' . $this->maximum_version . ' for the extension ' . $this->extension); + throw new NotSupportedException('The property "project.compiler.maximum_version" does not support version ' . $this->maximum_version . ' for the extension ' . $this->extension->value); } if(!in_array($this->minimum_version, CompilerExtensionSupportedVersions::PHP, true)) { - throw new NotSupportedException('The property "project.compiler.minimum_version" does not support version ' . $this->minimum_version . ' for the extension ' . $this->extension); + throw new NotSupportedException('The property "project.compiler.minimum_version" does not support version ' . $this->minimum_version . ' for the extension ' . $this->extension->value); } break; default: - throw new NotSupportedException('The compiler extension "' . $this->extension . '" is not supported by ncc'); + throw new NotSupportedException('The compiler extension "' . $this->extension->value . '" is not supported by ncc'); } return True; @@ -222,10 +214,7 @@ public function toArray(bool $bytecode = false): array { $results = []; - if($this->extension !== null && $this->extension !== '') - { - $results[($bytecode ? Functions::cbc('extension') : 'extension')] = $this->extension; - } + $results[($bytecode ? Functions::cbc('extension') : 'extension')] = $this->extension->value; if($this->minimum_version !== null && $this->minimum_version !== '') { diff --git a/src/ncc/Objects/ProjectConfiguration/Project.php b/src/ncc/Objects/ProjectConfiguration/Project.php index f708175..5246028 100644 --- a/src/ncc/Objects/ProjectConfiguration/Project.php +++ b/src/ncc/Objects/ProjectConfiguration/Project.php @@ -24,6 +24,7 @@ namespace ncc\Objects\ProjectConfiguration; + use ncc\Enums\CompilerExtensions; use ncc\Exceptions\ConfigurationException; use ncc\Exceptions\NotSupportedException; use ncc\Interfaces\BytecodeObjectInterface; @@ -52,17 +53,20 @@ /** * Public Constructor - * @param string|Compiler $compiler + * @param CompilerExtensions|Compiler $extension * @throws NotSupportedException */ - public function __construct(string|Compiler $compiler) + public function __construct(CompilerExtensions|Compiler $extension) { - if(is_string($compiler)) + if($extension instanceof Compiler) { - $compiler = new Compiler($compiler); + $this->compiler = $extension; + } + else + { + $this->compiler = new Compiler($extension); } - $this->compiler = $compiler; $this->options = []; } diff --git a/src/ncc/Objects/ProjectConfiguration/UpdateSource/Repository.php b/src/ncc/Objects/ProjectConfiguration/UpdateSource/Repository.php index e7d7ff8..ca8c119 100644 --- a/src/ncc/Objects/ProjectConfiguration/UpdateSource/Repository.php +++ b/src/ncc/Objects/ProjectConfiguration/UpdateSource/Repository.php @@ -24,6 +24,7 @@ namespace ncc\Objects\ProjectConfiguration\UpdateSource; + use ncc\Enums\Types\RepositoryType; use ncc\Exceptions\ConfigurationException; use ncc\Interfaces\BytecodeObjectInterface; use ncc\Utilities\Functions; @@ -40,7 +41,7 @@ /** * The type of client that is used to connect to the remote source * - * @var string|null + * @var RepositoryType|null */ private $type; @@ -58,7 +59,7 @@ */ private $ssl; - public function __construct(string $name, string $host, ?string $type=null, bool $ssl=false) + public function __construct(string $name, string $host, ?RepositoryType $type=null, bool $ssl=false) { $this->name = $name; $this->host = $host; @@ -83,17 +84,17 @@ } /** - * @return string|null + * @return RepositoryType|null */ - public function getType(): ?string + public function getType(): ?RepositoryType { return $this->type; } /** - * @param string|null $type + * @param RepositoryType|null $type */ - public function setType(?string $type): void + public function setType(?RepositoryType $type): void { $this->type = $type; } @@ -137,7 +138,8 @@ { return [ ($bytecode ? Functions::cbc('name') : 'name') => $this->name, - ($bytecode ? Functions::cbc('type') : 'type') => $this->type, + // TODO: Review the ? logic here to see if makes sense + ($bytecode ? Functions::cbc('type') : 'type') => ($this->type ? null : $this->type->value), ($bytecode ? Functions::cbc('host') : 'host') => $this->host, ($bytecode ? Functions::cbc('ssl') : 'ssl') => $this->ssl ]; @@ -150,7 +152,7 @@ public static function fromArray(array $data): Repository { $name = Functions::array_bc($data, 'name'); - $type = Functions::array_bc($data, 'type'); + $type = RepositoryType::tryFrom(Functions::array_bc($data, 'type')); $host = Functions::array_bc($data, 'host'); $ssl = Functions::array_bc($data, 'ssl') ?? false; diff --git a/src/ncc/Objects/RepositoryConfiguration.php b/src/ncc/Objects/RepositoryConfiguration.php index 8072f95..d74d46d 100644 --- a/src/ncc/Objects/RepositoryConfiguration.php +++ b/src/ncc/Objects/RepositoryConfiguration.php @@ -52,8 +52,7 @@ private $host; /** - * @var string - * @see RepositoryType + * @var RepositoryType */ private $type; @@ -100,11 +99,10 @@ /** * Returns the type of service ncc should use with this source (gitlab, github, etc...). - * - * @return string - * @see RepositoryType + * + * @return RepositoryType */ - public function getType(): string + public function getType(): RepositoryType { return $this->type; } @@ -175,13 +173,13 @@ */ public function fetchPackage(string $vendor, string $project, string $version=Versions::LATEST->value, ?AuthenticationType $authentication=null, array $options=[]): RepositoryResult { - return match(strtolower($this->type)) + return match($this->type) { - RepositoryType::GITHUB->value => GithubRepository::fetchPackage($this, $vendor, $project, $version, $authentication, $options), - RepositoryType::GITLAB->value => GitlabRepository::fetchPackage($this, $vendor, $project, $version, $authentication, $options), - RepositoryType::GITEA->value => GiteaRepository::fetchPackage($this, $vendor, $project, $version, $authentication, $options), - RepositoryType::PACKAGIST->value => throw new NotSupportedException('Fetching ncc packages from Packagist is not supported'), - default => throw new InvalidArgumentException(sprintf('Invalid repository type \'%s\'', $this->type)), + RepositoryType::GITHUB => GithubRepository::fetchPackage($this, $vendor, $project, $version, $authentication, $options), + RepositoryType::GITLAB => GitlabRepository::fetchPackage($this, $vendor, $project, $version, $authentication, $options), + RepositoryType::GITEA => GiteaRepository::fetchPackage($this, $vendor, $project, $version, $authentication, $options), + RepositoryType::PACKAGIST => throw new NotSupportedException('Fetching ncc packages from Packagist is not supported'), + default => throw new InvalidArgumentException(sprintf('Invalid repository type \'%s\'', $this->type->value)), }; } @@ -199,13 +197,13 @@ */ public function fetchSourceArchive(string $vendor, string $project, string $version=Versions::LATEST->value, ?AuthenticationType $authentication=null, array $options=[]): RepositoryResult { - return match(strtolower($this->type)) + return match($this->type) { - RepositoryType::GITHUB->value => GithubRepository::fetchSourceArchive($this, $vendor, $project, $version, $authentication, $options), - RepositoryType::GITLAB->value => GitlabRepository::fetchSourceArchive($this, $vendor, $project, $version, $authentication, $options), - RepositoryType::GITEA->value => GiteaRepository::fetchSourceArchive($this, $vendor, $project, $version, $authentication, $options), - RepositoryType::PACKAGIST->value => PackagistRepository::fetchSourceArchive($this, $vendor, $project, $version, $authentication, $options), - default => throw new InvalidArgumentException(sprintf('Invalid repository type \'%s\'', $this->type)), + RepositoryType::GITHUB => GithubRepository::fetchSourceArchive($this, $vendor, $project, $version, $authentication, $options), + RepositoryType::GITLAB => GitlabRepository::fetchSourceArchive($this, $vendor, $project, $version, $authentication, $options), + RepositoryType::GITEA => GiteaRepository::fetchSourceArchive($this, $vendor, $project, $version, $authentication, $options), + RepositoryType::PACKAGIST => PackagistRepository::fetchSourceArchive($this, $vendor, $project, $version, $authentication, $options), + default => throw new InvalidArgumentException(sprintf('Invalid repository type \'%s\'', $this->type->value)), }; } @@ -226,7 +224,7 @@ { return [ ($bytecode ? Functions::cbc('name') : 'name') => $this->name, - ($bytecode ? Functions::cbc('type') : 'type') => $this->type, + ($bytecode ? Functions::cbc('type') : 'type') => ($this->type ? null : $this->type->value), ($bytecode ? Functions::cbc('host') : 'host') => $this->host, ($bytecode ? Functions::cbc('ssl') : 'ssl') => $this->ssl ]; @@ -238,10 +236,15 @@ public static function fromArray(array $data): self { $name = Functions::array_bc($data, 'name'); - $type = Functions::array_bc($data, 'type'); + $type = RepositoryType::tryFrom(Functions::array_bc($data, 'type')); $host = Functions::array_bc($data, 'host'); $ssl = Functions::array_bc($data, 'ssl') ?? true; + if($type === null) + { + throw new InvalidArgumentException(sprintf("Unrecognized repository type %s", Functions::array_bc($data, 'type'))); + } + return new self($name, $host, $type, $ssl); } } \ No newline at end of file