UNPKG

2.2 kBPlain TextView Raw
1import { Observable } from 'rxjs';
2import { CLIOption } from './CRUDBase';
3import { CRUDResource, Request$Options } from './CRUDResource';
4import { GetCLIAutocompleteOptions } from './CRUDResourceBase';
5import { ResourceType } from './ResourceType';
6import { BaseResource, BaseResourceOptions, ExecuteTaskListResponse } from './types';
7
8export interface CreateCRUDOptions<Resource extends BaseResource, ResourceOptions extends BaseResourceOptions> {
9 readonly resourceType: ResourceType<Resource, ResourceOptions>;
10 readonly name?: string;
11 readonly help?: string;
12 readonly aliases?: ReadonlyArray<string>;
13 readonly extraArgs?: ReadonlyArray<string>;
14 readonly options?: ReadonlyArray<CLIOption>;
15 readonly autocomplete?: ReadonlyArray<string>;
16 readonly startOnCreate?: boolean;
17 readonly hidden?: boolean;
18}
19
20function nameToUpper(name: string): string {
21 return `${name.charAt(0).toUpperCase()}${name.slice(1)}`;
22}
23
24function nameToHelp(name: string, resourceName: string): string {
25 return `${nameToUpper(name)}s a ${resourceName} called <name>`;
26}
27
28export class CreateCRUD<
29 Resource extends BaseResource,
30 ResourceOptions extends BaseResourceOptions
31> extends CRUDResource<Resource, ResourceOptions> {
32 public readonly startOnCreate: boolean;
33
34 public constructor({
35 resourceType,
36 name = 'create',
37 help = nameToHelp(name, resourceType.names.lower),
38 aliases,
39 extraArgs,
40 options,
41 autocomplete,
42 startOnCreate = false,
43 hidden,
44 }: CreateCRUDOptions<Resource, ResourceOptions>) {
45 super({
46 name,
47 resourceType,
48 help,
49 aliases,
50 extraArgs,
51 options,
52 autocomplete,
53 hidden,
54 });
55
56 this.startOnCreate = startOnCreate;
57 }
58
59 public async getAutocomplete(_options: GetCLIAutocompleteOptions): Promise<ReadonlyArray<string>> {
60 return Promise.resolve(this.autocomplete);
61 }
62
63 public request$({
64 name,
65 cancel$,
66 options,
67 client,
68 }: Request$Options<ResourceOptions>): Observable<ExecuteTaskListResponse> {
69 return client.createResource$({
70 plugin: this.resourceType.plugin.name,
71 resourceType: this.resourceType.name,
72 name,
73 options,
74 cancel$,
75 });
76 }
77}