export enum MHErrorType { NETWORK = 'network', UNKNOWN = 'unknown', CARD_VALIDATION = 'cardValidation', CANCELLED = 'cancelled', APPLE_PAY_TRANSACTION_FAILED = 'applePayTransactionFailed', NOT_COMPATIBLE_WITH_APPLE_PAY = 'notCompatibleWithApplePay', } export class ErrorDetail { key: string; message: string; constructor(key: string, message: string) { this.key = key; this.message = message; } toString(): string { return `ErrorDetail{key: ${this.key}, message: ${this.message}}`; } } export function errorDetailFromJson(json: { [key: string]: any }): ErrorDetail { return new ErrorDetail(json.key ?? '', json.message ?? ''); } export function errorDetailToJson(errorDetail: ErrorDetail): { [key: string]: any; } { return { key: errorDetail.key, description: errorDetail.message, }; } export class MHError extends Error { description: string; errors: ErrorDetail[]; type: MHErrorType; constructor(message: string, errors: ErrorDetail[], type: MHErrorType) { super(message); this.description = message; this.errors = errors; this.type = type; } toString(): string { return `MHError{message: ${this.message}, errors: ${this.errors}, type: ${this.type}}`; } } export function mhErrorFromJson(json: { [key: string]: any }): MHError { const type = mhErrorTypeFromString(json.type); return new MHError( json.message ?? '', json.errors.map((error: any) => errorDetailFromJson(error)), type ); } export function mhErrorTypeFromString(type: string): MHErrorType { // Remove extra double quotes if they exist type = type.replace(/^"|"$/g, ''); switch (type) { case 'network': return MHErrorType.NETWORK; case 'unknown': return MHErrorType.UNKNOWN; case 'cardValidation': return MHErrorType.CARD_VALIDATION; case 'cancelled': return MHErrorType.CANCELLED; case 'applePayTransactionFailed': return MHErrorType.APPLE_PAY_TRANSACTION_FAILED; case 'notCompatibleWithApplePay': return MHErrorType.NOT_COMPATIBLE_WITH_APPLE_PAY; default: return MHErrorType.UNKNOWN; } }