diff options
Diffstat (limited to 'lib/tree.js')
| -rw-r--r-- | lib/tree.js | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/tree.js b/lib/tree.js new file mode 100644 index 00000000..e2fd44b6 --- /dev/null +++ b/lib/tree.js @@ -0,0 +1,69 @@ +var Faker = require('../index'); + +var tree = { + + clone: function clone(obj) { + if (obj == null || typeof(obj) != 'object') + return obj; + + var temp = obj.constructor(); // changed + + for (var key in obj) { + temp[key] = this.clone(obj[key]); + } + return temp; + }, + + createTree: function (depth, width, obj) { + if (!obj) { + throw { + name: "ObjectError", + message: "there needs to be an object passed in" + }; + } + + + if (width <= 0) { + throw { + name: "TreeParamError", + message: "width must be greater than zero" + }; + } + + var newObj = this.clone(obj); + + for (var prop in newObj) { + if (newObj.hasOwnProperty(prop)) { + var value = null; + if (newObj[prop] !== "__RECURSE__") { + value = eval(newObj[prop]); + } + else { + if (depth !== 0) { + value = []; + var evalWidth = 1; + + if (typeof(width) == "function") { + evalWidth = width(); + } + else { + evalWidth = width; + } + + for (var i = 0; i < evalWidth; i++) { + value.push(this.createTree(depth - 1, width, obj)); + } + + } + } + + newObj[prop] = value; + } + } + + return newObj; + } + +}; + +module.exports = tree; |
