Go to file
2019-02-10 21:41:03 +01:00
assets chore: switch to golangci-lint 2019-01-20 07:18:16 +01:00
cmd/web-editor chore: switch to go modules 2018-09-13 16:47:21 +02:00
contrib/homebrew Add Homebrew support #3 2016-11-06 20:20:11 +01:00
examples chore: lint 2019-01-19 20:01:03 +01:00
helpers Introducing two new helpers, one for returning in templates go_package path, and second one giving only last element of go_package namespace 2019-02-10 21:41:03 +01:00
slides chore: switch to moul.io/protoc-gen-gotemplate 2018-09-13 16:38:39 +02:00
vendor chore: switch to go modules 2018-09-13 16:47:21 +02:00
.gitignore chore: switch to go modules 2018-09-13 16:47:21 +02:00
.golangci.yml chore: switch to golangci-lint 2019-01-20 07:18:16 +01:00
.travis.yml chore: switch to golangci-lint 2019-01-20 07:18:16 +01:00
Dockerfile chore: switch to moul.io/protoc-gen-gotemplate 2018-09-13 16:38:39 +02:00
encoder.go Merge pull request #127 from piotrekmonko/fix_intermittent_errors 2019-02-10 21:37:31 +01:00
go.mod feat: add int64FieldExtension helper 2019-01-18 19:41:46 +01:00
go.sum feat: add int64FieldExtension helper 2019-01-18 19:41:46 +01:00
LICENSE Initial commit 2016-11-04 21:44:49 +01:00
main.go chore: switch to golangci-lint 2019-01-20 07:18:16 +01:00
Makefile chore: switch to golangci-lint 2019-01-20 07:18:16 +01:00
README.md feat: add int64FieldExtension helper 2019-01-18 19:41:46 +01:00
renovate.json chore: group renovate bump PRs into one 2019-01-09 16:37:05 +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

Web editor

Web editor screenshot

Demo server

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

Options

You can specify custom options, as follow:

$> protoc --gotemplate_out=debug=true,template_dir=/path/to/template/directory:. input.proto
Option Default Value Accepted Values Description
template_dir       ./template absolute or relative path path to look for templates
destination_dir     .           absolute or relative path base path to write output
single-package-mode false true or false if true, protoc won't accept multiple packages to be compiled at once (!= from all), but will support Message lookup across the imported protobuf dependencies
debug               false       true or false if true, protoc will generate a more verbose output
all                 false       true or false         if true, protobuf files without Service will also be parsed
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
  • add
  • boolFieldExtension
  • camelCase
  • contains
  • divide
  • fieldMapKeyType
  • fieldMapValueType
  • first
  • getEnumValue
  • getMessageType
  • getProtoFile
  • goNormalize
  • goTypeWithPackage
  • goType
  • goZeroValue
  • haskellType
  • httpBody
  • httpPath
  • httpPathsAdditionalBindings
  • httpVerb
  • index
  • int64FieldExtension
  • isFieldMap
  • isFieldMessageTimeStamp
  • isFieldMessage
  • isFieldRepeated
  • jsSuffixReserved
  • jsType
  • json
  • kebabCase
  • last
  • leadingComment
  • leadingDetachedComments
  • lowerCamelCase
  • lowerFirst
  • lowerGoNormalize
  • multiply
  • namespacedFlowType
  • prettyjson
  • replaceDict
  • shortType
  • snakeCase
  • splitArray
  • stringFieldExtension
  • stringMethodOptionsExtension
  • string
  • subtract
  • trailingComment
  • trimstr
  • upperFirst
  • urlHasVarsFromMessage

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 moul.io/protoc-gen-gotemplate

Docker

Usage:

$> docker run --rm -v "$(pwd):$(pwd)" -w "$(pwd)" moul/protoc-gen-gotemplate -I. --gotemplate_out=./output/ ./*.proto

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