set($name, $default); } return $this; } public function get(string $key, mixed $default = null): mixed { return $this->parsed[$key] ?? $default; } public function set(string $key, mixed $value): self { $this->parsed[$key] = $value; return $this; } } readonly class argvParser { /** * @param array $options * @param array $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): argParsed|false { array_shift($argv); // shift the script name $parsed = (new argParsed())->initOptions($this->options); while (str_starts_with($argv[0] ?? '', '-')) { $option = substr($argv[0], 1); if ($this->options[$option]) { $parsed->set($option, true); } array_shift($argv); } if (count($argv) !== count($this->arguments)) { return false; } foreach ($this->arguments as $arg => $description) { $parsed->set($arg, array_shift($argv)); } return $parsed; } }