• Stars
    star
    430
  • Rank 98,849 (Top 2 %)
  • Language
    Go
  • License
    MIT License
  • Created over 7 years ago
  • Updated 19 days ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

📂 generic protocol generator based on golang's text/template (grpc/protobuf)

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

Dev helpers

  1. Pre-commit script for install: https://pre-commit.com

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 install github.com/golang/protobuf/protoc-gen-go@latest
  • Install protoc-gen-gotemplate: go install moul.io/protoc-gen-gotemplate@latest

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)

See also

  • pbhbs: protobuf gen based on handlebarjs template

License

MIT

More Repositories

1

assh

💻 make your ssh client smarter
Go
2,868
star
2

awesome-ssh

💻 A curated list of SSH resources.
2,245
star
3

sshportal

🎩 simple, fun and transparent SSH (and telnet) bastion server
Go
1,693
star
4

quicssh

SSH over QUIC
Go
775
star
5

http2curl

📐 Convert Golang's http.Request to CURL command line
Makefile
704
star
6

node-gitlab

DEPRECATED, see https://github.com/node-gitlab/node-gitlab
JavaScript
474
star
7

gotty-client

🔧 terminal client for GoTTY
Go
296
star
8

golang-repo-template

🌀 A template for creating new Golang + Docker + Canonical Domain + Badges + Dependabot + Renovate + GolangCI-lint + Goreleaser + GitHub Actions + Gitpod + Depaware + Git Hooks + ...
Go
274
star
9

zapgorm2

⚡ zap logging driver for gorm v2
Go
246
star
10

alfred-workflow-gauth

🔑 TOTP - Google Authenticator Workflow for Alfred2 (Two-Factor authentication)
Python
238
star
11

ssh2docker

🐳 standalone SSH server that connects you to your Docker containers
Go
183
star
12

docker-diff

🐳 Compare Docker images
Shell
154
star
13

depviz

👓 dependency visualizer for GitHub & GitLab (a.k.a., "auto-roadmap")
Go
139
star
14

grpcbin

httpbin like for gRPC
Go
128
star
15

travis-docker

🐳👨 Docker in Travis-CI
Shell
108
star
16

docker-icecast

📻 Icecast 2 in Dockerfile (Docker container, compatible with liquidsoap)
XSLT
103
star
17

iocat

🔧 Socket.io & WebSocket netcat-like utility
CoffeeScript
83
star
18

number-to-words

convert number into words (english, french, italian, roman, spanish, portuguese, belgium, dutch, swedish, polish, russian, iranian, roman, aegean)
Go
73
star
19

awesome-ascii-art

A curated list of ascii-art resources
49
star
20

docker-kernel-builder

🐧 Kernel build environment in Docker
48
star
21

docker-readthedocs

🐳 ReadTheDocs (RTD, read the docs) in docker
Shell
43
star
22

kafka-gateway

🌊 Kafka Gateway (gRPC/protobuf + http/json)
Go
40
star
23

zapgorm

⚡ Zap logger for GORM (support v1 and v2)
Go
38
star
24

retry

🐚 retry shell commands
Makefile
26
star
25

dockerpatch

🐳 Read, write, manipulate, convert & apply filters to Dockerfiles
Go
24
star
26

radioman

🎵 Web radio solution using Liquidsoap and Icecast
Go
21
star
27

dockerself

🐳 runtime self dockerizer
Go
21
star
28

anonuuid

🔧 Anonymize UUIDs outputs (written in Golang)
Go
20
star
29

chizap

⚡️ simple zap logging middleware for go-chi
Go
20
star
30

node-scaleway

🔧 Online Labs API client in Node.js and browser javascript
JavaScript
19
star
31

pb

C#
18
star
32

scaleway-ipxe

💃 custom IPXE config on Scaleway servers
17
star
33

gno-basics

Gnolang smart contract examples
Go
15
star
34

sapin

🎄 draw a beautiful christmas tree in ascii using Golang
Go
14
star
35

totp-keychain

🔒 TOTP cli backed by the OS X keychain
Go
14
star
36

cleanarch

🚿 the clean architecture, optimised for Golang
Go
14
star
37

grpcbin-example

Go
14
star
38

xbmc-remote-keyboard

📹 Send local keyboard presses to a remote XBMC/Kodi through JSON RPC api (javascript, coffee, ncurses)
CoffeeScript
14
star
39

captcha

🦾 a "Completely Automated Public Turing test to tell Computers and Humans Apart" CLI
Go
13
star
40

golang-boilerplate

🔧 Golang project bootstrap
Makefile
13
star
41

zapfilter

⚡💊 advanced filtering for uber's zap logger
Go
13
star
42

scaleway-cli-node

💻 Interract with Scaleway from command line (Mimics Docker CLI)
JavaScript
12
star
43

acl

👮 ACL micro-service (gRPC/protobuf + http/json)
Go
12
star
44

progress

