Create seperate argv parser

This commit is contained in:
Tim 2025-03-19 00:19:54 +01:00
parent 61a4dcd370
commit 41bc3da4f0
2 changed files with 77 additions and 13 deletions

50
includes/argvParser.php Normal file
View File

@ -0,0 +1,50 @@
<?php
readonly class argvParser
{
/**
* @param array<string, string> $options
* @param array<string, string> $arguments
*/
public function __construct(
private array $options = [],
private array $arguments = [],
) {}
public function getOptionsHelp(): string
{
$line = '';
foreach ($this->options as $option => $description) {
$line .= sprintf('[-%s (%s)] ', $option, $description);
}
foreach ($this->arguments as $argument => $description) {
$line .= sprintf('<%s (%s)> ', $argument, $description);
}
return $line;
}
public function parseArgv(array $argv): false|array
{
array_shift($argv); // shift the script name
if (count($argv) === 0) {
return false;
}
$parsed = array_map(fn() => false, $this->options);
while (str_starts_with($argv[0], '-')) {
$option = substr($argv[0], 1);
if ($this->options[$option]) {
$parsed[$option] = true;
}
array_shift($argv);
}
if (count($argv) !== count($this->arguments)) {
return false;
}
foreach ($this->arguments as $arg => $description) {
$parsed[$arg] = array_shift($argv);
}
return $parsed;
}
}

View File

@ -5,29 +5,43 @@ include 'includes/fileReader.php';
include 'includes/io.php'; include 'includes/io.php';
include 'includes/includeBuilder.php'; include 'includes/includeBuilder.php';
include 'includes/includeParser.php'; include 'includes/includeParser.php';
include 'includes/argvParser.php';
if (count($argv) < 3) { // php://stdout
line('Usage: ' . __FILE__ . ' <inFile> <outFile>'); $argvParser = new ArgvParser(
['d' => 'Delete outFile'],
['inFile' => 'Input file', 'outFile' => 'Output file']
);
$parsed = $argvParser->parseArgv($argv);
if ($parsed === false) {
line('Usage: ' . __FILE__ . ' ' . $argvParser->getOptionsHelp());
exit(1); exit(1);
} }
$fromFile = $argv[1]; $inFile = $parsed['inFile'];
if (!file_exists($fromFile)) { if (!file_exists($inFile)) {
line('File not found: ' . $fromFile); line('File not found: ' . $inFile);
exit(1); exit(1);
} }
$toFile = $argv[2]; $outFile = $parsed['outFile'];
if (file_exists($toFile)) { if (file_exists($outFile)) {
line('File already exists: ' . $toFile); line('File already exists: ' . $outFile);
unlink($toFile); if ($parsed['d']) {
line('Deleting...');
unlink($outFile);
} else {
exit(1);
}
} }
$includes = []; $includes = [];
buildIncludes($fromFile, $includes); buildIncludes($inFile, $includes);
$lines = yieldIncludes($fromFile, $includes); var_dump($includes);
$lines = yieldIncludes($inFile, $includes);
$toFileHandle = fopen($toFile, 'w'); $toFileHandle = fopen($outFile, 'w');
foreach ($lines as $line) { foreach ($lines as $line) {
fwrite($toFileHandle, $line); fwrite($toFileHandle, $line);
chmod($toFile, fileperms($fromFile));
} }
chmod($outFile, fileperms($inFile));
fclose($toFileHandle); fclose($toFileHandle);