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

View File

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