_toResultError.mjs

import errToStr from './_errToStr.mjs'
import isRealError from './_isRealError.mjs'


/**
 * 結果物件之error值正規化且保證不拋錯,內部共用不對外
 *
 * 捕捉之值為Error物件(真Error,經_isRealError判定,含跨realm與無原型之Error,同R-CODEC-ERR-01之1)或非空字串者原樣回傳;其餘(null、undefined、一般物件、已撤銷之Proxy等)經_errToStr轉字串,仍為空字串者為'unknown error',故回傳值恆為truthy(R-FS-RESULT-01之5)
 *
 * 使用端: 回傳結果物件之fs函數之catch,如fsWriteJson、fsReadTextCore、fsWriteTextCore、fsCreateFileCore、fsCopyFileCore、fsCopyFolderCore、fsCreateFolderCore、fsDeleteFileCore、fsDeleteFolderCore、fsRenameFileCore、fsRenameFolderCore、fsCleanFolderCore
 *
 * @param {*} err 輸入捕捉之錯誤值
 * @returns {Error|String} 回傳Error物件或非空字串
 */
function toResultError(err) {
    let isErr = false
    try {
        isErr = isRealError(err)
    }
    catch (e) {} //已撤銷之Proxy於instanceof即拋錯, 視為非Error而轉字串
    if (isErr) {
        return err
    }
    if (typeof err === 'string' && err !== '') {
        return err
    }
    let s = errToStr(err)
    return s !== '' ? s : 'unknown error'
}


export default toResultError