forked from OSSPhilippines/covid19-tracker-cli
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathregularHandler.ts
More file actions
100 lines (86 loc) · 3.69 KB
/
regularHandler.ts
File metadata and controls
100 lines (86 loc) · 3.69 KB
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
import colors from "colors";
import { Timeline } from "../types/schema";
import { CallbackCurry, ObjectIface } from "../types/types";
import { generateAsciiChart } from "../utils/graphics/generateAsciiChart";
import { generateColorTable } from "../utils/graphics/generateTable";
import { getTimestamp } from "../utils/libs/getTimestamp";
import { getTitle } from "../utils/libs/getTitle";
import { convertPercentToNonPercent } from "../utils/libs/numberUtils";
import { camelToSentenceCase, removeANSI } from "../utils/libs/stringUtils";
import { lines } from "../utils/lines";
import { getSaying } from "../utils/sayings";
import { getDuration } from "./plainHandler";
export const colorMappings: ObjectIface<keyof colors.Color> = {
active: "blue",
cases: "yellow",
critical: "cyan",
deaths: "red",
recovered: "green",
tests: "magenta",
};
const getKeysColor = (str: string): string => {
let response = str;
Object.entries(colorMappings).forEach(([keyWord, color]) => {
// @ts-ignore. This will never be a function
if (str.toLowerCase().includes(keyWord)) response = str[color];
});
return response; // default value
};
const parseData = (data: ObjectIface<number>): ObjectIface<string> => {
let unsorted: ObjectIface<string> = {};
Object.entries(data).forEach(([key, value]) => {
let stringValue = value.toString();
if (key.includes("PerOneMillion")) stringValue += "%";
key = camelToSentenceCase(key).replace("Per One Million", "%");
unsorted[key] = stringValue;
});
let sortedAndColored: ObjectIface<string> = {};
Object.keys(unsorted)
.sort()
.forEach((key) => {
let coloredKey = getKeysColor(key);
sortedAndColored[coloredKey] = unsorted[key];
});
return sortedAndColored;
};
const constructTable = (data: ObjectIface<string>, cols = 8): string[][] => {
let raw = Object.entries(data);
let response: string[][] = [];
while (raw.length > 0) {
let keyPairArray: [string, string][] = []; // array split from raw containing <cols> amount of items
for (let i = 0; i < cols; i++)
keyPairArray.push(raw.shift() ?? ["", ""]);
let keys = keyPairArray.map(([key]) => key);
let values = keyPairArray.map(([_, value]) => value);
response.push(keys, values); // add to response;
}
return response;
};
export const regularHandler: CallbackCurry = (isQuiet) => {
// prettier-ignore
return (meta, [nonPercent, percent], timeline) => {
let payload: Parameters<typeof generateColorTable>[0] = [
getTitle(meta.country, timeline !== undefined), // title
]
payload.push(getTimestamp(meta.updated)) // add timestamp
const cols = timeline !== undefined ? 8 : 4; // limit to 4 columns when there is no chart
let dataTable = constructTable(parseData({ ...nonPercent, ...convertPercentToNonPercent(percent) }), cols);
payload = payload.concat(dataTable); // add body
// generate chart if applicable
let chart = timeline !== undefined ? generateAsciiChart(timeline as Timeline, 100) : undefined;
if(chart !== undefined){
let duration = getDuration(meta, timeline as Timeline)
payload.push(duration);
payload = payload.concat(chart.split("\n")) // add the chart
}
let response = generateColorTable(payload).split("\n");
const divider = "═".repeat(removeANSI(response[0]).length);
response.push(lines.sponsorMessage, lines.BMCLink.red);
if(isQuiet === false){
response.push(divider, `\n${getSaying().green}\n`);
response.push(divider, lines.twitterPlug);
response.push(lines.handleHashtag.map((str) => str.black.bgCyan).join(" "));
}
return response.join("\n") + "\n";
};
};