-
Notifications
You must be signed in to change notification settings - Fork 46
/
Copy pathhandleParseFiles.ts
108 lines (96 loc) · 2.95 KB
/
handleParseFiles.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
import type { TFunction } from 'i18next';
import type { Dispatch } from 'redux';
import type { ImportedTrainSchedule } from 'applications/operationalStudies/types';
import { type TrainScheduleBase } from 'common/api/osrdEditoastApi';
import { setFailure } from 'reducers/main';
export const handleFileReadingError = (error: Error) => {
console.error('File reading error:', error);
};
const TRAIN_SCHEDULE_COMPULSORY_KEYS: (keyof TrainScheduleBase)[] = [
'constraint_distribution',
'path',
'rolling_stock_name',
'start_time',
'train_name',
];
const validateTrainSchedules = (
importedTrainSchedules: Partial<TrainScheduleBase>[]
): TrainScheduleBase[] => {
const isInvalidTrainSchedules = importedTrainSchedules.some((trainSchedule) => {
if (
TRAIN_SCHEDULE_COMPULSORY_KEYS.some((key) => !(key in trainSchedule)) ||
!Array.isArray(trainSchedule.path)
) {
return true;
}
const hasInvalidSteps = trainSchedule.path.some((step) => !('id' in step));
return hasInvalidSteps;
});
if (isInvalidTrainSchedules) {
throw new Error('Invalid train schedules: some compulsory keys are missing');
}
return importedTrainSchedules as TrainScheduleBase[];
};
export const processJsonFile = (
fileContent: string,
fileExtension: string,
setTrainsJsonData: (data: TrainScheduleBase[]) => void,
dispatch: Dispatch,
t: TFunction
) => {
const isJsonFile = fileExtension === 'application/json';
// try to parse the file content
let rawContent;
try {
rawContent = JSON.parse(fileContent);
} catch {
if (isJsonFile) {
dispatch(
setFailure({
name: t('errorMessages.error'),
message: t('errorMessages.errorInvalidFile'),
})
);
}
return isJsonFile;
}
// validate the trainSchedules
try {
const importedTrainSchedules = validateTrainSchedules(rawContent);
if (importedTrainSchedules.length > 0) {
setTrainsJsonData(importedTrainSchedules);
} else {
dispatch(
setFailure({
name: t('errorMessages.error'),
message: t('errorMessages.errorEmptyFile'),
})
);
}
} catch {
dispatch(
setFailure({
name: t('errorMessages.error'),
message: t('errorMessages.errorInvalidFile'),
})
);
}
// file has been parsed successfully
return true;
};
export const processXmlFile = async (
fileContent: string,
parseRailML: (xmlDoc: Document) => Promise<ImportedTrainSchedule[]>,
updateTrainSchedules: (schedules: ImportedTrainSchedule[]) => void
) => {
const parser = new DOMParser();
const xmlDoc = parser.parseFromString(fileContent, 'application/xml');
const parserError = xmlDoc.getElementsByTagName('parsererror');
if (parserError.length > 0) {
throw new Error('Invalid XML');
}
const importedTrainSchedules = await parseRailML(xmlDoc);
if (importedTrainSchedules && importedTrainSchedules.length > 0) {
updateTrainSchedules(importedTrainSchedules);
}
};