import * as vscode from "vscode"; import { ConfigureButton, NotificationButton, showErrorMessage, } from "./show-error-message"; /** Options used to configure {@link ErrorWithNotification.showNotification}. */ export interface ShowNotificationOptions extends vscode.MessageOptions { /** * Whether or not to show the configure launch configuration button. * * **IMPORTANT**: the configure launch configuration button will do nothing if the * callee isn't a {@link vscode.DebugConfigurationProvider}. */ showConfigureButton?: boolean; } /** * An error that is able to be displayed to the user as a notification. * * Used in combination with {@link showErrorMessage showErrorMessage()} when whatever caused * the error was the result of a direct action by the user. E.g. launching a debug session. */ export class ErrorWithNotification extends Error { private readonly buttons: NotificationButton[]; constructor( message: string, ...buttons: NotificationButton[] ) { super(message); this.buttons = buttons; } /** * Shows the notification to the user including the configure launch configuration button. * * **IMPORTANT**: the configure launch configuration button will do nothing if the * callee isn't a {@link vscode.DebugConfigurationProvider}. * * @param options Configure the behavior of the notification */ showNotification( options: ShowNotificationOptions & { showConfigureButton: true }, ): Promise; /** * Shows the notification to the user. * * @param options Configure the behavior of the notification */ showNotification(options?: ShowNotificationOptions): Promise; // Actual implementation of showNotification() async showNotification( options: ShowNotificationOptions = {}, ): Promise { // Filter out the configure button unless explicitly requested let buttons = this.buttons; if (options.showConfigureButton !== true) { buttons = buttons.filter( (button) => !(button instanceof ConfigureButton), ); } return showErrorMessage(this.message, options, ...buttons); } }