| // Generated by LiveScript 1.4.0 |
| (function(){ |
| var parsedTypeCheck, types, toString$ = {}.toString; |
| parsedTypeCheck = require('type-check').parsedTypeCheck; |
| types = { |
| '*': function(value, options){ |
| switch (toString$.call(value).slice(8, -1)) { |
| case 'Array': |
| return typeCast(value, { |
| type: 'Array' |
| }, options); |
| case 'Object': |
| return typeCast(value, { |
| type: 'Object' |
| }, options); |
| default: |
| return { |
| type: 'Just', |
| value: typesCast(value, [ |
| { |
| type: 'Undefined' |
| }, { |
| type: 'Null' |
| }, { |
| type: 'NaN' |
| }, { |
| type: 'Boolean' |
| }, { |
| type: 'Number' |
| }, { |
| type: 'Date' |
| }, { |
| type: 'RegExp' |
| }, { |
| type: 'Array' |
| }, { |
| type: 'Object' |
| }, { |
| type: 'String' |
| } |
| ], (options.explicit = true, options)) |
| }; |
| } |
| }, |
| Undefined: function(it){ |
| if (it === 'undefined' || it === void 8) { |
| return { |
| type: 'Just', |
| value: void 8 |
| }; |
| } else { |
| return { |
| type: 'Nothing' |
| }; |
| } |
| }, |
| Null: function(it){ |
| if (it === 'null') { |
| return { |
| type: 'Just', |
| value: null |
| }; |
| } else { |
| return { |
| type: 'Nothing' |
| }; |
| } |
| }, |
| NaN: function(it){ |
| if (it === 'NaN') { |
| return { |
| type: 'Just', |
| value: NaN |
| }; |
| } else { |
| return { |
| type: 'Nothing' |
| }; |
| } |
| }, |
| Boolean: function(it){ |
| if (it === 'true') { |
| return { |
| type: 'Just', |
| value: true |
| }; |
| } else if (it === 'false') { |
| return { |
| type: 'Just', |
| value: false |
| }; |
| } else { |
| return { |
| type: 'Nothing' |
| }; |
| } |
| }, |
| Number: function(it){ |
| return { |
| type: 'Just', |
| value: +it |
| }; |
| }, |
| Int: function(it){ |
| return { |
| type: 'Just', |
| value: +it |
| }; |
| }, |
| Float: function(it){ |
| return { |
| type: 'Just', |
| value: +it |
| }; |
| }, |
| Date: function(value, options){ |
| var that; |
| if (that = /^\#([\s\S]*)\#$/.exec(value)) { |
| return { |
| type: 'Just', |
| value: new Date(+that[1] || that[1]) |
| }; |
| } else if (options.explicit) { |
| return { |
| type: 'Nothing' |
| }; |
| } else { |
| return { |
| type: 'Just', |
| value: new Date(+value || value) |
| }; |
| } |
| }, |
| RegExp: function(value, options){ |
| var that; |
| if (that = /^\/([\s\S]*)\/([gimy]*)$/.exec(value)) { |
| return { |
| type: 'Just', |
| value: new RegExp(that[1], that[2]) |
| }; |
| } else if (options.explicit) { |
| return { |
| type: 'Nothing' |
| }; |
| } else { |
| return { |
| type: 'Just', |
| value: new RegExp(value) |
| }; |
| } |
| }, |
| Array: function(value, options){ |
| return castArray(value, { |
| of: [{ |
| type: '*' |
| }] |
| }, options); |
| }, |
| Object: function(value, options){ |
| return castFields(value, { |
| of: {} |
| }, options); |
| }, |
| String: function(it){ |
| var that; |
| if (toString$.call(it).slice(8, -1) !== 'String') { |
| return { |
| type: 'Nothing' |
| }; |
| } |
| if (that = it.match(/^'([\s\S]*)'$/)) { |
| return { |
| type: 'Just', |
| value: that[1].replace(/\\'/g, "'") |
| }; |
| } else if (that = it.match(/^"([\s\S]*)"$/)) { |
| return { |
| type: 'Just', |
| value: that[1].replace(/\\"/g, '"') |
| }; |
| } else { |
| return { |
| type: 'Just', |
| value: it |
| }; |
| } |
| } |
| }; |
| function castArray(node, type, options){ |
| var typeOf, element; |
| if (toString$.call(node).slice(8, -1) !== 'Array') { |
| return { |
| type: 'Nothing' |
| }; |
| } |
| typeOf = type.of; |
| return { |
| type: 'Just', |
| value: (function(){ |
| var i$, ref$, len$, results$ = []; |
| for (i$ = 0, len$ = (ref$ = node).length; i$ < len$; ++i$) { |
| element = ref$[i$]; |
| results$.push(typesCast(element, typeOf, options)); |
| } |
| return results$; |
| }()) |
| }; |
| } |
| function castTuple(node, type, options){ |
| var result, i, i$, ref$, len$, types, cast; |
| if (toString$.call(node).slice(8, -1) !== 'Array') { |
| return { |
| type: 'Nothing' |
| }; |
| } |
| result = []; |
| i = 0; |
| for (i$ = 0, len$ = (ref$ = type.of).length; i$ < len$; ++i$) { |
| types = ref$[i$]; |
| cast = typesCast(node[i], types, options); |
| if (toString$.call(cast).slice(8, -1) !== 'Undefined') { |
| result.push(cast); |
| } |
| i++; |
| } |
| if (node.length <= i) { |
| return { |
| type: 'Just', |
| value: result |
| }; |
| } else { |
| return { |
| type: 'Nothing' |
| }; |
| } |
| } |
| function castFields(node, type, options){ |
| var typeOf, key, value; |
| if (toString$.call(node).slice(8, -1) !== 'Object') { |
| return { |
| type: 'Nothing' |
| }; |
| } |
| typeOf = type.of; |
| return { |
| type: 'Just', |
| value: (function(){ |
| var ref$, resultObj$ = {}; |
| for (key in ref$ = node) { |
| value = ref$[key]; |
| resultObj$[typesCast(key, [{ |
| type: 'String' |
| }], options)] = typesCast(value, typeOf[key] || [{ |
| type: '*' |
| }], options); |
| } |
| return resultObj$; |
| }()) |
| }; |
| } |
| function typeCast(node, typeObj, options){ |
| var type, structure, castFunc, ref$; |
| type = typeObj.type, structure = typeObj.structure; |
| if (type) { |
| castFunc = ((ref$ = options.customTypes[type]) != null ? ref$.cast : void 8) || types[type]; |
| if (!castFunc) { |
| throw new Error("Type not defined: " + type + "."); |
| } |
| return castFunc(node, options, typesCast); |
| } else { |
| switch (structure) { |
| case 'array': |
| return castArray(node, typeObj, options); |
| case 'tuple': |
| return castTuple(node, typeObj, options); |
| case 'fields': |
| return castFields(node, typeObj, options); |
| } |
| } |
| } |
| function typesCast(node, types, options){ |
| var i$, len$, type, ref$, valueType, value; |
| for (i$ = 0, len$ = types.length; i$ < len$; ++i$) { |
| type = types[i$]; |
| ref$ = typeCast(node, type, options), valueType = ref$.type, value = ref$.value; |
| if (valueType === 'Nothing') { |
| continue; |
| } |
| if (parsedTypeCheck([type], value, { |
| customTypes: options.customTypes |
| })) { |
| return value; |
| } |
| } |
| throw new Error("Value " + JSON.stringify(node) + " does not type check against " + JSON.stringify(types) + "."); |
| } |
| module.exports = typesCast; |
| }).call(this); |