Skip to content

Commit 7c18fec

Browse files
committed
feat: added status effects for sub-progresses
1 parent 7e22775 commit 7c18fec

4 files changed

Lines changed: 34 additions & 17 deletions

File tree

src/events/context.ts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,12 @@ export enum ProcessName {
3131
TERMINATE = 'terminate',
3232
}
3333

34+
export enum SubprocessFinishStatus {
35+
SUCCESS,
36+
FAILED,
37+
SKIPPED,
38+
}
39+
3440
export enum SubProcessName {
3541
APPLYING_RESOURCE = 'apply_resource_',
3642
GENERATE_PLAN = 'generate_plan',
@@ -107,8 +113,8 @@ export const ctx = new class {
107113
this.emitter.emit(Event.SUB_PROCESS_START, name, additionalName);
108114
}
109115

110-
subprocessFinished(name: string, additionalName?: string) {
111-
this.emitter.emit(Event.SUB_PROCESS_FINISH, name, additionalName);
116+
subprocessFinished(name: string, additionalName?: string, status: SubprocessFinishStatus = SubprocessFinishStatus.SUCCESS) {
117+
this.emitter.emit(Event.SUB_PROCESS_FINISH, name, additionalName, status);
112118
}
113119

114120
commandRequested(pluginName: string, data: CommandRequestData) {
@@ -138,7 +144,7 @@ export const ctx = new class {
138144
async subprocess<T>(name: string, run: () => Promise<T>): Promise<T> {
139145
this.emitter.emit(Event.SUB_PROCESS_START, name);
140146
const result = await run();
141-
this.emitter.emit(Event.SUB_PROCESS_FINISH, name);
147+
this.emitter.emit(Event.SUB_PROCESS_FINISH, name, undefined, SubprocessFinishStatus.SUCCESS);
142148
return result;
143149
}
144150

src/plugins/plugin-manager.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import { Plan, ResourcePlan } from '../entities/plan.js';
1111
import { Project } from '../entities/project.js';
1212
import { ResourceConfig } from '../entities/resource-config.js';
1313
import { ResourceInfo } from '../entities/resource-info.js';
14-
import { SubProcessName, ctx } from '../events/context.js';
14+
import { SubProcessName, SubprocessFinishStatus, ctx } from '../events/context.js';
1515
import { groupBy } from '../utils/index.js';
1616
import { registerKillListeners } from '../utils/register-kill-listeners.js';
1717
import { Plugin } from './plugin.js';
@@ -146,7 +146,7 @@ export class PluginManager {
146146
for (const id of project.evaluationOrder ?? []) {
147147
if (skippedIds.has(id)) {
148148
ctx.subprocessStarted(SubProcessName.APPLYING_RESOURCE, id);
149-
ctx.subprocessFinished(SubProcessName.APPLYING_RESOURCE, id);
149+
ctx.subprocessFinished(SubProcessName.APPLYING_RESOURCE, id, SubprocessFinishStatus.SKIPPED);
150150
continue;
151151
}
152152

@@ -166,17 +166,17 @@ export class PluginManager {
166166
try {
167167
await this.plugins.get(pluginName)!.apply(resourcePlan);
168168
succeededPlans.push(resourcePlan);
169+
ctx.subprocessFinished(SubProcessName.APPLYING_RESOURCE, resourcePlan.id, SubprocessFinishStatus.SUCCESS);
169170
} catch (err) {
170171
if (err instanceof PluginError) {
171172
collectedErrors.push(err);
173+
ctx.subprocessFinished(SubProcessName.APPLYING_RESOURCE, resourcePlan.id, SubprocessFinishStatus.FAILED);
172174
const dependents = plan.computeTransitiveDependents(id);
173175
for (const depId of dependents) skippedIds.add(depId);
174176
} else {
175177
throw err;
176178
}
177179
}
178-
179-
ctx.subprocessFinished(SubProcessName.APPLYING_RESOURCE, resourcePlan.id);
180180
}
181181

182182
return createApplyResult(succeededPlans, collectedErrors, skippedIds);

src/ui/components/progress/progress-display.tsx

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@ import Spinner from './spinner.js';
1212
export enum ProgressStatus {
1313
IN_PROGRESS,
1414
FINISHED,
15+
FAILED,
16+
SKIPPED,
1517
}
1618

1719
export interface ProgressState {
@@ -94,10 +96,11 @@ export function SubProgressDisplay(
9496
{hiddenCount > 0 && (
9597
<Text dimColor><Text color="greenBright" dimColor={false}></Text> and {hiddenCount} other{hiddenCount !== 1 ? 's' : ''}...</Text>
9698
)}
97-
{sorted.map((s, idx) =>
98-
s.status === ProgressStatus.IN_PROGRESS
99-
? <Spinner key={idx} label={s.label} type="dots" />
100-
: <Text key={idx}><Text color='greenBright'></Text> {s.label}</Text>
101-
)}
99+
{sorted.map((s, idx) => {
100+
if (s.status === ProgressStatus.IN_PROGRESS) return <Spinner key={idx} label={s.label} type="dots" />;
101+
if (s.status === ProgressStatus.FAILED) return <Text key={idx}><Text color="red"></Text> {s.label}</Text>;
102+
if (s.status === ProgressStatus.SKIPPED) return <Text key={idx} dimColor>~ {s.label}</Text>;
103+
return <Text key={idx}><Text color='greenBright'></Text> {s.label}</Text>;
104+
})}
102105
</>
103106
}

src/ui/reporters/default-reporter.tsx

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import { ApplyResult } from '../../entities/apply-result.js';
1010
import { Plan, ResourcePlan } from '../../entities/plan.js';
1111
import { ResourceConfig } from '../../entities/resource-config.js';
1212
import { ResourceInfo } from '../../entities/resource-info.js';
13-
import { ctx, Event, ProcessName, SubProcessName } from '../../events/context.js';
13+
import { ctx, Event, ProcessName, SubProcessName, SubprocessFinishStatus } from '../../events/context.js';
1414
import { FileModificationResult } from '../../generators/index.js';
1515
import { ImportResult } from '../../orchestrators/import.js';
1616
import { sleep } from '../../utils/index.js';
@@ -62,7 +62,7 @@ export class DefaultReporter implements Reporter {
6262
ctx.on(Event.PROCESS_START, (name) => this.onProcessStartEvent(name))
6363
ctx.on(Event.PROCESS_FINISH, (name) => this.onProcessFinishEvent(name))
6464
ctx.on(Event.SUB_PROCESS_START, (name, additionalName) => this.onSubprocessStartEvent(name, additionalName));
65-
ctx.on(Event.SUB_PROCESS_FINISH, (name, additionalName) => this.onSubprocessFinishEvent(name, additionalName));
65+
ctx.on(Event.SUB_PROCESS_FINISH, (name, additionalName, status) => this.onSubprocessFinishEvent(name, additionalName, status));
6666

6767
this.renderEmitter.on(RenderEvent.TOGGLE_VERBOSITY, () => {
6868
this.verbosityToggleCallback?.();
@@ -321,7 +321,7 @@ export class DefaultReporter implements Reporter {
321321
store.set(store.progressState, structuredClone(this.progressState));
322322
}
323323

324-
private onSubprocessFinishEvent(name: SubProcessName, additionalName?: string): void {
324+
private onSubprocessFinishEvent(name: SubProcessName, additionalName?: string, status: SubprocessFinishStatus = SubprocessFinishStatus.SUCCESS): void {
325325
const label = ProgressLabelMapping[name] + (additionalName ? ' ' + additionalName : '');
326326

327327
const subProgress = this.progressState
@@ -332,9 +332,17 @@ export class DefaultReporter implements Reporter {
332332
return;
333333
}
334334

335-
subProgress.status = ProgressStatus.FINISHED;
335+
if (status === SubprocessFinishStatus.FAILED) {
336+
subProgress.status = ProgressStatus.FAILED;
337+
ctx.log(`${label} failed`);
338+
} else if (status === SubprocessFinishStatus.SKIPPED) {
339+
subProgress.status = ProgressStatus.SKIPPED;
340+
ctx.log(`${label} skipped`);
341+
} else {
342+
subProgress.status = ProgressStatus.FINISHED;
343+
ctx.log(`${label} finished successfully`);
344+
}
336345

337-
ctx.log(`${label} finished successfully`)
338346
store.set(store.progressState, structuredClone(this.progressState));
339347
}
340348

0 commit comments

Comments
 (0)