import isobj from 'wsemi/src/isobj.mjs'
import isfun from 'wsemi/src/isfun.mjs'
//測試接縫之取用規則:本模組為其唯一事實來源
//
//opt._fetchers 允許以假函數置換個別抓取函數。階梯升級須走完四階才能驗證,
//真跑等於每條測試啟動 Chrome 兩次加 camofox 一次, 且有頭模式會彈實體視窗,
//無法作為常規測試; 故開此接縫供測試以假抓取函數精確驅動各情境。
//底線前綴表示內部用途, 未傳時一律使用真實抓取函數, 生產環境不應傳入。
//
//此規則原寫在 runPlan 內; 內建 msn adapter 之 fetch 掛點亦須經 curl 呼叫其內容 API,
//且同樣需要被測試置換——若在 adapter 內再手寫一份「有 _fetchers.curl 就用它」,
//即是同一個決定的第二處實作, 兩處日後會分歧(例如一處加了型別檢核、另一處沒有)
/**
* 依測試接縫取出應使用之抓取函數
*
* @param {Object} opt 輸入設定物件
* @param {String} fetcherKey 輸入接縫鍵名字串,可為'curl'、'playwrightHeadless'、'playwrightHead'、'camofox'
* @param {Function} real 輸入真實抓取函數
* @returns {Function} 回傳應使用之抓取函數:opt._fetchers[fetcherKey]為函數時用它,否則用real
* @example
*
* import fetcherOf from './src/fetcherSeam.mjs'
*
* let real = async () => 'real'
* let fake = async () => 'fake'
* console.log(fetcherOf({ _fetchers: { curl: fake } }, 'curl', real) === fake, fetcherOf({}, 'curl', real) === real)
* // => true true
*
*/
function fetcherOf(opt, fetcherKey, real) {
let fs = opt?._fetchers
if (isobj(fs) && isfun(fs[fetcherKey])) {
return fs[fetcherKey]
}
return real
}
export default fetcherOf