import { APIMessageComponent, APIModalComponent, ComponentType } from 'discord-api-types/v10'; import type { AnyComponentBuilder, MessageComponentBuilder, ModalComponentBuilder } from './ActionRow'; import { ActionRowBuilder, ButtonBuilder, ComponentBuilder, SelectMenuBuilder, TextInputBuilder } from '../index'; export interface MappedComponentTypes { [ComponentType.ActionRow]: ActionRowBuilder; [ComponentType.Button]: ButtonBuilder; [ComponentType.SelectMenu]: SelectMenuBuilder; [ComponentType.TextInput]: TextInputBuilder; } /** * Factory for creating components from API data * * @param data - The api data to transform to a component class */ export function createComponentBuilder( data: (APIMessageComponent | APIModalComponent) & { type: T }, ): MappedComponentTypes[T]; export function createComponentBuilder(data: C): C; export function createComponentBuilder( data: APIMessageComponent | APIModalComponent | MessageComponentBuilder, ): ComponentBuilder { if (data instanceof ComponentBuilder) { return data; } switch (data.type) { case ComponentType.ActionRow: return new ActionRowBuilder(data); case ComponentType.Button: return new ButtonBuilder(data); case ComponentType.SelectMenu: return new SelectMenuBuilder(data); case ComponentType.TextInput: return new TextInputBuilder(data); default: // @ts-expect-error // eslint-disable-next-line @typescript-eslint/restrict-template-expressions throw new Error(`Cannot properly serialize component type: ${data.type}`); } }