-
Notifications
You must be signed in to change notification settings - Fork 0
/
ConfigProvider.ts
129 lines (116 loc) · 4.11 KB
/
ConfigProvider.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
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
import { asyncPrompt, asyncSilentPrompt } from './TerminalIO';
import chalk from "chalk";
import parseArgs from 'minimist';
import {FileHandle} from "fs/promises";
export enum Command {
INTERACTIVE,
CHECK,
LISTCHECKS,
VERSION,
HELP
}
export class ConfigProvider {
urlBase: string;
private username: string;
private password: string;
private sourceFolder: string;
private categoryId: number;
private command: Command;
private interactiveResults: boolean;
private listChecks: boolean;
private disableUpdate: boolean;
constructor() {
this.username = "";
this.password = "";
this.sourceFolder = "";
this.categoryId = -1;
this.command = Command.INTERACTIVE;
this.urlBase = "https://codetester.ialistannen.de";
this.interactiveResults = false;
this.listChecks = false;
this.disableUpdate = false;
}
public async parseFile(fileHandler: FileHandle) {
const jsonData = JSON.parse(await fileHandler.readFile('utf-8'));
switch(jsonData.command) {
case "check":
this.command = Command.CHECK;
break;
case "listcategories":
this.command = Command.LISTCHECKS;
break;
}
this.username = jsonData.username || this.username;
this.password = jsonData.password || this.password;
this.sourceFolder = jsonData.source || this.sourceFolder;
this.categoryId = jsonData.categoryId || this.categoryId;
this.interactiveResults = jsonData.interactiveResults || this.interactiveResults;
this.listChecks = jsonData.listChecks || this.listChecks;
this.disableUpdate = jsonData.disableUpdate || this.disableUpdate;
}
public async parseCommandLine(cliArguments: string[]): Promise<Command> {
const args = parseArgs(cliArguments, {
string: ["src", "c", "u", "p"],
boolean: ["l", "i", "noupdate", "help", "version"],
alias: {
"c": "category",
"u": "username",
"p": "password",
"l": "list-checks",
"i": "interactive-results"
}
});
if(args.help) return Command.HELP;
if(args.version) return Command.VERSION;
if(args._.includes("check")) {
this.command = Command.CHECK;
}
if(args._.includes("listcategories")) {
this.command = Command.LISTCHECKS;
}
this.username = args.u || this.username;
this.password = args.p || this.password;
this.sourceFolder = args.src || this.sourceFolder;
this.categoryId = args.c || this.categoryId;
this.interactiveResults = args.i || this.interactiveResults;
this.listChecks = args.l || this.listChecks;
this.disableUpdate = args.noupdate || this.disableUpdate;
return args.command;
}
public async getCategoryId(): Promise<number> {
while(this.categoryId < 0) {
this.categoryId = parseInt(await asyncPrompt("Please enter a category id: "));
}
return this.categoryId;
}
public async getUsername(): Promise<string> {
while(this.username === "") {
this.username = await asyncPrompt("Please enter your username: ");
}
return this.username;
}
public async getPassword(): Promise<string> {
while(this.password === "") {
this.password = await asyncSilentPrompt(`Password for ${chalk.yellow(this.username)}: `);
}
return this.password;
}
public getCommand(): Command {
return this.command;
}
public async getSource(): Promise<string> {
while(this.sourceFolder === "") {
this.sourceFolder = await asyncPrompt("Please enter the source folder: ");
}
return this.sourceFolder;
}
public getInteractiveResults(): boolean {
return this.interactiveResults;
}
public getCheckList(): boolean {
return this.listChecks;
}
public getUpdateCheck(): boolean {
return !this.disableUpdate;
}
}