import fs from 'fs'
import genPm from './genPm.mjs'
/**
* 使用stream寫入utf8文字至檔案
*
* Unit Test: {@link https://github.com/yuda-lyu/wsemi/blob/master/test/fsBuildWriteStreamText.test.mjs Github}
* @memberOf wsemi
* @returns {Object} 回傳函數物件,提供creat、write、end函數,create代表創建stream,可輸入fp為檔案路徑字串,write代表寫入字串,輸入c為字串(預設為行),end代表結束stream,無輸入
* @example
* need test in nodejs.
*
* let test = async () => {
*
* let ms = []
*
* let fdt = './_test_fsBuildWriteStreamText'
* fsCreateFolder(fdt) //創建臨時任務資料夾
*
* let fn = 't1.txt'
* let fp = `${fdt}/${fn}`
*
* let bdw = fsBuildWriteStreamText()
*
* let pm = bdw.create(fp)
* ms.push({ 'create': '' })
*
* bdw.write('abc')
* ms.push({ 'write': 'abc' })
* bdw.write('中文')
* ms.push({ 'write': '中文' })
* bdw.end()
*
* await pm
*
* let c = fs.readFileSync(fp, 'utf8')
* ms.push({ 'readFileSync': c })
*
* fsDeleteFolder(fdt) //刪除臨時任務資料夾
*
* console.log('ms', ms)
* return ms
* }
* await test()
* // ms [
* // { create: '' },
* // { write: 'abc' },
* // { write: '中文' },
* // { readFileSync: 'abc\n中文\n' }
* // ]
*
*/
function fsBuildWriteStreamText() {
//stream
let stream = null
//create
let create = (fp) => {
//pm
let pm = genPm()
//createWriteStream
stream = fs.createWriteStream(fp, { flags: 'w', encoding: 'utf8' })
//finish
stream.on('finish', () => {
pm.resolve()
})
//error
stream.on('error', (err) => {
pm.reject(err)
})
return pm
}
//write
let write = (c) => {
stream.write(c + '\n')
}
//end
let end = () => {
let pmm = genPm()
stream.on('close', () => {
//close事件才代表檔案可刪除
pmm.resolve()
})
stream.end() //發出flush與close
return pmm
}
//r
let r = {
create,
write,
end,
}
return r
}
export default fsBuildWriteStreamText