{"version":3,"file":"scalarEnum.cjs","sources":["../../src/scalarEnum.ts"],"sourcesContent":["import {\n  BaseSerializerOptions,\n  DeserializingEmptyBufferError,\n  Serializer,\n} from '@metaplex-foundation/umi-serializers-core';\nimport {\n  NumberSerializer,\n  u8,\n} from '@metaplex-foundation/umi-serializers-numbers';\nimport {\n  EnumDiscriminatorOutOfRangeError,\n  InvalidScalarEnumVariantError,\n} from './errors';\n\n/**\n * Defines a scalar enum as a type from its constructor.\n *\n * @example\n * ```ts\n * enum Direction { Left, Right };\n * type DirectionType = ScalarEnum<Direction>;\n * ```\n *\n * @category Serializers\n */\nexport type ScalarEnum<T> =\n  | { [key: number | string]: string | number | T }\n  | number\n  | T;\n\n/**\n * Defines the options for scalar enum serializers.\n * @category Serializers\n */\nexport type ScalarEnumSerializerOptions = BaseSerializerOptions & {\n  /**\n   * The serializer to use for the enum discriminator.\n   * @defaultValue `u8()`\n   */\n  size?: NumberSerializer;\n};\n\n/**\n * Creates a scalar enum serializer.\n *\n * @param constructor - The constructor of the scalar enum.\n * @param options - A set of options for the serializer.\n * @category Serializers\n */\nexport function scalarEnum<T>(\n  constructor: ScalarEnum<T> & {},\n  options: ScalarEnumSerializerOptions = {}\n): Serializer<T> {\n  const prefix = options.size ?? u8();\n  const enumKeys = Object.keys(constructor);\n  const enumValues = Object.values(constructor);\n  const isNumericEnum = enumValues.some((v) => typeof v === 'number');\n  const valueDescriptions = enumValues\n    .filter((v) => typeof v === 'string')\n    .join(', ');\n  const minRange = 0;\n  const maxRange = isNumericEnum\n    ? enumValues.length / 2 - 1\n    : enumValues.length - 1;\n  const stringValues: string[] = isNumericEnum\n    ? [...enumKeys]\n    : [...new Set([...enumKeys, ...enumValues])];\n  function assertValidVariant(variant: number | string): void {\n    const isInvalidNumber =\n      typeof variant === 'number' && (variant < minRange || variant > maxRange);\n    const isInvalidString =\n      typeof variant === 'string' && !stringValues.includes(variant);\n    if (isInvalidNumber || isInvalidString) {\n      throw new InvalidScalarEnumVariantError(\n        variant,\n        stringValues,\n        minRange,\n        maxRange\n      );\n    }\n  }\n  return {\n    description:\n      options.description ??\n      `enum(${valueDescriptions}; ${prefix.description})`,\n    fixedSize: prefix.fixedSize,\n    maxSize: prefix.maxSize,\n    serialize: (value: T) => {\n      assertValidVariant(value as string | number);\n      if (typeof value === 'number') return prefix.serialize(value);\n      const valueIndex = enumValues.indexOf(value);\n      if (valueIndex >= 0) return prefix.serialize(valueIndex);\n      return prefix.serialize(enumKeys.indexOf(value as string));\n    },\n    deserialize: (bytes: Uint8Array, offset = 0) => {\n      if (bytes.slice(offset).length === 0) {\n        throw new DeserializingEmptyBufferError('enum');\n      }\n      const [value, newOffset] = prefix.deserialize(bytes, offset);\n      const valueAsNumber = Number(value);\n      offset = newOffset;\n      if (valueAsNumber < minRange || valueAsNumber > maxRange) {\n        throw new EnumDiscriminatorOutOfRangeError(\n          valueAsNumber,\n          minRange,\n          maxRange\n        );\n      }\n      return [\n        (isNumericEnum ? valueAsNumber : enumValues[valueAsNumber]) as T,\n        offset,\n      ];\n    },\n  };\n}\n"],"names":["scalarEnum","constructor","options","prefix","size","u8","enumKeys","Object","keys","enumValues","values","isNumericEnum","some","v","valueDescriptions","filter","join","minRange","maxRange","length","stringValues","Set","assertValidVariant","variant","isInvalidNumber","isInvalidString","includes","InvalidScalarEnumVariantError","description","fixedSize","maxSize","serialize","value","valueIndex","indexOf","deserialize","bytes","offset","slice","DeserializingEmptyBufferError","newOffset","valueAsNumber","Number","EnumDiscriminatorOutOfRangeError"],"mappings":"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"}