-
Notifications
You must be signed in to change notification settings - Fork 0
/
vaccinationCentresParser.ts
103 lines (74 loc) · 2.79 KB
/
vaccinationCentresParser.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
import localDebug from './localDebug'
import {
RawVaccinationCentre,
RawVaccinationCentreKeys,
} from '../VaccinationCentre'
import { ParsedTable } from './vaccinationCentresTableParser'
import { ParsedTableEntry } from './tableParser'
const fieldsCache : Map<string, string> = new Map()
const centresParserDebug = localDebug('centresParser')
const fields = {
'district': ["district"],
'tehsil': ["tehsil"],
'name': ["avc", "cvc", "mvc", "cvc\/mvc", "cvc\/ mvc name", "hf", "hf name"],
'address': ["address", "adres"],
'contact': ["contact no", "contact", "number", "contact number"],
'designation': ["designated", "designated for", "designation"],
}
export function parseToVaccinationCentreArray (table: ParsedTable): RawVaccinationCentre[] {
return table.tableEntries.map(
tableEntry => resolveTableEntry(
table.province,
tableEntry
)
).filter(x => x) as RawVaccinationCentre[]
}
function resolveTableEntry (province: string, tableEntry: ParsedTableEntry): RawVaccinationCentre | undefined {
const newObject : ParsedTableEntry = {
province,
}
for (const [key, value] of Object.entries(tableEntry)) {
const resolvedField = resolveField(key)
if (resolvedField === undefined) {
centresParserDebug('Skipping as no resolved field is found')
centresParserDebug('field = ' + key)
continue
}
newObject[resolvedField] = value
}
if (!('tehsil' in newObject) || !('district' in newObject)) {
if ('tehsil' in newObject) {
newObject.tehsil = newObject.tehsil
newObject.district = newObject.tehsil
} else {
newObject.district = newObject.district
newObject.tehsil = newObject.district
}
}
newObject.designation = 'all'
const keysNotPresent = RawVaccinationCentreKeys.filter(key => {
return !(key in newObject) && key !== 'contact'
})
if (keysNotPresent.length) {
centresParserDebug('Following keys are not present in an entry so skipping ->' + JSON.stringify(keysNotPresent))
centresParserDebug(newObject)
return undefined
}
const x = newObject as RawVaccinationCentre
return x
}
function resolveField (str: string): string | undefined {
if (fieldsCache.has(str)) {
centresParserDebug('Using cached value for ' + str)
return fieldsCache.get(str)
}
for (const [field, fieldMatches] of Object.entries(fields)) {
for (const fieldMatch of fieldMatches) {
if (str.match(new RegExp(fieldMatch, 'i')) !== null) {
fieldsCache.set(str, field)
return field
}
}
}
centresParserDebug(`Not able to resolve to anything for ${str}`)
}