]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/JSONSchema.pm
print_property_string: don't print the default key's name
[pve-common.git] / src / PVE / JSONSchema.pm
index f731856efb32573a97556f1664697b0648c50771..a2394f74ede21d9f49105f876f42e3b32bf05d0d 100644 (file)
@@ -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;
 }