import { HttpResponseErrorMessage, HttpResponseInformationMessage, HttpResponseMessage, HttpResponseWarningMessage, } from './httpResponseMessage.js'; import { specifyErrors } from '../../errors/index.js'; export type HttpSuccessResponseMessagesArray = Array< HttpResponseInformationMessage | HttpResponseWarningMessage >; export type HttpSuccessResponseBody = { status: 'success'; messages: HttpSuccessResponseMessagesArray; payload: Payload; }; export function makeHttpSuccessResponseBody( messages: HttpSuccessResponseMessagesArray, payload: Payload, ): HttpSuccessResponseBody { return { status: 'success', messages, payload, }; } export type NonEmptyHttpErrorMessagesArray = [ ...Array, HttpResponseErrorMessage, ]; export type HttpErrorResponseBody = { status: 'error'; messages: NonEmptyHttpErrorMessagesArray; }; export function makeHttpErrorResponseBody( messages: NonEmptyHttpErrorMessagesArray, ): HttpErrorResponseBody { return { status: 'error', messages, }; } export function matchIsHttpErrorResponseBody( candidate: unknown, ): candidate is HttpErrorResponseBody { return ( typeof candidate === 'object' && candidate !== null && (candidate as { status: string }).status === 'error' && 'messages' in candidate && Array.isArray((candidate as { messages: unknown }).messages) ); } export function getLastHttpResponseErrorMessage( responseBody: HttpErrorResponseBody, ): HttpResponseErrorMessage { if (Array.isArray(responseBody.messages) === false) throw new Error('Expected responseBody.messages to be an array'); const maybeError = responseBody.messages[responseBody.messages.length - 1]; if (maybeError?.type === 'error') { return maybeError; } return { type: 'error', content: maybeError?.content ? `"${maybeError?.content}" is not an error` : 'Unknown error', errorKey: specifyErrors.UNEXPECTED_ERROR.errorKey, }; } export function getHttpResponseWarningAndErrorMessages(responseBody: HttpErrorResponseBody) { if (Array.isArray(responseBody.messages) === false) throw new Error('Expected responseBody.messages to be an array'); return responseBody.messages.filter(m => m.type === 'warning' || m.type === 'error') as Array< HttpResponseWarningMessage | HttpResponseErrorMessage >; } export type HttpResponseBody = HttpSuccessResponseBody | HttpErrorResponseBody;