From 94dd44353294418b389414c260e1e1c4b991950c Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Thu, 1 Oct 2015 10:36:29 +0200 Subject: [PATCH] added JSONSchema::print_property_string This will be used to format comma-separated property list strings. --- src/PVE/JSONSchema.pm | 68 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm index b9ef26a..0cb281d 100644 --- a/src/PVE/JSONSchema.pm +++ b/src/PVE/JSONSchema.pm @@ -532,6 +532,74 @@ sub parse_property_string { return $res; } +sub print_property_string { + my ($data, $format, $skip, $path) = @_; + + if (ref($format) ne 'HASH') { + my $schema = $format_list->{$format}; + die "not a valid format: $format" if !$schema; + $format = $schema; + } + + my $errors = {}; + check_object($path, $format, $data, undef, $errors); + if (scalar(%$errors)) { + raise "format error", errors => $errors; + } + + my $default_key; + my %skipped = map { $_ => 1 } @$skip; + my %allowed; + my %required; # this is a set, all present keys are required regardless of value + foreach my $key (keys %$format) { + $allowed{$key} = 1; + if (!$format->{$key}->{optional} && !$skipped{$key}) { + $required{$key} = 1; + } + + # Skip default keys + if ($format->{$key}->{default_key}) { + if ($default_key) { + warn "multiple default keys in schema ($default_key, $key)"; + } else { + $default_key = $key; + $skipped{$key} = 1; + } + } + } + + my ($text, $comma); + if ($default_key) { + $text = "$data->{$default_key}"; + $comma = ','; + } else { + $text = ''; + $comma = ''; + } + + foreach my $key (sort keys %$data) { + die "invalid key: $key" if !$allowed{$key}; + delete $required{$key}; + next if $skipped{$key}; + + my $type = $format->{$key}->{type}; + my $value = $data->{$key}; + $text .= $comma; + $comma = ','; + if ($type eq 'disk-size') { + $text .= "$key=" . format_size($value); + } else { + $text .= "$key=$value"; + } + } + + if (my $missing = join(',', keys %required)) { + die "missing properties: $missing"; + } + + return $text; +} + sub add_error { my ($errors, $path, $msg) = @_; -- 2.39.2