/
Task.ts
43 lines (35 loc) · 1.19 KB
/
Task.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
import { ImplementationPendingError } from '../errors';
import { Activity } from './Activity';
import { PerformsActivities } from './actor';
export abstract class Task implements Activity {
static where(description: string, ...activities: Activity[]): Task {
return activities.length > 0
? new DynamicallyGeneratedTask(description, activities)
: new NotImplementedTask(description);
}
abstract performAs(actor: PerformsActivities): PromiseLike<void>;
}
class DynamicallyGeneratedTask extends Task {
constructor(private description: string, private activities: Activity[]) {
super();
}
performAs(actor: PerformsActivities): PromiseLike<void> {
return actor.attemptsTo(...this.activities);
}
toString() {
return this.description;
}
}
class NotImplementedTask extends Task {
constructor(private description: string) {
super();
}
performAs(actor: PerformsActivities): PromiseLike<void> {
return Promise.reject(
new ImplementationPendingError(`A task where "${ this.toString() }" has not been implemented yet`),
);
}
toString() {
return this.description;
}
}