From 2c90fdf029915c8eef587614f32dac15436d1945 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Tue, 16 Jun 2020 14:22:56 +0100 Subject: [PATCH] demo-protobuf: Add example using protobufjs decorators --- packages/demo-protobuf/src/decorator.spec.ts | 38 ++++++++++++++++++++ packages/demo-protobuf/src/decorator.ts | 13 +++++++ packages/demo-protobuf/types/decorator.d.ts | 6 ++++ 3 files changed, 57 insertions(+) create mode 100644 packages/demo-protobuf/src/decorator.spec.ts create mode 100644 packages/demo-protobuf/src/decorator.ts create mode 100644 packages/demo-protobuf/types/decorator.d.ts diff --git a/packages/demo-protobuf/src/decorator.spec.ts b/packages/demo-protobuf/src/decorator.spec.ts new file mode 100644 index 00000000..eb934b65 --- /dev/null +++ b/packages/demo-protobuf/src/decorator.spec.ts @@ -0,0 +1,38 @@ +/* eslint-disable @typescript-eslint/camelcase */ +import { assert } from "@cosmjs/utils"; + +import { myRegistry } from "./decorator"; + +describe("decorator demo", () => { + it("works with a custom msg", () => { + const typeUrl = "/demo.MsgDemo"; + const MsgDemo = myRegistry.lookupType(typeUrl)!; + const TxBody = myRegistry.lookupType("/cosmos.tx.TxBody")!; + const Any = myRegistry.lookupType("/google.protobuf.Any")!; + + const msgDemo = MsgDemo.create({ + example: "Some example text", + }); + const msgDemoBytes = MsgDemo.encode(msgDemo).finish(); + const msgDemoWrapped = Any.create({ + type_url: typeUrl, + value: msgDemoBytes, + }); + const txBody = TxBody.create({ + messages: [msgDemoWrapped], + memo: "Some memo", + timeoutHeight: 9999, + extensionOptions: [], + }); + const txBodyBytes = TxBody.encode(txBody).finish(); + + const txBodyDecoded = TxBody.decode(txBodyBytes); + const msg = txBodyDecoded.messages[0]; + assert(msg.type_url); + assert(msg.value); + + const decoder = myRegistry.lookupType(msg.type_url)!; + const msgDemoDecoded = decoder.decode(msg.value); + expect(msgDemoDecoded.example).toEqual(msgDemo.example); + }); +}); diff --git a/packages/demo-protobuf/src/decorator.ts b/packages/demo-protobuf/src/decorator.ts new file mode 100644 index 00000000..16548ffe --- /dev/null +++ b/packages/demo-protobuf/src/decorator.ts @@ -0,0 +1,13 @@ +import { Field, Message, Type } from "protobufjs"; + +import { Registry } from "./registry"; + +export const myRegistry = new Registry(); + +@Type.d("MsgDemo") +export class MsgDemo extends Message<{}> { + @Field.d(1, "string") + public readonly example: string = ""; +} + +myRegistry.register("/demo.MsgDemo", MsgDemo); diff --git a/packages/demo-protobuf/types/decorator.d.ts b/packages/demo-protobuf/types/decorator.d.ts new file mode 100644 index 00000000..0053b88a --- /dev/null +++ b/packages/demo-protobuf/types/decorator.d.ts @@ -0,0 +1,6 @@ +import { Message } from "protobufjs"; +import { Registry } from "./registry"; +export declare const myRegistry: Registry; +export declare class MsgDemo extends Message<{}> { + readonly example: string; +}