+ $req = array_filter($optional, function($a) {
+ return $a[3] & Args::REQARG;
+ });
+ $opt = array_filter($optional, function($a) {
+ return $a[3] & Args::OPTARG;
+ });
+
+ $dump = "";
+ if ($req) {
+ $short = array_filter($req, function($a) {
+ return is_string($a[0]);
+ });
+ if ($short) {
+ $dump .= sprintf(" [-%s <arg>]", implode("|-", array_column($short, 0)));
+ }
+ $long = array_filter($req, function($a) {
+ return !is_string($a[0]);
+ });
+ if ($long) {
+ $dump .= sprintf(" [--%s <arg>]", implode("|--", array_column($long, 1)));
+ }
+ }
+ if ($opt) {
+ $short = array_filter($opt, function($a) {
+ return is_string($a[0]);
+ });
+ if ($short) {
+ $dump .= sprintf(" [-%s [<arg>]]", implode("|-", array_column($short, 0)));
+ }
+ $long = array_filter($opt, function($a) {
+ return !is_string($a[0]);
+ });
+ if ($long) {
+ $dump .= sprintf(" [--%s [<arg>]]", implode("|--", array_column($long, 1)));
+ }
+ }
+ return $dump;
+ }
+
+ function dumpPositional(array $positional) {
+ $dump = " [--]";
+ $conv = [];
+ foreach ($positional as $pos) {
+ $conv[$pos[0]][] = $pos;
+ }
+ $opts = [];
+ foreach ($conv as $positional) {
+ $args = implode("|", array_column($positional, 1));
+ if ($positional[0][3] & Args::REQUIRED) {
+ $dump .= sprintf(" <%s>", $args);
+ } else {
+ $dump .= sprintf(" [<%s>]", $args);
+ }
+ if ($positional[0][3] & Args::MULTI) {
+ $dump .= sprintf(" [<%s>]...", $args);
+ }
+ /*
+ foreach ($positional as $pos) {
+ if ($pos[3] & Args::REQUIRED) {
+ $dump .= sprintf(" <%s>", $pos[1]);
+ } else {
+ $opts[] = $pos;
+ //$dump .= sprintf(" [<%s>]", $pos[1]);
+ }
+ if ($pos[3] & Args::MULTI) {
+ $dump .= sprintf(" [<%s>]...", $pos[1]);
+ }
+ }
+ */
+ }
+ return $dump;