Go to file
2017-04-13 13:15:40 +02:00
contrib/homebrew Add Homebrew support #3 2016-11-06 20:20:11 +01:00
examples Moved to google.golang.org/genproto/googleapis/api/annotations 2017-03-31 18:01:58 +02:00
slides Add slides (#16) 2016-12-13 19:08:37 +01:00
vendor Remove unneeded dep on grpc-gateway 2017-03-31 18:27:30 +02:00
.gitignore Setup unit tests (fix #13) 2016-12-12 19:35:59 +01:00
.travis.yml Update Glide install method 2017-04-01 09:20:29 +02:00
Dockerfile bump funcmap@1.1.1 2016-12-01 10:19:09 +01:00
encoder.go Add all arguments 2017-01-12 14:46:43 +01:00
glide.lock Moved to google.golang.org/genproto/googleapis/api/annotations 2017-03-31 18:01:58 +02:00
glide.yaml Moved to google.golang.org/genproto/googleapis/api/annotations 2017-03-31 18:01:58 +02:00
helpers.go Add jsSuffixReservedKeyword helper 2017-04-13 13:15:40 +02:00
LICENSE Initial commit 2016-11-04 21:44:49 +01:00
main.go Concatenate if file already exist 2017-01-17 12:20:16 +01:00
Makefile Temporarily disabling go-kit example in the test-suite 2017-04-01 21:50:10 +02:00
README.md Update README.md 2017-03-16 16:15:10 +01:00

protoc-gen-gotemplate

📂 protocol generator + golang text/template (protobuf)

A generic code/script/data generator based on Protobuf.


This project is a generator plugin for the Google Protocol Buffers compiler (protoc).

The plugin parses protobuf files, generates an ast, and walks a local templates directory to generate files using the Golang's text/template engine.

Philosophy

  • protobuf-first
  • no built-in template, only user defined templates
  • kiss, keep it stupid simple

Under the hood

  1. the user protobuf files are parsed by protoc
  2. the ast is generated by protoc-gen-go helpers
  3. the ast is given to Golang's text/template engine for each user template files
  4. the funcmap enriching the template engine is based on Masterminds/sprig, and contains type-manipulation, iteration and language-specific helpers

Usage

protoc-gen-gotemplate requires a template_dir directory (by default ./templates).

Every file ending with .tmpl will be processed and written to the destination folder, following the file hierarchy of the template_dir, and remove the .tmpl extension.


$> ls -R
input.proto     templates/doc.txt.tmpl      templates/config.json.tmpl
$> protoc --gotemplate_out=. input.proto
$> ls -R
input.proto     templates/doc.txt.tmpl      templates/config.json.tmpl
doc.txt         config.json

You can specify a custom template_dir or enable debug:

$> protoc --gotemplate_out=debug=true,template_dir=/path/to/template/directory:. input.proto

Hints

Shipping the templates with your project is very smart and useful when contributing on git-based projects.

Another workflow consists in having a dedicated repository for generic templates which is then versioned and vendored with multiple projects (npm package, golang vendor package, ...)

See examples.

Funcmap

This project uses Masterminds/sprig library and additional functions to extend the builtin text/template helpers.

Non-exhaustive list of new helpers:

  • all the functions from sprig
  • json
  • prettyjson
  • first
  • last

See the project helpers for the complete list.

Install

  • Install the Go compiler and tools from https://golang.org/doc/install
  • Install protobuf: go get -u github.com/golang/protobuf/{proto,protoc-gen-go}
  • Install protoc-gen-gotemplate: go get -u github.com/moul/protoc-gen-gotemplate

Projects using protoc-gen-gotemplate

  • kafka-gateway: Kafka gateway/proxy (gRPC + http) using Go-Kit
  • translator: Translator Micro-service using Gettext and Go-Kit
  • acl: ACL micro-service (gRPC/protobuf + http/json)

License

MIT