in pytheas-core/src/main/resources/js/jsondiffpatch.js [442:544]
var patch = jdp.patch = function(o, pname, d, path) {
var p, nvalue, subpath = '', target;
if (typeof pname != 'string') {
path = d;
d = pname;
pname = null;
}
else {
if (typeof o != 'object') {
pname = null;
}
}
if (path) {
subpath += path;
}
subpath += '/';
if (pname !== null) {
subpath += pname;
}
if (typeof d == 'object') {
if (isArray(d)) {
// changed value
if (d.length < 3) {
nvalue = d[d.length - 1];
if (pname !== null) {
objectSet(o, pname, nvalue);
}
return nvalue;
}
else {
if (d[2] == 0) {
// undefined, delete value
if (pname !== null) {
objectSet(o, pname);
}
else {
return;
}
}
else
if (d[2] == 2) {
// text diff
if (!jdp.config.textPatch) {
diff_match_patch_autoconfig();
}
if (!jdp.config.textPatch) {
throw new Error("textPatch function not found");
}
try {
nvalue = jdp.config.textPatch(objectGet(o, pname), d[0]);
}
catch (text_patch_err) {
throw new Error('cannot apply patch at "' + subpath + '": ' + text_patch_err);
}
if (pname !== null) {
objectSet(o, pname, nvalue);
}
return nvalue;
}
else {
throw new Error("invalid diff type");
}
}
}
else {
if (d._t == 'a') {
// array diff
target = pname === null ? o : objectGet(o, pname);
if (typeof target != 'object' || !isArray(target)) {
throw new Error('cannot apply patch at "' + subpath + '": array expected');
}
else {
for (p in d) {
if (p !== '_t' && d.hasOwnProperty(p)) {
patch(target, p, d[p], subpath);
}
}
}
}
else {
// object diff
target = pname === null ? o : objectGet(o, pname);
if (typeof target != 'object' || isArray(target)) {
throw new Error('cannot apply patch at "' + subpath + '": object expected');
}
else {
for (p in d) {
if (d.hasOwnProperty(p)) {
patch(target, p, d[p], subpath);
}
}
}
}
}
}
return o;
}