[pve-devel] [PATCH pve-common 3/6] Added JSONSchema::parse_property_string

Wolfgang Bumiller w.bumiller at proxmox.com
Tue Sep 22 13:45:41 CEST 2015


---
 src/PVE/JSONSchema.pm | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/src/PVE/JSONSchema.pm b/src/PVE/JSONSchema.pm
index 45ce5ba..d900a69 100644
--- a/src/PVE/JSONSchema.pm
+++ b/src/PVE/JSONSchema.pm
@@ -431,6 +431,51 @@ sub check_format {
     }
 } 
 
+sub parse_property_string {
+    my ($format, $data, $path) = @_;
+
+    my $default_key;
+
+    my $res = {};
+    foreach my $part (split(/,/, $data)) {
+	next if $part =~ /^\s*$/;
+
+	if ($part =~ /^([^=]+)=(.+)$/) {
+	    my ($k, $v) = ($1, $2);
+	    die "duplicate key in comma-separated list property: $k" if defined($res->{$k});
+	    my $schema = $format->{$k};
+	    die "invalid key in comma-separated list property: $k" if !$schema;
+	    if ($schema->{type} && $schema->{type} eq 'boolean') {
+		$v = 1 if $v =~ m/^(1|on|yes|true)$/i;
+		$v = 0 if $v =~ m/^(0|off|no|false)$/i;
+	    }
+	    $res->{$k} = $v;
+	} elsif ($part !~ /=/) {
+	    die "duplicate key in comma-separated list property: $default_key" if $default_key;
+	    foreach my $key (keys %$format) {
+		if ($format->{$key}->{default_key}) {
+		    $default_key = $key;
+		    if (!$res->{$default_key}) {
+			$res->{$default_key} = $part;
+			last;
+		    }
+		    die "duplicate key in comma-separated list property: $default_key";
+		}
+	    }
+	} else {
+	    die "missing key in comma-separated list property";
+	}
+    }
+
+    my $errors = {};
+    check_object($path, $format, $res, undef, $errors);
+    if (scalar(%$errors)) {
+	raise "format error", errors => $errors;
+    }
+
+    return $res;
+}
+
 sub add_error {
     my ($errors, $path, $msg) = @_;
 
@@ -874,6 +919,11 @@ my $default_schema_noref = {
 	    optional => 1,
      	    description => "This indicates what format the data is among some predefined formats which may include:\n\ndate - a string following the ISO format \naddress \nschema - a schema definition object \nperson \npage \nhtml - a string representing HTML",
         },
+	default_key => {
+	    type => "boolean",
+	    optional => 1,
+	    description => "Whether this is the default key in a comma separated list property string.",
+	},
 	default => {
 	    type => "any",
 	    optional => 1,
-- 
2.1.4





More information about the pve-devel mailing list