src/common/diagnostics/diagnostics_service.ts (39 lines of code) (raw):
import * as vscode from 'vscode';
import { ExtensionStateService, StateKey } from '../state/extension_state_service';
export interface DiagnosticsSection {
title: string;
content: string;
}
export interface DiagnosticsRenderer<States extends unknown[]> {
keys: Readonly<{
[I in keyof States]: StateKey<States[I]>;
}>;
render(state: {
[K in keyof States]: States[K];
}): DiagnosticsSection[];
}
export interface DiagnosticsService {
addRenderer(renderer: DiagnosticsRenderer<unknown[]>): void;
onChange: vscode.Event<void>;
getSections(): DiagnosticsSection[];
}
export class DefaultDiagnosticsService implements DiagnosticsService {
#eventEmitter = new vscode.EventEmitter<void>();
#renderers: DiagnosticsRenderer<unknown[]>[] = [];
#subscriptions: vscode.Disposable[] = [];
onChange = this.#eventEmitter.event;
#extensionStateService: ExtensionStateService;
constructor(extensionStateService: ExtensionStateService) {
this.#extensionStateService = extensionStateService;
this.#subscriptions.push(this.#extensionStateService.onChange(() => this.#eventEmitter.fire()));
}
addRenderer(renderer: DiagnosticsRenderer<unknown[]>): void {
this.#renderers.push(renderer);
}
getSections(): DiagnosticsSection[] {
return this.#renderers.flatMap(renderer => {
const providers = renderer.keys.map(k => this.#extensionStateService.get(k));
return renderer.render(providers.map(p => p.state));
});
}
}