Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
Download
81159 views
1
var console = require("console");
2
3
var untilde = function(str) {
4
return str.replace(/~./g, function(m) {
5
switch (m) {
6
case "~0":
7
return "~";
8
case "~1":
9
return "/";
10
}
11
throw("Invalid tilde escape: " + m);
12
});
13
}
14
15
var traverse = function(obj, pointer, value) {
16
// assert(isArray(pointer))
17
var part = untilde(pointer.shift());
18
if(typeof obj[part] === "undefined") {
19
throw("Value for pointer '" + pointer + "' not found.");
20
return;
21
}
22
if(pointer.length !== 0) { // keep traversin!
23
return traverse(obj[part], pointer, value);
24
}
25
// we're done
26
if(typeof value === "undefined") {
27
// just reading
28
return obj[part];
29
}
30
// set new value, return old value
31
var old_value = obj[part];
32
if(value === null) {
33
delete obj[part];
34
} else {
35
obj[part] = value;
36
}
37
return old_value;
38
}
39
40
var validate_input = function(obj, pointer) {
41
if(typeof obj !== "object") {
42
throw("Invalid input object.");
43
}
44
45
if(pointer === "") {
46
return [];
47
}
48
49
if(!pointer) {
50
throw("Invalid JSON pointer.");
51
}
52
53
pointer = pointer.split("/");
54
var first = pointer.shift();
55
if (first !== "") {
56
throw("Invalid JSON pointer.");
57
}
58
59
return pointer;
60
}
61
62
var get = function(obj, pointer) {
63
pointer = validate_input(obj, pointer);
64
if (pointer.length === 0) {
65
return obj;
66
}
67
return traverse(obj, pointer);
68
}
69
70
var set = function(obj, pointer, value) {
71
pointer = validate_input(obj, pointer);
72
if (pointer.length === 0) {
73
throw("Invalid JSON pointer for set.")
74
}
75
return traverse(obj, pointer, value);
76
}
77
78
exports.get = get
79
exports.set = set
80
81