protogen: support passing command-line parameters to plugins
Add a protogen.Options struct for future expansion. Include a FlagSet
which will be populated with parameters passed to the plugin.
Change-Id: I26a13bbde7ce011135b9c151edd160f3b51b7f9a
Reviewed-on: https://go-review.googlesource.com/134696
Reviewed-by: Joe Tsai <thebrokentoaster@gmail.com>
diff --git a/protogen/protogen_test.go b/protogen/protogen_test.go
index 05d0bf2..f35068a 100644
--- a/protogen/protogen_test.go
+++ b/protogen/protogen_test.go
@@ -5,6 +5,7 @@
package protogen
import (
+ "flag"
"fmt"
"io/ioutil"
"os"
@@ -18,8 +19,45 @@
pluginpb "github.com/golang/protobuf/protoc-gen-go/plugin"
)
+func TestPluginParameters(t *testing.T) {
+ var flags flag.FlagSet
+ value := flags.Int("integer", 0, "")
+ opts := &Options{
+ ParamFunc: flags.Set,
+ }
+ const params = "integer=2"
+ _, err := New(&pluginpb.CodeGeneratorRequest{
+ Parameter: proto.String(params),
+ }, opts)
+ if err != nil {
+ t.Errorf("New(generator parameters %q): %v", params, err)
+ }
+ if *value != 2 {
+ t.Errorf("New(generator parameters %q): integer=%v, want 2", params, *value)
+ }
+}
+
+func TestPluginParameterErrors(t *testing.T) {
+ for _, parameter := range []string{
+ "unknown=1",
+ "boolean=error",
+ } {
+ var flags flag.FlagSet
+ flags.Bool("boolean", false, "")
+ opts := &Options{
+ ParamFunc: flags.Set,
+ }
+ _, err := New(&pluginpb.CodeGeneratorRequest{
+ Parameter: proto.String(parameter),
+ }, opts)
+ if err == nil {
+ t.Errorf("New(generator parameters %q): want error, got nil", parameter)
+ }
+ }
+}
+
func TestFiles(t *testing.T) {
- gen, err := New(makeRequest(t, "testdata/go_package/no_go_package_import.proto"))
+ gen, err := New(makeRequest(t, "testdata/go_package/no_go_package_import.proto"), nil)
if err != nil {
t.Fatal(err)
}
@@ -144,7 +182,7 @@
if test.generate {
req.FileToGenerate = []string{filename}
}
- gen, err := New(req)
+ gen, err := New(req, nil)
if err != nil {
t.Errorf("%vNew(req) = %v", context, err)
continue
@@ -182,7 +220,7 @@
},
},
FileToGenerate: []string{"dir/file1.proto", "dir/file2.proto"},
- })
+ }, nil)
if err != nil {
t.Fatalf("New(req) = %v", err)
}
@@ -212,14 +250,14 @@
},
},
FileToGenerate: []string{"dir/file1.proto", "dir/file2.proto"},
- })
+ }, nil)
if err == nil {
t.Fatalf("inconsistent package names for the same import path: New(req) = nil, want error")
}
}
func TestImports(t *testing.T) {
- gen, err := New(&pluginpb.CodeGeneratorRequest{})
+ gen, err := New(&pluginpb.CodeGeneratorRequest{}, nil)
if err != nil {
t.Fatal(err)
}
@@ -309,7 +347,7 @@
func init() {
if os.Getenv("RUN_AS_PROTOC_PLUGIN") != "" {
- Run(func(p *Plugin) error {
+ Run(nil, func(p *Plugin) error {
g := p.NewGeneratedFile("request", "")
return proto.MarshalText(g, p.Request)
})