[pve-devel] [PATCH v2 pve-common 4/4] added JSONSchema::print_property_string

Wolfgang Bumiller w.bumiller at proxmox.com
Thu Oct 1 10:36:29 CEST 2015


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.1.4





More information about the pve-devel mailing list