mransan / ocaml-protoc

A Protobuf Compiler for OCaml
https://mransan.github.io/ocaml-protoc/
MIT License
179 stars 33 forks source link

More compliant options parsing #242

Closed Lupus closed 7 months ago

Lupus commented 8 months ago

This PR introduces Pb_raw_option, which is a raw set of options as they are parsed from the .proto file. Pb_option is modified to actually be a compiled set of options. See https://protobuf.com/docs/language-spec#options for more details on how options are represented and thus should be parsed. Citing the example from that link here (same example is also added to tests to illustrate the new option parsing behavior and its correctness):

The example below demonstrates use of destructured messages and destructured lists:

option (google.api.http).custom.kind = "FETCH";
option (google.api.http).custom.path = "/foo/bar/baz/{id}";
option (google.api.http).additional_bindings = {
    get: "/foo/bar/baz/{id}"
};
option (google.api.http).additional_bindings = {
    post: "/foo/bar/baz/"
    body: "*"
};

The following is equivalent to the above, and instead uses a single message literal instead of de-structuring:

option (google.api.http) = {
    custom: {
        kind: "FETCH"
        path: "/foo/bar/baz/{id}"
    }
    additional_bindings: [
      {
          get: "/foo/bar/baz/{id}"
      },
      {
          post: "/foo/bar/baz/"
          body: "*"
      }
    ]
};
Lupus commented 8 months ago

@c-cube hey, would you be able to take a look at this?