{"version":3,"file":"result.mjs","sources":["../../../src/core/result.ts"],"sourcesContent":["import { Text } from '../tools/text'\n\n/**\n * Interface defining the structure and methods of a Result object.\n */\nexport interface IResult<T = any> {\n  /**\n   * Indicates whether the operation resulted in success (no errors).\n   */\n  readonly isSuccess: boolean\n  /**\n   * Collection of errors\n   */\n  readonly errors: Map<string, Error>\n\n  /**\n   * Sets the data associated with the result.\n   *\n   * @param data The data to be stored in the result.\n   * @returns The current Result object for chaining methods.\n   */\n  setData: (data: T) => IResult<T>\n  /**\n   * Retrieves the data associated with the result.\n   *\n   * @returns The data stored in the result, if any.\n   */\n  getData: () => T | null | undefined\n\n  /**\n   * Adds an error message or Error object to the result.\n   * @param error The error message or Error object to be added.\n   * @param key Error key. You can leave it blank. Then it will be generated automatically.\n   * @returns {IResult} The current Result object for chaining methods.\n   */\n  addError: (error: Error | string, key?: string) => IResult\n  /**\n   * Adds multiple errors to the result in a single call.\n   *\n   * @param errors An array of errors or strings that will be converted to errors.\n   * @returns {IResult} The current Result object for chaining methods.\n   */\n  addErrors: (errors: (Error | string)[]) => IResult\n  /**\n   * Retrieves an iterator for the errors collected in the result.\n   *\n   * @returns {IterableIterator<Error>} An iterator over the stored Error objects.\n   */\n  getErrors: () => IterableIterator<Error>\n\n  /**\n   * Retrieves an array of error messages from the collected errors.\n   *\n   * @returns {string[]} An array of strings representing the error messages.\n   */\n  getErrorMessages: () => string[]\n  /**\n   * Checks for an error in a collection by key\n   * @param key - Error key\n   */\n  hasError(key: string): boolean\n  /**\n   * Converts the Result object to a string.\n   *\n   * @returns {string} Returns a string representation of the result operation\n   */\n  toString: () => string\n}\n\n/**\n * A class representing an operation result with success/failure status, data, and errors.\n * Similar to \\Bitrix\\Main\\Result from Bitrix Framework.\n * @link https://dev.1c-bitrix.ru/api_d7/bitrix/main/result/index.php\n */\nexport class Result<T = any> implements IResult<T> {\n  protected _errors: Map<string, Error>\n  protected _data: T | null | undefined\n\n  constructor(data?: T) {\n    this._errors = new Map()\n    this._data = data ?? null\n  }\n\n  get isSuccess(): boolean {\n    return this._errors.size === 0\n  }\n\n  get errors(): Map<string, Error> {\n    return this._errors\n  }\n\n  setData(data: T | null | undefined): Result<T> {\n    this._data = data\n\n    return this\n  }\n\n  getData(): T | null | undefined {\n    return this._data\n  }\n\n  addError(error: Error | string, key?: string): Result<T> {\n    const errorKey = key ?? Text.getUuidRfc4122()\n    const errorObj = typeof error === 'string' ? new Error(error) : error\n\n    this._errors.set(errorKey, errorObj)\n\n    return this\n  }\n\n  addErrors(errors: (Error | string)[]): Result<T> {\n    for (const error of errors) {\n      this.addError(error)\n    }\n\n    return this\n  }\n\n  getErrors(): IterableIterator<Error> {\n    return this._errors.values()\n  }\n\n  hasError(key: string): boolean {\n    return this._errors.has(key)\n  }\n\n  /**\n   * Retrieves an array of error messages from the collected errors.\n   *\n   * @returns An array of strings representing the error messages. Each string\n   *          contains the message of a corresponding error object.\n   */\n  getErrorMessages(): string[] {\n    return Array.from(this._errors.values(), e => e.message)\n  }\n\n  /**\n   * Converts the Result object to a string.\n   *\n   * @returns {string} Returns a string representation of the result operation\n   */\n  toString(): string {\n    const status = this.isSuccess ? 'success' : 'failure'\n    const data = this.safeStringify(this._data)\n\n    return this.isSuccess\n      ? `Result(${status}): ${data}`\n      : `Result(${status}): ${data}\\nErrors: ${this.getErrorMessages().join(', ')}`\n  }\n\n  private safeStringify(data: unknown): string {\n    try {\n      return JSON.stringify(data, this.replacer, 2)\n    } catch {\n      return '[Unable to serialize data]'\n    }\n  }\n\n  private replacer(_: string, value: unknown) {\n    if (value instanceof Error) {\n      return {\n        name: value.name,\n        message: value.message,\n        stack: value.stack\n      }\n    }\n    return value\n  }\n\n  // Static constructors\n  static ok<U>(data?: U): Result<U> {\n    return new Result<U>(data)\n  }\n\n  static fail<U>(error: Error | string, key?: string): Result<U> {\n    return new Result<U>().addError(error, key)\n  }\n}\n"],"names":[],"mappings":"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"}