bbody/CMD-Resume

View on GitHub
js/helpers/commandHandlers.js

Summary

Maintainability
A
0 mins
Test Coverage
// Basic command handlers
var basicHandlerFunction = function(command) {
    var result = CONSTANTS.NEW_LINE;

    result += command ? (command.data ? command.data : CONSTANTS.EMPTY)
    : CONSTANTS.EMPTY;

    return result;
};

// System commmand handler
var systemHandlerFunction = function(command) {
    if (command) {
        if (command.handler) {
            return command.handler(command.data);
        } else if (command.data) {
            return command.data;
        }
    }

    return CONSTANTS.EMPTY;
};

// Calculated command handler
var calculatedHandlerFunction = function(command) {
    return CONSTANTS.NEW_LINE + systemHandlerFunction(command);
};

// Array function handler
var arrayHandlerFunction = function(command, top) {
    var result = CONSTANTS.EMPTY;

    if (!command.handlers) {
        return result;
    }

    command.data.some(function(value) {
        var resultArray = [];

        if (command.handlers.organisation) {
            var organisationValue = command.handlers.organisation(value);
            if (organisationValue) {
                resultArray.push(organisationValue);
            }
        }

        if (command.handlers.title) {
            var titleValue = command.handlers.title(value);
            if (titleValue) {
                resultArray.push(titleValue);
            }
        }

        if (command.handlers.date) {
            var dateValue = command.handlers.date(value);
            if (dateValue) {
                resultArray.push(dateValue);
            }
        }

        if (!top && resultArray.length) {
            result += CONSTANTS.NEW_LINE;
        }

        result += resultArray.join(CONSTANTS.TAB);

        // Break after the first command
        return top;
    });

    return result;
};

var commandProcessor = {
    basic: basicHandlerFunction,
    array: arrayHandlerFunction,
    calculated: calculatedHandlerFunction,
    system: systemHandlerFunction
};

var CMD = {
    BASIC: "basic",
    ARRAY: "array",
    CALCULATED: "calculated",
    SYSTEM: "system",
    getCommand: function(cmd) {
        return commandProcessor[cmd];
    }
};

// Format date
var getDate = function(startDate, endDate) {
    if (!endDate && !startDate) {
        return CONSTANTS.EMPTY;
    } else if (!endDate) {
        return startDate + " - Present";
    } else if (!startDate) {
        return "Until " + endDate;
    }

    return startDate + CONSTANTS.DASH + endDate;
};

// Get degree name
var getFullDegree = function(studyType, area) {
    if (!studyType && !area) {
        return CONSTANTS.EMPTY;
    } else if (!studyType) {
        return area;
    } else if (!area) {
        return studyType;
    }

    return studyType + " of " + area;
};

// Build URL based on social media username
var buildUrl = function(network, username) {
    if (!network || !username) {
        return CONSTANTS.EMPTY;
    }

    switch (network.toLowerCase()) {
        case "twitter":
            return "https://www.twitter.com/" + username;
        case "github":
            return "https://www.github.com/" + username;
        case "linkedin":
            return "https://www.linkedin.com/in/" + username;
        case "facebook":
            return "https://www.facebook.com/" + username;
        case "reddit":
            return "https://www.reddit.com/user/" + username;
        case "hackernews":
            return "https://news.ycombinator.com/user?id=" + username;
        default:
            return CONSTANTS.EMPTY;
    }
};

var parseEmail = function(email) {
    return email.replace("mailto:", "");
};

var buildEmail = function(email, username) {
    var address = "";

    if (email) {
        address = parseEmail(email);
    } else if (username) {
        address = parseEmail(username);
    }

    if (address) {
        return address;
    }

    return false;
};

var buildSocialNetworkAddress = function(network, url, username) {
    if (network.toLowerCase() === "email") {
        return buildEmail(url, username);
    } else if (url) {
        return url;
    } else if (username) {
        url = buildUrl(network, username);

        if (url) {
            return url;
        }
    }
    return false;
};

String.prototype.upperCaseFirstLetter = function() {
    if (!this || !this.length) {
        return "";
    }

    return this.charAt(0).toUpperCase() + this.slice(1);
};

var buildSocialNetwork = function(value) {
    if (value.network) {
        var address = buildSocialNetworkAddress(value.network, value.url,
            value.username);
        if (address) {
            return value.network.upperCaseFirstLetter() + CONSTANTS.DASH + address;
        }
        return false;
    }
    return value.url ? value.url : false;
};

var isValidCommandType = function(commandType) {
    return !!commandType && commandProcessor.hasOwnProperty(commandType);
};

var commandValidators = {
    basic: function(command) {
        if (!command.data) {
            console.error("'basic' command type requires 'data'");
            return false;
        }
        return true;
    },
    system: function(command) {
        if (!command.handler) {
            console.error("'system' command type requires 'handler'");
            return false;
        }
        return true;
    },
    calculated: function(command) {
        if (!command.data) {
            console.error("'calculated' command type requires 'data'");
            return false;
        }

        if (!command.handler) {
            console.error("'calculated' command type requires 'handler'");
            return false;
        }

        return true;
    },
    array: function(command) {
        if (!command.data) {
            console.error("'array' command type requires 'data'");
            return false;
        }

        if (!command.handlers) {
            console.error("'array' command type requires 'handlers'");
            return false;
        }
        return true;
    }
};

var isValidCommand = function(command) {
    if (!command.name) {
        console.error("Command must have a name");
        return false;
    }

    command.name = command.name.toLowerCase();

    if (!command.description) {
        console.error("'" + command.name + "' does not have a 'description'");
        return false;
    }

    if (!isValidCommandType(command.type)) {
        console.error("'" + command.name +
            "' does not have a valid type [basic, system, array, calculated]");
        return false;
    }

    return commandValidators[command.type](command);
};