piotr-oles/as-proto

Maps create compilation errors in generated code because entry type is not defined

Closed this issue · 3 comments

dsyer commented

Input:

syntax = "proto3";

message TestMessage {
    bytes payload = 1;
    map<string, string> headers = 2;
}

Output:

// Code generated by protoc-gen-as. DO NOT EDIT.
// Versions:
//   protoc-gen-as v0.4.0
//   protoc        v3.19.4

import { Writer, Reader } from "as-proto";

export class TestMessage {
  static encode(message: TestMessage, writer: Writer): void {
    writer.uint32(10);
    writer.bytes(message.payload);

    const headers = message.headers;
    for (let i = 0; i < headers.length; ++i) {
      writer.uint32(18);
      writer.fork();
      TestMessage.HeadersEntry.encode(headers[i], writer);
      writer.ldelim();
    }
  }

  static decode(reader: Reader, length: i32): TestMessage {
    const end: usize = length < 0 ? reader.end : reader.ptr + length;
    const message = new TestMessage();

    while (reader.ptr < end) {
      const tag = reader.uint32();
      switch (tag >>> 3) {
        case 1:
          message.payload = reader.bytes();
          break;

        case 2:
          message.headers.push(
            TestMessage.HeadersEntry.decode(reader, reader.uint32())
          );
          break;

        default:
          reader.skipType(tag & 7);
          break;
      }
    }

    return message;
  }

  payload: Uint8Array;
  headers: Array<TestMessage.HeadersEntry>;

  constructor(
    payload: Uint8Array = new Uint8Array(0),
    headers: Array<TestMessage.HeadersEntry> = []
  ) {
    this.payload = payload;
    this.headers = headers;
  }
}

export namespace TestMessage {}

The output kind of looks OK, but the HeadersEntry type is never defined.

This should be fixed in the newest version - could you check if it works for you?

Related PR: #28

dsyer commented

That seems much better, thanks.