idodod / protoc-gen-fieldmask

A protoc plugin that generates fieldmask paths
MIT License
23 stars 3 forks source link

protoc-gen-fieldmask

CI Go Report Card GitHub release (latest SemVer) GitHub go.mod Go version GitHub

A protoc plugin that generates fieldmask paths as static type properties for proto messages, which elimantes the usage of error-prone strings.

For example, given the following proto messages:


syntax = "proto3";

package example;

option go_package = "example/;example";

import "google/type/date.proto";

message Foo {
  string baz = 1;
  int32 xyz = 2;
  Bar my_bar = 3;
  google.type.Date some_date = 4;
}

message Bar {
  string some_field = 1;
  bool another_field = 2;
}

fieldmasks paths can be used as follows:

  foo := &example.Foo{}

  // Prints "baz"
  fmt.Println(foo.FieldMaskPaths().Baz())

  // Prints "xyz"
  fmt.Println(foo.FieldMaskPaths().Xyz())

  // Prints "my_bar"
  fmt.Println(foo.FieldMaskPaths().MyBar().String())

  // Since baz is a nested message, we can print a nested path - "my_bar.some_field"
  fmt.Println(foo.FieldMaskPaths().MyBar().SomeField())

  // Thirdparty messages work the same way:
  // Prints "some_date"
  fmt.Println(foo.FieldMaskPaths().SomeDate().String())

  // Prints "some_date.year"
  fmt.Println(foo.FieldMaskPaths().SomeDate().Year())

Usage

Installation

The plugin can be downloaded from the release page, and should be ideally installed somewhere available in your $PATH.

Executing the plugin

protoc --fieldmask_out=gen protos/example.proto

# If the plugin is not in your $PATH:
protoc --fieldmask_out=out_dir protos/example.proto --plugin=protoc-gen-fieldmask=/path/to/protoc-gen-fieldmask

Parameters

The following parameters can be set by passing --fieldmask_opt to the command:

Features