parse-js
Version:
Utility library for object structure conversion.
58 lines (44 loc) • 1.72 kB
JavaScript
;
var _get = require('lodash/get');
var _isNil = require('lodash/isNil');
var _isFunction = require('lodash/isFunction');
var nullSelector = {
parse: function parse() {},
reverse: function reverse() {}
};
function wrapPath(selector) {
if (_isFunction(selector)) return selector;
if (_isNil(selector)) return selector;
return function (source) {
return _get(source, selector);
};
}
function SwitchTransformer() {
var cases = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
var parseSelector = arguments.length > 1 ? arguments[1] : undefined;
var reverseSelector = arguments.length > 2 ? arguments[2] : undefined;
if (!(this instanceof SwitchTransformer)) {
return this.transform(new SwitchTransformer(cases, parseSelector, reverseSelector));
}
this._cases = cases;
this._parseSelector = wrapPath(parseSelector);
this._reverseSelector = wrapPath(reverseSelector);
}
SwitchTransformer.prototype._getParser = function (source, root, selector) {
if (!selector) return nullSelector;
var value = selector(source, root);
var next = this._cases[value];
if (next) return next;
return this._cases['_default_'];
};
SwitchTransformer.prototype.parse = function (source, instance, root) {
var next = this._getParser(source, root, this._parseSelector);
if (!next || !_isFunction(next.parse)) return void 0;
return next.parse(source, instance, root);
};
SwitchTransformer.prototype.reverse = function (source, instance, root) {
var next = this._getParser(source, root, this._reverseSelector);
if (!next || !_isFunction(next.reverse)) return void 0;
return next.reverse(source, instance, root);
};
module.exports = SwitchTransformer;