Skip to content

Commit

Permalink
Custom preprocess (#3)
Browse files Browse the repository at this point in the history
* add ability to implement custom preprocessors

* update readme

* syntax highlight in readme for protobuf

* Preprocess not generated if unused

* update custom example
  • Loading branch information
atorgayev authored and Evgeniy-L committed Sep 6, 2018
1 parent 1c5aef3 commit 7919e4f
Show file tree
Hide file tree
Showing 7 changed files with 103 additions and 42 deletions.
12 changes: 4 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ We have variety of validators for protobuf, however sometimes we need to pre-pro

### Example

```proto
```protobuf
syntax = "proto3";
import "github.com/infobloxopen/protoc-gen-preprocess/options/preprocess.proto";
message Demo {
string preprocessedField = 1 [(preprocess.field).string.trim_space = true ];
string preprocessedField = 1 [(preprocess.field).string.trim_space = true];
repeated string preprocessedRepeatedField = 2 [(preprocess.field).string.trim_space = true ];
string untouched = 3;
}
Expand Down Expand Up @@ -74,12 +74,8 @@ func runService() {
### Installation

```sh
# get repo
go get -d github.com/infobloxopen/protoc-gen-preprocess

# build
make install

# get repo and install
go get github.com/infobloxopen/protoc-gen-preprocess
```

### Running Demo
Expand Down
6 changes: 5 additions & 1 deletion example/demo.proto
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
syntax = "proto3";

package proto;
import "github.com/infobloxopen/protoc-gen-preprocess/options/preprocess.proto";
import "google/api/annotations.proto";

Expand All @@ -10,6 +10,10 @@ message Demo {
int32 ignored = 4 [(preprocess.field).string.trim_space = true ];
}

message Custom {
string doItYourself = 1;
}

service DemoService {
rpc Echo(Demo) returns (Demo){
option (google.api.http) = {
Expand Down
7 changes: 7 additions & 0 deletions example/proto/demo.pb.custom.preprocess.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package proto

// Preprocess will be called by interceptor
func (m *Custom) Preprocess() error {
m.DoItYourself = "Changed Internals"
return nil
}
95 changes: 68 additions & 27 deletions example/proto/demo.pb.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

4 changes: 2 additions & 2 deletions example/proto/demo.pb.gw.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion example/proto/demo.pb.preprocess.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

19 changes: 16 additions & 3 deletions preprocess/preprocess.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,8 @@ import (
type preprocessor struct {
*generator.Generator
generator.PluginImports
stringsPkg generator.Single
packageName string
stringsPkg generator.Single
}

func NewPreprocessor() *preprocessor {
Expand All @@ -30,7 +31,9 @@ func (p *preprocessor) Generate(file *generator.FileDescriptor) {
p.PluginImports = generator.NewPluginImports(p.Generator)
p.stringsPkg = p.NewImport("strings")
for _, message := range file.Messages() {
p.generateProto3Message(file, message)
if containsPreprocessOptions(message) {
p.generateProto3Message(message)
}
}
}

Expand All @@ -53,7 +56,7 @@ func getFieldOptions(field *descriptor.FieldDescriptorProto) *prep.PreprocessFie
return opts
}

func (p *preprocessor) generateProto3Message(file *generator.FileDescriptor, message *generator.Descriptor) {
func (p *preprocessor) generateProto3Message(message *generator.Descriptor) {
ccTypeName := generator.CamelCaseSlice(message.TypeName())
p.P(`func (m *`, ccTypeName, `) Preprocess() error {`)
p.In()
Expand Down Expand Up @@ -94,3 +97,13 @@ func (p *preprocessor) generateStringValidator(variableName string, ccTypeName s
}
}
}

func containsPreprocessOptions(message *generator.Descriptor) bool {
for _, field := range message.Field {
fieldOptions := getFieldOptions(field)
if fieldOptions != nil {
return true
}
}
return false
}

0 comments on commit 7919e4f

Please # to comment.