Support named formats in typetext generation
authorWolfgang Bumiller <w.bumiller@proxmox.com>
Thu, 1 Oct 2015 08:36:26 +0000 (10:36 +0200)
committerDietmar Maurer <dietmar@proxmox.com>
Thu, 1 Oct 2015 09:22:39 +0000 (11:22 +0200)
Now that generate_typetext doesn't need to be accessed
anymore it made sense to move it to PodParser.pm as this is
the only place that uses it now.
PodParser now needs access to JSONSchema's $format_list, so
a JSONSchema::get_format was added.

src/PVE/JSONSchema.pm
src/PVE/PodParser.pm

index 3afc37a..51dfc89 100644 (file)
@@ -101,6 +101,11 @@ sub register_format {
     $format_list->{$format} = $code;
 }
 
+sub get_format {
+    my ($format) = @_;
+    return $format_list->{$format};
+}
+
 # register some common type for pve
 
 register_format('string', sub {}); # allow format => 'string-list'
@@ -1341,45 +1346,4 @@ sub dump_config {
     return $data;
 }
 
-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 $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;
-}
-
 1;
index 3cb3c56..eb443bd 100644 (file)
@@ -44,6 +44,47 @@ 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 $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 +103,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);
+           }
        }
     }