aboutsummaryrefslogtreecommitdiff
path: root/src/background/controllers/CommandController.ts
diff options
context:
space:
mode:
Diffstat (limited to 'src/background/controllers/CommandController.ts')
-rw-r--r--src/background/controllers/CommandController.ts103
1 files changed, 103 insertions, 0 deletions
diff --git a/src/background/controllers/CommandController.ts b/src/background/controllers/CommandController.ts
new file mode 100644
index 0000000..f3a6b7f
--- /dev/null
+++ b/src/background/controllers/CommandController.ts
@@ -0,0 +1,103 @@
+import CompletionsUseCase from '../usecases/CompletionsUseCase';
+import CommandUseCase from '../usecases/CommandUseCase';
+import CompletionGroup from '../domains/CompletionGroup';
+
+const trimStart = (str: string): string => {
+ // NOTE String.trimStart is available on Firefox 61
+ return str.replace(/^\s+/, '');
+};
+
+export default class CommandController {
+ private completionsUseCase: CompletionsUseCase;
+
+ private commandIndicator: CommandUseCase;
+
+ constructor() {
+ this.completionsUseCase = new CompletionsUseCase();
+ this.commandIndicator = new CommandUseCase();
+ }
+
+ getCompletions(line: string): Promise<CompletionGroup[]> {
+ let trimmed = trimStart(line);
+ let words = trimmed.split(/ +/);
+ let name = words[0];
+ if (words.length === 1) {
+ return this.completionsUseCase.queryConsoleCommand(name);
+ }
+ let keywords = trimStart(trimmed.slice(name.length));
+ switch (words[0]) {
+ case 'o':
+ case 'open':
+ case 't':
+ case 'tabopen':
+ case 'w':
+ case 'winopen':
+ return this.completionsUseCase.queryOpen(name, keywords);
+ case 'b':
+ case 'buffer':
+ return this.completionsUseCase.queryBuffer(name, keywords);
+ case 'bd':
+ case 'bdel':
+ case 'bdelete':
+ case 'bdeletes':
+ return this.completionsUseCase.queryBdelete(name, keywords);
+ case 'bd!':
+ case 'bdel!':
+ case 'bdelete!':
+ case 'bdeletes!':
+ return this.completionsUseCase.queryBdeleteForce(name, keywords);
+ case 'set':
+ return this.completionsUseCase.querySet(name, keywords);
+ }
+ return Promise.resolve([]);
+ }
+
+ // eslint-disable-next-line complexity
+ exec(line: string): Promise<any> {
+ let trimmed = trimStart(line);
+ let words = trimmed.split(/ +/);
+ let name = words[0];
+ if (words[0].length === 0) {
+ return Promise.resolve();
+ }
+
+ let keywords = trimStart(trimmed.slice(name.length));
+ switch (words[0]) {
+ case 'o':
+ case 'open':
+ return this.commandIndicator.open(keywords);
+ case 't':
+ case 'tabopen':
+ return this.commandIndicator.tabopen(keywords);
+ case 'w':
+ case 'winopen':
+ return this.commandIndicator.winopen(keywords);
+ case 'b':
+ case 'buffer':
+ return this.commandIndicator.buffer(keywords);
+ case 'bd':
+ case 'bdel':
+ case 'bdelete':
+ return this.commandIndicator.bdelete(false, keywords);
+ case 'bd!':
+ case 'bdel!':
+ case 'bdelete!':
+ return this.commandIndicator.bdelete(true, keywords);
+ case 'bdeletes':
+ return this.commandIndicator.bdeletes(false, keywords);
+ case 'bdeletes!':
+ return this.commandIndicator.bdeletes(true, keywords);
+ case 'addbookmark':
+ return this.commandIndicator.addbookmark(keywords);
+ case 'q':
+ case 'quit':
+ return this.commandIndicator.quit();
+ case 'qa':
+ case 'quitall':
+ return this.commandIndicator.quitAll();
+ case 'set':
+ return this.commandIndicator.set(keywords);
+ }
+ throw new Error(words[0] + ' command is not defined');
+ }
+}