UNPKG

@metaplex-foundation/umi-serializers

Version:

A comprehensive set of serializers for the Umi framework

1 lines 6.59 kB
{"version":3,"file":"option.mjs","sources":["../../src/option.ts"],"sourcesContent":["import {\n Option,\n OptionOrNullable,\n isOption,\n isSome,\n none,\n some,\n wrapNullable,\n} from '@metaplex-foundation/umi-options';\nimport {\n BaseSerializerOptions,\n ExpectedFixedSizeSerializerError,\n Serializer,\n mergeBytes,\n} from '@metaplex-foundation/umi-serializers-core';\nimport {\n NumberSerializer,\n u8,\n} from '@metaplex-foundation/umi-serializers-numbers';\nimport { sumSerializerSizes } from './sumSerializerSizes';\nimport { getSizeDescription } from './utils';\n\n/**\n * Defines the options for `Option` serializers.\n * @category Serializers\n */\nexport type OptionSerializerOptions = BaseSerializerOptions & {\n /**\n * The serializer to use for the boolean prefix.\n * @defaultValue `u8()`\n */\n prefix?: NumberSerializer;\n /**\n * Whether the item serializer should be of fixed size.\n *\n * When this is true, a `None` value will skip the bytes that would\n * have been used for the item. Note that this will only work if the\n * item serializer is of fixed size.\n * @defaultValue `false`\n */\n fixed?: boolean;\n};\n\n/**\n * Creates a serializer for an optional value using the {@link Option} type.\n *\n * @param item - The serializer to use for the value that may be present.\n * @param options - A set of options for the serializer.\n * @category Serializers\n */\nexport function option<T, U extends T = T>(\n item: Serializer<T, U>,\n options: OptionSerializerOptions = {}\n): Serializer<OptionOrNullable<T>, Option<U>> {\n const prefix = options.prefix ?? u8();\n const fixed = options.fixed ?? false;\n let descriptionSuffix = `; ${getSizeDescription(prefix)}`;\n let fixedSize = item.fixedSize === 0 ? prefix.fixedSize : null;\n if (fixed) {\n if (item.fixedSize === null || prefix.fixedSize === null) {\n throw new ExpectedFixedSizeSerializerError(\n 'Fixed options can only be used with fixed-size serializers'\n );\n }\n descriptionSuffix += '; fixed';\n fixedSize = prefix.fixedSize + item.fixedSize;\n }\n return {\n description:\n options.description ?? `option(${item.description + descriptionSuffix})`,\n fixedSize,\n maxSize: sumSerializerSizes([prefix.maxSize, item.maxSize]),\n serialize: (optionOrNullable: OptionOrNullable<T>) => {\n const option = isOption<T>(optionOrNullable)\n ? optionOrNullable\n : wrapNullable(optionOrNullable);\n\n const prefixByte = prefix.serialize(Number(isSome(option)));\n if (fixed) {\n const itemFixedSize = item.fixedSize as number;\n const itemBytes = isSome(option)\n ? item.serialize(option.value).slice(0, itemFixedSize)\n : new Uint8Array(itemFixedSize).fill(0);\n return mergeBytes([prefixByte, itemBytes]);\n }\n const itemBytes = isSome(option)\n ? item.serialize(option.value)\n : new Uint8Array();\n return mergeBytes([prefixByte, itemBytes]);\n },\n deserialize: (bytes: Uint8Array, offset = 0) => {\n if (bytes.slice(offset).length === 0) {\n return [none(), offset];\n }\n const fixedOffset =\n offset + (prefix.fixedSize ?? 0) + (item.fixedSize ?? 0);\n const [isSome, prefixOffset] = prefix.deserialize(bytes, offset);\n offset = prefixOffset;\n if (isSome === 0) {\n return [none(), fixed ? fixedOffset : offset];\n }\n const [value, newOffset] = item.deserialize(bytes, offset);\n offset = newOffset;\n return [some(value), fixed ? fixedOffset : offset];\n },\n };\n}\n"],"names":["option","item","options","prefix","u8","fixed","descriptionSuffix","getSizeDescription","fixedSize","ExpectedFixedSizeSerializerError","description","maxSize","sumSerializerSizes","serialize","optionOrNullable","isOption","wrapNullable","prefixByte","Number","isSome","itemFixedSize","itemBytes","value","slice","Uint8Array","fill","mergeBytes","deserialize","bytes","offset","length","none","fixedOffset","prefixOffset","newOffset","some"],"mappings":"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"}