X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=src%2FPVE%2FCLIHandler.pm;h=2fa7933ee00574baaf860cb87fcc0f34974d7e38;hb=85b9def289c52e768cc6aea99687f75211952646;hp=a4f63ee8bdb2bf4550ed46b85c4bbaea6f6e7b74;hpb=8042c2cc6264a56683c96862cb831d9dde0d24c6;p=pve-common.git diff --git a/src/PVE/CLIHandler.pm b/src/PVE/CLIHandler.pm index a4f63ee..2fa7933 100644 --- a/src/PVE/CLIHandler.pm +++ b/src/PVE/CLIHandler.pm @@ -401,25 +401,27 @@ my $print_bash_completion = sub { # prints a formatted table with a title row. # $formatopts is an array of hashes, with the following keys: -# 'key' - the key in the data-objects to use for this column -# 'title' - the title to print above the column, defaults to 'key' - always gets printed in full -# 'cutoff' - the maximal length of the data, overlong values will be truncated -# 'default' - an optional default value for the column -# the last column always gets printed in full +# 'key' - key of $data element to print +# 'title' - column title, defaults to 'key' - won't get cutoff +# 'cutoff' - maximal (print) length of this column values, if set +# the last column will never be cutoff +# 'default' - optional default value for the column +# formatopts element order defines column order (left to right) sub print_text_table { my ($formatopts, $data) = @_; - my ($formatstring, @keys, @titles, %cutoffs, %defaults, $last_col); - $last_col = $formatopts->[$#{$formatopts}]; + my ($formatstring, @keys, @titles, %cutoffs, %defaults); + my $last_col = $formatopts->[$#{$formatopts}]; + foreach my $col ( @$formatopts ) { - my ($key, $title, $cutoff, $default) = @$col{ qw(key title cutoff default)}; + my ($key, $title, $cutoff, $default) = @$col{qw(key title cutoff default)}; $title //= $key; push @keys, $key; push @titles, $title; $defaults{$key} = $default; - #calculate maximal print width and cutoff + # calculate maximal print width and cutoff my $titlelen = length($title); my $longest = $titlelen; @@ -441,16 +443,17 @@ sub print_text_table { printf $formatstring, @titles; - foreach my $entry (sort { $a->{$keys[0]} cmp $b->{$keys[0]} } @$data){ + foreach my $entry (sort { $a->{$keys[0]} cmp $b->{$keys[0]} } @$data) { printf $formatstring, map { substr(($entry->{$_} // $defaults{$_}), 0 , $cutoffs{$_}) } @keys; } } sub print_entry { my $entry = shift; + #TODO: handle objects/hashes as well foreach my $item (sort keys %$entry) { - if (ref($entry->{$item}) eq 'ARRAY'){ + if (ref($entry->{$item}) eq 'ARRAY') { printf "%s: [ %s ]\n", $item, join(", ", @{$entry->{$item}}); } else { printf "%s: %s\n", $item, $entry->{$item}; @@ -458,6 +461,28 @@ sub print_entry { } } +# prints the result of an API GET call returning an array +# and to have the results key of the API call defined. +sub print_api_list { + my ($props_to_print, $data, $returninfo) = @_; + + my $returnprops = $returninfo->{items}->{properties}; + + my $formatopts = []; + foreach my $prop ( @$props_to_print ) { + my $propinfo = $returnprops->{$prop}; + my $colopts = { + key => $prop, + title => $propinfo->{title}, + default => $propinfo->{default}, + cutoff => $propinfo->{print_width} // $propinfo->{maxLength}, + }; + push @$formatopts, $colopts; + } + + print_text_table($formatopts, $data); +} + sub verify_api { my ($class) = @_; @@ -559,7 +584,10 @@ my $handle_cmd = sub { my $res = $class->cli_handler($cmd_str, $name, $cmd_args, $arg_param, $uri_param, $read_password_func, $param_mapping_func); - &$outsub($res) if $outsub; + if (defined $outsub) { + my $returninfo = $class->map_method_by_name($name)->{returns}; + $outsub->($res, $returninfo); + } }; my $handle_simple_cmd = sub { @@ -594,7 +622,10 @@ my $handle_simple_cmd = sub { my $res = $class->cli_handler($name, $name, \@ARGV, $arg_param, $uri_param, $read_password_func, $param_mapping_func); - &$outsub($res) if $outsub; + if (defined $outsub) { + my $returninfo = $class->map_method_by_name($name)->{returns}; + $outsub->($res, $returninfo); + } }; sub run_cli_handler {