Hacker News new | ask | show | jobs
by lucono 4011 days ago
Example of using xtypejs:

Go from this:

    function searchEmployees(value) {
        if (typeof value === 'string') {
             if (value.trim().length > 1) {
                return EmployeeDB.searchByName(value);
            } else if (value.trim().length === 1) {
                return EmployeeDB.searchByMiddleInitial(value);
            } else {
                return { error: 'Invalid search value supplied' };
            }
        } else if (typeof value === 'object' && value !== null) {
            if (Object.keys(value).length === 1) {
                return EmployeeDB.searchByFieldValuePair(value);
            } else if (Object.keys(value).length > 1) {
                return { error: 'Search by multiple fields not supported' };
            } else {
                return { error: 'Invalid search value supplied' };
            }
        } else if (typeof value === 'number') {
            if (!isNaN(value) && isFinite(value) && value > 0 && value % 1 === 0) {
                return EmployeeDB.searchByEmployeeNumber(value);
            } else {
                return { error: 'Invalid employee number supplied' };
            }
        } else if (typeof value === 'undefined' || value === null) {
            return { error: 'No search value supplied' };
        } else {
            return { error: 'Invalid search value supplied' };
        }
    }
    
To concise, performant, readable, data validation:

    function searchEmployees(value) {
        switch (xtype.which(value, 'str2+ str1 int+ obj1 obj2+ num nil')) {
            case 'str2+':
                return EmployeeDB.searchByName(value);
            case 'str1':
                return EmployeeDB.searchByMiddleInitial(value);
            case 'int+':
                return EmployeeDB.searchByEmployeeNumber(value);
            case 'obj1':
                return EmployeeDB.searchByFieldValuePair(value);
            case 'obj2+':
                return { error: 'Search by multiple fields not supported' };
            case 'num':
                return { error: 'Invalid employee number supplied' };
            case 'nil':
                return { error: 'No search value supplied' };
            default:
                return { error: 'Invalid search value supplied' };
        }
    }
1 comments

Contrived and oddly specific for an example. Do we have any examples being used out in the wild?
There is a non-open-source JavaScript decorator library using this. It has many (real) examples, but the one that first comes to mind is its use of the xtype.is API method (http://xtype.js.org/api/is) to perform runtime validations based on validation meta-data that's defined in configuration.

For an idea of what that looks like, see:

http://xtype.js.org/guide/checking_combinations_of_types

Completely makes sense now, the example had me in the wrong headspace.