4de762bbc2ece85a84f9ff9620550b7722d53dc0
[e-mobility-charging-stations-simulator.git] / src / utils / ConfigurationUtils.ts
1 import chalk from 'chalk'
2 import { dirname, join, resolve } from 'node:path'
3 import { fileURLToPath } from 'node:url'
4
5 import { type ElementsPerWorkerType, type FileType, StorageType } from '../types/index.js'
6 import { WorkerProcessType } from '../worker/index.js'
7 import { Constants } from './Constants.js'
8 import { isNotEmptyString, logPrefix as utilsLogPrefix } from './Utils.js'
9
10 export const logPrefix = (): string => {
11 return utilsLogPrefix(' Simulator configuration |')
12 }
13
14 export const buildPerformanceUriFilePath = (file: string): string => {
15 return `file://${join(resolve(dirname(fileURLToPath(import.meta.url)), '../'), file)}`
16 }
17
18 export const getDefaultPerformanceStorageUri = (storageType: StorageType): string => {
19 switch (storageType) {
20 case StorageType.JSON_FILE:
21 return buildPerformanceUriFilePath(
22 `${Constants.DEFAULT_PERFORMANCE_DIRECTORY}/${Constants.DEFAULT_PERFORMANCE_RECORDS_FILENAME}`
23 )
24 case StorageType.SQLITE:
25 return buildPerformanceUriFilePath(
26 `${Constants.DEFAULT_PERFORMANCE_DIRECTORY}/${Constants.DEFAULT_PERFORMANCE_RECORDS_DB_NAME}.db`
27 )
28 default:
29 throw new Error(`Unsupported storage type '${storageType}'`)
30 }
31 }
32
33 export const handleFileException = (
34 file: string,
35 fileType: FileType,
36 error: NodeJS.ErrnoException,
37 logPfx: string
38 ): void => {
39 const prefix = isNotEmptyString(logPfx) ? `${logPfx} ` : ''
40 let logMsg: string
41 switch (error.code) {
42 case 'ENOENT':
43 logMsg = `${fileType} file ${file} not found: `
44 break
45 case 'EEXIST':
46 logMsg = `${fileType} file ${file} already exists: `
47 break
48 case 'EACCES':
49 logMsg = `${fileType} file ${file} access denied: `
50 break
51 case 'EPERM':
52 logMsg = `${fileType} file ${file} permission denied: `
53 break
54 default:
55 logMsg = `${fileType} file ${file} error: `
56 }
57 console.error(`${chalk.green(prefix)}${chalk.red(logMsg)}`, error)
58 throw error
59 }
60
61 export const checkWorkerProcessType = (workerProcessType: WorkerProcessType): void => {
62 if (!Object.values(WorkerProcessType).includes(workerProcessType)) {
63 throw new SyntaxError(
64 `Invalid worker process type '${workerProcessType}' defined in configuration`
65 )
66 }
67 }
68
69 export const checkWorkerElementsPerWorker = (
70 elementsPerWorker: ElementsPerWorkerType | undefined
71 ): void => {
72 if (
73 elementsPerWorker != null &&
74 elementsPerWorker !== 'auto' &&
75 elementsPerWorker !== 'all' &&
76 !Number.isSafeInteger(elementsPerWorker)
77 ) {
78 throw new SyntaxError(
79 `Invalid number of elements per worker '${elementsPerWorker.toString()}' defined in configuration`
80 )
81 }
82 if (Number.isSafeInteger(elementsPerWorker) && (elementsPerWorker as number) <= 0) {
83 throw RangeError(
84 // eslint-disable-next-line @typescript-eslint/restrict-template-expressions
85 `Invalid negative or zero number of elements per worker '${elementsPerWorker?.toString()}' defined in configuration`
86 )
87 }
88 }