UNPKG

@metaplex-foundation/umi-serializers

Version:

A comprehensive set of serializers for the Umi framework

1 lines 6.58 kB
{"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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"}