X-Git-Url: https://git.piment-noir.org/?a=blobdiff_plain;f=src%2Futils%2FFileUtils.ts;h=328687b2dcdc21f46868d538cb110c0aa9248e7a;hb=260f9dcc04f0680f7ef3f01d859a1f2fa748c07c;hp=38df26a9eb23419de11c4040a39170f7104978a2;hpb=e81916227dc1a059ae4080cdb5fb4c0ef383788d;p=e-mobility-charging-stations-simulator.git diff --git a/src/utils/FileUtils.ts b/src/utils/FileUtils.ts index 38df26a9..328687b2 100644 --- a/src/utils/FileUtils.ts +++ b/src/utils/FileUtils.ts @@ -1,57 +1,78 @@ -import { EmptyObject } from '../types/EmptyObject'; -import { HandleErrorParams } from '../types/Error'; -import Utils from './Utils'; +import fs from 'node:fs'; + import chalk from 'chalk'; -import logger from './Logger'; -export default class FileUtils { - static handleFileException( +// import { Utils, logger } from './internal'; +import { logger } from './Logger'; +import { Utils } from './Utils'; +import type { EmptyObject, FileType, HandleErrorParams, JsonType } from '../types'; + +export class FileUtils { + private constructor() { + // This is intentional + } + + public static watchJsonFile( + file: string, + fileType: FileType, logPrefix: string, - fileType: string, - filePath: string, + refreshedVariable?: T, + listener: fs.WatchListener = (event, filename) => { + if (Utils.isNotEmptyString(filename) && event === 'change') { + try { + logger.debug(`${logPrefix} ${fileType} file ${file} have changed, reload`); + refreshedVariable && (refreshedVariable = JSON.parse(fs.readFileSync(file, 'utf8')) as T); + } catch (error) { + FileUtils.handleFileException(file, fileType, error as NodeJS.ErrnoException, logPrefix, { + throwError: false, + }); + } + } + } + ): fs.FSWatcher | undefined { + if (Utils.isNotEmptyString(file)) { + try { + return fs.watch(file, listener); + } catch (error) { + FileUtils.handleFileException(file, fileType, error as NodeJS.ErrnoException, logPrefix, { + throwError: false, + }); + } + } else { + logger.info(`${logPrefix} No ${fileType} file to watch given. Not monitoring its changes`); + } + } + + public static handleFileException( + file: string, + fileType: FileType, error: NodeJS.ErrnoException, + logPrefix: string, params: HandleErrorParams = { throwError: true, consoleOut: false } ): void { - const prefix = !Utils.isEmptyString(logPrefix) ? logPrefix + ' ' : ''; - if (error.code === 'ENOENT') { - if (params?.consoleOut) { - console.warn( - chalk.green(prefix) + chalk.yellow(fileType + ' file ' + filePath + ' not found: '), - error - ); - } else { - logger.warn(prefix + fileType + ' file ' + filePath + ' not found: %j', error); - } - } else if (error.code === 'EEXIST') { - if (params?.consoleOut) { - console.warn( - chalk.green(prefix) + chalk.yellow(fileType + ' file ' + filePath + ' already exists: '), - error - ); - } else { - logger.warn(prefix + fileType + ' file ' + filePath + ' already exists: %j', error); - } - } else if (error.code === 'EACCES') { - if (params?.consoleOut) { - console.warn( - chalk.green(prefix) + chalk.yellow(fileType + ' file ' + filePath + ' access denied: '), - error - ); - } else { - logger.warn(prefix + fileType + ' file ' + filePath + ' access denied: %j', error); - } + const prefix = Utils.isNotEmptyString(logPrefix) ? `${logPrefix} ` : ''; + let logMsg: string; + switch (error.code) { + case 'ENOENT': + logMsg = `${fileType} file ${file} not found:`; + break; + case 'EEXIST': + logMsg = `${fileType} file ${file} already exists:`; + break; + case 'EACCES': + logMsg = `${fileType} file ${file} access denied:`; + break; + default: + logMsg = `${fileType} file ${file} error:`; + } + if (params?.consoleOut) { + logMsg = `${logMsg} `; + console.warn(`${chalk.green(prefix)}${chalk.yellow(logMsg)}`, error); } else { - if (params?.consoleOut) { - console.warn( - chalk.green(prefix) + chalk.yellow(fileType + ' file ' + filePath + ' error: '), - error - ); - } else { - logger.warn(prefix + fileType + ' file ' + filePath + ' error: %j', error); - } - if (params?.throwError) { - throw error; - } + logger.warn(`${prefix}${logMsg}`, error); + } + if (params?.throwError) { + throw error; } } }