UNPKG

@metaplex-foundation/umi-serializers

Version:

A comprehensive set of serializers for the Umi framework

1 lines 3.52 kB
{"version":3,"file":"struct.mjs","sources":["../../src/struct.ts"],"sourcesContent":["import {\n BaseSerializerOptions,\n Serializer,\n mergeBytes,\n} from '@metaplex-foundation/umi-serializers-core';\nimport { sumSerializerSizes } from './sumSerializerSizes';\n\n/**\n * Get the name and serializer of each field in a struct.\n * @category Serializers\n */\nexport type StructToSerializerTuple<T extends object, U extends T> = Array<\n {\n [K in keyof T]: [K, Serializer<T[K], U[K]>];\n }[keyof T]\n>;\n\n/**\n * Defines the options for struct serializers.\n * @category Serializers\n */\nexport type StructSerializerOptions = BaseSerializerOptions;\n\n/**\n * Creates a serializer for a custom object.\n *\n * @param fields - The name and serializer of each field.\n * @param options - A set of options for the serializer.\n * @category Serializers\n */\nexport function struct<T extends object, U extends T = T>(\n fields: StructToSerializerTuple<T, U>,\n options: StructSerializerOptions = {}\n): Serializer<T, U> {\n const fieldDescriptions = fields\n .map(([name, serializer]) => `${String(name)}: ${serializer.description}`)\n .join(', ');\n return {\n description: options.description ?? `struct(${fieldDescriptions})`,\n fixedSize: sumSerializerSizes(fields.map(([, field]) => field.fixedSize)),\n maxSize: sumSerializerSizes(fields.map(([, field]) => field.maxSize)),\n serialize: (struct: T) => {\n const fieldBytes = fields.map(([key, serializer]) =>\n serializer.serialize(struct[key])\n );\n return mergeBytes(fieldBytes);\n },\n deserialize: (bytes: Uint8Array, offset = 0) => {\n const struct: Partial<U> = {};\n fields.forEach(([key, serializer]) => {\n const [value, newOffset] = serializer.deserialize(bytes, offset);\n offset = newOffset;\n struct[key] = value;\n });\n return [struct as U, offset];\n },\n };\n}\n"],"names":["struct","fields","options","fieldDescriptions","map","name","serializer","String","description","join","fixedSize","sumSerializerSizes","field","maxSize","serialize","fieldBytes","key","mergeBytes","deserialize","bytes","offset","forEach","value","newOffset"],"mappings":";;;AAOA;AACA;AACA;AACA;;AAaA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,SAASA,MAAM,CACpBC,MAAqC,EACrCC,OAAgC,GAAG,EAAE,EACnB;AAClB,EAAA,MAAMC,iBAAiB,GAAGF,MAAM,CAC7BG,GAAG,CAAC,CAAC,CAACC,IAAI,EAAEC,UAAU,CAAC,KAAM,CAAA,EAAEC,MAAM,CAACF,IAAI,CAAE,CAAIC,EAAAA,EAAAA,UAAU,CAACE,WAAY,CAAC,CAAA,CAAC,CACzEC,IAAI,CAAC,IAAI,CAAC,CAAA;EACb,OAAO;AACLD,IAAAA,WAAW,EAAEN,OAAO,CAACM,WAAW,IAAK,CAAA,OAAA,EAASL,iBAAkB,CAAE,CAAA,CAAA;AAClEO,IAAAA,SAAS,EAAEC,kBAAkB,CAACV,MAAM,CAACG,GAAG,CAAC,CAAC,GAAGQ,KAAK,CAAC,KAAKA,KAAK,CAACF,SAAS,CAAC,CAAC;AACzEG,IAAAA,OAAO,EAAEF,kBAAkB,CAACV,MAAM,CAACG,GAAG,CAAC,CAAC,GAAGQ,KAAK,CAAC,KAAKA,KAAK,CAACC,OAAO,CAAC,CAAC;IACrEC,SAAS,EAAGd,MAAS,IAAK;MACxB,MAAMe,UAAU,GAAGd,MAAM,CAACG,GAAG,CAAC,CAAC,CAACY,GAAG,EAAEV,UAAU,CAAC,KAC9CA,UAAU,CAACQ,SAAS,CAACd,MAAM,CAACgB,GAAG,CAAC,CAAC,CAClC,CAAA;MACD,OAAOC,UAAU,CAACF,UAAU,CAAC,CAAA;KAC9B;AACDG,IAAAA,WAAW,EAAE,CAACC,KAAiB,EAAEC,MAAM,GAAG,CAAC,KAAK;MAC9C,MAAMpB,MAAkB,GAAG,EAAE,CAAA;MAC7BC,MAAM,CAACoB,OAAO,CAAC,CAAC,CAACL,GAAG,EAAEV,UAAU,CAAC,KAAK;AACpC,QAAA,MAAM,CAACgB,KAAK,EAAEC,SAAS,CAAC,GAAGjB,UAAU,CAACY,WAAW,CAACC,KAAK,EAAEC,MAAM,CAAC,CAAA;AAChEA,QAAAA,MAAM,GAAGG,SAAS,CAAA;AAClBvB,QAAAA,MAAM,CAACgB,GAAG,CAAC,GAAGM,KAAK,CAAA;AACrB,OAAC,CAAC,CAAA;AACF,MAAA,OAAO,CAACtB,MAAM,EAAOoB,MAAM,CAAC,CAAA;AAC9B,KAAA;GACD,CAAA;AACH;;;;"}