]> git.proxmox.com Git - pve-common.git/blobdiff - src/PVE/PodParser.pm
Add AbstractConfig base class
[pve-common.git] / src / PVE / PodParser.pm
index 3cb3c56f0e6dfff9fc295469e929612238375c8c..8ad05980f71ea63f1a28ca99b703db63d45028c6 100644 (file)
@@ -44,6 +44,51 @@ sub command {
 
 # helpers used to generate our manual pages
 
+sub generate_typetext {
+    my ($schema) = @_;
+    my $typetext = '';
+    my (@optional, @required);
+    foreach my $key (sort keys %$schema) {
+       next if !$schema->{$key}->{format_description} &&
+               !$schema->{$key}->{typetext};
+       if ($schema->{$key}->{optional}) {
+           push @optional, $key;
+       } else {
+           push @required, $key;
+       }
+    }
+    my ($pre, $post) = ('', '');
+    my $add = sub {
+       my ($key) = @_;
+       $typetext .= $pre;
+       my $entry = $schema->{$key};
+       if (my $alias = $entry->{alias}) {
+           $key = $alias;
+           $entry = $schema->{$key};
+       }
+       if (my $desc = $entry->{format_description}) {
+           $typetext .= $entry->{default_key} ? "[$key=]" : "$key=";
+           $typetext .= "<$desc>";
+       } elsif (my $text = $entry->{typetext}) {
+           $typetext .= $text;
+       } else {
+           die "internal error: neither format_description nor typetext found";
+       }
+       $typetext .= $post;
+    };
+    foreach my $key (@required) {
+       &$add($key);
+       $pre = ', ';
+    }
+    $pre = $pre ? ' [,' : '[';
+    $post = ']';
+    foreach my $key (@optional) {
+       &$add($key);
+       $pre = ' [,';
+    }
+    return $typetext;
+}
+
 sub schema_get_type_text {
     my ($phash) = @_;
 
@@ -62,9 +107,11 @@ sub schema_get_type_text {
            return "$phash->{type} (-N - $phash->{maximum})";
        }
     } elsif ($phash->{type} eq 'string') {
-       my $format = $phash->{format};
-       if ($format && ref($format) eq 'HASH') {
-           return PVE::JSONSchema::generate_typetext($format);
+       if (my $format = $phash->{format}) {
+           $format = PVE::JSONSchema::get_format($format) if ref($format) ne 'HASH';
+           if (ref($format) eq 'HASH') {
+               return generate_typetext($format);
+           }
        }
     }
 
@@ -73,6 +120,19 @@ sub schema_get_type_text {
     return $type;
 }
 
+sub generate_property_text {
+    my ($schema) = @_;
+    my $data = '';
+    foreach my $key (sort keys %$schema) {
+       my $d = $schema->{$key};
+       my $desc = $d->{description};
+       my $typetext = schema_get_type_text($d);
+       $desc = 'No description available' if !$desc;
+       $data .= "=item $key: $typetext\n\n$desc\n\n";
+    }
+    return $data;
+}
+
 # generta epop from JSON schema properties
 sub dump_properties {
     my ($properties) = @_;
@@ -103,6 +163,15 @@ sub dump_properties {
        my $typetext = schema_get_type_text($d);
        $data .= "=item $base: $typetext\n\n";
        $data .= "$descr\n\n";
+
+       if ($d->{type} eq 'string') {
+           my $format = $d->{format};
+           if ($format && ref($format) eq 'HASH') {
+               $data .= "=over 1.1\n\n";
+               $data .= generate_property_text($format);
+               $data .= "=back\n\n";
+           }
+       }
     }
 
     $data .= "=back";