Add JSON pointer support to $data reference.

master
Don Rouse 2016-08-25 03:46:47 -07:00
parent eac77bf565
commit 53e9971edd
2 changed files with 27 additions and 11 deletions

View File

@ -214,20 +214,33 @@ function getPath(currentPath, prop, jsonPointers) {
}
var JSON_POINTER = /^#|\/(?:[^~]|~0|~1)*?$/;
var RELATIVE_JSON_POINTER = /^([0-9]+)(#|\/(?:[^~]|~0|~1)*)?$/;
function getData($data, lvl, paths) {
var matches = $data.match(RELATIVE_JSON_POINTER);
if (!matches) throw new Error('Invalid relative JSON-pointer: ' + $data);
var up = +matches[1];
var jsonPointer = matches[2];
if (jsonPointer == '#') {
if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);
return paths[lvl - up];
var up;
var jsonPointer;
var data;
var matches;
if ($data.charAt(0) == '/') {
matches = $data.match(JSON_POINTER);
if (!matches) throw new Error('Invalid JSON-pointer: ' + $data);
jsonPointer = matches[0];
data = 'data';
}
else {
matches = $data.match(RELATIVE_JSON_POINTER);
if (!matches) throw new Error('Invalid JSON-pointer: ' + $data);
up = +matches[1];
jsonPointer = matches[2];
if (jsonPointer == '#') {
if (up >= lvl) throw new Error('Cannot access property/index ' + up + ' levels up, current level is ' + lvl);
return paths[lvl - up];
}
if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);
var data = 'data' + ((lvl - up) || '');
if (!jsonPointer) return data;
if (up > lvl) throw new Error('Cannot access data ' + up + ' levels up, current level is ' + lvl);
data = 'data' + ((lvl - up) || '');
if (!jsonPointer) return data;
}
var expr = data;
var segments = jsonPointer.split('/');

View File

@ -30,7 +30,10 @@
"properties": {
"$data": {
"type": "string",
"format": "relative-json-pointer"
"anyOf": [
{ "format": "relative-json-pointer" },
{ "format": "json-pointer" }
]
}
},
"additionalProperties": false