3 namespace pharext\Cli\Args
;
5 use function array_column
;
12 function __construct($prog, Args
$args) {
17 function __toString() {
18 $usage = "Usage:\n\n \$ ";
19 $usage .= $this->prog
;
21 list($flags, $required, $optional, $positional) = $this->listSpec();
23 $usage .= $this->dumpFlags($flags);
26 $usage .= $this->dumpRequired($required);
29 $usage .= $this->dumpOptional($optional);
32 $usage .= $this->dumpPositional($positional);
35 $help = $this->dumpHelp($positional);
37 return $usage . "\n\n" . $help . "\n";
45 foreach ($this->args
->getSpec() as $spec) {
46 if (is_numeric($spec[0])) {
47 $positional[] = $spec;
48 } elseif ($spec[3] & Args
::REQUIRED
) {
50 } elseif ($spec[3] & (Args
::OPTARG|Args
::REQARG
)) {
57 return [$flags, $required, $optional, $positional]
58 +
compact("flags", "required", "optional", "positional");
61 function dumpFlags(array $flags) {
62 return sprintf(" [-%s]", implode("", array_column($flags, 0)));
65 function dumpRequired(array $required) {
67 foreach ($required as $req) {
68 $dump .= sprintf(" -%s <%s>", $req[0], $req[1]);
73 function dumpOptional(array $optional) {
74 $req = array_filter($optional, function($a) {
75 return $a[3] & Args
::REQARG
;
77 $opt = array_filter($optional, function($a) {
78 return $a[3] & Args
::OPTARG
;
83 $short = array_filter($req, function($a) {
84 return is_string($a[0]);
87 $dump .= sprintf(" [-%s <arg>]", implode("|-", array_column($short, 0)));
89 $long = array_filter($req, function($a) {
90 return !is_string($a[0]);
93 $dump .= sprintf(" [--%s <arg>]", implode("|--", array_column($long, 1)));
97 $short = array_filter($opt, function($a) {
98 return is_string($a[0]);
101 $dump .= sprintf(" [-%s [<arg>]]", implode("|-", array_column($short, 0)));
103 $long = array_filter($opt, function($a) {
104 return !is_string($a[0]);
107 $dump .= sprintf(" [--%s [<arg>]]", implode("|--", array_column($long, 1)));
113 function dumpPositional(array $positional) {
116 foreach ($positional as $pos) {
117 $conv[$pos[0]][] = $pos;
120 foreach ($conv as $positional) {
121 $args = implode("|", array_column($positional, 1));
122 if ($positional[0][3] & Args
::REQUIRED
) {
123 $dump .= sprintf(" <%s>", $args);
125 $dump .= sprintf(" [<%s>]", $args);
127 if ($positional[0][3] & Args
::MULTI
) {
128 $dump .= sprintf(" [<%s>]...", $args);
131 foreach ($positional as $pos) {
132 if ($pos[3] & Args::REQUIRED) {
133 $dump .= sprintf(" <%s>", $pos[1]);
136 //$dump .= sprintf(" [<%s>]", $pos[1]);
138 if ($pos[3] & Args::MULTI) {
139 $dump .= sprintf(" [<%s>]...", $pos[1]);
147 function calcMaxLen() {
148 $spc = $this->args
->getSpec();
149 $max = max(array_map("strlen", array_column($spc, 1)));
150 $max +
= $max %
8 +
2;
154 function dumpHelp() {
155 $max = $this->calcMaxLen();
157 foreach ($this->args
->getSpec() as $spec) {
159 if (is_numeric($spec[0])) {
160 $dump .= sprintf(" <%s> ", $spec[1]);
161 } elseif (isset($spec[0])) {
162 $dump .= sprintf("-%s|", $spec[0]);
164 if (!is_numeric($spec[0])) {
165 $dump .= sprintf("--%s ", $spec[1]);
167 if ($spec[3] & Args
::REQARG
) {
169 } elseif ($spec[3] & Args
::OPTARG
) {
175 $space = str_repeat(" ", $max-strlen($spec[1])+
3*!isset($spec[0]));
177 $dump .= str_replace("\n", "\n $space", $spec[2]);
179 if ($spec[3] & Args
::REQUIRED
) {
180 $dump .= " (REQUIRED)";
182 if ($spec[3] & Args
::MULTI
) {
183 $dump .= " (MULTIPLE)";
185 if (isset($spec[4])) {
186 $dump .= sprintf(" [%s]", $spec[4]);