104 lines
1.9 KiB
JavaScript
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'
|
|
// }
|