uci-utils-type/src/cast.js

104 lines
1.9 KiB
JavaScript

import { toBoolean } from '@uci-utils/to-boolean'
import otp from 'observable-to-promise'
import isObservable from 'is-observable'
// adapted from "https://github.com/eivindfjeldstad/const git"
/**
* Cast `val` to `String`
*
* @param {Mixed} val
* @api public
*/
const toString = function (val) {
if (null == val) return ''
return val.toString()
}
/**
* Cast `val` to `Number`
*
* @param {Mixed} val
* @api public
*/
const toNumber = function (val) {
var num = parseFloat(val)
return isNaN(num)
? 0
: num
}
/**
* Cast `val` to a`Date`
*
* @param {Mixed} val
* @api public
*/
const toDate = function () {
var date = new Date(...arguments)
return isNaN(date.getTime())
? new Date(0)
: date
}
/**
* Cast `val` to `Array`
*
* @param {Mixed} val
* @api public
*/
const toArray = function (val) {
if (val == null) return []
if (val instanceof Array) return val
if (typeof val != 'string') return [val]
var arr = val.split(',')
for (var i = 0; i < arr.length; i++) {
arr[i] = arr[i].trim()
}
return arr
}
// cast Observable to promise
const toPromise = function (obs) {
if (!isObservable(obs)) throw new Error('not an observable, can not cast to promise')
return otp(obs)
}
/**
* Cast given `val` to `type`
*
* @param {Mixed} val
* @param {String} type
* @api public
*/
const typecast = { string: toString, number: toNumber, date: toDate, boolean: toBoolean, array: toArray, promise: toPromise }
function cast(val, type) {
var fn = typecast[type]
if (typeof fn != 'function') throw new Error('cannot cast to ' + type)
return fn(val)
}
export { cast, typecast, toBoolean, toArray, toDate, toNumber, toString, toPromise }
// TODO support registering alternative casting functions with a register function
/**
* Cast `val` to `Boolean`
*
* @param {Mixed} val
* @api public
*/
// const toBoolean = function (val) {
// return !! val && val !== 'false' && val !== '0'
// }