X-Git-Url: https://git.proxmox.com/?p=pve-common.git;a=blobdiff_plain;f=src%2FPVE%2FJSONSchema.pm;h=a2394f74ede21d9f49105f876f42e3b32bf05d0d;hp=f731856efb32573a97556f1664697b0648c50771;hb=971353e8ac4191a6ea7125b4c7240cd6387060bd;hpb=bf27456b4e6f7da0e75331e88a8bd70d6281c9c6 diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index f731856..a2394f7 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -978,6 +978,11 @@ my $default_schema_noref = { optional => 1, description => "This provides a description of the purpose the instance property. The value can be a string or it can be an object with properties corresponding to various different instance languages (with an optional default property indicating the default description).", }, + verbose_description => { + type => "string", + optional => 1, + description => "This provides a more verbose description.", + }, format_description => { type => "string", optional => 1, @@ -1446,10 +1451,12 @@ my $find_schema_default_key = sub { if defined($phash->{alias}); die "default key '$key' with keyAlias attribute is not allowed\n" if $phash->{keyAlias}; - $default_key = $key; } my $key_alias = $phash->{keyAlias}; + die "found keyAlias without 'alias definition for '$key'\n" + if $key_alias && !$phash->{alias}; + if ($phash->{alias} && $key_alias) { die "inconsistent keyAlias '$key_alias' definition" if defined($keyAliasProps->{$key_alias}) && @@ -1464,7 +1471,7 @@ my $find_schema_default_key = sub { sub generate_typetext { my ($format) = @_; - my $default_key = &$find_schema_default_key($format); + my ($default_key, $keyAliasProps) = &$find_schema_default_key($format); my $res = ''; my $add_sep = 0; @@ -1513,24 +1520,40 @@ sub generate_typetext { } }; - if (defined($default_key)) { - my $phash = $format->{$default_key}; - &$format_key_value($default_key, $phash); - } + my $done = {}; - foreach my $key (sort keys %$format) { - next if defined($default_key) && ($key eq $default_key); + my $cond_add_key = sub { + my ($key) = @_; + + return if $done->{$key}; # avoid duplicates + + $done->{$key} = 1; my $phash = $format->{$key}; - next if $phash->{alias}; - next if $phash->{group}; + return if !$phash; # should not happen + + return if $phash->{alias}; &$format_key_value($key, $phash); - if (my $keyAlias = $phash->{keyAlias}) { - &$add_option_string("<$keyAlias>=<$key>", 1); - } + }; + + &$cond_add_key($default_key) if defined($default_key); + + # add required keys first + foreach my $key (sort keys %$format) { + my $phash = $format->{$key}; + &$cond_add_key($key) if $phash && !$phash->{optional}; + } + + # add the rest + foreach my $key (sort keys %$format) { + &$cond_add_key($key); + } + + foreach my $keyAlias (sort keys %$keyAliasProps) { + &$add_option_string("<$keyAlias>=<$keyAliasProps->{$keyAlias }>", 1); } return $res; @@ -1575,10 +1598,10 @@ sub print_property_string { } }; - my $done = {}; + my $done = { map { $_ => 1 } @$skip }; my $cond_add_key = sub { - my ($key) = @_; + my ($key, $isdefault) = @_; return if $done->{$key}; # avoid duplicates @@ -1610,12 +1633,23 @@ sub print_property_string { die "internal error" if defined($phash->{alias}); my $value_str = &$format_value($key, $value, $phash->{format}); - &$add_option_string("$key=${value_str}"); + if ($isdefault) { + &$add_option_string($value_str); + } else { + &$add_option_string("$key=${value_str}"); + } }; # add default key first - &$cond_add_key($default_key) if defined($default_key); + &$cond_add_key($default_key, 1) if defined($default_key); + + # add required keys first + foreach my $key (sort keys %$data) { + my $phash = $format->{$key}; + &$cond_add_key($key) if $phash && !$phash->{optional}; + } + # add the rest foreach my $key (sort keys %$data) { &$cond_add_key($key); } @@ -1626,6 +1660,8 @@ sub print_property_string { sub schema_get_type_text { my ($phash) = @_; + my $type = $phash->{type} || 'string'; + if ($phash->{typetext}) { return $phash->{typetext}; } elsif ($phash->{format_description}) { @@ -1634,15 +1670,15 @@ sub schema_get_type_text { return "(" . join(' | ', sort @{$phash->{enum}}) . ")"; } elsif ($phash->{pattern}) { return $phash->{pattern}; - } elsif ($phash->{type} eq 'integer' || $phash->{type} eq 'number') { + } elsif ($type eq 'integer' || $type eq 'number') { if (defined($phash->{minimum}) && defined($phash->{maximum})) { - return "$phash->{type} ($phash->{minimum} - $phash->{maximum})"; + return "$type ($phash->{minimum} - $phash->{maximum})"; } elsif (defined($phash->{minimum})) { - return "$phash->{type} ($phash->{minimum} - N)"; + return "$type ($phash->{minimum} - N)"; } elsif (defined($phash->{maximum})) { - return "$phash->{type} (-N - $phash->{maximum})"; + return "$type (-N - $phash->{maximum})"; } - } elsif ($phash->{type} eq 'string') { + } elsif ($type eq 'string') { if (my $format = $phash->{format}) { $format = get_format($format) if ref($format) ne 'HASH'; if (ref($format) eq 'HASH') { @@ -1651,8 +1687,6 @@ sub schema_get_type_text { } } - my $type = $phash->{type} || 'string'; - return $type; }