3 namespace pharext\Cli\Args
;
11 function __construct($prog, Args
$args) {
16 function __toString() {
17 $usage = "Usage:\n\n \$ ";
18 $usage .= $this->prog
;
20 list($flags, $required, $optional, $positional) = $this->listSpec();
22 $usage .= $this->dumpFlags($flags);
25 $usage .= $this->dumpRequired($required);
28 $usage .= $this->dumpOptional($optional);
31 $usage .= $this->dumpPositional($positional);
34 $help = $this->dumpHelp($positional);
36 return $usage . "\n\n" . $help . "\n";
44 foreach ($this->args
->getSpec() as $spec) {
45 if (is_numeric($spec[0])) {
46 $positional[] = $spec;
47 } elseif ($spec[3] & Args
::REQARG
) {
48 if ($spec[3] & Args
::REQUIRED
) {
58 return [$flags, $required, $optional, $positional]
59 +
compact("flags", "required", "optional", "positional");
62 function dumpFlags(array $flags) {
63 return sprintf(" [-%s]", implode("", array_column($flags, 0)));
66 function dumpRequired(array $required) {
68 foreach ($required as $req) {
69 $dump .= sprintf(" -%s <%s>", $req[0], $req[1]);
74 function dumpOptional(array $optional) {
75 return sprintf(" [-%s <arg>]", implode("|-", array_column($optional, 0)));
78 function dumpPositional(array $positional) {
80 foreach ($positional as $pos) {
81 if ($pos[3] & Args
::MULTI
) {
86 if ($pos[3] & Args
::REQUIRED
) {
87 $dump .= sprintf(" <%s%s>", $pos[1], $multi);
89 $dump .= sprintf(" [%s%s]", $pos[1], $multi);
95 function calcMaxLen() {
96 $spc = $this->args
->getSpec();
97 $max = max(array_map("strlen", array_column($spc, 1)));
102 function dumpHelp() {
103 $max = $this->calcMaxLen();
106 foreach ($this->args
->getSpec() as $spec) {
108 if (is_numeric($spec[0])) {
109 $dump .= sprintf("-- %s ", $spec[1]);
110 } elseif (isset($spec[0])) {
111 $dump .= sprintf("-%s|", $spec[0]);
113 if (!is_numeric($spec[0])) {
114 $dump .= sprintf("--%s ", $spec[1]);
116 if ($spec[3] & Args
::REQARG
) {
118 } elseif ($spec[3] & Args
::OPTARG
) {
124 $dump .= str_repeat(" ", $max-strlen($spec[1])+
3*!isset($spec[0]));
127 if ($spec[3] & Args
::REQUIRED
) {
128 $dump .= " (REQUIRED)";
130 if ($spec[3] & Args
::MULTI
) {
131 $dump .= " (MULTIPLE)";
133 if (isset($spec[4])) {
134 $dump .= sprintf(" [%s]", $spec[4]);