mirror of
https://git.proxmox.com/git/pve-common
synced 2025-07-29 13:09:43 +00:00
cli: data_to_text: pass property info
So that we can display defaults, render boolean nicely, or call arbitrary render functions ... Signed-off-by: Dietmar Maurer <dietmar@proxmox.com>
This commit is contained in:
parent
b521204225
commit
84142f1d20
@ -2,15 +2,31 @@ package PVE::CLIFormatter;
|
|||||||
|
|
||||||
use strict;
|
use strict;
|
||||||
use warnings;
|
use warnings;
|
||||||
|
use PVE::JSONSchema;
|
||||||
use JSON;
|
use JSON;
|
||||||
|
|
||||||
sub data_to_text {
|
sub data_to_text {
|
||||||
my ($data) = @_;
|
my ($data, $propdef) = @_;
|
||||||
|
|
||||||
|
if (defined($propdef)) {
|
||||||
|
if (my $type = $propdef->{type}) {
|
||||||
|
if ($type eq 'boolean') {
|
||||||
|
return $data ? 1 : 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!defined($data) && defined($propdef->{default})) {
|
||||||
|
return "($propdef->{default})";
|
||||||
|
}
|
||||||
|
if (defined(my $renderer = $propdef->{renderer})) {
|
||||||
|
my $code = PVE::JSONSchema::get_renderer($renderer);
|
||||||
|
die "internal error: unknown renderer '$renderer'" if !$code;
|
||||||
|
return $code->($data);
|
||||||
|
}
|
||||||
|
}
|
||||||
return '' if !defined($data);
|
return '' if !defined($data);
|
||||||
|
|
||||||
if (my $class = ref($data)) {
|
if (my $class = ref($data)) {
|
||||||
return to_json($data, { utf8 => 1, canonical => 1 });
|
return to_json($data, { canonical => 1 });
|
||||||
} else {
|
} else {
|
||||||
return "$data";
|
return "$data";
|
||||||
}
|
}
|
||||||
@ -53,7 +69,7 @@ sub print_text_table {
|
|||||||
my $longest = $titlelen;
|
my $longest = $titlelen;
|
||||||
my $sortable = $autosort;
|
my $sortable = $autosort;
|
||||||
foreach my $entry (@$data) {
|
foreach my $entry (@$data) {
|
||||||
my $len = length(data_to_text($entry->{$prop})) // 0;
|
my $len = length(data_to_text($entry->{$prop}, $propinfo)) // 0;
|
||||||
$longest = $len if $len > $longest;
|
$longest = $len if $len > $longest;
|
||||||
$sortable = 0 if !defined($entry->{$prop});
|
$sortable = 0 if !defined($entry->{$prop});
|
||||||
}
|
}
|
||||||
@ -95,7 +111,7 @@ sub print_text_table {
|
|||||||
foreach my $entry (@$data) {
|
foreach my $entry (@$data) {
|
||||||
print $borderstring if $border;
|
print $borderstring if $border;
|
||||||
printf $formatstring, map {
|
printf $formatstring, map {
|
||||||
substr(data_to_text($entry->{$_}) // $colopts->{$_}->{default},
|
substr(data_to_text($entry->{$_}, $returnprops->{$_}) // $colopts->{$_}->{default},
|
||||||
0, $colopts->{$_}->{cutoff});
|
0, $colopts->{$_}->{cutoff});
|
||||||
} @$props_to_print;
|
} @$props_to_print;
|
||||||
}
|
}
|
||||||
@ -145,7 +161,7 @@ sub print_api_result {
|
|||||||
$props_to_print = [ sort keys %$data ] if !defined($props_to_print);
|
$props_to_print = [ sort keys %$data ] if !defined($props_to_print);
|
||||||
my $kvstore = [];
|
my $kvstore = [];
|
||||||
foreach my $key (@$props_to_print) {
|
foreach my $key (@$props_to_print) {
|
||||||
push @$kvstore, { key => $key, value => data_to_text($data->{$key}) };
|
push @$kvstore, { key => $key, value => data_to_text($data->{$key}, $result_schema->{properties}->{$key}) };
|
||||||
}
|
}
|
||||||
my $schema = { type => 'array', items => { type => 'object' }};
|
my $schema = { type => 'array', items => { type => 'object' }};
|
||||||
print_api_list($kvstore, $schema, ['key', 'value'], 0, $format eq 'text');
|
print_api_list($kvstore, $schema, ['key', 'value'], 0, $format eq 'text');
|
||||||
|
Loading…
Reference in New Issue
Block a user