]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/CLIFormatter.pm
print_api_result_plain: new helper
[pve-common.git] / src / PVE / CLIFormatter.pm
index f6ad45921842c827504ddcd7d738d6d472a54f4d..2a2ff30b494e1b6164bf997aea0d565e366f6174 100644 (file)
@@ -209,6 +209,8 @@ sub print_text_table {
                $width = $len if $len > $width;
            }
 
+           $width = ($width =~ m/^(\d+)$/) ? int($1) : 0; # untaint int
+
            $rowdata->{$prop} = {
                lines => $lines,
                width => $width,
@@ -224,6 +226,8 @@ sub print_text_table {
     for (my $i = 0; $i < $column_count; $i++) {
        my $prop = $props_to_print->[$i];
        my $propinfo = $returnprops->{$prop} // {};
+       my $type = $propinfo->{type} // 'string';
+       my $alignstr = ($type eq 'integer' || $type eq 'number') ? '' : '-';
 
        my $title = $propinfo->{title} // $prop;
        my $cutoff = $propinfo->{print_width} // $propinfo->{maxLength};
@@ -246,48 +250,48 @@ sub print_text_table {
        if ($border) {
            if ($i == 0 && ($column_count == 1)) {
                if ($utf8) {
-                   $formatstring .= "│ %-${cutoff}s │";
+                   $formatstring .= "│ %$alignstr${cutoff}s │";
                    $borderstring_t .= "┌─" . ('─' x $cutoff) . "─┐";
                    $borderstring_m .= "├─" . ('─' x $cutoff) . "─┤";
                    $borderstring_b .= "└─" . ('─' x $cutoff) . "─┘";
                } else {
-                   $formatstring .= "| %-${cutoff}s |";
+                   $formatstring .= "| %$alignstr${cutoff}s |";
                    $borderstring_m .= "+-" . ('-' x $cutoff) . "-+";
                }
            } elsif ($i == 0) {
                if ($utf8) {
-                   $formatstring .= "│ %-${cutoff}s ";
+                   $formatstring .= "│ %$alignstr${cutoff}s ";
                    $borderstring_t .= "┌─" . ('─' x $cutoff) . '─';
                    $borderstring_m .= "├─" . ('─' x $cutoff) . '─';
                    $borderstring_b .= "└─" . ('─' x $cutoff) . '─';
                } else {
-                   $formatstring .= "| %-${cutoff}s ";
+                   $formatstring .= "| %$alignstr${cutoff}s ";
                    $borderstring_m .= "+-" . ('-' x $cutoff) . '-';
                }
            } elsif ($i == ($column_count - 1)) {
                if ($utf8) {
-                   $formatstring .= "│ %-${cutoff}s │";
+                   $formatstring .= "│ %$alignstr${cutoff}s │";
                    $borderstring_t .= "┬─" . ('─' x $cutoff) . "─┐";
                    $borderstring_m .= "┼─" . ('─' x $cutoff) . "─┤";
                    $borderstring_b .= "┴─" . ('─' x $cutoff) . "─┘";
                } else {
-                   $formatstring .= "| %-${cutoff}s |";
+                   $formatstring .= "| %$alignstr${cutoff}s |";
                    $borderstring_m .= "+-" . ('-' x $cutoff) . "-+";
                }
            } else {
                if ($utf8) {
-                   $formatstring .= "│ %-${cutoff}s ";
+                   $formatstring .= "│ %$alignstr${cutoff}s ";
                    $borderstring_t .= "┬─" . ('─' x $cutoff) . '─';
                    $borderstring_m .= "┼─" . ('─' x $cutoff) . '─';
                    $borderstring_b .= "┴─" . ('─' x $cutoff) . '─';
                } else {
-                   $formatstring .= "| %-${cutoff}s ";
+                   $formatstring .= "| %$alignstr${cutoff}s ";
                    $borderstring_m .= "+-" . ('-' x $cutoff) . '-';
                }
            }
        } else {
            # skip alignment and cutoff on last column
-           $formatstring .= ($i == ($column_count - 1)) ? "%s" : "%-${cutoff}s ";
+           $formatstring .= ($i == ($column_count - 1)) ? "%s" : "%$alignstr${cutoff}s ";
        }
     }
 
@@ -432,4 +436,16 @@ sub print_api_result {
     }
 }
 
+sub print_api_result_plain {
+    my ($data, $result_schema, $props_to_print, $options) = @_;
+
+    # avoid borders and header, ignore terminal width
+    $options = $options ? { %$options } : {}; # copy
+
+    $options->{noheader} //= 1;
+    $options->{noborder} //= 1;
+
+    print_api_result($data, $result_schema, $props_to_print, $options, {});
+}
+
 1;