var untilde = function(str) {
return str.replace(/~./g, function(m) { switch (m) { case "~0": return "~"; case "~1": return "/"; } throw new Error("Invalid tilde escape: " + m); });
}
var traverse = function(obj, pointer, value) {
// assert(isArray(pointer)) var part = untilde(pointer.shift()); if(!obj.hasOwnProperty(part)) { return null; } if(pointer.length !== 0) { // keep traversin! return traverse(obj[part], pointer, value); } // we're done if(typeof value === "undefined") { // just reading return obj[part]; } // set new value, return old value var old_value = obj[part]; if(value === null) { delete obj[part]; } else { obj[part] = value; } return old_value;
}
var validate_input = function(obj, pointer) {
if(typeof obj !== "object") { throw new Error("Invalid input object."); } if(pointer === "") { return []; } if(!pointer) { throw new Error("Invalid JSON pointer."); } pointer = pointer.split("/"); var first = pointer.shift(); if (first !== "") { throw new Error("Invalid JSON pointer."); } return pointer;
}
var get = function(obj, pointer) {
pointer = validate_input(obj, pointer); if (pointer.length === 0) { return obj; } return traverse(obj, pointer);
}
var set = function(obj, pointer, value) {
pointer = validate_input(obj, pointer); if (pointer.length === 0) { throw new Error("Invalid JSON pointer for set.") } return traverse(obj, pointer, value);
}
exports.get = get exports.set = set