🏗 progress, steps, completion patterns for golang
Go
12
star
45

node-icecast-admin

📻 Icecast admin nodejs library - used for statistics
JavaScript
12
star
46

stegaporn

8========D The art of hiding sensitive data in porn videos
Shell
11
star
47

docker-liquidsoap

📻 Liquidsoap in Docker - compatible with icecast
Dockerfile
11
star
48

pipotron

generic (& funny?) text generator
Go
11
star
49

bot

🤖 my personal bot / virtual assistant (GitHub, Discord, HTTP+gRPC API, Twitter, Coffee, etc)
Go
11
star
50

translator

🎤 Translator micro-service
Go
10
star
51

image-builder

⚠️ ARCHIVED ⚠️
10
star
52

node-leboncoin

🔧 leboncoin.fr nodejs library
CoffeeScript
10
star
53

node-netsoul

Netsoul client - Epitech, Epita, Ionis
JavaScript
9
star
54

internet-status

📶 Check internet connectivity
Go
9
star
55

totp-cli

🔒 TOTP CLI
Go
8
star
56

docker-coreos-img

🐳 CoreOS image in a docker image
Makefile
8
star
57

generate-fake-data

🧬 CLI to generate fake data for testing
Go
8
star
58

euler

🎲 Project Euler in Golang
Go
8
star
59

shikaku

🀄 Shikaku generator
Go
8
star
60

git-ci

♐ git subcommand to interract with CI/CD from command line
Go
8
star
61

nixpkgs

🧔 personal nix config #nixos
Nix
8
star
62

docker-binfmt-register

🐳 Register Binfmt-support in Docker, works with boot2docker to run armhf images
8
star
63

graphman

graph manipulation library in golang (pert, cpm, dijkstra, ...)
Go
8
star
64

3d-stereo-html5

3d anaglyph / stereoscopic html5 canvas viewer
8
star
65

libmusic

Manipulate Music in Golang
Go
8
star
66

converter

✂️ multiformat data conversion
Go
7
star
67

mbin

:neckbeard: plenty of more-or-less useful scripts I use(d)
Python
7
star
68

irccloud-desktop-app

💻 IRC Cloud Desktop Application (irccloud.com)
CSS
7
star
69

cryptoguess

Automatically detect and parse cryptography keys
Go
7
star
70

ascii2svg

Go
7
star
71

conf-du-loose

💀🔫 Hacked
Shell
7
star
72

as-a-service

👨 Me, as a service
Go
7
star
73

pkgman

📱 Package manipulation tool & library (ipa, etc)
Go
7
star
74

drunken-bishop

Drunken Bishop algorithm for Ascii-Art representation of Fingerprint
Makefile
7
star
75

image-tools-v1

⚠️ Archives ⚠️ Image Tools - Scripts to build images on Online Labs
7
star
76

hacker-typing

☠️🏴‍☠️🦜 impress your friends :)
Makefile
7
star
77

port-docker-image

🐳 Script to port Docker image on armhf architecture
Shell
7
star
78

u

🔬 Go common utility functions
Go
7
star
79

go-dl-extract

🐳 "curl | tar xf" as a static binary - ADD compressed tarball url on Docker scratch
Go
6
star
80

godev

A collection of helpers I use during Golang development
Makefile
6
star
81

amiga-ball

AMIGA!!!
HTML
6
star
82

tapas-icecast-analytics

Icecast Web Analytics using Tapas (nodejs)
CoffeeScript
6
star
83

docker-drupal

🐳 run Drupal in Docker
Shell
6
star
84

runcache

🔧 shell command caching
Shell
6
star
85

node-slumber

🔧 Port of Python's slumber library -- (RESTful API library)
CoffeeScript
6
star
86

guilhunize

Speak like Guilhem
Makefile
6
star
87

testman

😎 `go test` wrapper for advanced testing workflows in Go
Go
6
star
88

banner

lightweight Golang ascii-art text generator
Go
6
star
89

node-alfred-workflow

👨 Create Alfred Workflow with NodeJS (wrapper)
Python
6
star
90

awesome

awesome
Go
6
star
91

alfred-workflow-chromecast

👨 Chromecast Workflow for Alfred2
Python
6
star
92

docker-plan9port

🐳 plan9port in Docker
Dockerfile
6
star
93

term.js-cli

🔧 A command line interface client for term.js / tty.js
CoffeeScript
6
star
94

funcenter

function-level middlewares in golang
Go
6
star
95

image-service-travis

💽 WIP Official Travis-CI worker image on Online Labs
Makefile
6
star
96

zapring

💍 In-memory RING buffer backend for the Zap logger
Go
6
star
97

docker-emacs

🐳 run Emacs server in Docker
Emacs Lisp
5
star
98

wiki

✌️ life wiki
5
star
99

comments

GitHub-Based discussions for some posts of my website
HTML
5
star
100

music-paint

paint-based midi controller
Makefile
5
star