refactor: cleanup eslint configuration
[e-mobility-charging-stations-simulator.git] / src / utils / FileUtils.ts
index 8edbb4c5ec0b2f79ed3d0c4f7adf7005f742a08f..543a2b23c2eda50f157680f15377ee335ec697da 100644 (file)
@@ -1,21 +1,38 @@
-import logger from './Logger';
+import { type FSWatcher, readFileSync, watch, type WatchListener } from 'node:fs'
 
-export default class FileUtils {
-  static handleFileException(logPrefix: string, fileType: string, filePath: string, error: NodeJS.ErrnoException, consoleOut = false): void {
-    const prefix = logPrefix.length !== 0 ? logPrefix + ' ' : '';
-    if (error.code === 'ENOENT') {
-      if (consoleOut) {
-        console.error(prefix + fileType + ' file ' + filePath + ' not found: ', error);
-      } else {
-        logger.error(prefix + fileType + ' file ' + filePath + ' not found: %j', error);
-      }
-    } else {
-      if (consoleOut) {
-        console.error(prefix + fileType + ' file ' + filePath + ' opening error: ', error);
-      } else {
-        logger.error(prefix + fileType + ' file ' + filePath + ' opening error: %j', error);
+import type { FileType, JsonType } from '../types/index.js'
+import { handleFileException } from './ErrorUtils.js'
+import { logger } from './Logger.js'
+import { isNotEmptyString } from './Utils.js'
+
+export const watchJsonFile = <T extends JsonType>(
+  file: string,
+  fileType: FileType,
+  logPrefix: string,
+  refreshedVariable?: T,
+  listener: WatchListener<string> = (event, filename) => {
+    if (isNotEmptyString(filename) && event === 'change') {
+      try {
+        logger.debug(`${logPrefix} ${fileType} file ${file} have changed, reload`)
+        refreshedVariable != null &&
+          (refreshedVariable = JSON.parse(readFileSync(file, 'utf8')) as T)
+      } catch (error) {
+        handleFileException(file, fileType, error as NodeJS.ErrnoException, logPrefix, {
+          throwError: false
+        })
       }
-      throw error;
     }
   }
+): FSWatcher | undefined => {
+  if (isNotEmptyString(file)) {
+    try {
+      return watch(file, listener)
+    } catch (error) {
+      handleFileException(file, fileType, error as NodeJS.ErrnoException, logPrefix, {
+        throwError: false
+      })
+    }
+  } else {
+    logger.info(`${logPrefix} No ${fileType} file to watch given. Not monitoring its changes`)
+  }
 }