UNPKG

@metaplex-foundation/umi-serializers

Version:

A comprehensive set of serializers for the Umi framework

1 lines 8.5 kB
{"version":3,"file":"dataEnum.mjs","sources":["../../src/dataEnum.ts"],"sourcesContent":["import {\n BaseSerializerOptions,\n DeserializingEmptyBufferError,\n Serializer,\n mergeBytes,\n} from '@metaplex-foundation/umi-serializers-core';\nimport {\n NumberSerializer,\n u8,\n} from '@metaplex-foundation/umi-serializers-numbers';\nimport {\n EnumDiscriminatorOutOfRangeError,\n InvalidDataEnumVariantError,\n} from './errors';\nimport { maxSerializerSizes } from './maxSerializerSizes';\nimport { sumSerializerSizes } from './sumSerializerSizes';\n\n/**\n * Defines a data enum using discriminated union types.\n *\n * @example\n * ```ts\n * type WebPageEvent =\n * | { __kind: 'pageview', url: string }\n * | { __kind: 'click', x: number, y: number };\n * ```\n *\n * @category Serializers\n */\nexport type DataEnum = { __kind: string };\n\n/**\n * Extracts a variant from a data enum.\n *\n * @example\n * ```ts\n * type WebPageEvent =\n * | { __kind: 'pageview', url: string }\n * | { __kind: 'click', x: number, y: number };\n * type ClickEvent = GetDataEnumKind<WebPageEvent, 'click'>;\n * // -> { __kind: 'click', x: number, y: number }\n * ```\n *\n * @category Serializers\n */\nexport type GetDataEnumKind<\n T extends DataEnum,\n K extends T['__kind']\n> = Extract<T, { __kind: K }>;\n\n/**\n * Extracts a variant from a data enum without its discriminator.\n *\n * @example\n * ```ts\n * type WebPageEvent =\n * | { __kind: 'pageview', url: string }\n * | { __kind: 'click', x: number, y: number };\n * type ClickEvent = GetDataEnumKindContent<WebPageEvent, 'click'>;\n * // -> { x: number, y: number }\n * ```\n *\n * @category Serializers\n */\nexport type GetDataEnumKindContent<\n T extends DataEnum,\n K extends T['__kind']\n> = Omit<Extract<T, { __kind: K }>, '__kind'>;\n\n/**\n * Get the name and serializer of each variant in a data enum.\n * @category Serializers\n */\nexport type DataEnumToSerializerTuple<T extends DataEnum, U extends T> = Array<\n T extends any\n ? [\n T['__kind'],\n keyof Omit<T, '__kind'> extends never\n ? Serializer<Omit<T, '__kind'>, Omit<U, '__kind'>> | Serializer<void>\n : Serializer<Omit<T, '__kind'>, Omit<U, '__kind'>>\n ]\n : never\n>;\n\n/**\n * Defines the options for data enum serializers.\n * @category Serializers\n */\nexport type DataEnumSerializerOptions = BaseSerializerOptions & {\n /**\n * The serializer to use for the enum discriminator prefixing the variant.\n * @defaultValue `u8()`\n */\n size?: NumberSerializer;\n};\n\n/**\n * Creates a data enum serializer.\n *\n * @param variants - The variant serializers of the data enum.\n * @param options - A set of options for the serializer.\n * @category Serializers\n */\nexport function dataEnum<T extends DataEnum, U extends T = T>(\n variants: DataEnumToSerializerTuple<T, U>,\n options: DataEnumSerializerOptions = {}\n): Serializer<T, U> {\n const prefix = options.size ?? u8();\n const fieldDescriptions = variants\n .map(\n ([name, serializer]) =>\n `${String(name)}${serializer ? `: ${serializer.description}` : ''}`\n )\n .join(', ');\n const allVariantHaveTheSameFixedSize = variants.every(\n (one, i, all) => one[1].fixedSize === all[0][1].fixedSize\n );\n const fixedVariantSize = allVariantHaveTheSameFixedSize\n ? variants[0][1].fixedSize\n : null;\n const maxVariantSize = maxSerializerSizes(\n variants.map(([, field]) => field.maxSize)\n );\n return {\n description:\n options.description ??\n `dataEnum(${fieldDescriptions}; ${prefix.description})`,\n fixedSize:\n variants.length === 0\n ? prefix.fixedSize\n : sumSerializerSizes([prefix.fixedSize, fixedVariantSize]),\n maxSize:\n variants.length === 0\n ? prefix.maxSize\n : sumSerializerSizes([prefix.maxSize, maxVariantSize]),\n serialize: (variant: T) => {\n const discriminator = variants.findIndex(\n ([key]) => variant.__kind === key\n );\n if (discriminator < 0) {\n throw new InvalidDataEnumVariantError(\n variant.__kind,\n variants.map(([key]) => key)\n );\n }\n const variantPrefix = prefix.serialize(discriminator);\n const variantSerializer = variants[discriminator][1];\n const variantBytes = variantSerializer.serialize(variant as any);\n return mergeBytes([variantPrefix, variantBytes]);\n },\n deserialize: (bytes: Uint8Array, offset = 0) => {\n if (bytes.slice(offset).length === 0) {\n throw new DeserializingEmptyBufferError('dataEnum');\n }\n const [discriminator, dOffset] = prefix.deserialize(bytes, offset);\n offset = dOffset;\n const variantField = variants[Number(discriminator)] ?? null;\n if (!variantField) {\n throw new EnumDiscriminatorOutOfRangeError(\n discriminator,\n 0,\n variants.length - 1\n );\n }\n const [variant, vOffset] = variantField[1].deserialize(bytes, offset);\n offset = vOffset;\n return [{ __kind: variantField[0], ...(variant ?? {}) } as U, offset];\n },\n };\n}\n"],"names":["dataEnum","variants","options","prefix","size","u8","fieldDescriptions","map","name","serializer","String","description","join","allVariantHaveTheSameFixedSize","every","one","i","all","fixedSize","fixedVariantSize","maxVariantSize","maxSerializerSizes","field","maxSize","length","sumSerializerSizes","serialize","variant","discriminator","findIndex","key","__kind","InvalidDataEnumVariantError","variantPrefix","variantSerializer","variantBytes","mergeBytes","deserialize","bytes","offset","slice","DeserializingEmptyBufferError","dOffset","variantField","Number","EnumDiscriminatorOutOfRangeError","vOffset"],"mappings":"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"}