diff options
Diffstat (limited to 'parseExceptions.js')
-rw-r--r-- | parseExceptions.js | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/parseExceptions.js b/parseExceptions.js new file mode 100644 index 0000000..63cd6d2 --- /dev/null +++ b/parseExceptions.js @@ -0,0 +1,66 @@ + +const assert = require('node:assert').strict; + +function parseLine(line) { + const [datePart] = line.split(' ', 1); + assert.equal(datePart !== undefined, true, `otsikkoa ei annettu rivillä ”${line}”`); + const rest = line.substring(datePart.length + 1); + let dateStrings = datePart.split('-'); + if (dateStrings.length === 1) + dateStrings.push(dateStrings[0]); + assert.equal(dateStrings.length, 2, `päivämääräväli ${datePart} on virheellinen (ks. rivi ${line})`); + let d1 = dateStrings[0].split('.'); + const d2 = dateStrings[1].split('.'); + assert.equal(d2.length, 3, `päivämäärästä ”${dateStrings[1]}” puuttui päivä, kuukausi tai vuosi tai se on muutoin virheellinen (ks. rivi ”${line}”)`); + while (d1.length < 3) { + d1.push(d2[d1.length]) + } + for (let i = 0; i < 3; i++) { + d1[i] = +d1[i]; + d2[i] = +d2[i]; + let opts = ['päivä', 'kuukausi', 'vuosi']; + assert.ok(!isNaN(d1[i]), `syötetty ${opts[i]} ei koostunut pelkistä numeroista (ks. rivi ${line})`); + assert.ok(!isNaN(d2[i]), `syötetty ${opts[i]} ei koostunut pelkistä numeroista (ks. rivi ${line})`); + } + const start = new Date(d1[2], d1[1] - 1, d1[0]); + const end = new Date(d2[2], d2[1] - 1, d2[0]); + + let [header, message = ''] = rest.split('|', 2); + assert.equal(header === undefined, false, 'otsikko täytyy antaa (ks. rivi ${line})'); + header = header.trimEnd(); + message = message.trimStart(); + + return [ + start, + end, + header, + message + ]; +} +assert.deepEqual( + parseLine('02.06.2024-07.08.2024 Hyvää kesää LYLLin väelle! | Kesäloma 2.6.-7.8.'), + [ + new Date(2024, 5, 2), + new Date(2024, 7, 7), + 'Hyvää kesää LYLLin väelle!', + 'Kesäloma 2.6.-7.8.' + ] +); + +async function updateExceptions(exceptions, DB) { + await DB.query_raw('DELETE FROM exceptions'); + let dbOperations = []; + for (line of exceptions.split('\n')) { + if (line === '' || line[0] === '#') + continue + const [start, end, header, message] = parseLine(line); + dbOperations.push(DB.execute( + 'INSERT INTO exceptions VALUE (?, ?, ?, ?)', + [start, end, header, message] + )); + } + await Promise.all(dbOperations); + return 0; +} + +exports.updateExceptions = updateExceptions; |