import { injectable, inject } from 'tsyringe'; import FindPresenter from '../presenters/FindPresenter'; import FindRepository from '../repositories/FindRepository'; import FindClient from '../client/FindClient'; import ConsoleClient from '../client/ConsoleClient'; @injectable() export default class FindUseCase { constructor( @inject('FindPresenter') private presenter: FindPresenter, @inject('FindRepository') private repository: FindRepository, @inject('FindClient') private client: FindClient, @inject('ConsoleClient') private consoleClient: ConsoleClient, ) { } async startFind(keyword?: string): Promise { this.presenter.clearSelection(); if (keyword) { this.saveKeyword(keyword); } else { const lastKeyword = await this.getKeyword(); if (!lastKeyword) { return this.showNoLastKeywordError(); } this.saveKeyword(lastKeyword); } return this.findNext(); } findNext(): Promise { return this.findNextPrev(false); } findPrev(): Promise { return this.findNextPrev(true); } private async findNextPrev( backwards: boolean, ): Promise { const keyword = await this.getKeyword(); if (!keyword) { return this.showNoLastKeywordError(); } const found = this.presenter.find(keyword, backwards); if (found) { this.consoleClient.info('Pattern found: ' + keyword); } else { this.consoleClient.error('Pattern not found: ' + keyword); } } private async getKeyword(): Promise { let keyword = this.repository.getLastKeyword(); if (!keyword) { keyword = await this.client.getGlobalLastKeyword(); } return keyword; } private async saveKeyword(keyword: string): Promise { this.repository.setLastKeyword(keyword); await this.client.setGlobalLastKeyword(keyword); } private async showNoLastKeywordError(): Promise { await this.consoleClient.error('No previous search keywords'); } }