refactor: cleanup imports
[e-mobility-charging-stations-simulator.git] / src / utils / FileUtils.ts
index 0e8efc61e38cf593143a085631adb5f2b8db2efe..5e40b72435bc461b5ca8a6494ee08541be830a56 100644 (file)
@@ -1,56 +1,37 @@
-import { EmptyObject } from '../types/EmptyObject';
-import { HandleErrorParams } from '../types/Error';
-import chalk from 'chalk';
-import logger from './Logger';
+import { type FSWatcher, type WatchListener, readFileSync, watch } from 'node:fs';
 
-export default class FileUtils {
-  static handleFileException(
-    logPrefix: string,
-    fileType: string,
-    filePath: string,
-    error: NodeJS.ErrnoException,
-    params: HandleErrorParams<EmptyObject> = { throwError: true, consoleOut: false }
-  ): void {
-    const prefix = logPrefix.length !== 0 ? 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);
-      }
-    } 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;
+import { handleFileException } from './ErrorUtils';
+import { logger } from './Logger';
+import { Utils } from './Utils';
+import type { FileType, JsonType } from '../types';
+
+export const watchJsonFile = <T extends JsonType>(
+  file: string,
+  fileType: FileType,
+  logPrefix: string,
+  refreshedVariable?: T,
+  listener: WatchListener<string> = (event, filename) => {
+    if (Utils.isNotEmptyString(filename) && event === 'change') {
+      try {
+        logger.debug(`${logPrefix} ${fileType} file ${file} have changed, reload`);
+        refreshedVariable && (refreshedVariable = JSON.parse(readFileSync(file, 'utf8')) as T);
+      } catch (error) {
+        handleFileException(file, fileType, error as NodeJS.ErrnoException, logPrefix, {
+          throwError: false,
+        });
       }
     }
   }
-}
+): FSWatcher | undefined => {
+  if (Utils.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`);
+  }
+};