aboutsummaryrefslogtreecommitdiff
path: root/lib/tree.js
blob: 07a6242bab27bb515a8367ea759d7e757d56b7fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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;