verifyValue.mjs

import get from 'lodash-es/get.js'
import isbol from './isbol.mjs'
import isstr from './isstr.mjs'
import isestr from './isestr.mjs'
import isnum from './isnum.mjs'
import isp0num from './isp0num.mjs'
import isn0num from './isn0num.mjs'
import isint from './isint.mjs'
import ispint from './ispint.mjs'
import isp0int from './isp0int.mjs'
import isnint from './isnint.mjs'
import isn0int from './isn0int.mjs'
import isfun from './isfun.mjs'


/**
 * 驗證數值是否為指定類型
 *
 * Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/verifyValue.test.mjs Github}
 * @memberOf wsemi
 * @param {String|Function} type 輸入判斷資料類型字串或判斷函式,資料類型可選為'isstr','isnum','isp0num','isn0num','isint','ispint','isp0int','isnint','isn0int','isfun'
 * @param {*} value 輸入任意資料
 * @returns {Object} 回傳判斷結果,屬性value為回傳資料類型的取值,屬性err為是否資料類型有錯,屬性errmsg為類型有錯時之錯誤訊息
 * @example
 *
 * console.log(verifyValue('12a5', 'isstr'))
 * // => r.err=false
 *
 * console.log(verifyValue('12', 'isint'))
 * // => r.err=false
 *
 * console.log(verifyValue('0', 'isp0int'))
 * // => r.err=false
 *
 * console.log(verifyValue('12', 'isp0int'))
 * // => r.err=false
 *
 * console.log(verifyValue('0', 'isn0int'))
 * // => r.err=false
 *
 * console.log(verifyValue('-12', 'isn0int'))
 * // => r.err=false
 *
 * console.log(verifyValue('12.34', 'isnum'))
 * // => r.err=false
 *
 * console.log(verifyValue('12.34', 'isp0num'))
 * // => r.err=false
 *
 * console.log(verifyValue('-12.34', 'isn0num'))
 * // => r.err=false
 *
 */
function verifyValue(value, type, opt = {}) {

    let err = false
    let errmsg = ''
    if (type === 'isstr') {
        if (!isstr(value)) {
            err = true
            errmsg = '需要為字串'
            value = ''
        }
    }
    else if (type === 'isnum') {
        if (!isnum(value)) {
            err = true
            errmsg = '需要為數字'
            value = 0
        }
    }
    else if (type === 'isp0num') {
        if (!isp0num(value)) {
            err = true
            errmsg = '需要為含0的正浮點數'
            value = 0
        }
    }
    else if (type === 'isn0num') {
        if (!isn0num(value)) {
            err = true
            errmsg = '需要為含0的負浮點數'
            value = 0
        }
    }
    else if (type === 'isint') {
        if (!isint(value)) {
            err = true
            errmsg = '需要為整數'
            value = 0
        }
    }
    else if (type === 'ispint') {
        if (!ispint(value)) {
            err = true
            errmsg = '需要為不含0正整數'
            value = 0
        }
    }
    else if (type === 'isp0int') {
        if (!isp0int(value)) {
            err = true
            errmsg = '需要為含0正整數'
            value = 0
        }
    }
    else if (type === 'isnint') {
        if (!isnint(value)) {
            err = true
            errmsg = '需要為不含0負整數'
            value = 0
        }
    }
    else if (type === 'isn0int') {
        if (!isn0int(value)) {
            err = true
            errmsg = '需要為含0負整數'
            value = 0
        }
    }
    else if (type === 'custom') {
        let funCustom = get(opt, 'funCustom')
        if (!isfun(funCustom)) {
            throw new Error(`invalid opt.funCustom when type='custom'`)
        }
        let r = funCustom(value)
        if (!isbol(r.err)) {
            throw new Error(`invalid return.err for type='custom'`)
        }
        if (r.err && !isestr(r.errmsg)) {
            throw new Error(`invalid return.errmsg when return.err=true for type='custom'`)
        }
        if (!isnum(r.value) & !isstr(r.value)) {
            throw new Error(`invalid return.value for type='custom'`)
        }
        err = r.err
        errmsg = r.errmsg
        value = r.value
    }
    else if (isfun(type)) {
        let f = type
        value = f(value)
    }
    else if (type === 'any') {
        if (!isnum(value) && !isstr(value)) {
            err = true
            errmsg = '需要為字串或數字'
            value = ''
        }
    }
    else {
        err = true
        errmsg = '需要指定驗證類型'
        value = null
    }
    let r = {
        value,
        err,
        errmsg,
    }
    return r
}


export default verifyValue