import { Observable } from 'rxjs'; import { map } from 'rxjs/operators'; import { CLIOption, CRUDBase } from './CRUDBase'; import { ResourceType } from './ResourceType'; import { BaseResource, BaseResourceOptions, Client, InteractiveCLI } from './types'; export interface ExecCLIOptions { readonly cli: InteractiveCLI; readonly options: ResourceOptions; } export interface GetResources$Options { readonly client: Client; readonly options: ResourceOptions; } export interface GetCRUDOptions { readonly resourceType: ResourceType; readonly help?: string; readonly aliases?: ReadonlyArray; readonly options?: ReadonlyArray; readonly autocomplete?: ReadonlyArray; readonly hidden?: boolean; } export class GetCRUD< Resource extends BaseResource = BaseResource, ResourceOptions extends BaseResourceOptions = BaseResourceOptions > extends CRUDBase { public constructor({ resourceType, help, aliases, options, autocomplete, hidden, }: GetCRUDOptions) { super({ name: 'get', command: `get ${resourceType.name}`, resourceType, help: help === undefined ? `List ${resourceType.names.lowerPlural}` : help, aliases, options, autocomplete, hidden, }); } // Function to execute before the command. public async preExecCLI(_options: ExecCLIOptions): Promise { return Promise.resolve(); } // Function to execute after the command. public async postExecCLI(_options: ExecCLIOptions): Promise { return Promise.resolve(); } public getResources$({ client, options, }: GetResources$Options): Observable> { return client .getResources$({ plugin: this.resourceType.plugin.name, resourceType: this.resourceType.name, options, }) .pipe(map((resources) => resources.map((resource) => resource as Resource))); } }