{"version":3,"file":"option.cjs","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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"}