restructer
Version:
The restructer library is a type-safe encoder/decoder up to one level for objects.
96 lines (95 loc) • 3.62 kB
JavaScript
module.exports = {
encode: function(obj) {
let encoded_string = typeof string !== 'undefined' ? string : '';
for (var key in obj) {
let k = key;
let t = typeof obj[key];
let v = obj[key];
if (t === 'undefined') {
encoded_string += '[' + k + ':undefined]=§';
} else if (v === null) {
encoded_string += '[' + k + ':null]=§';
} else if (t === 'string') {
let l = v.length;
encoded_string += '[' + k + ':' + t + ':' + l + ']=' + v + '§';
} else if (t === 'object') {
if (Array.isArray(obj[key])) {
let l = obj[key].length;
encoded_string += '[' + k + ':array:' + l + ']=§';
} else {
let l = Object.keys(obj[key]);
encoded_string += '[' + k + ':' + t + ':' + l + ']=§';
}
let child = obj[key];
for (var ckey in child) {
let ck = k + '<>' + ckey;
let ct = typeof child[ckey];
let cv = child[ckey];
if (ct === 'undefined') {
encoded_string += '[' + ck + ':undefined]=§';
} else if (cv === null) {
encoded_string += '[' + ck + ':null]=§';
} else if (ct === 'string') {
let cl = cv.length;
encoded_string += '[' + ck + ':' + ct + ':' + cl + ']=' + cv + '§';
} else if (ct === 'object') {
encoded_string += '[' + ck + ':base64]=' + btoa(JSON.stringify(cv)) + '§';
} else {
encoded_string += '[' + ck + ':' + ct + ']=' + cv + '§';
}
}
} else {
encoded_string += '[' + k + ':' + t + ']=' + v + '§';
}
}
return encoded_string;
},
decode: function(encoded_string) {
let decodedObject = {};
let objArray = encoded_string.split('§');
for (var i = 0; i < objArray.length; i++) {
let lineArray = objArray[i].substring(1).split(']=');
let keyParts = lineArray[0].split(':');
let value = lineArray[1];
let keyObjectParts = keyParts[0].split('<>');
if (keyObjectParts.length === 1) {
if (keyParts[1] === 'string') {
decodedObject[keyParts[0]] = String(value);
} else if (keyParts[1] === 'number') {
decodedObject[keyParts[0]] = parseInt(value);
} else if (keyParts[1] === 'boolean') {
decodedObject[keyParts[0]] = (value === 'true' ? true : false);
} else if (keyParts[1] === 'array') {
decodedObject[keyParts[0]] = new Array();
} else if (keyParts[1] === 'object') {
decodedObject[keyParts[0]] = new Object();
} else if (keyParts[1] === 'base64') {
decodedObject[keyParts[0]] = atob(value);
} else if (keyParts[1] === 'null') {
decodedObject[keyParts[0]] = null;
} else if (keyParts[1] === 'undefined') {
decodedObject[keyParts[0]] = undefined;
}
} else {
if (keyParts[1] === 'string') {
decodedObject[keyObjectParts[0]][keyObjectParts[1]] = String(value);
} else if (keyParts[1] === 'number') {
decodedObject[keyObjectParts[0]][keyObjectParts[1]] = parseInt(value);
} else if (keyParts[1] === 'boolean') {
decodedObject[keyObjectParts[0]][keyObjectParts[1]] = (value === 'true' ? true : false);
} else if (keyParts[1] === 'null') {
decodedObject[keyObjectParts[0]][keyObjectParts[1]] = null;
} else if (keyParts[1] === 'array') {
decodedObject[keyObjectParts[0]][keyObjectParts[1]] = new Array();
} else if (keyParts[1] === 'object') {
decodedObject[keyObjectParts[0]][keyObjectParts[1]] = new Object();
} else if (keyParts[1] === 'base64') {
decodedObject[keyObjectParts[0]][keyObjectParts[1]] = JSON.parse(atob(value));
} else if (keyParts[1] === 'undefined') {
decodedObject[keyObjectParts[0]][keyObjectParts[1]] = undefined;
}
}
}
return decodedObject;
},
}