import { take } from 'rxjs/operators'; import { CLIOption, CRUDBase, NamesIn } from './CRUDBase'; import { ResourceType } from './ResourceType'; import { BaseResource, BaseResourceOptions, InteractiveCLI } from './types'; export interface ExecCLIOptions { readonly name: string; readonly cli: InteractiveCLI; readonly options: ResourceOptions; } export interface GetCLIAutocompleteOptions { readonly cli: InteractiveCLI; } export interface CRUDResourceOptions { readonly name: string; readonly names?: NamesIn; readonly resourceType: ResourceType; readonly help: string; readonly aliases?: ReadonlyArray; readonly extraArgs?: ReadonlyArray; readonly options?: ReadonlyArray; readonly autocomplete?: ReadonlyArray; readonly hidden?: boolean; } export interface GetCLINameOptions { readonly baseName: string; readonly cli: InteractiveCLI; readonly options: ResourceOptions; } export class CRUDResourceBase< Resource extends BaseResource = BaseResource, ResourceOptions extends BaseResourceOptions = BaseResourceOptions > extends CRUDBase { public constructor({ name, names, resourceType, help, aliases, extraArgs, options, autocomplete, hidden, }: CRUDResourceOptions) { const commandBase = `${name} ${resourceType.name} `; const command = extraArgs === undefined ? commandBase : `${commandBase} ${extraArgs.join(' ')}`; super({ name, names, command, resourceType, help, aliases, options, autocomplete, hidden, }); } public async getCLIName({ baseName }: GetCLINameOptions): Promise { return Promise.resolve(baseName); } public async getCLIAutocomplete(options: GetCLIAutocompleteOptions): Promise> { const { cli } = options; try { const resourceOptions = await this.getCLIAutocompleteResourceOptions(options); const resources = await cli.client .getResources$({ plugin: this.resourceType.plugin.name, resourceType: this.resourceType.name, options: resourceOptions, }) .pipe(take(1)) .toPromise() .then((results) => results.map((result) => result.baseName)); return [...new Set(resources.concat(this.autocomplete))]; } catch (error) { this.resourceType.plugin.monitor.logError({ name: 'neo_crud_get_cli_autocomplete_error', message: 'Failed to fetch cli autocomplete.', error, }); return this.autocomplete; } } // Extract options that will be passed to ResourceType#filterResources. public async getCLIAutocompleteResourceOptions({ cli }: GetCLIAutocompleteOptions): Promise { return this.getCLIResourceOptions({ cli, args: {}, options: {} }); } // Function to execute before the command. Useful if you want to do things // like call other commands, e.g. `activate ` before activating another // name. public async preExecCLI(_options: ExecCLIOptions): Promise { return Promise.resolve(); } // Function to execute after the command is complete. Useful if you want to do // things like call other commands, e.g. `activate ` after starting // public async postExecCLI(_options: ExecCLIOptions): Promise { return Promise.resolve(); } }