From 2421fba133ffed89eb92e9c09be573d67cec9bc3 Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Thu, 1 Oct 2015 10:36:26 +0200 Subject: [PATCH] Support named formats in typetext generation 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 | 46 +++++----------------------------------- src/PVE/PodParser.pm | 49 ++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 51 insertions(+), 44 deletions(-) diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index 3afc37a..51dfc89 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -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; diff --git a/src/PVE/PodParser.pm b/src/PVE/PodParser.pm index 3cb3c56..eb443bd 100644 --- a/src/PVE/PodParser.pm +++ b/src/PVE/PodParser.pm @@ -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); + } } } -- 2.39.2