Compare commits
237 Commits
v1.0.0
...
guardrails
Author | SHA1 | Date | |
---|---|---|---|
|
f98b5ae98f | ||
|
0a47157c26 | ||
|
48265e1947 | ||
|
5ab09755c8 | ||
|
8b191e85f2 | ||
|
c015ff9539 | ||
|
ac2e25e74f | ||
|
7d8c6c4b19 | ||
|
8ec535ac58 | ||
|
ca3f353d44 | ||
|
9b14e8fb8a | ||
|
5b8733f8ec | ||
|
90a63053d4 | ||
|
8a8c54b5b4 | ||
|
9938cbdf5a | ||
|
0fe0e49401 | ||
|
5b056b2579 | ||
|
4b9116a5dd | ||
|
6abbdf4cfb | ||
|
adb58bd940 | ||
|
283713bd93 | ||
|
19fb3c8da9 | ||
|
77a820ea6f | ||
|
6765ff04eb | ||
|
bb3105a862 | ||
|
0c29a9922f | ||
|
aff21c1e7c | ||
|
15ac366c8d | ||
|
5a9555bcf5 | ||
|
3f1d5001d9 | ||
|
be5f14041f | ||
|
100279cd16 | ||
|
4f138c4f92 | ||
|
78cb5588b1 | ||
|
0b600dd93f | ||
|
decb64ccd8 | ||
|
7e17e4319f | ||
|
c64e1d8ed6 | ||
|
f84ba571b5 | ||
|
5da3d00df2 | ||
|
9f831eb4de | ||
|
230480afd1 | ||
|
ccffd8bfe2 | ||
|
bd68210bc3 | ||
|
c833301bd5 | ||
|
3dbba43e5f | ||
|
055b1a5a86 | ||
|
6db1457a28 | ||
|
6ceb257a3b | ||
|
fc09c682e3 | ||
|
22c3e39e89 | ||
|
64c92d0c8d | ||
|
ba84ae0c01 | ||
|
8caafb8ec4 | ||
|
fe71150b76 | ||
|
7172d5b49d | ||
|
a0e68f8a2b | ||
|
1dc5500690 | ||
|
dab343fc15 | ||
|
a921a29c7e | ||
|
6db729b136 | ||
|
ee845f3ed6 | ||
|
19fd9d7959 | ||
|
07992907fd | ||
|
c52b282d96 | ||
|
d454efa152 | ||
|
80a62f29d8 | ||
|
8a25e9ba06 | ||
|
37fe30907a | ||
|
fd268a723e | ||
|
d0c5bb5a97 | ||
|
098b247649 | ||
|
09adcbdcd9 | ||
|
31a84ee58f | ||
|
62b7b2227e | ||
|
0f43ead321 | ||
|
30b0ec5000 | ||
|
4e25b6e83a | ||
|
5448f25fd6 | ||
|
dc386661ca | ||
|
e1486970f7 | ||
|
c750f5de81 | ||
|
266eb3707c | ||
|
d37b141a64 | ||
|
47ef416835 | ||
|
69cc91572b | ||
|
91ebb6e521 | ||
|
c73a4b8c46 | ||
|
a68198f386 | ||
|
21cba66d10 | ||
|
fcfaf82ebd | ||
|
a4fbdd0369 | ||
|
263cb87b9c | ||
|
7393098e01 | ||
|
b4a019192c | ||
|
ff370a965d | ||
|
1594e18f3c | ||
|
c40779224f | ||
|
024c5a4e4e | ||
|
266d42dc25 | ||
|
9da682760b | ||
|
97cfa60fc8 | ||
|
191df6c8ec | ||
|
6d0ee10322 | ||
|
b3496838ad | ||
|
7758db8357 | ||
|
cf5e1b7064 | ||
|
bc937830d2 | ||
|
6202a3f762 | ||
|
c1f10d57e9 | ||
|
199050ce6f | ||
|
1006df3564 | ||
|
99cff16e71 | ||
|
fee245f5d4 | ||
|
99d310ac79 | ||
|
5a65b0fca4 | ||
|
0d32837e5d | ||
|
72880bafe5 | ||
|
4d3b9c31b6 | ||
|
4149bd5c25 | ||
|
0ce8ebe54b | ||
|
b3b9aec439 | ||
|
47277242ae | ||
|
5fa1ea5cba | ||
|
738a68fd4c | ||
|
dc8e191077 | ||
|
acbd1bf87b | ||
|
66e9d20e1f | ||
|
6cbc8f35eb | ||
|
37d97c5693 | ||
|
ab2a5d5181 | ||
|
a8d641cd8d | ||
|
af1ed8a2fb | ||
|
54eb016142 | ||
|
81310a7f0f | ||
|
2c01e8b298 | ||
|
6b43c020b1 | ||
|
e8cdc47633 | ||
|
f8c091326e | ||
|
c73331e20d | ||
|
83f2bd1514 | ||
|
22d4ea9a44 | ||
|
791af18420 | ||
|
6106c552da | ||
|
7e6c4a9401 | ||
|
d6aa9a06cc | ||
|
877e93aa7c | ||
|
cdb9580565 | ||
|
f78470553b | ||
|
c26d72d1ad | ||
|
91e9114c24 | ||
|
f5d97d64c7 | ||
|
4c53f8ebdd | ||
|
718f9120e4 | ||
|
f4f2300417 | ||
|
c7d0a86fec | ||
|
453376e811 | ||
|
49d31f1636 | ||
|
7d8a132834 | ||
|
e8332ed718 | ||
|
e4160940c1 | ||
|
88a2f47522 | ||
|
5dd30f38f3 | ||
|
d0ac6afb18 | ||
|
15db6dce00 | ||
|
19ea337fa6 | ||
|
536162a58b | ||
|
304fba375b | ||
|
5c6941cf87 | ||
|
2195db0de2 | ||
|
eec84d5d96 | ||
|
d38fbfccf0 | ||
|
abbd30d34c | ||
|
5b8c9e93dc | ||
|
9cde3288ea | ||
|
d3abcca373 | ||
|
df709b52ac | ||
|
f9e191c6a4 | ||
|
8e2be0f866 | ||
|
869e37e163 | ||
|
5489e68995 | ||
|
1bbb1dfb26 | ||
|
6beb5868e8 | ||
|
da88fbcbd7 | ||
|
add7ae7237 | ||
|
d7c3d1a32b | ||
|
8b7fa40e87 | ||
|
2ab581a1d6 | ||
|
3b5a2eeafe | ||
|
e48d798d89 | ||
|
f48fe29ebf | ||
|
ae44a872b3 | ||
|
7907fb79d9 | ||
|
407790640d | ||
|
14d2af18a7 | ||
|
ba1f64a731 | ||
|
aa9a474262 | ||
|
1afdd936da | ||
|
a4749d98ae | ||
|
b4d1f1f9bb | ||
|
2ae75f6702 | ||
|
6c946d62eb | ||
|
514198f2e5 | ||
|
ff7e469a05 | ||
|
9c249b45a4 | ||
|
b34abe8c12 | ||
|
c83a19d80c | ||
|
0336dc5217 | ||
|
dbd5ed55a4 | ||
|
d252b157c9 | ||
|
605610f7d0 | ||
|
8b771ff4c7 | ||
|
701c12f866 | ||
|
d748878896 | ||
|
f62940ac4c | ||
|
bffc245a82 | ||
|
71fb53ae02 | ||
|
ce8f7bd8a7 | ||
|
218f25ab56 | ||
|
09a9873bad | ||
|
664498d53d | ||
|
1146013b1f | ||
|
19a3db3d08 | ||
|
b6d7814f97 | ||
|
8958575958 | ||
|
9222cc15b9 | ||
|
136f9b6fba | ||
|
32072ab20b | ||
|
84c1d65fd3 | ||
|
9e79d2b3aa | ||
|
83232e17d7 | ||
|
efcd958d6b | ||
|
96b930de07 | ||
|
65f289bea7 | ||
|
e0c9f987fc | ||
|
c8c607ae0d | ||
|
7ec1769398 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -1,3 +1,7 @@
|
|||||||
|
vendor/**/.travis.yml
|
||||||
|
|
||||||
|
/protoc-gen-gotemplate
|
||||||
|
|
||||||
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
# Compiled Object files, Static and Dynamic libs (Shared Objects)
|
||||||
*.o
|
*.o
|
||||||
*.a
|
*.a
|
||||||
|
20
.travis.yml
Normal file
20
.travis.yml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
language: go
|
||||||
|
go: 1.11.x
|
||||||
|
go_import_path: moul.io/protoc-gen-gotemplate
|
||||||
|
install:
|
||||||
|
- go get github.com/Masterminds/glide
|
||||||
|
- wget https://raw.githubusercontent.com/grpc-ecosystem/grpc-gateway/master/.travis/install-protoc.sh && chmod +x install-protoc.sh && ./install-protoc.sh 3.4.0
|
||||||
|
- go get -u github.com/golang/protobuf/protoc-gen-go
|
||||||
|
- go get github.com/securego/gosec/cmd/gosec/...
|
||||||
|
- go get -u github.com/alecthomas/gometalinter
|
||||||
|
- gometalinter --install
|
||||||
|
script:
|
||||||
|
- make install
|
||||||
|
- make test
|
||||||
|
- make lint
|
||||||
|
cache:
|
||||||
|
directories:
|
||||||
|
- $HOME/local
|
||||||
|
env:
|
||||||
|
global:
|
||||||
|
- "PATH=$PATH:$HOME/local/bin"
|
14
Dockerfile
Normal file
14
Dockerfile
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
FROM znly/protoc:0.3.0
|
||||||
|
|
||||||
|
ENV GOPATH=/go \
|
||||||
|
PATH=/go/bin:${PATH}
|
||||||
|
|
||||||
|
# Install deps and common tools
|
||||||
|
RUN apk --update add make git go rsync libc-dev \
|
||||||
|
&& go get -u golang.org/x/tools/cmd/goimports
|
||||||
|
|
||||||
|
# Install protoc-gen-gotemplate
|
||||||
|
COPY . /go/src/moul.io/protoc-gen-gotemplate
|
||||||
|
WORKDIR /go/src/moul.io/protoc-gen-gotemplate
|
||||||
|
RUN git remote set-url origin https://github.com/moul/protoc-gen-gotemplate
|
||||||
|
RUN go install . ./cmd/web-editor
|
36
Makefile
Normal file
36
Makefile
Normal file
@@ -0,0 +1,36 @@
|
|||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
go build -v -i -o protoc-gen-gotemplate .
|
||||||
|
|
||||||
|
.PHONY: install
|
||||||
|
install:
|
||||||
|
go install .
|
||||||
|
go install ./cmd/web-editor
|
||||||
|
|
||||||
|
.PHONY: test
|
||||||
|
test: install
|
||||||
|
cd examples/time && make
|
||||||
|
cd examples/enum && make
|
||||||
|
cd examples/import && make
|
||||||
|
cd examples/dummy && make
|
||||||
|
cd examples/flow && make
|
||||||
|
cd examples/concat && make
|
||||||
|
cd examples/flow && make
|
||||||
|
cd examples/sitemap && make
|
||||||
|
cd examples/go-generate && make
|
||||||
|
# cd examples/single-package-mode && make
|
||||||
|
cd examples/helpers && make
|
||||||
|
cd examples/arithmetics && make
|
||||||
|
# cd examples/go-kit && make
|
||||||
|
|
||||||
|
.PHONY: docker.build
|
||||||
|
docker.build:
|
||||||
|
docker build --pull -t moul/protoc-gen-gotemplate .
|
||||||
|
|
||||||
|
.PHONY: docker.push
|
||||||
|
docker.push: docker.build
|
||||||
|
docker push moul/protoc-gen-gotemplate
|
||||||
|
|
||||||
|
.PHONY: lint
|
||||||
|
lint:
|
||||||
|
gometalinter --disable-all --enable=errcheck --enable=vet --enable=vetshadow --enable=golint --enable=gosec --enable=ineffassign --enable=goconst --enable=goimports --enable=gofmt --exclude="Binds to all network interfaces" --exclude="should have comment" --enable=staticcheck --enable=gosimple --enable=misspell --deadline=120s . ./cmd/... ./helpers/...
|
160
README.md
160
README.md
@@ -1,2 +1,160 @@
|
|||||||
# protoc-gen-gotemplate
|
# `protoc-gen-gotemplate`
|
||||||
|
|
||||||
|
[](https://www.guardrails.io)
|
||||||
|
|
||||||
:open_file_folder: protocol generator + golang text/template (protobuf)
|
:open_file_folder: protocol generator + golang text/template (protobuf)
|
||||||
|
|
||||||
|
A generic **code**/script/data generator based on [Protobuf](https://developers.google.com/protocol-buffers/).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
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](https://golang.org/pkg/text/template/).
|
||||||
|
|
||||||
|
## 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`](https://github.com/google/protobuf/releases)
|
||||||
|
2. the `ast` is generated by [`protoc-gen-go` helpers](https://github.com/golang/protobuf/tree/master/protoc-gen-go)
|
||||||
|
3. the `ast` is given to [Golang's `text/template` engine](https://golang.org/pkg/text/template/) for each *user* template files
|
||||||
|
4. the *funcmap* enriching the template engine is based on [Masterminds/sprig](https://github.com/Masterminds/sprig), and contains type-manipulation, iteration and language-specific helpers
|
||||||
|
|
||||||
|
## Web editor
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
[Demo server](http://protoc-gen-gotemplate.m.42.am/)
|
||||||
|
|
||||||
|
## 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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
```console
|
||||||
|
$> 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:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$> 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](./examples).
|
||||||
|
|
||||||
|
## Funcmap
|
||||||
|
|
||||||
|
This project uses [Masterminds/sprig](https://github.com/Masterminds/sprig) library and additional functions to extend the builtin [text/template](https://golang.org/pkg/text/template) helpers.
|
||||||
|
|
||||||
|
Non-exhaustive list of new helpers:
|
||||||
|
|
||||||
|
* **all the functions from [sprig](https://github.com/Masterminds/sprig)**
|
||||||
|
* `string`
|
||||||
|
* `json`
|
||||||
|
* `prettyjson`
|
||||||
|
* `splitArray`
|
||||||
|
* `first`
|
||||||
|
* `last`
|
||||||
|
* `upperFirst`
|
||||||
|
* `lowerFirst`
|
||||||
|
* `camelCase`
|
||||||
|
* `lowerCamelCase`
|
||||||
|
* `kebabCase`
|
||||||
|
* `contains`
|
||||||
|
* `trimstr`
|
||||||
|
* `index`
|
||||||
|
* `snakeCase`
|
||||||
|
* `getProtoFile`
|
||||||
|
* `getMessageType`
|
||||||
|
* `getEnumValue`
|
||||||
|
* `isFieldMessage`
|
||||||
|
* `isFieldMessageTimeStamp`
|
||||||
|
* `isFieldRepeated`
|
||||||
|
* `haskellType`
|
||||||
|
* `goType`
|
||||||
|
* `goZeroValue`
|
||||||
|
* `goTypeWithPackage`
|
||||||
|
* `jsType`
|
||||||
|
* `jsSuffixReserved`
|
||||||
|
* `namespacedFlowType`
|
||||||
|
* `httpVerb`
|
||||||
|
* `httpPath`
|
||||||
|
* `httpPathsAdditionalBindings`
|
||||||
|
* `httpBody`
|
||||||
|
* `shortType`
|
||||||
|
* `urlHasVarsFromMessage`
|
||||||
|
* `lowerGoNormalize`
|
||||||
|
* `goNormalize`
|
||||||
|
* `leadingComment`
|
||||||
|
* `trailingComment`
|
||||||
|
* `leadingDetachedComments`
|
||||||
|
* `stringFieldExtension`
|
||||||
|
* `stringMethodOptionsExtension`
|
||||||
|
* `boolFieldExtension`
|
||||||
|
* `isFieldMap`
|
||||||
|
* `fieldMapKeyType`
|
||||||
|
* `fieldMapValueType`
|
||||||
|
* `replaceDict`
|
||||||
|
* `add`
|
||||||
|
* `subtract`
|
||||||
|
* `multiply`
|
||||||
|
* `divide`
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
* automated docker hub build: [https://hub.docker.com/r/moul/protoc-gen-gotemplate/](https://hub.docker.com/r/moul/protoc-gen-gotemplate/)
|
||||||
|
* Based on [http://github.com/znly/protoc](http://github.com/znly/protoc)
|
||||||
|
|
||||||
|
Usage:
|
||||||
|
|
||||||
|
```console
|
||||||
|
$> docker run --rm -v "$(pwd):$(pwd)" -w "$(pwd)" moul/protoc-gen-gotemplate -I. --gotemplate_out=./output/ ./*.proto
|
||||||
|
```
|
||||||
|
|
||||||
|
## Projects using `protoc-gen-gotemplate`
|
||||||
|
|
||||||
|
* [kafka-gateway](https://github.com/moul/kafka-gateway/): Kafka gateway/proxy (gRPC + http) using Go-Kit
|
||||||
|
* [translator](https://github.com/moul/translator): Translator Micro-service using Gettext and Go-Kit
|
||||||
|
* [acl](https://github.com/moul/acl): ACL micro-service (gRPC/protobuf + http/json)
|
||||||
|
|
||||||
|
## License
|
||||||
|
|
||||||
|
MIT
|
||||||
|
BIN
assets/web-editor.jpg
Normal file
BIN
assets/web-editor.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 274 KiB |
118
cmd/web-editor/main.go
Normal file
118
cmd/web-editor/main.go
Normal file
@@ -0,0 +1,118 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
|
"io/ioutil"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"path/filepath"
|
||||||
|
|
||||||
|
"github.com/gorilla/handlers"
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
)
|
||||||
|
|
||||||
|
func generate(w http.ResponseWriter, r *http.Request) {
|
||||||
|
// read input
|
||||||
|
decoder := json.NewDecoder(r.Body)
|
||||||
|
type Input struct {
|
||||||
|
Protobuf string `json:"protobuf"`
|
||||||
|
Template string `json:"template"`
|
||||||
|
}
|
||||||
|
var input Input
|
||||||
|
if err := decoder.Decode(&input); err != nil {
|
||||||
|
returnError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// create workspace
|
||||||
|
dir, err := ioutil.TempDir("", "pggt")
|
||||||
|
if err != nil {
|
||||||
|
returnError(w, err)
|
||||||
|
}
|
||||||
|
// clean up
|
||||||
|
defer func() {
|
||||||
|
if err = os.RemoveAll(dir); err != nil {
|
||||||
|
log.Printf("error: failed to remove temporary directory: %v", err)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
if err = ioutil.WriteFile(filepath.Join(dir, "example.proto"), []byte(input.Protobuf), 0644); err != nil {
|
||||||
|
returnError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err = ioutil.WriteFile(filepath.Join(dir, "example.output.tmpl"), []byte(input.Template), 0644); err != nil {
|
||||||
|
returnError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate
|
||||||
|
cmd := exec.Command("protoc", "-I"+dir, "--gotemplate_out=template_dir="+dir+",debug=true:"+dir, filepath.Join(dir, "example.proto")) // #nosec
|
||||||
|
out, err := cmd.CombinedOutput()
|
||||||
|
if err != nil {
|
||||||
|
returnError(w, errors.New(string(out)))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// read output
|
||||||
|
content, err := ioutil.ReadFile(filepath.Join(dir, "example.output")) // #nosec
|
||||||
|
if err != nil {
|
||||||
|
returnError(w, err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
returnContent(w, content)
|
||||||
|
}
|
||||||
|
|
||||||
|
func returnContent(w http.ResponseWriter, output interface{}) {
|
||||||
|
payload := map[string]interface{}{
|
||||||
|
"output": fmt.Sprintf("%s", output),
|
||||||
|
}
|
||||||
|
response, err := json.Marshal(payload)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusOK)
|
||||||
|
if _, err := w.Write(response); err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func returnError(w http.ResponseWriter, err error) {
|
||||||
|
payload := map[string]interface{}{
|
||||||
|
"error": fmt.Sprintf("%v", err),
|
||||||
|
}
|
||||||
|
response, err := json.Marshal(payload)
|
||||||
|
if err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Header().Set("Content-Type", "application/json")
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
if _, err := w.Write(response); err != nil {
|
||||||
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
r := mux.NewRouter()
|
||||||
|
|
||||||
|
r.Handle("/", http.FileServer(http.Dir("static")))
|
||||||
|
r.HandleFunc("/generate", generate)
|
||||||
|
addr := fmt.Sprintf(":%s", os.Getenv("PORT"))
|
||||||
|
if addr == ":" {
|
||||||
|
addr = ":8080"
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Printf("Listening on %s...\n", addr)
|
||||||
|
h := handlers.LoggingHandler(os.Stderr, r)
|
||||||
|
h = handlers.CompressHandler(h)
|
||||||
|
h = handlers.RecoveryHandler()(h)
|
||||||
|
if err := http.ListenAndServe(addr, h); err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
138
cmd/web-editor/static/index.html
Normal file
138
cmd/web-editor/static/index.html
Normal file
@@ -0,0 +1,138 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<title>protoc-gen-gotemplate web editor</title>
|
||||||
|
<meta charset="utf-8">
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||||
|
|
||||||
|
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular.js"></script>
|
||||||
|
<script src="//ajax.googleapis.com/ajax/libs/angularjs/1.4.3/angular-animate.js"></script>
|
||||||
|
<script src="//angular-ui.github.io/bootstrap/ui-bootstrap-tpls-0.13.3.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/angular-ui-bootstrap/0.13.3/ui-bootstrap.min.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/ace.min.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/mode-protobuf.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/mode-golang.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/theme-cobalt.js"></script>
|
||||||
|
<script src="//cdnjs.cloudflare.com/ajax/libs/ace/1.2.0/worker-javascript.js"></script>
|
||||||
|
<script src="//angular-ui.github.io/ui-ace/dist/ui-ace.min.js"></script>
|
||||||
|
|
||||||
|
<script type="text/javascript">
|
||||||
|
var Base64={_keyStr:"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=",encode:function(e){var t="";var n,r,i,s,o,u,a;var f=0;e=Base64._utf8_encode(e);while(f<e.length){n=e.charCodeAt(f++);r=e.charCodeAt(f++);i=e.charCodeAt(f++);s=n>>2;o=(n&3)<<4|r>>4;u=(r&15)<<2|i>>6;a=i&63;if(isNaN(r)){u=a=64}else if(isNaN(i)){a=64}t=t+this._keyStr.charAt(s)+this._keyStr.charAt(o)+this._keyStr.charAt(u)+this._keyStr.charAt(a)}return t},decode:function(e){var t="";var n,r,i;var s,o,u,a;var f=0;e=e.replace(/[^A-Za-z0-9+/=]/g,"");while(f<e.length){s=this._keyStr.indexOf(e.charAt(f++));o=this._keyStr.indexOf(e.charAt(f++));u=this._keyStr.indexOf(e.charAt(f++));a=this._keyStr.indexOf(e.charAt(f++));n=s<<2|o>>4;r=(o&15)<<4|u>>2;i=(u&3)<<6|a;t=t+String.fromCharCode(n);if(u!=64){t=t+String.fromCharCode(r)}if(a!=64){t=t+String.fromCharCode(i)}}t=Base64._utf8_decode(t);return t},_utf8_encode:function(e){e=e.replace(/rn/g,"n");var t="";for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r)}else if(r>127&&r<2048){t+=String.fromCharCode(r>>6|192);t+=String.fromCharCode(r&63|128)}else{t+=String.fromCharCode(r>>12|224);t+=String.fromCharCode(r>>6&63|128);t+=String.fromCharCode(r&63|128)}}return t},_utf8_decode:function(e){var t="";var n=0;var r=c1=c2=0;while(n<e.length){r=e.charCodeAt(n);if(r<128){t+=String.fromCharCode(r);n++}else if(r>191&&r<224){c2=e.charCodeAt(n+1);t+=String.fromCharCode((r&31)<<6|c2&63);n+=2}else{c2=e.charCodeAt(n+1);c3=e.charCodeAt(n+2);t+=String.fromCharCode((r&15)<<12|(c2&63)<<6|c3&63);n+=3}}return t}}
|
||||||
|
|
||||||
|
angular.module("pggt", ['pggt.controllers','ngAnimate','ui.bootstrap', 'ui.ace']);
|
||||||
|
angular.module("pggt.controllers", [])
|
||||||
|
.controller('PggtCtrl', ['$scope', '$http', '$interval', function($scope, $http, $interval) {
|
||||||
|
$scope.requestType = 'post';
|
||||||
|
$scope.url = '/generate';
|
||||||
|
$scope.response = null;
|
||||||
|
$scope.errors = null;
|
||||||
|
|
||||||
|
$scope.inputHasChanged = false;
|
||||||
|
|
||||||
|
$scope.checkModel = {
|
||||||
|
optimize: false,
|
||||||
|
disableNetwork: false,
|
||||||
|
toArm: false,
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.$watchCollection('checkModel', function() {
|
||||||
|
$scope.sendRequest();
|
||||||
|
});
|
||||||
|
|
||||||
|
var cron = $interval(function() {
|
||||||
|
if ($scope.inputHasChanged) {
|
||||||
|
$scope.sendRequest();
|
||||||
|
}
|
||||||
|
}, 2000);
|
||||||
|
|
||||||
|
// b64encoded version of https://github.com/grpc/grpc-go/blob/master/examples/route_guide/routeguide/route_guide.proto
|
||||||
|
$scope.protobuf = Base64.decode("Ly8gQ29weXJpZ2h0IDIwMTUgZ1JQQyBhdXRob3JzLg0KLy8NCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOw0KLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQovLw0KLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLy8NCi8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCi8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCi8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KDQpzeW50YXggPSAicHJvdG8zIjsNCg0Kb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOw0Kb3B0aW9uIGphdmFfcGFja2FnZSA9ICJpby5ncnBjLmV4YW1wbGVzLnJvdXRlZ3VpZGUiOw0Kb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlJvdXRlR3VpZGVQcm90byI7DQoNCnBhY2thZ2Ugcm91dGVndWlkZTsNCg0KLy8gSW50ZXJmYWNlIGV4cG9ydGVkIGJ5IHRoZSBzZXJ2ZXIuDQpzZXJ2aWNlIFJvdXRlR3VpZGUgew0KICAvLyBBIHNpbXBsZSBSUEMuDQogIC8vDQogIC8vIE9idGFpbnMgdGhlIGZlYXR1cmUgYXQgYSBnaXZlbiBwb3NpdGlvbi4NCiAgLy8NCiAgLy8gQSBmZWF0dXJlIHdpdGggYW4gZW1wdHkgbmFtZSBpcyByZXR1cm5lZCBpZiB0aGVyZSdzIG5vIGZlYXR1cmUgYXQgdGhlIGdpdmVuDQogIC8vIHBvc2l0aW9uLg0KICBycGMgR2V0RmVhdHVyZShQb2ludCkgcmV0dXJucyAoRmVhdHVyZSkge30NCg0KICAvLyBBIHNlcnZlci10by1jbGllbnQgc3RyZWFtaW5nIFJQQy4NCiAgLy8NCiAgLy8gT2J0YWlucyB0aGUgRmVhdHVyZXMgYXZhaWxhYmxlIHdpdGhpbiB0aGUgZ2l2ZW4gUmVjdGFuZ2xlLiAgUmVzdWx0cyBhcmUNCiAgLy8gc3RyZWFtZWQgcmF0aGVyIHRoYW4gcmV0dXJuZWQgYXQgb25jZSAoZS5nLiBpbiBhIHJlc3BvbnNlIG1lc3NhZ2Ugd2l0aCBhDQogIC8vIHJlcGVhdGVkIGZpZWxkKSwgYXMgdGhlIHJlY3RhbmdsZSBtYXkgY292ZXIgYSBsYXJnZSBhcmVhIGFuZCBjb250YWluIGENCiAgLy8gaHVnZSBudW1iZXIgb2YgZmVhdHVyZXMuDQogIHJwYyBMaXN0RmVhdHVyZXMoUmVjdGFuZ2xlKSByZXR1cm5zIChzdHJlYW0gRmVhdHVyZSkge30NCg0KICAvLyBBIGNsaWVudC10by1zZXJ2ZXIgc3RyZWFtaW5nIFJQQy4NCiAgLy8NCiAgLy8gQWNjZXB0cyBhIHN0cmVhbSBvZiBQb2ludHMgb24gYSByb3V0ZSBiZWluZyB0cmF2ZXJzZWQsIHJldHVybmluZyBhDQogIC8vIFJvdXRlU3VtbWFyeSB3aGVuIHRyYXZlcnNhbCBpcyBjb21wbGV0ZWQuDQogIHJwYyBSZWNvcmRSb3V0ZShzdHJlYW0gUG9pbnQpIHJldHVybnMgKFJvdXRlU3VtbWFyeSkge30NCg0KICAvLyBBIEJpZGlyZWN0aW9uYWwgc3RyZWFtaW5nIFJQQy4NCiAgLy8NCiAgLy8gQWNjZXB0cyBhIHN0cmVhbSBvZiBSb3V0ZU5vdGVzIHNlbnQgd2hpbGUgYSByb3V0ZSBpcyBiZWluZyB0cmF2ZXJzZWQsDQogIC8vIHdoaWxlIHJlY2VpdmluZyBvdGhlciBSb3V0ZU5vdGVzIChlLmcuIGZyb20gb3RoZXIgdXNlcnMpLg0KICBycGMgUm91dGVDaGF0KHN0cmVhbSBSb3V0ZU5vdGUpIHJldHVybnMgKHN0cmVhbSBSb3V0ZU5vdGUpIHt9DQp9DQoNCi8vIFBvaW50cyBhcmUgcmVwcmVzZW50ZWQgYXMgbGF0aXR1ZGUtbG9uZ2l0dWRlIHBhaXJzIGluIHRoZSBFNyByZXByZXNlbnRhdGlvbg0KLy8gKGRlZ3JlZXMgbXVsdGlwbGllZCBieSAxMCoqNyBhbmQgcm91bmRlZCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyKS4NCi8vIExhdGl0dWRlcyBzaG91bGQgYmUgaW4gdGhlIHJhbmdlICsvLSA5MCBkZWdyZWVzIGFuZCBsb25naXR1ZGUgc2hvdWxkIGJlIGluDQovLyB0aGUgcmFuZ2UgKy8tIDE4MCBkZWdyZWVzIChpbmNsdXNpdmUpLg0KbWVzc2FnZSBQb2ludCB7DQogIGludDMyIGxhdGl0dWRlID0gMTsNCiAgaW50MzIgbG9uZ2l0dWRlID0gMjsNCn0NCg0KLy8gQSBsYXRpdHVkZS1sb25naXR1ZGUgcmVjdGFuZ2xlLCByZXByZXNlbnRlZCBhcyB0d28gZGlhZ29uYWxseSBvcHBvc2l0ZQ0KLy8gcG9pbnRzICJsbyIgYW5kICJoaSIuDQptZXNzYWdlIFJlY3RhbmdsZSB7DQogIC8vIE9uZSBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZS4NCiAgUG9pbnQgbG8gPSAxOw0KDQogIC8vIFRoZSBvdGhlciBjb3JuZXIgb2YgdGhlIHJlY3RhbmdsZS4NCiAgUG9pbnQgaGkgPSAyOw0KfQ0KDQovLyBBIGZlYXR1cmUgbmFtZXMgc29tZXRoaW5nIGF0IGEgZ2l2ZW4gcG9pbnQuDQovLw0KLy8gSWYgYSBmZWF0dXJlIGNvdWxkIG5vdCBiZSBuYW1lZCwgdGhlIG5hbWUgaXMgZW1wdHkuDQptZXNzYWdlIEZlYXR1cmUgew0KICAvLyBUaGUgbmFtZSBvZiB0aGUgZmVhdHVyZS4NCiAgc3RyaW5nIG5hbWUgPSAxOw0KDQogIC8vIFRoZSBwb2ludCB3aGVyZSB0aGUgZmVhdHVyZSBpcyBkZXRlY3RlZC4NCiAgUG9pbnQgbG9jYXRpb24gPSAyOw0KfQ0KDQovLyBBIFJvdXRlTm90ZSBpcyBhIG1lc3NhZ2Ugc2VudCB3aGlsZSBhdCBhIGdpdmVuIHBvaW50Lg0KbWVzc2FnZSBSb3V0ZU5vdGUgew0KICAvLyBUaGUgbG9jYXRpb24gZnJvbSB3aGljaCB0aGUgbWVzc2FnZSBpcyBzZW50Lg0KICBQb2ludCBsb2NhdGlvbiA9IDE7DQoNCiAgLy8gVGhlIG1lc3NhZ2UgdG8gYmUgc2VudC4NCiAgc3RyaW5nIG1lc3NhZ2UgPSAyOw0KfQ0KDQovLyBBIFJvdXRlU3VtbWFyeSBpcyByZWNlaXZlZCBpbiByZXNwb25zZSB0byBhIFJlY29yZFJvdXRlIHJwYy4NCi8vDQovLyBJdCBjb250YWlucyB0aGUgbnVtYmVyIG9mIGluZGl2aWR1YWwgcG9pbnRzIHJlY2VpdmVkLCB0aGUgbnVtYmVyIG9mDQovLyBkZXRlY3RlZCBmZWF0dXJlcywgYW5kIHRoZSB0b3RhbCBkaXN0YW5jZSBjb3ZlcmVkIGFzIHRoZSBjdW11bGF0aXZlIHN1bSBvZg0KLy8gdGhlIGRpc3RhbmNlIGJldHdlZW4gZWFjaCBwb2ludC4NCm1lc3NhZ2UgUm91dGVTdW1tYXJ5IHsNCiAgLy8gVGhlIG51bWJlciBvZiBwb2ludHMgcmVjZWl2ZWQuDQogIGludDMyIHBvaW50X2NvdW50ID0gMTsNCg0KICAvLyBUaGUgbnVtYmVyIG9mIGtub3duIGZlYXR1cmVzIHBhc3NlZCB3aGlsZSB0cmF2ZXJzaW5nIHRoZSByb3V0ZS4NCiAgaW50MzIgZmVhdHVyZV9jb3VudCA9IDI7DQoNCiAgLy8gVGhlIGRpc3RhbmNlIGNvdmVyZWQgaW4gbWV0cmVzLg0KICBpbnQzMiBkaXN0YW5jZSA9IDM7DQoNCiAgLy8gVGhlIGR1cmF0aW9uIG9mIHRoZSB0cmF2ZXJzYWwgaW4gc2Vjb25kcy4NCiAgaW50MzIgZWxhcHNlZF90aW1lID0gNDsNCn0=");
|
||||||
|
$scope.template = Base64.decode("Ly8gQ29kZSBnZW5lcmF0ZWQgYnkgcHJvdG9jLWdlbi1nb3RlbXBsYXRlDQpwYWNrYWdlIHt7LlNlcnZpY2UuTmFtZX19cGINCg0KaW1wb3J0ICgNCiAgImdvbGFuZy5vcmcveC9uZXQvY29udGV4dCINCikNCg0KdHlwZSBTZXJ2aWNlIGludGVyZmFjZSB7DQp7ey0gcmFuZ2UgLlNlcnZpY2UuTWV0aG9kfX0NCnt7LSBpZiBhbmQgKG5vdCAuU2VydmVyU3RyZWFtaW5nKSAobm90IC5DbGllbnRTdHJlYW1pbmcpfX0NCiAge3suTmFtZX19KGNvbnRleHQuQ29udGV4dCwgKnt7Lk5hbWV9fVJlcXVlc3QpICgqe3suTmFtZX19UmVzcG9uc2UsIGVycm9yKQ0Ke3stIGVsc2UgaWYgYW5kIC5TZXJ2ZXJTdHJlYW1pbmcgKG5vdCAuQ2xpZW50U3RyZWFtaW5nKX19DQoge3suTmFtZX19KGNvbnRleHQuQ29udGV4dCwgKnt7Lk5hbWV9fVJlcXVlc3QsIGNoYW4gc3RydWN0e30pIChjaGFuICp7ey5OYW1lfX1SZXNwb25zZSwgZXJyb3IpDQp7ey0gZWxzZSBpZiBhbmQgKG5vdCAuU2VydmVyU3RyZWFtaW5nKSAuQ2xpZW50U3RyZWFtaW5nfX0NCiAge3suTmFtZX19KGNvbnRleHQuQ29udGV4dCwgY2hhbiAqe3suTmFtZX19UmVxdWVzdCkgKCp7ey5OYW1lfX1SZXNwb25zZSwgZXJyb3IpDQp7ey0gZWxzZSBpZiBhbmQgKC5TZXJ2ZXJTdHJlYW1pbmcpICguQ2xpZW50U3RyZWFtaW5nKX19DQogIHt7Lk5hbWV9fShjb250ZXh0LkNvbnRleHQsIGNoYW4gKnt7Lk5hbWV9fVJlcXVlc3QpIChjaGFuICp7ey5OYW1lfX1SZXNwb25zZSwgZXJyb3IpDQp7ey0gZW5kfX0ge3svKiBzdHJlYW1pbmcgaWZzKi99fQ0Ke3stIGVuZH19IHt7LypyYW5nZSBNZXRob2QqL319DQp9DQoNCi8vIE1ldGhvZHMNCi8vIC0tLS0tLS0NCnt7LSByYW5nZSAuU2VydmljZS5NZXRob2R9fQ0KLy8gKiB7ey5OYW1lfX0NCnt7LSBlbmR9fQ0KLy8NCi8vIE1lc3NhZ2UgdHlwZXMNCi8vIC0tLS0tLS0tLS0tLS0NCnt7LSByYW5nZSAuRmlsZS5NZXNzYWdlVHlwZX19DQovLyAqIHt7Lk5hbWV9fQ0Ke3stIGVuZH19");
|
||||||
|
|
||||||
|
$scope.inputLoaded = function(_editor) {
|
||||||
|
$scope.inputEditor = _editor;
|
||||||
|
};
|
||||||
|
$scope.outputLoaded = function(_editor) {
|
||||||
|
$scope.outputEditor = _editor;
|
||||||
|
};
|
||||||
|
$scope.inputChanged = function(e) {
|
||||||
|
$scope.inputHasChanged = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
$scope.sendRequest = function(){
|
||||||
|
$scope.inputHasChanged = false;
|
||||||
|
var data = {
|
||||||
|
protobuf: $scope.protobuf,
|
||||||
|
template: $scope.template,
|
||||||
|
};
|
||||||
|
$http.post($scope.url, data)
|
||||||
|
.success(function(data,status,headers,config) {
|
||||||
|
$scope.errors = {};
|
||||||
|
$scope.response = {};
|
||||||
|
$scope.response.data = data;
|
||||||
|
$scope.response.status = status;
|
||||||
|
$scope.response.headers = headers;
|
||||||
|
$scope.response.config = config;
|
||||||
|
$scope.outputEditor.setValue(data['output'], 1);
|
||||||
|
})
|
||||||
|
.error(function(data,status,headers,config) {
|
||||||
|
$scope.errors = {};
|
||||||
|
$scope.response = {};
|
||||||
|
$scope.errors.data = data;
|
||||||
|
$scope.errors.status = status;
|
||||||
|
$scope.errors.headers = headers;
|
||||||
|
$scope.errors.config = config;
|
||||||
|
$scope.outputEditor.setValue(data['error'], 1);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}]);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<link rel="stylesheet" href="//netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css">
|
||||||
|
<link rel="stylesheet" href="//cdnjs.cloudflare.com/ajax/libs/highlight.js/8.3/styles/github.min.css">
|
||||||
|
<style>.ace_editor { height: 80%; }</style>
|
||||||
|
</head>
|
||||||
|
<body ng-app="pggt">
|
||||||
|
<div class="container-fluid" ng-controller="PggtCtrl">
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-8">
|
||||||
|
<form name="dpform" ng-submit="sendRequest()" class="well">
|
||||||
|
<fieldset>
|
||||||
|
<legend>`protoc-gen-gotemplate`: input</legend>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="protobuf">./example.proto</label>
|
||||||
|
<div ng-model="protobuf" name="protobuf" id="protobuf" language="protobuf"
|
||||||
|
ui-ace="{mode:'protobuf',theme:'cobalt',onChange:inputChanged,onLoad:inputLoaded,useWrapMode:true}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-6">
|
||||||
|
<label for="template">./example.txt.tmpl</label>
|
||||||
|
<div ng-model="template" name="template" id="template" language="text"
|
||||||
|
ui-ace="{mode:'text',theme:'cobalt',onChange:inputChanged,onLoad:inputLoaded,useWrapMode:true}">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</fieldset>
|
||||||
|
</form>
|
||||||
|
</div>
|
||||||
|
<div class="col-md-4">
|
||||||
|
<div class="well">
|
||||||
|
<fieldset>
|
||||||
|
<legend>Output</legend>
|
||||||
|
<label>./example.txt</label>
|
||||||
|
<div ui-ace="{mode:'text',theme:'cobalt',onLoad:outputLoaded,useWrapMode:true}" readonly></div>
|
||||||
|
</fieldset>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="row">
|
||||||
|
<div class="col-md-12">
|
||||||
|
<div>Command: <code>protoc --gotemplate_out=template_dir=.:. example.proto</code></div>
|
||||||
|
<div>Powered by <a href="https://moul.io/protoc-gen-gotemplate">protoc-gen-gotemplate</a></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<a href="https://moul.io/protoc-gen-gotemplate"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://camo.githubusercontent.com/365986a132ccd6a44c23a9169022c0b5c890c387/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f6769746875622f726962626f6e732f666f726b6d655f72696768745f7265645f6161303030302e706e67" alt="Fork me on GitHub" data-canonical-src="https://s3.amazonaws.com/github/ribbons/forkme_right_red_aa0000.png"></a>
|
||||||
|
</body>
|
||||||
|
</html>
|
20
contrib/homebrew/protoc-gen-gotemplate.rb
Normal file
20
contrib/homebrew/protoc-gen-gotemplate.rb
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
require "language/go"
|
||||||
|
|
||||||
|
class ProtocGenGotemplate < Formula
|
||||||
|
desc "protocol generator + golang text/template (protobuf)"
|
||||||
|
homepage "https://github.com/moul/protoc-gen-gotemplate"
|
||||||
|
url "https://github.com/moul/protoc-gen-gotemplate/archive/v1.0.0.tar.gz"
|
||||||
|
sha256 "1ff57cd8513f1e871cf71dc8f2099bf64204af0df1b7397370827083e95bbb82"
|
||||||
|
head "https://github.com/moul/protoc-gen-gotemplate.git"
|
||||||
|
|
||||||
|
depends_on "go" => :build
|
||||||
|
|
||||||
|
def install
|
||||||
|
ENV["GOPATH"] = buildpath
|
||||||
|
ENV["GOBIN"] = buildpath
|
||||||
|
ENV["GO15VENDOREXPERIMENT"] = "1"
|
||||||
|
(buildpath/"src/github.com/moul/protoc-gen-gotemplate").install Dir["*"]
|
||||||
|
|
||||||
|
system "go", "build", "-o", "#{bin}/protoc-gen-gotemplate", "-v", "github.com/moul/protoc-gen-gotemplate"
|
||||||
|
end
|
||||||
|
end
|
229
encoder.go
229
encoder.go
@@ -2,107 +2,218 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"log"
|
||||||
|
"net/url"
|
||||||
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"text/template"
|
"text/template"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/golang/protobuf/protoc-gen-go/descriptor"
|
"github.com/golang/protobuf/protoc-gen-go/descriptor"
|
||||||
"github.com/golang/protobuf/protoc-gen-go/plugin"
|
"github.com/golang/protobuf/protoc-gen-go/plugin"
|
||||||
"github.com/kr/fs"
|
|
||||||
"github.com/moul/funcmap"
|
pgghelpers "moul.io/protoc-gen-gotemplate/helpers"
|
||||||
)
|
)
|
||||||
|
|
||||||
type GenericTemplateBasedEncoder struct {
|
type GenericTemplateBasedEncoder struct {
|
||||||
templateDir string
|
templateDir string
|
||||||
service *descriptor.ServiceDescriptorProto
|
service *descriptor.ServiceDescriptorProto
|
||||||
file *descriptor.FileDescriptorProto
|
file *descriptor.FileDescriptorProto
|
||||||
|
enum []*descriptor.EnumDescriptorProto
|
||||||
|
debug bool
|
||||||
|
destinationDir string
|
||||||
}
|
}
|
||||||
|
|
||||||
type Ast struct {
|
type Ast struct {
|
||||||
Filename string
|
BuildDate time.Time `json:"build-date"`
|
||||||
Service *descriptor.ServiceDescriptorProto
|
BuildHostname string `json:"build-hostname"`
|
||||||
File *descriptor.FileDescriptorProto
|
BuildUser string `json:"build-user"`
|
||||||
|
GoPWD string `json:"go-pwd,omitempty"`
|
||||||
|
PWD string `json:"pwd"`
|
||||||
|
Debug bool `json:"debug"`
|
||||||
|
DestinationDir string `json:"destination-dir"`
|
||||||
|
File *descriptor.FileDescriptorProto `json:"file"`
|
||||||
|
RawFilename string `json:"raw-filename"`
|
||||||
|
Filename string `json:"filename"`
|
||||||
|
TemplateDir string `json:"template-dir"`
|
||||||
|
Service *descriptor.ServiceDescriptorProto `json:"service"`
|
||||||
|
Enum []*descriptor.EnumDescriptorProto `json:"enum"`
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewGenericTemplateBasedEncoder(templateDir string, service *descriptor.ServiceDescriptorProto, file *descriptor.FileDescriptorProto) (e *GenericTemplateBasedEncoder) {
|
func NewGenericServiceTemplateBasedEncoder(templateDir string, service *descriptor.ServiceDescriptorProto, file *descriptor.FileDescriptorProto, debug bool, destinationDir string) (e *GenericTemplateBasedEncoder) {
|
||||||
e = &GenericTemplateBasedEncoder{
|
e = &GenericTemplateBasedEncoder{
|
||||||
service: service,
|
service: service,
|
||||||
file: file,
|
file: file,
|
||||||
templateDir: templateDir,
|
templateDir: templateDir,
|
||||||
|
debug: debug,
|
||||||
|
destinationDir: destinationDir,
|
||||||
|
enum: file.GetEnumType(),
|
||||||
}
|
}
|
||||||
|
if debug {
|
||||||
|
log.Printf("new encoder: file=%q service=%q template-dir=%q", file.GetName(), service.GetName(), templateDir)
|
||||||
|
}
|
||||||
|
pgghelpers.InitPathMap(file)
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGenericTemplateBasedEncoder(templateDir string, file *descriptor.FileDescriptorProto, debug bool, destinationDir string) (e *GenericTemplateBasedEncoder) {
|
||||||
|
e = &GenericTemplateBasedEncoder{
|
||||||
|
service: nil,
|
||||||
|
file: file,
|
||||||
|
templateDir: templateDir,
|
||||||
|
enum: file.GetEnumType(),
|
||||||
|
debug: debug,
|
||||||
|
destinationDir: destinationDir,
|
||||||
|
}
|
||||||
|
if debug {
|
||||||
|
log.Printf("new encoder: file=%q template-dir=%q", file.GetName(), templateDir)
|
||||||
|
}
|
||||||
|
pgghelpers.InitPathMap(file)
|
||||||
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *GenericTemplateBasedEncoder) templates() ([]string, error) {
|
func (e *GenericTemplateBasedEncoder) templates() ([]string, error) {
|
||||||
filenames := []string{}
|
filenames := []string{}
|
||||||
|
|
||||||
walker := fs.Walk(e.templateDir)
|
err := filepath.Walk(e.templateDir, func(path string, info os.FileInfo, err error) error {
|
||||||
for walker.Step() {
|
|
||||||
if err := walker.Err(); err != nil {
|
|
||||||
return nil, err
|
|
||||||
}
|
|
||||||
|
|
||||||
if walker.Stat().IsDir() {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
if filepath.Ext(walker.Path()) != ".tmpl" {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
|
|
||||||
rel, err := filepath.Rel(e.templateDir, walker.Path())
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return err
|
||||||
|
}
|
||||||
|
if info.IsDir() {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
if filepath.Ext(path) != ".tmpl" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
rel, err := filepath.Rel(e.templateDir, path)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if e.debug {
|
||||||
|
log.Printf("new template: %q", rel)
|
||||||
}
|
}
|
||||||
|
|
||||||
filenames = append(filenames, rel)
|
filenames = append(filenames, rel)
|
||||||
}
|
return nil
|
||||||
|
})
|
||||||
return filenames, nil
|
return filenames, err
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *GenericTemplateBasedEncoder) buildContent(templateFilename string) (string, error) {
|
func (e *GenericTemplateBasedEncoder) genAst(templateFilename string) (*Ast, error) {
|
||||||
fullPath := filepath.Join(e.templateDir, templateFilename)
|
// prepare the ast passed to the template engine
|
||||||
|
hostname, err := os.Hostname()
|
||||||
tmpl, err := template.New(templateFilename).Funcs(funcmap.FuncMap).ParseFiles(fullPath)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return "", err
|
return nil, err
|
||||||
|
}
|
||||||
|
pwd, err := os.Getwd()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
goPwd := ""
|
||||||
|
if os.Getenv("GOPATH") != "" {
|
||||||
|
goPwd, err = filepath.Rel(os.Getenv("GOPATH")+"/src", pwd)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if strings.Contains(goPwd, "../") {
|
||||||
|
goPwd = ""
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ast := Ast{
|
ast := Ast{
|
||||||
Filename: templateFilename,
|
BuildDate: time.Now(),
|
||||||
Service: e.service,
|
BuildHostname: hostname,
|
||||||
File: e.file,
|
BuildUser: os.Getenv("USER"),
|
||||||
|
PWD: pwd,
|
||||||
|
GoPWD: goPwd,
|
||||||
|
File: e.file,
|
||||||
|
TemplateDir: e.templateDir,
|
||||||
|
DestinationDir: e.destinationDir,
|
||||||
|
RawFilename: templateFilename,
|
||||||
|
Filename: "",
|
||||||
|
Service: e.service,
|
||||||
|
Enum: e.enum,
|
||||||
|
}
|
||||||
|
buffer := new(bytes.Buffer)
|
||||||
|
|
||||||
|
unescaped, err := url.QueryUnescape(templateFilename)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("failed to unescape filepath %q: %v", templateFilename, err)
|
||||||
|
} else {
|
||||||
|
templateFilename = unescaped
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tmpl, err := template.New("").Funcs(pgghelpers.ProtoHelpersFuncMap).Parse(templateFilename)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := tmpl.Execute(buffer, ast); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
ast.Filename = buffer.String()
|
||||||
|
return &ast, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *GenericTemplateBasedEncoder) buildContent(templateFilename string) (string, string, error) {
|
||||||
|
// initialize template engine
|
||||||
|
fullPath := filepath.Join(e.templateDir, templateFilename)
|
||||||
|
templateName := filepath.Base(fullPath)
|
||||||
|
tmpl, err := template.New(templateName).Funcs(pgghelpers.ProtoHelpersFuncMap).ParseFiles(fullPath)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
ast, err := e.genAst(templateFilename)
|
||||||
|
if err != nil {
|
||||||
|
return "", "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate the content
|
||||||
buffer := new(bytes.Buffer)
|
buffer := new(bytes.Buffer)
|
||||||
if err := tmpl.Execute(buffer, ast); err != nil {
|
if err := tmpl.Execute(buffer, ast); err != nil {
|
||||||
return "", err
|
return "", "", err
|
||||||
}
|
}
|
||||||
|
|
||||||
return buffer.String(), nil
|
return buffer.String(), ast.Filename, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (e *GenericTemplateBasedEncoder) Files() []*plugin_go.CodeGeneratorResponse_File {
|
func (e *GenericTemplateBasedEncoder) Files() []*plugin_go.CodeGeneratorResponse_File {
|
||||||
files := []*plugin_go.CodeGeneratorResponse_File{}
|
|
||||||
|
|
||||||
templates, err := e.templates()
|
templates, err := e.templates()
|
||||||
|
if err != nil {
|
||||||
|
log.Fatalf("cannot get templates from %q: %v", e.templateDir, err)
|
||||||
|
}
|
||||||
|
|
||||||
|
length := len(templates)
|
||||||
|
files := make([]*plugin_go.CodeGeneratorResponse_File, 0, length)
|
||||||
|
errChan := make(chan error, length)
|
||||||
|
resultChan := make(chan *plugin_go.CodeGeneratorResponse_File, length)
|
||||||
|
for _, templateFilename := range templates {
|
||||||
|
go func(tmpl string) {
|
||||||
|
var translatedFilename, content string
|
||||||
|
content, translatedFilename, err = e.buildContent(tmpl)
|
||||||
|
if err != nil {
|
||||||
|
errChan <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
filename := translatedFilename[:len(translatedFilename)-len(".tmpl")]
|
||||||
|
|
||||||
|
resultChan <- &plugin_go.CodeGeneratorResponse_File{
|
||||||
|
Content: &content,
|
||||||
|
Name: &filename,
|
||||||
|
}
|
||||||
|
}(templateFilename)
|
||||||
|
}
|
||||||
|
for i := 0; i < length; i++ {
|
||||||
|
select {
|
||||||
|
case f := <-resultChan:
|
||||||
|
files = append(files, f)
|
||||||
|
case err = <-errChan:
|
||||||
|
}
|
||||||
|
}
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, templateFilename := range templates {
|
|
||||||
filename := templateFilename[0 : len(templateFilename)-len(".tmpl")]
|
|
||||||
|
|
||||||
content, err := e.buildContent(templateFilename)
|
|
||||||
if err != nil {
|
|
||||||
panic(err)
|
|
||||||
}
|
|
||||||
|
|
||||||
files = append(files, &plugin_go.CodeGeneratorResponse_File{
|
|
||||||
Content: &content,
|
|
||||||
Name: &filename,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return files
|
return files
|
||||||
}
|
}
|
||||||
|
13
examples/arithmetics/Makefile
Normal file
13
examples/arithmetics/Makefile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
mkdir -p output
|
||||||
|
protoc -I. --gotemplate_out=template_dir=templates,debug=true,all=true:output proto/*.proto
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: re
|
||||||
|
re: clean build
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf output
|
5
examples/arithmetics/output/arithmetics
Normal file
5
examples/arithmetics/output/arithmetics
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
|
||||||
|
add(1,2) = 3
|
||||||
|
subtract(1,2) = -1
|
||||||
|
multiply(1,2) = 2
|
||||||
|
divide(2,1) = 2
|
2
examples/arithmetics/proto/arithmetics.proto
Normal file
2
examples/arithmetics/proto/arithmetics.proto
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package Arithmetics;
|
6
examples/arithmetics/templates/arithmetics.tmpl
Normal file
6
examples/arithmetics/templates/arithmetics.tmpl
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{{with $a := 1}}{{with $b := 2}}
|
||||||
|
add(1,2) = {{add $a $b}}
|
||||||
|
subtract(1,2) = {{subtract $a $b}}
|
||||||
|
multiply(1,2) = {{multiply $a $b}}
|
||||||
|
divide(2,1) = {{divide $b $a}}
|
||||||
|
{{end}}{{end}}
|
13
examples/concat/Makefile
Normal file
13
examples/concat/Makefile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
mkdir -p output
|
||||||
|
protoc -I. --gotemplate_out=template_dir=templates,debug=true,all=true:output proto/*.proto
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: re
|
||||||
|
re: clean build
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf output
|
3
examples/concat/output/concat.txt
Normal file
3
examples/concat/output/concat.txt
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
I'm Eric
|
||||||
|
I'm Francis
|
||||||
|
I'm Arnold
|
1
examples/concat/output/static.txt
Normal file
1
examples/concat/output/static.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
This is static text.This is static text.This is static text.
|
2
examples/concat/proto/Eric.proto
Normal file
2
examples/concat/proto/Eric.proto
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package Eric;
|
2
examples/concat/proto/Francis.proto
Normal file
2
examples/concat/proto/Francis.proto
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package Francis;
|
2
examples/concat/proto/arnold.proto
Normal file
2
examples/concat/proto/arnold.proto
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package Arnold;
|
1
examples/concat/templates/concat.txt.tmpl
Normal file
1
examples/concat/templates/concat.txt.tmpl
Normal file
@@ -0,0 +1 @@
|
|||||||
|
I'm {{.File.Package}}
|
1
examples/concat/templates/static.txt.tmpl
Normal file
1
examples/concat/templates/static.txt.tmpl
Normal file
@@ -0,0 +1 @@
|
|||||||
|
This is static text.
|
13
examples/dummy/Makefile
Normal file
13
examples/dummy/Makefile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
mkdir -p output
|
||||||
|
protoc -I. --gotemplate_out=template_dir=templates,debug=true:output *.proto
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: re
|
||||||
|
re: clean build
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf output
|
844
examples/dummy/output/export.json
Normal file
844
examples/dummy/output/export.json
Normal file
@@ -0,0 +1,844 @@
|
|||||||
|
{
|
||||||
|
"build-date": "2017-05-19T20:09:45.954357761+02:00",
|
||||||
|
"build-hostname": "manfred-spacegray.aircard",
|
||||||
|
"build-user": "moul",
|
||||||
|
"pwd": "/Users/moul/Git/moul/protoc-gen-gotemplate/examples/dummy",
|
||||||
|
"debug": false,
|
||||||
|
"destination-dir": ".",
|
||||||
|
"file": {
|
||||||
|
"name": "dummy.proto",
|
||||||
|
"package": "dummy",
|
||||||
|
"message_type": [
|
||||||
|
{
|
||||||
|
"name": "Dummy1",
|
||||||
|
"field": [
|
||||||
|
{
|
||||||
|
"name": "aaa",
|
||||||
|
"number": 1,
|
||||||
|
"label": 1,
|
||||||
|
"type": 2,
|
||||||
|
"json_name": "aaa"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "bbb",
|
||||||
|
"number": 2,
|
||||||
|
"label": 1,
|
||||||
|
"type": 9,
|
||||||
|
"json_name": "bbb"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ccc",
|
||||||
|
"number": 3,
|
||||||
|
"label": 1,
|
||||||
|
"type": 5,
|
||||||
|
"json_name": "ccc"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ddd",
|
||||||
|
"number": 4,
|
||||||
|
"label": 1,
|
||||||
|
"type": 3,
|
||||||
|
"json_name": "ddd"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "eee",
|
||||||
|
"number": 5,
|
||||||
|
"label": 3,
|
||||||
|
"type": 9,
|
||||||
|
"json_name": "eee"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Dummy2",
|
||||||
|
"field": [
|
||||||
|
{
|
||||||
|
"name": "fff",
|
||||||
|
"number": 1,
|
||||||
|
"label": 1,
|
||||||
|
"type": 2,
|
||||||
|
"json_name": "fff"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ggg",
|
||||||
|
"number": 2,
|
||||||
|
"label": 1,
|
||||||
|
"type": 11,
|
||||||
|
"type_name": ".dummy.Dummy1",
|
||||||
|
"json_name": "ggg"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Dummy3"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"service": [
|
||||||
|
{
|
||||||
|
"name": "DummyService",
|
||||||
|
"method": [
|
||||||
|
{
|
||||||
|
"name": "Hhh",
|
||||||
|
"input_type": ".dummy.Dummy1",
|
||||||
|
"output_type": ".dummy.Dummy2",
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Iii",
|
||||||
|
"input_type": ".dummy.Dummy2",
|
||||||
|
"output_type": ".dummy.Dummy1",
|
||||||
|
"options": {}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"source_code_info": {
|
||||||
|
"location": [
|
||||||
|
{
|
||||||
|
"span": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
22,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
12
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
0,
|
||||||
|
0,
|
||||||
|
18
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
2,
|
||||||
|
8,
|
||||||
|
13
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
10,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
4,
|
||||||
|
8,
|
||||||
|
14
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
5,
|
||||||
|
2,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
5,
|
||||||
|
2,
|
||||||
|
4,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
5,
|
||||||
|
2,
|
||||||
|
7
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
5,
|
||||||
|
8,
|
||||||
|
11
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
5,
|
||||||
|
14,
|
||||||
|
15
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
6,
|
||||||
|
2,
|
||||||
|
17
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
6,
|
||||||
|
2,
|
||||||
|
5,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
6,
|
||||||
|
2,
|
||||||
|
8
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
6,
|
||||||
|
9,
|
||||||
|
12
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
6,
|
||||||
|
15,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
7,
|
||||||
|
2,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
7,
|
||||||
|
2,
|
||||||
|
6,
|
||||||
|
17
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
7,
|
||||||
|
2,
|
||||||
|
7
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
7,
|
||||||
|
8,
|
||||||
|
11
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
7,
|
||||||
|
14,
|
||||||
|
15
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
8,
|
||||||
|
2,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
8,
|
||||||
|
2,
|
||||||
|
7,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
8,
|
||||||
|
2,
|
||||||
|
7
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
8,
|
||||||
|
8,
|
||||||
|
11
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
3,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
8,
|
||||||
|
14,
|
||||||
|
15
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
9,
|
||||||
|
2,
|
||||||
|
26
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
4,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
9,
|
||||||
|
2,
|
||||||
|
10
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
4,
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
9,
|
||||||
|
11,
|
||||||
|
17
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
4,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
9,
|
||||||
|
18,
|
||||||
|
21
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
4,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
9,
|
||||||
|
24,
|
||||||
|
25
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
12,
|
||||||
|
0,
|
||||||
|
15,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
12,
|
||||||
|
8,
|
||||||
|
14
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
13,
|
||||||
|
2,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
13,
|
||||||
|
2,
|
||||||
|
12,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
5
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
13,
|
||||||
|
2,
|
||||||
|
7
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
13,
|
||||||
|
8,
|
||||||
|
11
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
13,
|
||||||
|
14,
|
||||||
|
15
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
14,
|
||||||
|
2,
|
||||||
|
17
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
4
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
14,
|
||||||
|
2,
|
||||||
|
13,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
6
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
14,
|
||||||
|
2,
|
||||||
|
8
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
14,
|
||||||
|
9,
|
||||||
|
12
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
1,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
14,
|
||||||
|
15,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
17,
|
||||||
|
0,
|
||||||
|
17
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
4,
|
||||||
|
2,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
17,
|
||||||
|
8,
|
||||||
|
14
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
6,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
19,
|
||||||
|
0,
|
||||||
|
22,
|
||||||
|
1
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
6,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
19,
|
||||||
|
8,
|
||||||
|
20
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
6,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
20,
|
||||||
|
2,
|
||||||
|
37
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
6,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
20,
|
||||||
|
6,
|
||||||
|
9
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
6,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
20,
|
||||||
|
10,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
6,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
0,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
20,
|
||||||
|
27,
|
||||||
|
33
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
6,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
21,
|
||||||
|
2,
|
||||||
|
37
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
6,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
1
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
21,
|
||||||
|
6,
|
||||||
|
9
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
6,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
2
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
21,
|
||||||
|
10,
|
||||||
|
16
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"path": [
|
||||||
|
6,
|
||||||
|
0,
|
||||||
|
2,
|
||||||
|
1,
|
||||||
|
3
|
||||||
|
],
|
||||||
|
"span": [
|
||||||
|
21,
|
||||||
|
27,
|
||||||
|
33
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"syntax": "proto3"
|
||||||
|
},
|
||||||
|
"raw-filename": "export.json.tmpl",
|
||||||
|
"filename": "export.json.tmpl",
|
||||||
|
"template-dir": "templates",
|
||||||
|
"service": {
|
||||||
|
"name": "DummyService",
|
||||||
|
"method": [
|
||||||
|
{
|
||||||
|
"name": "Hhh",
|
||||||
|
"input_type": ".dummy.Dummy1",
|
||||||
|
"output_type": ".dummy.Dummy2",
|
||||||
|
"options": {}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Iii",
|
||||||
|
"input_type": ".dummy.Dummy2",
|
||||||
|
"output_type": ".dummy.Dummy1",
|
||||||
|
"options": {}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"enum": null
|
||||||
|
}
|
1
examples/dummy/templates/export.json.tmpl
Normal file
1
examples/dummy/templates/export.json.tmpl
Normal file
@@ -0,0 +1 @@
|
|||||||
|
{{ . | prettyjson }}
|
13
examples/enum/Makefile
Normal file
13
examples/enum/Makefile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
mkdir -p output
|
||||||
|
protoc -I. --gotemplate_out=template_dir=templates,debug=true,all=true:output proto/*.proto
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: re
|
||||||
|
re: clean build
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf output
|
9
examples/enum/output/enum.txt
Normal file
9
examples/enum/output/enum.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
-red
|
||||||
|
-blue
|
||||||
|
-black
|
||||||
|
-yellow
|
||||||
|
-green
|
||||||
|
-dark
|
||||||
|
-white
|
||||||
|
-gray
|
||||||
|
-orange
|
14
examples/enum/proto/sample.proto
Normal file
14
examples/enum/proto/sample.proto
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
package Sample;
|
||||||
|
|
||||||
|
enum Colors {
|
||||||
|
red = 0;
|
||||||
|
blue = 1;
|
||||||
|
black = 2;
|
||||||
|
yellow = 3;
|
||||||
|
green = 4;
|
||||||
|
dark = 5;
|
||||||
|
white = 6;
|
||||||
|
gray = 7;
|
||||||
|
orange = 8;
|
||||||
|
}
|
2
examples/enum/templates/enum.txt.tmpl
Normal file
2
examples/enum/templates/enum.txt.tmpl
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
{{range $m := "colors" | getEnumValue .Enum }}-{{$m.Name}}
|
||||||
|
{{end}}
|
13
examples/flow/Makefile
Normal file
13
examples/flow/Makefile
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
mkdir -p output
|
||||||
|
protoc -I. --gotemplate_out=template_dir=templates,debug=true:output ./protos/*.proto
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: re
|
||||||
|
re: clean build
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf output
|
311
examples/flow/output/test/test_grpc_js.js
Normal file
311
examples/flow/output/test/test_grpc_js.js
Normal file
@@ -0,0 +1,311 @@
|
|||||||
|
// @flow
|
||||||
|
// GENERATED CODE -- DO NOT EDIT!
|
||||||
|
|
||||||
|
import base64 from 'base64-js'
|
||||||
|
import test_pb from './test_pb'
|
||||||
|
|
||||||
|
|
||||||
|
export type TestEnum = {|
|
||||||
|
ELEMENT_A?: 0;
|
||||||
|
ELEMENT_B?: 1;
|
||||||
|
|};
|
||||||
|
|
||||||
|
|
||||||
|
export type TestMessage$TestNestedEnum = {|
|
||||||
|
ELEMENT_C?: 0;
|
||||||
|
ELEMENT_D?: 1;
|
||||||
|
|};
|
||||||
|
|
||||||
|
|
||||||
|
export type TestMessage$TestNestedMessage = {
|
||||||
|
getS?: () => string;
|
||||||
|
setS?: (s: string) => void;
|
||||||
|
getT?: () => number;
|
||||||
|
setT?: (t: number) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
export type TestMessage = {
|
||||||
|
getA?: () => string;
|
||||||
|
setA?: (a: string) => void;
|
||||||
|
getB?: () => number;
|
||||||
|
setB?: (b: number) => void;
|
||||||
|
getC?: () => number;
|
||||||
|
setC?: (c: number) => void;
|
||||||
|
getD?: () => number;
|
||||||
|
setD?: (d: number) => void;
|
||||||
|
getE?: () => number;
|
||||||
|
setE?: (e: number) => void;
|
||||||
|
getNList?: () => Array<string>;
|
||||||
|
setNList?: (n: Array<string>) => void;
|
||||||
|
addN?: (n: string) => void;
|
||||||
|
clearNList?: () => void;
|
||||||
|
getOList?: () => Array<number>;
|
||||||
|
setOList?: (o: Array<number>) => void;
|
||||||
|
addO?: (o: number) => void;
|
||||||
|
clearOList?: () => void;
|
||||||
|
getPList?: () => Array<number>;
|
||||||
|
setPList?: (p: Array<number>) => void;
|
||||||
|
addP?: (p: number) => void;
|
||||||
|
clearPList?: () => void;
|
||||||
|
getQList?: () => Array<number>;
|
||||||
|
setQList?: (q: Array<number>) => void;
|
||||||
|
addQ?: (q: number) => void;
|
||||||
|
clearQList?: () => void;
|
||||||
|
getRList?: () => Array<number>;
|
||||||
|
setRList?: (r: Array<number>) => void;
|
||||||
|
addR?: (r: number) => void;
|
||||||
|
clearRList?: () => void;
|
||||||
|
getU?: () => test$TestEnum;
|
||||||
|
setU?: (u: test$TestEnum) => void;
|
||||||
|
getV?: () => test$TestMessage$TestNestedEnum;
|
||||||
|
setV?: (v: test$TestMessage$TestNestedEnum) => void;
|
||||||
|
getWList?: () => Array<test$TestMessage$TestNestedMessage>;
|
||||||
|
setWList?: (w: Array<test$TestMessage$TestNestedMessage>) => void;
|
||||||
|
addW?: (w: test$TestMessage$TestNestedMessage) => void;
|
||||||
|
clearWList?: () => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export type TestNoStreamRequest = {
|
||||||
|
getMessage?: () => test$TestMessage;
|
||||||
|
setMessage?: (message: test$TestMessage) => void;
|
||||||
|
clearMessage?: () => void;
|
||||||
|
hasMessage?: () => boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export type TestNoStreamReply = {
|
||||||
|
getMessage?: () => test$TestMessage;
|
||||||
|
setMessage?: (message: test$TestMessage) => void;
|
||||||
|
clearMessage?: () => void;
|
||||||
|
hasMessage?: () => boolean;
|
||||||
|
getErrMsg?: () => string;
|
||||||
|
setErrMsg?: (err_msg: string) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export type TestStreamRequestRequest = {
|
||||||
|
getMessage?: () => test$TestMessage;
|
||||||
|
setMessage?: (message: test$TestMessage) => void;
|
||||||
|
clearMessage?: () => void;
|
||||||
|
hasMessage?: () => boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export type TestStreamRequestReply = {
|
||||||
|
getMessage?: () => test$TestMessage;
|
||||||
|
setMessage?: (message: test$TestMessage) => void;
|
||||||
|
clearMessage?: () => void;
|
||||||
|
hasMessage?: () => boolean;
|
||||||
|
getErrMsg?: () => string;
|
||||||
|
setErrMsg?: (err_msg: string) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export type TestStreamReplyRequest = {
|
||||||
|
getMessage?: () => test$TestMessage;
|
||||||
|
setMessage?: (message: test$TestMessage) => void;
|
||||||
|
clearMessage?: () => void;
|
||||||
|
hasMessage?: () => boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export type TestStreamReplyReply = {
|
||||||
|
getMessage?: () => test$TestMessage;
|
||||||
|
setMessage?: (message: test$TestMessage) => void;
|
||||||
|
clearMessage?: () => void;
|
||||||
|
hasMessage?: () => boolean;
|
||||||
|
getErrMsg?: () => string;
|
||||||
|
setErrMsg?: (err_msg: string) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export type TestStreamBothRequest = {
|
||||||
|
getMessage?: () => test$TestMessage;
|
||||||
|
setMessage?: (message: test$TestMessage) => void;
|
||||||
|
clearMessage?: () => void;
|
||||||
|
hasMessage?: () => boolean;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export type TestStreamBothReply = {
|
||||||
|
getMessage?: () => test$TestMessage;
|
||||||
|
setMessage?: (message: test$TestMessage) => void;
|
||||||
|
clearMessage?: () => void;
|
||||||
|
hasMessage?: () => boolean;
|
||||||
|
getErrMsg?: () => string;
|
||||||
|
setErrMsg?: (err_msg: string) => void;
|
||||||
|
};
|
||||||
|
|
||||||
|
const serializeToBase64 = (byteArray: Uint8Array): string => base64.fromByteArray(byteArray)
|
||||||
|
const deserializeFromBase64 = (base64Encoded: string): Uint8Array => new Uint8Array(base64.toByteArray(base64Encoded))
|
||||||
|
|
||||||
|
|
||||||
|
function serialize_test_TestNoStreamRequest(arg : TestNoStreamRequest): string {
|
||||||
|
if (!(arg instanceof test_pb.TestNoStreamRequest)) {
|
||||||
|
throw new Error('Expected argument of type TestNoStreamRequest')
|
||||||
|
}
|
||||||
|
return serializeToBase64(arg.serializeBinary())
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_test_TestNoStreamRequest(base64Encoded: string): TestNoStreamRequest {
|
||||||
|
return test_pb.TestNoStreamRequest.deserializeBinary(deserializeFromBase64(base64Encoded))
|
||||||
|
}
|
||||||
|
|
||||||
|
function serialize_test_TestNoStreamReply(arg : TestNoStreamReply): string {
|
||||||
|
if (!(arg instanceof test_pb.TestNoStreamReply)) {
|
||||||
|
throw new Error('Expected argument of type TestNoStreamReply')
|
||||||
|
}
|
||||||
|
return serializeToBase64(arg.serializeBinary())
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_test_TestNoStreamReply(base64Encoded: string): TestNoStreamReply {
|
||||||
|
return test_pb.TestNoStreamReply.deserializeBinary(deserializeFromBase64(base64Encoded))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function serialize_test_TestStreamRequestRequest(arg : TestStreamRequestRequest): string {
|
||||||
|
if (!(arg instanceof test_pb.TestStreamRequestRequest)) {
|
||||||
|
throw new Error('Expected argument of type TestStreamRequestRequest')
|
||||||
|
}
|
||||||
|
return serializeToBase64(arg.serializeBinary())
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_test_TestStreamRequestRequest(base64Encoded: string): TestStreamRequestRequest {
|
||||||
|
return test_pb.TestStreamRequestRequest.deserializeBinary(deserializeFromBase64(base64Encoded))
|
||||||
|
}
|
||||||
|
|
||||||
|
function serialize_test_TestStreamRequestReply(arg : TestStreamRequestReply): string {
|
||||||
|
if (!(arg instanceof test_pb.TestStreamRequestReply)) {
|
||||||
|
throw new Error('Expected argument of type TestStreamRequestReply')
|
||||||
|
}
|
||||||
|
return serializeToBase64(arg.serializeBinary())
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_test_TestStreamRequestReply(base64Encoded: string): TestStreamRequestReply {
|
||||||
|
return test_pb.TestStreamRequestReply.deserializeBinary(deserializeFromBase64(base64Encoded))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function serialize_test_TestStreamReplyRequest(arg : TestStreamReplyRequest): string {
|
||||||
|
if (!(arg instanceof test_pb.TestStreamReplyRequest)) {
|
||||||
|
throw new Error('Expected argument of type TestStreamReplyRequest')
|
||||||
|
}
|
||||||
|
return serializeToBase64(arg.serializeBinary())
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_test_TestStreamReplyRequest(base64Encoded: string): TestStreamReplyRequest {
|
||||||
|
return test_pb.TestStreamReplyRequest.deserializeBinary(deserializeFromBase64(base64Encoded))
|
||||||
|
}
|
||||||
|
|
||||||
|
function serialize_test_TestStreamReplyReply(arg : TestStreamReplyReply): string {
|
||||||
|
if (!(arg instanceof test_pb.TestStreamReplyReply)) {
|
||||||
|
throw new Error('Expected argument of type TestStreamReplyReply')
|
||||||
|
}
|
||||||
|
return serializeToBase64(arg.serializeBinary())
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_test_TestStreamReplyReply(base64Encoded: string): TestStreamReplyReply {
|
||||||
|
return test_pb.TestStreamReplyReply.deserializeBinary(deserializeFromBase64(base64Encoded))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function serialize_test_TestStreamBothRequest(arg : TestStreamBothRequest): string {
|
||||||
|
if (!(arg instanceof test_pb.TestStreamBothRequest)) {
|
||||||
|
throw new Error('Expected argument of type TestStreamBothRequest')
|
||||||
|
}
|
||||||
|
return serializeToBase64(arg.serializeBinary())
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_test_TestStreamBothRequest(base64Encoded: string): TestStreamBothRequest {
|
||||||
|
return test_pb.TestStreamBothRequest.deserializeBinary(deserializeFromBase64(base64Encoded))
|
||||||
|
}
|
||||||
|
|
||||||
|
function serialize_test_TestStreamBothReply(arg : TestStreamBothReply): string {
|
||||||
|
if (!(arg instanceof test_pb.TestStreamBothReply)) {
|
||||||
|
throw new Error('Expected argument of type TestStreamBothReply')
|
||||||
|
}
|
||||||
|
return serializeToBase64(arg.serializeBinary())
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_test_TestStreamBothReply(base64Encoded: string): TestStreamBothReply {
|
||||||
|
return test_pb.TestStreamBothReply.deserializeBinary(deserializeFromBase64(base64Encoded))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export default {
|
||||||
|
|
||||||
|
TestService: {
|
||||||
|
|
||||||
|
testNoStream: {
|
||||||
|
path: '/test.TestService/TestNoStream',
|
||||||
|
requestStream: false,
|
||||||
|
responseStream: false,
|
||||||
|
requestType: test_pb.TestNoStreamRequest,
|
||||||
|
responseType: test_pb.TestNoStreamReply,
|
||||||
|
requestSerialize: serialize_test_TestNoStreamRequest,
|
||||||
|
requestDeserialize: deserialize_test_TestNoStreamRequest,
|
||||||
|
responseSerialize: serialize_test_TestNoStreamReply,
|
||||||
|
responseDeserialize: deserialize_test_TestNoStreamReply,
|
||||||
|
},
|
||||||
|
testStreamRequest: {
|
||||||
|
path: '/test.TestService/TestStreamRequest',
|
||||||
|
requestStream: true,
|
||||||
|
responseStream: false,
|
||||||
|
requestType: test_pb.TestStreamRequestRequest,
|
||||||
|
responseType: test_pb.TestStreamRequestReply,
|
||||||
|
requestSerialize: serialize_test_TestStreamRequestRequest,
|
||||||
|
requestDeserialize: deserialize_test_TestStreamRequestRequest,
|
||||||
|
responseSerialize: serialize_test_TestStreamRequestReply,
|
||||||
|
responseDeserialize: deserialize_test_TestStreamRequestReply,
|
||||||
|
},
|
||||||
|
testStreamReply: {
|
||||||
|
path: '/test.TestService/TestStreamReply',
|
||||||
|
requestStream: false,
|
||||||
|
responseStream: true,
|
||||||
|
requestType: test_pb.TestStreamReplyRequest,
|
||||||
|
responseType: test_pb.TestStreamReplyReply,
|
||||||
|
requestSerialize: serialize_test_TestStreamReplyRequest,
|
||||||
|
requestDeserialize: deserialize_test_TestStreamReplyRequest,
|
||||||
|
responseSerialize: serialize_test_TestStreamReplyReply,
|
||||||
|
responseDeserialize: deserialize_test_TestStreamReplyReply,
|
||||||
|
},
|
||||||
|
testStreamBoth: {
|
||||||
|
path: '/test.TestService/TestStreamBoth',
|
||||||
|
requestStream: true,
|
||||||
|
responseStream: true,
|
||||||
|
requestType: test_pb.TestStreamBothRequest,
|
||||||
|
responseType: test_pb.TestStreamBothReply,
|
||||||
|
requestSerialize: serialize_test_TestStreamBothRequest,
|
||||||
|
requestDeserialize: deserialize_test_TestStreamBothRequest,
|
||||||
|
responseSerialize: serialize_test_TestStreamBothReply,
|
||||||
|
responseDeserialize: deserialize_test_TestStreamBothReply,
|
||||||
|
},
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
52
examples/flow/protos/test.proto
Normal file
52
examples/flow/protos/test.proto
Normal file
@@ -0,0 +1,52 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package test;
|
||||||
|
|
||||||
|
option go_package = "github.com/united-drivers/models/go/test;testpb";
|
||||||
|
|
||||||
|
service TestService {
|
||||||
|
rpc TestNoStream(TestNoStreamRequest) returns (TestNoStreamReply);
|
||||||
|
rpc TestStreamRequest(stream TestStreamRequestRequest) returns (TestStreamRequestReply);
|
||||||
|
rpc TestStreamReply(TestStreamReplyRequest) returns (stream TestStreamReplyReply);
|
||||||
|
rpc TestStreamBoth(stream TestStreamBothRequest) returns (stream TestStreamBothReply);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum TestEnum {
|
||||||
|
ELEMENT_A = 0;
|
||||||
|
ELEMENT_B = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message TestMessage {
|
||||||
|
string a = 1;
|
||||||
|
int32 b = 2;
|
||||||
|
int64 c = 3;
|
||||||
|
float d = 4;
|
||||||
|
double e = 5;
|
||||||
|
repeated string n = 14;
|
||||||
|
repeated int32 o = 15;
|
||||||
|
repeated int64 p = 16;
|
||||||
|
repeated float q = 17;
|
||||||
|
repeated double r = 18;
|
||||||
|
|
||||||
|
message TestNestedMessage {
|
||||||
|
string s = 1;
|
||||||
|
int32 t = 2;
|
||||||
|
}
|
||||||
|
enum TestNestedEnum {
|
||||||
|
ELEMENT_C = 0;
|
||||||
|
ELEMENT_D = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
TestEnum u = 19;
|
||||||
|
TestNestedEnum v = 20;
|
||||||
|
repeated TestNestedMessage w = 21;
|
||||||
|
}
|
||||||
|
|
||||||
|
message TestNoStreamRequest { TestMessage message = 1; }
|
||||||
|
message TestNoStreamReply { TestMessage message = 1; string err_msg = 2; }
|
||||||
|
message TestStreamRequestRequest { TestMessage message = 1; }
|
||||||
|
message TestStreamRequestReply { TestMessage message = 1; string err_msg = 2; }
|
||||||
|
message TestStreamReplyRequest { TestMessage message = 1; }
|
||||||
|
message TestStreamReplyReply { TestMessage message = 1; string err_msg = 2; }
|
||||||
|
message TestStreamBothRequest { TestMessage message = 1; }
|
||||||
|
message TestStreamBothReply { TestMessage message = 1; string err_msg = 2; }
|
@@ -0,0 +1,110 @@
|
|||||||
|
// @flow
|
||||||
|
// GENERATED CODE -- DO NOT EDIT!
|
||||||
|
|
||||||
|
{{- $Package:=.File.Package}}
|
||||||
|
|
||||||
|
import base64 from 'base64-js'
|
||||||
|
import {{$Package}}_pb from './{{$Package}}_pb'
|
||||||
|
|
||||||
|
{{- range .File.Dependency}}
|
||||||
|
import {{. | replace "/" "_" | trimSuffix ".proto" }}_pb from '../{{. | trimSuffix ".proto" }}_pb'
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
{{- define "fieldMethods"}}
|
||||||
|
{{- if isFieldRepeated .}}
|
||||||
|
get{{.Name | camelCase}}List?: () => {{. | jsType}};
|
||||||
|
set{{.Name | camelCase}}List?: ({{.Name}}: {{. | jsType}}) => void;
|
||||||
|
add{{.Name | camelCase}}?: ({{.Name}}: {{. | jsType | trimPrefix "Array<" | trimSuffix ">"}}) => void;
|
||||||
|
clear{{.Name | camelCase}}List?: () => void;
|
||||||
|
{{- else}}
|
||||||
|
get{{.Name | camelCase}}?: () => {{. | jsType}};
|
||||||
|
set{{.Name | camelCase}}?: ({{.Name}}: {{. | jsType}}) => void;
|
||||||
|
|
||||||
|
{{- if isFieldMessage .}}
|
||||||
|
clear{{.Name | camelCase}}?: () => void;
|
||||||
|
has{{.Name | camelCase}}?: () => boolean;
|
||||||
|
{{- end}}
|
||||||
|
{{- end}}
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
{{range .File.EnumType}}
|
||||||
|
export type {{.Name}} = {|
|
||||||
|
{{- range .Value}}
|
||||||
|
{{.Name}}?: {{.Number}};
|
||||||
|
{{- end}}
|
||||||
|
|};
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
{{- range .File.MessageType}}
|
||||||
|
{{- $MessageType := .Name}}
|
||||||
|
|
||||||
|
{{range .EnumType}}
|
||||||
|
export type {{$MessageType}}${{.Name}} = {|
|
||||||
|
{{- range .Value}}
|
||||||
|
{{.Name}}?: {{.Number}};
|
||||||
|
{{- end}}
|
||||||
|
|};
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
{{range .NestedType}}
|
||||||
|
export type {{$MessageType}}${{.Name}} = {
|
||||||
|
{{- range .Field}}
|
||||||
|
{{- template "fieldMethods" .}}
|
||||||
|
{{- end}}
|
||||||
|
};
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
export type {{.Name}} = {
|
||||||
|
{{- range .Field}}
|
||||||
|
{{- template "fieldMethods" .}}
|
||||||
|
{{- end}}
|
||||||
|
};
|
||||||
|
|
||||||
|
{{- end}}
|
||||||
|
|
||||||
|
const serializeToBase64 = (byteArray: Uint8Array): string => base64.fromByteArray(byteArray)
|
||||||
|
const deserializeFromBase64 = (base64Encoded: string): Uint8Array => new Uint8Array(base64.toByteArray(base64Encoded))
|
||||||
|
|
||||||
|
{{range .File.Service}}{{range .Method}}
|
||||||
|
function serialize_{{$Package}}_{{.InputType | shortType}}(arg : {{.InputType | shortType}}): string {
|
||||||
|
if (!(arg instanceof {{$Package}}_pb.{{.InputType | shortType}})) {
|
||||||
|
throw new Error('Expected argument of type {{.InputType | shortType}}')
|
||||||
|
}
|
||||||
|
return serializeToBase64(arg.serializeBinary())
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_{{$Package}}_{{.InputType | shortType}}(base64Encoded: string): {{.InputType | shortType}} {
|
||||||
|
return {{$Package}}_pb.{{.InputType | shortType}}.deserializeBinary(deserializeFromBase64(base64Encoded))
|
||||||
|
}
|
||||||
|
|
||||||
|
function serialize_{{$Package}}_{{.OutputType | shortType}}(arg : {{.OutputType | shortType}}): string {
|
||||||
|
if (!(arg instanceof {{$Package}}_pb.{{.OutputType | shortType}})) {
|
||||||
|
throw new Error('Expected argument of type {{.OutputType | shortType}}')
|
||||||
|
}
|
||||||
|
return serializeToBase64(arg.serializeBinary())
|
||||||
|
}
|
||||||
|
|
||||||
|
function deserialize_{{$Package}}_{{.OutputType | shortType}}(base64Encoded: string): {{.OutputType | shortType}} {
|
||||||
|
return {{$Package}}_pb.{{.OutputType | shortType}}.deserializeBinary(deserializeFromBase64(base64Encoded))
|
||||||
|
}
|
||||||
|
|
||||||
|
{{end}}{{end}}
|
||||||
|
export default {
|
||||||
|
{{range .File.Service}}
|
||||||
|
{{.Name}}: {
|
||||||
|
{{$serviceName:=.Name}}
|
||||||
|
{{range .Method}}{{.Name | lowerCamelCase}}: {
|
||||||
|
path: '/{{$Package}}.{{$serviceName}}/{{.Name}}',
|
||||||
|
requestStream: {{.ClientStreaming | default "false"}},
|
||||||
|
responseStream: {{.ServerStreaming | default "false"}},
|
||||||
|
requestType: {{$Package}}_pb.{{.InputType | shortType}},
|
||||||
|
responseType: {{$Package}}_pb.{{.OutputType | shortType}},
|
||||||
|
requestSerialize: serialize_{{$Package}}_{{.InputType | shortType}},
|
||||||
|
requestDeserialize: deserialize_{{$Package}}_{{.InputType | shortType}},
|
||||||
|
responseSerialize: serialize_{{$Package}}_{{.OutputType | shortType}},
|
||||||
|
responseDeserialize: deserialize_{{$Package}}_{{.OutputType | shortType}},
|
||||||
|
},
|
||||||
|
{{end}}
|
||||||
|
}
|
||||||
|
{{end}}
|
||||||
|
}
|
2
examples/go-generate/Makefile
Normal file
2
examples/go-generate/Makefile
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
all:
|
||||||
|
go generate
|
4
examples/go-generate/example.go
Normal file
4
examples/go-generate/example.go
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
package example
|
||||||
|
|
||||||
|
//go:generate protoc --go_out=./gen/ example.proto
|
||||||
|
//go:generate protoc --gotemplate_out=./gen/ example.proto
|
16
examples/go-generate/example.proto
Normal file
16
examples/go-generate/example.proto
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package example;
|
||||||
|
|
||||||
|
service Sum {
|
||||||
|
rpc Sum(SumRequest) returns (SumReply) {};
|
||||||
|
}
|
||||||
|
|
||||||
|
message SumRequest {
|
||||||
|
int32 a = 1;
|
||||||
|
int32 b = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message SumReply {
|
||||||
|
int32 c = 1;
|
||||||
|
}
|
11
examples/go-generate/gen/doc.gen.go
Normal file
11
examples/go-generate/gen/doc.gen.go
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
// Code generated by protoc-gen-gotemplate
|
||||||
|
package example
|
||||||
|
|
||||||
|
// Methods
|
||||||
|
// -------
|
||||||
|
// * Sum
|
||||||
|
//
|
||||||
|
// Message types
|
||||||
|
// -------------
|
||||||
|
// * SumRequest
|
||||||
|
// * SumReply
|
89
examples/go-generate/gen/example.pb.go
Normal file
89
examples/go-generate/gen/example.pb.go
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: example.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package example is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
example.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
SumRequest
|
||||||
|
SumReply
|
||||||
|
*/
|
||||||
|
package example
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||||
|
|
||||||
|
type SumRequest struct {
|
||||||
|
A int32 `protobuf:"varint,1,opt,name=a" json:"a,omitempty"`
|
||||||
|
B int32 `protobuf:"varint,2,opt,name=b" json:"b,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *SumRequest) Reset() { *m = SumRequest{} }
|
||||||
|
func (m *SumRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*SumRequest) ProtoMessage() {}
|
||||||
|
func (*SumRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func (m *SumRequest) GetA() int32 {
|
||||||
|
if m != nil {
|
||||||
|
return m.A
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *SumRequest) GetB() int32 {
|
||||||
|
if m != nil {
|
||||||
|
return m.B
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
type SumReply struct {
|
||||||
|
C int32 `protobuf:"varint,1,opt,name=c" json:"c,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *SumReply) Reset() { *m = SumReply{} }
|
||||||
|
func (m *SumReply) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*SumReply) ProtoMessage() {}
|
||||||
|
func (*SumReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
||||||
|
|
||||||
|
func (m *SumReply) GetC() int32 {
|
||||||
|
if m != nil {
|
||||||
|
return m.C
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*SumRequest)(nil), "example.SumRequest")
|
||||||
|
proto.RegisterType((*SumReply)(nil), "example.SumReply")
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("example.proto", fileDescriptor0) }
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 124 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xe2, 0x4d, 0xad, 0x48, 0xcc,
|
||||||
|
0x2d, 0xc8, 0x49, 0xd5, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x62, 0x87, 0x72, 0x95, 0x34, 0xb8,
|
||||||
|
0xb8, 0x82, 0x4b, 0x73, 0x83, 0x52, 0x0b, 0x4b, 0x53, 0x8b, 0x4b, 0x84, 0x78, 0xb8, 0x18, 0x13,
|
||||||
|
0x25, 0x18, 0x15, 0x18, 0x35, 0x58, 0x83, 0x18, 0x13, 0x41, 0xbc, 0x24, 0x09, 0x26, 0x08, 0x2f,
|
||||||
|
0x49, 0x49, 0x82, 0x8b, 0x03, 0xac, 0xb2, 0x20, 0xa7, 0x12, 0x24, 0x93, 0x0c, 0x53, 0x97, 0x6c,
|
||||||
|
0x64, 0xc6, 0xc5, 0x1c, 0x5c, 0x9a, 0x2b, 0xa4, 0x0f, 0xa1, 0x84, 0xf5, 0x60, 0x56, 0x21, 0x0c,
|
||||||
|
0x96, 0x12, 0x44, 0x15, 0x2c, 0xc8, 0xa9, 0x54, 0x62, 0x48, 0x62, 0x03, 0xbb, 0xc5, 0x18, 0x10,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x2b, 0xf1, 0xe9, 0x56, 0x9c, 0x00, 0x00, 0x00,
|
||||||
|
}
|
14
examples/go-generate/templates/doc.gen.go.tmpl
Normal file
14
examples/go-generate/templates/doc.gen.go.tmpl
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
// Code generated by protoc-gen-gotemplate
|
||||||
|
package {{.File.Package}}
|
||||||
|
|
||||||
|
// Methods
|
||||||
|
// -------
|
||||||
|
{{- range .Service.Method}}
|
||||||
|
// * {{.Name}}
|
||||||
|
{{- end}}
|
||||||
|
//
|
||||||
|
// Message types
|
||||||
|
// -------------
|
||||||
|
{{- range .File.MessageType}}
|
||||||
|
// * {{.Name}}
|
||||||
|
{{- end}}
|
2
examples/go-kit/.gitignore
vendored
Normal file
2
examples/go-kit/.gitignore
vendored
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
/vendor/
|
||||||
|
/server
|
24
examples/go-kit/Makefile
Normal file
24
examples/go-kit/Makefile
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
SOURCES := $(shell find . -name "*.proto" -not -path ./vendor/\*)
|
||||||
|
|
||||||
|
TARGETS_GO := $(foreach source, $(SOURCES), $(source)_go)
|
||||||
|
TARGETS_TMPL := $(foreach source, $(SOURCES), $(source)_tmpl)
|
||||||
|
|
||||||
|
service_name = $(word 2,$(subst /, ,$1))
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
|
build: server
|
||||||
|
|
||||||
|
server: $(TARGETS_GO) $(TARGETS_TMPL)
|
||||||
|
glide install
|
||||||
|
go build -o server .
|
||||||
|
|
||||||
|
$(TARGETS_GO): %_go:
|
||||||
|
protoc --go_out=plugins=grpc:. "$*"
|
||||||
|
@mkdir -p services/$(call service_name,$*)/gen/pb
|
||||||
|
@mv ./services/$(call service_name,$*)/$(call service_name,$*).pb.go ./services/$(call service_name,$*)/gen/pb/pb.go
|
||||||
|
|
||||||
|
$(TARGETS_TMPL): %_tmpl:
|
||||||
|
@mkdir -p $(dir $*)gen
|
||||||
|
protoc -I. --gotemplate_out=destination_dir=services/$(call service_name,$*)/gen,template_dir=templates:services "$*"
|
||||||
|
@rm -rf services/services # need to investigate why this directory is created
|
||||||
|
gofmt -w $(dir $*)gen
|
48
examples/go-kit/glide.lock
generated
Normal file
48
examples/go-kit/glide.lock
generated
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
hash: e225ab17b49f8d6601b2bd813d43ad34ee04380d29c278c11919efd454c7b2d7
|
||||||
|
updated: 2017-03-16T17:03:34.437968115+01:00
|
||||||
|
imports:
|
||||||
|
- name: github.com/dgrijalva/jwt-go
|
||||||
|
version: 2268707a8f0843315e2004ee4f1d021dc08baedf
|
||||||
|
- name: github.com/go-kit/kit
|
||||||
|
version: fadad6fffe0466b19df9efd9acde5c9a52df5fa4
|
||||||
|
subpackages:
|
||||||
|
- auth/jwt
|
||||||
|
- endpoint
|
||||||
|
- log
|
||||||
|
- transport/grpc
|
||||||
|
- transport/http
|
||||||
|
- name: github.com/go-logfmt/logfmt
|
||||||
|
version: 390ab7935ee28ec6b286364bba9b4dd6410cb3d5
|
||||||
|
- name: github.com/go-stack/stack
|
||||||
|
version: 100eb0c0a9c5b306ca2fb4f165df21d80ada4b82
|
||||||
|
- name: github.com/golang/protobuf
|
||||||
|
version: c9c7427a2a70d2eb3bafa0ab2dc163e45f143317
|
||||||
|
subpackages:
|
||||||
|
- proto
|
||||||
|
- name: github.com/gorilla/handlers
|
||||||
|
version: 3a5767ca75ece5f7f1440b1d16975247f8d8b221
|
||||||
|
- name: github.com/kr/logfmt
|
||||||
|
version: b84e30acd515aadc4b783ad4ff83aff3299bdfe0
|
||||||
|
- name: golang.org/x/net
|
||||||
|
version: a6577fac2d73be281a500b310739095313165611
|
||||||
|
subpackages:
|
||||||
|
- context
|
||||||
|
- context/ctxhttp
|
||||||
|
- http2
|
||||||
|
- http2/hpack
|
||||||
|
- idna
|
||||||
|
- internal/timeseries
|
||||||
|
- lex/httplex
|
||||||
|
- trace
|
||||||
|
- name: google.golang.org/grpc
|
||||||
|
version: 777daa17ff9b5daef1cfdf915088a2ada3332bf0
|
||||||
|
subpackages:
|
||||||
|
- codes
|
||||||
|
- credentials
|
||||||
|
- grpclog
|
||||||
|
- internal
|
||||||
|
- metadata
|
||||||
|
- naming
|
||||||
|
- peer
|
||||||
|
- transport
|
||||||
|
testImports: []
|
20
examples/go-kit/glide.yaml
Normal file
20
examples/go-kit/glide.yaml
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
package: moul.io/protoc-gen-gotemplate/examples/go-kit
|
||||||
|
import:
|
||||||
|
- package: github.com/go-kit/kit
|
||||||
|
subpackages:
|
||||||
|
- auth/jwt
|
||||||
|
- endpoint
|
||||||
|
- log
|
||||||
|
- transport/grpc
|
||||||
|
- transport/http
|
||||||
|
- package: github.com/golang/protobuf
|
||||||
|
subpackages:
|
||||||
|
- proto
|
||||||
|
version: c9c7427a2a70d2eb3bafa0ab2dc163e45f143317
|
||||||
|
- package: github.com/gorilla/handlers
|
||||||
|
- package: golang.org/x/net
|
||||||
|
subpackages:
|
||||||
|
- context
|
||||||
|
- http2
|
||||||
|
version: a6577fac2d73be281a500b310739095313165611
|
||||||
|
- package: google.golang.org/grpc
|
93
examples/go-kit/main.go
Normal file
93
examples/go-kit/main.go
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"net"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/signal"
|
||||||
|
"syscall"
|
||||||
|
|
||||||
|
"github.com/go-kit/kit/log"
|
||||||
|
"github.com/gorilla/handlers"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
|
session_svc "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session"
|
||||||
|
session_endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
||||||
|
session_pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
|
session_grpctransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/transports/grpc"
|
||||||
|
session_httptransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/transports/http"
|
||||||
|
|
||||||
|
sprint_svc "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint"
|
||||||
|
sprint_endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
||||||
|
sprint_pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
|
sprint_grpctransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/transports/grpc"
|
||||||
|
sprint_httptransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/transports/http"
|
||||||
|
|
||||||
|
user_svc "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user"
|
||||||
|
user_endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
||||||
|
user_pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
|
user_grpctransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/transports/grpc"
|
||||||
|
user_httptransport "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/transports/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
mux := http.NewServeMux()
|
||||||
|
errc := make(chan error)
|
||||||
|
s := grpc.NewServer()
|
||||||
|
var logger log.Logger
|
||||||
|
{
|
||||||
|
logger = log.NewLogfmtLogger(os.Stdout)
|
||||||
|
logger = log.With(logger, "ts", log.DefaultTimestampUTC)
|
||||||
|
logger = log.With(logger, "caller", log.DefaultCaller)
|
||||||
|
}
|
||||||
|
|
||||||
|
// initialize services
|
||||||
|
{
|
||||||
|
svc := session_svc.New()
|
||||||
|
endpoints := session_endpoints.MakeEndpoints(svc)
|
||||||
|
srv := session_grpctransport.MakeGRPCServer(endpoints)
|
||||||
|
session_pb.RegisterSessionServiceServer(s, srv)
|
||||||
|
session_httptransport.RegisterHandlers(svc, mux, endpoints)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
svc := sprint_svc.New()
|
||||||
|
endpoints := sprint_endpoints.MakeEndpoints(svc)
|
||||||
|
srv := sprint_grpctransport.MakeGRPCServer(endpoints)
|
||||||
|
sprint_pb.RegisterSprintServiceServer(s, srv)
|
||||||
|
sprint_httptransport.RegisterHandlers(svc, mux, endpoints)
|
||||||
|
}
|
||||||
|
{
|
||||||
|
svc := user_svc.New()
|
||||||
|
endpoints := user_endpoints.MakeEndpoints(svc)
|
||||||
|
srv := user_grpctransport.MakeGRPCServer(endpoints)
|
||||||
|
user_pb.RegisterUserServiceServer(s, srv)
|
||||||
|
user_httptransport.RegisterHandlers(svc, mux, endpoints)
|
||||||
|
}
|
||||||
|
|
||||||
|
// start servers
|
||||||
|
go func() {
|
||||||
|
c := make(chan os.Signal, 1)
|
||||||
|
signal.Notify(c, syscall.SIGINT, syscall.SIGTERM)
|
||||||
|
errc <- fmt.Errorf("%s", <-c)
|
||||||
|
}()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
logger := log.With(logger, "transport", "HTTP")
|
||||||
|
logger.Log("addr", ":8000")
|
||||||
|
errc <- http.ListenAndServe(":8000", handlers.LoggingHandler(os.Stderr, mux))
|
||||||
|
}()
|
||||||
|
|
||||||
|
go func() {
|
||||||
|
logger := log.With(logger, "transport", "gRPC")
|
||||||
|
ln, err := net.Listen("tcp", ":9000")
|
||||||
|
if err != nil {
|
||||||
|
errc <- err
|
||||||
|
return
|
||||||
|
}
|
||||||
|
logger.Log("addr", ":9000")
|
||||||
|
errc <- s.Serve(ln)
|
||||||
|
}()
|
||||||
|
|
||||||
|
logger.Log("exit", <-errc)
|
||||||
|
}
|
0
examples/go-kit/services/session/gen/README.md
Normal file
0
examples/go-kit/services/session/gen/README.md
Normal file
45
examples/go-kit/services/session/gen/client/grpc/client.go
Normal file
45
examples/go-kit/services/session/gen/client/grpc/client.go
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package session_clientgrpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
|
||||||
|
jwt "github.com/go-kit/kit/auth/jwt"
|
||||||
|
"github.com/go-kit/kit/endpoint"
|
||||||
|
"github.com/go-kit/kit/log"
|
||||||
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
func New(conn *grpc.ClientConn, logger log.Logger) pb.SessionServiceServer {
|
||||||
|
|
||||||
|
var loginEndpoint endpoint.Endpoint
|
||||||
|
{
|
||||||
|
loginEndpoint = grpctransport.NewClient(
|
||||||
|
conn,
|
||||||
|
"session.SessionService",
|
||||||
|
"Login",
|
||||||
|
EncodeLoginRequest,
|
||||||
|
DecodeLoginResponse,
|
||||||
|
pb.LoginResponse{},
|
||||||
|
append([]grpctransport.ClientOption{}, grpctransport.ClientBefore(jwt.FromGRPCContext()))...,
|
||||||
|
).Endpoint()
|
||||||
|
}
|
||||||
|
|
||||||
|
return &endpoints.Endpoints{
|
||||||
|
|
||||||
|
LoginEndpoint: loginEndpoint,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func EncodeLoginRequest(_ context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.LoginRequest)
|
||||||
|
return req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DecodeLoginResponse(_ context.Context, grpcResponse interface{}) (interface{}, error) {
|
||||||
|
response := grpcResponse.(*pb.LoginResponse)
|
||||||
|
return response, nil
|
||||||
|
}
|
46
examples/go-kit/services/session/gen/endpoints/endpoints.go
Normal file
46
examples/go-kit/services/session/gen/endpoints/endpoints.go
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package session_endpoints
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/go-kit/kit/endpoint"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
|
oldcontext "golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = endpoint.Chain
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = context.Background
|
||||||
|
|
||||||
|
type StreamEndpoint func(server interface{}, req interface{}) (err error)
|
||||||
|
|
||||||
|
type Endpoints struct {
|
||||||
|
LoginEndpoint endpoint.Endpoint
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Endpoints) Login(ctx oldcontext.Context, in *pb.LoginRequest) (*pb.LoginResponse, error) {
|
||||||
|
out, err := e.LoginEndpoint(ctx, in)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.LoginResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return out.(*pb.LoginResponse), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeLoginEndpoint(svc pb.SessionServiceServer) endpoint.Endpoint {
|
||||||
|
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.LoginRequest)
|
||||||
|
rep, err := svc.Login(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.LoginResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return rep, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeEndpoints(svc pb.SessionServiceServer) Endpoints {
|
||||||
|
return Endpoints{
|
||||||
|
|
||||||
|
LoginEndpoint: MakeLoginEndpoint(svc),
|
||||||
|
}
|
||||||
|
}
|
178
examples/go-kit/services/session/gen/pb/pb.go
Normal file
178
examples/go-kit/services/session/gen/pb/pb.go
Normal file
@@ -0,0 +1,178 @@
|
|||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: services/session/session.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package session is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
services/session/session.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
LoginRequest
|
||||||
|
LoginResponse
|
||||||
|
*/
|
||||||
|
package session
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "golang.org/x/net/context"
|
||||||
|
grpc "google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||||
|
|
||||||
|
type LoginRequest struct {
|
||||||
|
Username string `protobuf:"bytes,1,opt,name=username" json:"username,omitempty"`
|
||||||
|
Password string `protobuf:"bytes,2,opt,name=password" json:"password,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *LoginRequest) Reset() { *m = LoginRequest{} }
|
||||||
|
func (m *LoginRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*LoginRequest) ProtoMessage() {}
|
||||||
|
func (*LoginRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func (m *LoginRequest) GetUsername() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Username
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *LoginRequest) GetPassword() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Password
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type LoginResponse struct {
|
||||||
|
Token string `protobuf:"bytes,1,opt,name=token" json:"token,omitempty"`
|
||||||
|
ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg" json:"err_msg,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *LoginResponse) Reset() { *m = LoginResponse{} }
|
||||||
|
func (m *LoginResponse) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*LoginResponse) ProtoMessage() {}
|
||||||
|
func (*LoginResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
||||||
|
|
||||||
|
func (m *LoginResponse) GetToken() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Token
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *LoginResponse) GetErrMsg() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.ErrMsg
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*LoginRequest)(nil), "session.LoginRequest")
|
||||||
|
proto.RegisterType((*LoginResponse)(nil), "session.LoginResponse")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ context.Context
|
||||||
|
var _ grpc.ClientConn
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the grpc package it is being compiled against.
|
||||||
|
const _ = grpc.SupportPackageIsVersion4
|
||||||
|
|
||||||
|
// Client API for SessionService service
|
||||||
|
|
||||||
|
type SessionServiceClient interface {
|
||||||
|
Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type sessionServiceClient struct {
|
||||||
|
cc *grpc.ClientConn
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewSessionServiceClient(cc *grpc.ClientConn) SessionServiceClient {
|
||||||
|
return &sessionServiceClient{cc}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *sessionServiceClient) Login(ctx context.Context, in *LoginRequest, opts ...grpc.CallOption) (*LoginResponse, error) {
|
||||||
|
out := new(LoginResponse)
|
||||||
|
err := grpc.Invoke(ctx, "/session.SessionService/Login", in, out, c.cc, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server API for SessionService service
|
||||||
|
|
||||||
|
type SessionServiceServer interface {
|
||||||
|
Login(context.Context, *LoginRequest) (*LoginResponse, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterSessionServiceServer(s *grpc.Server, srv SessionServiceServer) {
|
||||||
|
s.RegisterService(&_SessionService_serviceDesc, srv)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _SessionService_Login_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(LoginRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(SessionServiceServer).Login(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: "/session.SessionService/Login",
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(SessionServiceServer).Login(ctx, req.(*LoginRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
var _SessionService_serviceDesc = grpc.ServiceDesc{
|
||||||
|
ServiceName: "session.SessionService",
|
||||||
|
HandlerType: (*SessionServiceServer)(nil),
|
||||||
|
Methods: []grpc.MethodDesc{
|
||||||
|
{
|
||||||
|
MethodName: "Login",
|
||||||
|
Handler: _SessionService_Login_Handler,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Streams: []grpc.StreamDesc{},
|
||||||
|
Metadata: "services/session/session.proto",
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("services/session/session.proto", fileDescriptor0) }
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 188 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x92, 0x2b, 0x4e, 0x2d, 0x2a,
|
||||||
|
0xcb, 0x4c, 0x4e, 0x2d, 0xd6, 0x2f, 0x4e, 0x2d, 0x2e, 0xce, 0xcc, 0xcf, 0x83, 0xd1, 0x7a, 0x05,
|
||||||
|
0x45, 0xf9, 0x25, 0xf9, 0x42, 0xec, 0x50, 0xae, 0x92, 0x1b, 0x17, 0x8f, 0x4f, 0x7e, 0x7a, 0x66,
|
||||||
|
0x5e, 0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, 0x89, 0x90, 0x14, 0x17, 0x47, 0x69, 0x71, 0x6a, 0x51,
|
||||||
|
0x5e, 0x62, 0x6e, 0xaa, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x9c, 0x0f, 0x92, 0x2b, 0x48,
|
||||||
|
0x2c, 0x2e, 0x2e, 0xcf, 0x2f, 0x4a, 0x91, 0x60, 0x82, 0xc8, 0xc1, 0xf8, 0x4a, 0x76, 0x5c, 0xbc,
|
||||||
|
0x50, 0x73, 0x8a, 0x0b, 0xf2, 0xf3, 0x8a, 0x53, 0x85, 0x44, 0xb8, 0x58, 0x4b, 0xf2, 0xb3, 0x53,
|
||||||
|
0xf3, 0xa0, 0xa6, 0x40, 0x38, 0x42, 0xe2, 0x5c, 0xec, 0xa9, 0x45, 0x45, 0xf1, 0xb9, 0xc5, 0xe9,
|
||||||
|
0x50, 0x13, 0xd8, 0x52, 0x8b, 0x8a, 0x7c, 0x8b, 0xd3, 0x8d, 0xbc, 0xb8, 0xf8, 0x82, 0x21, 0x4e,
|
||||||
|
0x0a, 0x86, 0xb8, 0x5c, 0xc8, 0x82, 0x8b, 0x15, 0x6c, 0xa2, 0x90, 0xa8, 0x1e, 0xcc, 0xed, 0xc8,
|
||||||
|
0x2e, 0x95, 0x12, 0x43, 0x17, 0x86, 0x58, 0xac, 0xc4, 0x90, 0xc4, 0x06, 0xf6, 0xa3, 0x31, 0x20,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x29, 0x3f, 0x91, 0xc7, 0x05, 0x01, 0x00, 0x00,
|
||||||
|
}
|
65
examples/go-kit/services/session/gen/transports/grpc/grpc.go
Normal file
65
examples/go-kit/services/session/gen/transports/grpc/grpc.go
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
package session_grpctransport
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
|
oldcontext "golang.org/x/net/context"
|
||||||
|
|
||||||
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
// avoid import errors
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
|
||||||
|
func MakeGRPCServer(endpoints endpoints.Endpoints) pb.SessionServiceServer {
|
||||||
|
var options []grpctransport.ServerOption
|
||||||
|
_ = options
|
||||||
|
return &grpcServer{
|
||||||
|
|
||||||
|
login: grpctransport.NewServer(
|
||||||
|
endpoints.LoginEndpoint,
|
||||||
|
decodeRequest,
|
||||||
|
encodeLoginResponse,
|
||||||
|
options...,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type grpcServer struct {
|
||||||
|
login grpctransport.Handler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *grpcServer) Login(ctx oldcontext.Context, req *pb.LoginRequest) (*pb.LoginResponse, error) {
|
||||||
|
_, rep, err := s.login.ServeGRPC(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return rep.(*pb.LoginResponse), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeLoginResponse(ctx context.Context, response interface{}) (interface{}, error) {
|
||||||
|
resp := response.(*pb.LoginResponse)
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeRequest(ctx context.Context, grpcReq interface{}) (interface{}, error) {
|
||||||
|
return grpcReq, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type streamHandler interface {
|
||||||
|
Do(server interface{}, req interface{}) (err error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type server struct {
|
||||||
|
e endpoints.StreamEndpoint
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s server) Do(server interface{}, req interface{}) (err error) {
|
||||||
|
if err := s.e(server, req); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
46
examples/go-kit/services/session/gen/transports/http/http.go
Normal file
46
examples/go-kit/services/session/gen/transports/http/http.go
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
package session_httptransport
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
||||||
|
httptransport "github.com/go-kit/kit/transport/http"
|
||||||
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/endpoints"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = log.Printf
|
||||||
|
var _ = gokit_endpoint.Chain
|
||||||
|
var _ = httptransport.NewClient
|
||||||
|
|
||||||
|
func MakeLoginHandler(svc pb.SessionServiceServer, endpoint gokit_endpoint.Endpoint) *httptransport.Server {
|
||||||
|
return httptransport.NewServer(
|
||||||
|
endpoint,
|
||||||
|
decodeLoginRequest,
|
||||||
|
encodeResponse,
|
||||||
|
[]httptransport.ServerOption{}...,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeLoginRequest(ctx context.Context, r *http.Request) (interface{}, error) {
|
||||||
|
var req pb.LoginRequest
|
||||||
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
|
||||||
|
return json.NewEncoder(w).Encode(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterHandlers(svc pb.SessionServiceServer, mux *http.ServeMux, endpoints endpoints.Endpoints) error {
|
||||||
|
|
||||||
|
log.Println("new HTTP endpoint: \"/Login\" (service=Session)")
|
||||||
|
mux.Handle("/Login", MakeLoginHandler(svc, endpoints.LoginEndpoint))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
19
examples/go-kit/services/session/service.go
Normal file
19
examples/go-kit/services/session/service.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
package sessionsvc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/session/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Service struct{}
|
||||||
|
|
||||||
|
func New() pb.SessionServiceServer {
|
||||||
|
return &Service{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svc *Service) Login(ctx context.Context, in *pb.LoginRequest) (*pb.LoginResponse, error) {
|
||||||
|
return nil, fmt.Errorf("not implemented")
|
||||||
|
}
|
17
examples/go-kit/services/session/session.proto
Normal file
17
examples/go-kit/services/session/session.proto
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package session;
|
||||||
|
|
||||||
|
service SessionService {
|
||||||
|
rpc Login(LoginRequest) returns (LoginResponse) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
message LoginRequest {
|
||||||
|
string username = 1;
|
||||||
|
string password = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message LoginResponse {
|
||||||
|
string token = 1;
|
||||||
|
string err_msg = 2;
|
||||||
|
}
|
0
examples/go-kit/services/sprint/gen/README.md
Normal file
0
examples/go-kit/services/sprint/gen/README.md
Normal file
95
examples/go-kit/services/sprint/gen/client/grpc/client.go
Normal file
95
examples/go-kit/services/sprint/gen/client/grpc/client.go
Normal file
@@ -0,0 +1,95 @@
|
|||||||
|
package sprint_clientgrpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
|
||||||
|
jwt "github.com/go-kit/kit/auth/jwt"
|
||||||
|
"github.com/go-kit/kit/endpoint"
|
||||||
|
"github.com/go-kit/kit/log"
|
||||||
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
func New(conn *grpc.ClientConn, logger log.Logger) pb.SprintServiceServer {
|
||||||
|
|
||||||
|
var addsprintEndpoint endpoint.Endpoint
|
||||||
|
{
|
||||||
|
addsprintEndpoint = grpctransport.NewClient(
|
||||||
|
conn,
|
||||||
|
"sprint.SprintService",
|
||||||
|
"AddSprint",
|
||||||
|
EncodeAddSprintRequest,
|
||||||
|
DecodeAddSprintResponse,
|
||||||
|
pb.AddSprintResponse{},
|
||||||
|
append([]grpctransport.ClientOption{}, grpctransport.ClientBefore(jwt.FromGRPCContext()))...,
|
||||||
|
).Endpoint()
|
||||||
|
}
|
||||||
|
|
||||||
|
var closesprintEndpoint endpoint.Endpoint
|
||||||
|
{
|
||||||
|
closesprintEndpoint = grpctransport.NewClient(
|
||||||
|
conn,
|
||||||
|
"sprint.SprintService",
|
||||||
|
"CloseSprint",
|
||||||
|
EncodeCloseSprintRequest,
|
||||||
|
DecodeCloseSprintResponse,
|
||||||
|
pb.CloseSprintResponse{},
|
||||||
|
append([]grpctransport.ClientOption{}, grpctransport.ClientBefore(jwt.FromGRPCContext()))...,
|
||||||
|
).Endpoint()
|
||||||
|
}
|
||||||
|
|
||||||
|
var getsprintEndpoint endpoint.Endpoint
|
||||||
|
{
|
||||||
|
getsprintEndpoint = grpctransport.NewClient(
|
||||||
|
conn,
|
||||||
|
"sprint.SprintService",
|
||||||
|
"GetSprint",
|
||||||
|
EncodeGetSprintRequest,
|
||||||
|
DecodeGetSprintResponse,
|
||||||
|
pb.GetSprintResponse{},
|
||||||
|
append([]grpctransport.ClientOption{}, grpctransport.ClientBefore(jwt.FromGRPCContext()))...,
|
||||||
|
).Endpoint()
|
||||||
|
}
|
||||||
|
|
||||||
|
return &endpoints.Endpoints{
|
||||||
|
|
||||||
|
AddSprintEndpoint: addsprintEndpoint,
|
||||||
|
|
||||||
|
CloseSprintEndpoint: closesprintEndpoint,
|
||||||
|
|
||||||
|
GetSprintEndpoint: getsprintEndpoint,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func EncodeAddSprintRequest(_ context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.AddSprintRequest)
|
||||||
|
return req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DecodeAddSprintResponse(_ context.Context, grpcResponse interface{}) (interface{}, error) {
|
||||||
|
response := grpcResponse.(*pb.AddSprintResponse)
|
||||||
|
return response, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func EncodeCloseSprintRequest(_ context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.CloseSprintRequest)
|
||||||
|
return req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DecodeCloseSprintResponse(_ context.Context, grpcResponse interface{}) (interface{}, error) {
|
||||||
|
response := grpcResponse.(*pb.CloseSprintResponse)
|
||||||
|
return response, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func EncodeGetSprintRequest(_ context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.GetSprintRequest)
|
||||||
|
return req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DecodeGetSprintResponse(_ context.Context, grpcResponse interface{}) (interface{}, error) {
|
||||||
|
response := grpcResponse.(*pb.GetSprintResponse)
|
||||||
|
return response, nil
|
||||||
|
}
|
92
examples/go-kit/services/sprint/gen/endpoints/endpoints.go
Normal file
92
examples/go-kit/services/sprint/gen/endpoints/endpoints.go
Normal file
@@ -0,0 +1,92 @@
|
|||||||
|
package sprint_endpoints
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/go-kit/kit/endpoint"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
|
oldcontext "golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = endpoint.Chain
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = context.Background
|
||||||
|
|
||||||
|
type StreamEndpoint func(server interface{}, req interface{}) (err error)
|
||||||
|
|
||||||
|
type Endpoints struct {
|
||||||
|
AddSprintEndpoint endpoint.Endpoint
|
||||||
|
|
||||||
|
CloseSprintEndpoint endpoint.Endpoint
|
||||||
|
|
||||||
|
GetSprintEndpoint endpoint.Endpoint
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Endpoints) AddSprint(ctx oldcontext.Context, in *pb.AddSprintRequest) (*pb.AddSprintResponse, error) {
|
||||||
|
out, err := e.AddSprintEndpoint(ctx, in)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.AddSprintResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return out.(*pb.AddSprintResponse), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Endpoints) CloseSprint(ctx oldcontext.Context, in *pb.CloseSprintRequest) (*pb.CloseSprintResponse, error) {
|
||||||
|
out, err := e.CloseSprintEndpoint(ctx, in)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.CloseSprintResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return out.(*pb.CloseSprintResponse), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Endpoints) GetSprint(ctx oldcontext.Context, in *pb.GetSprintRequest) (*pb.GetSprintResponse, error) {
|
||||||
|
out, err := e.GetSprintEndpoint(ctx, in)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.GetSprintResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return out.(*pb.GetSprintResponse), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeAddSprintEndpoint(svc pb.SprintServiceServer) endpoint.Endpoint {
|
||||||
|
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.AddSprintRequest)
|
||||||
|
rep, err := svc.AddSprint(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.AddSprintResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return rep, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeCloseSprintEndpoint(svc pb.SprintServiceServer) endpoint.Endpoint {
|
||||||
|
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.CloseSprintRequest)
|
||||||
|
rep, err := svc.CloseSprint(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.CloseSprintResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return rep, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeGetSprintEndpoint(svc pb.SprintServiceServer) endpoint.Endpoint {
|
||||||
|
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.GetSprintRequest)
|
||||||
|
rep, err := svc.GetSprint(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.GetSprintResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return rep, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeEndpoints(svc pb.SprintServiceServer) Endpoints {
|
||||||
|
return Endpoints{
|
||||||
|
|
||||||
|
AddSprintEndpoint: MakeAddSprintEndpoint(svc),
|
||||||
|
|
||||||
|
CloseSprintEndpoint: MakeCloseSprintEndpoint(svc),
|
||||||
|
|
||||||
|
GetSprintEndpoint: MakeGetSprintEndpoint(svc),
|
||||||
|
}
|
||||||
|
}
|
357
examples/go-kit/services/sprint/gen/pb/pb.go
Normal file
357
examples/go-kit/services/sprint/gen/pb/pb.go
Normal file
@@ -0,0 +1,357 @@
|
|||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: services/sprint/sprint.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package sprint is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
services/sprint/sprint.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
AddSprintRequest
|
||||||
|
AddSprintResponse
|
||||||
|
CloseSprintRequest
|
||||||
|
CloseSprintResponse
|
||||||
|
GetSprintRequest
|
||||||
|
GetSprintResponse
|
||||||
|
Sprint
|
||||||
|
*/
|
||||||
|
package sprint
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "golang.org/x/net/context"
|
||||||
|
grpc "google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||||
|
|
||||||
|
type AddSprintRequest struct {
|
||||||
|
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *AddSprintRequest) Reset() { *m = AddSprintRequest{} }
|
||||||
|
func (m *AddSprintRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*AddSprintRequest) ProtoMessage() {}
|
||||||
|
func (*AddSprintRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func (m *AddSprintRequest) GetName() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Name
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type AddSprintResponse struct {
|
||||||
|
Sprint *Sprint `protobuf:"bytes,1,opt,name=sprint" json:"sprint,omitempty"`
|
||||||
|
ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg" json:"err_msg,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *AddSprintResponse) Reset() { *m = AddSprintResponse{} }
|
||||||
|
func (m *AddSprintResponse) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*AddSprintResponse) ProtoMessage() {}
|
||||||
|
func (*AddSprintResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
||||||
|
|
||||||
|
func (m *AddSprintResponse) GetSprint() *Sprint {
|
||||||
|
if m != nil {
|
||||||
|
return m.Sprint
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *AddSprintResponse) GetErrMsg() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.ErrMsg
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type CloseSprintRequest struct {
|
||||||
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CloseSprintRequest) Reset() { *m = CloseSprintRequest{} }
|
||||||
|
func (m *CloseSprintRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*CloseSprintRequest) ProtoMessage() {}
|
||||||
|
func (*CloseSprintRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
|
||||||
|
|
||||||
|
func (m *CloseSprintRequest) GetId() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Id
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type CloseSprintResponse struct {
|
||||||
|
ErrMsg string `protobuf:"bytes,1,opt,name=err_msg,json=errMsg" json:"err_msg,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CloseSprintResponse) Reset() { *m = CloseSprintResponse{} }
|
||||||
|
func (m *CloseSprintResponse) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*CloseSprintResponse) ProtoMessage() {}
|
||||||
|
func (*CloseSprintResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
|
||||||
|
|
||||||
|
func (m *CloseSprintResponse) GetErrMsg() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.ErrMsg
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetSprintRequest struct {
|
||||||
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetSprintRequest) Reset() { *m = GetSprintRequest{} }
|
||||||
|
func (m *GetSprintRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*GetSprintRequest) ProtoMessage() {}
|
||||||
|
func (*GetSprintRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
|
||||||
|
|
||||||
|
func (m *GetSprintRequest) GetId() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Id
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetSprintResponse struct {
|
||||||
|
Sprint *Sprint `protobuf:"bytes,1,opt,name=sprint" json:"sprint,omitempty"`
|
||||||
|
ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg" json:"err_msg,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetSprintResponse) Reset() { *m = GetSprintResponse{} }
|
||||||
|
func (m *GetSprintResponse) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*GetSprintResponse) ProtoMessage() {}
|
||||||
|
func (*GetSprintResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} }
|
||||||
|
|
||||||
|
func (m *GetSprintResponse) GetSprint() *Sprint {
|
||||||
|
if m != nil {
|
||||||
|
return m.Sprint
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetSprintResponse) GetErrMsg() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.ErrMsg
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type Sprint struct {
|
||||||
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
|
CreatedAt uint32 `protobuf:"varint,2,opt,name=created_at,json=createdAt" json:"created_at,omitempty"`
|
||||||
|
Name string `protobuf:"bytes,3,opt,name=name" json:"name,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Sprint) Reset() { *m = Sprint{} }
|
||||||
|
func (m *Sprint) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*Sprint) ProtoMessage() {}
|
||||||
|
func (*Sprint) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} }
|
||||||
|
|
||||||
|
func (m *Sprint) GetId() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Id
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Sprint) GetCreatedAt() uint32 {
|
||||||
|
if m != nil {
|
||||||
|
return m.CreatedAt
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Sprint) GetName() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Name
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*AddSprintRequest)(nil), "sprint.AddSprintRequest")
|
||||||
|
proto.RegisterType((*AddSprintResponse)(nil), "sprint.AddSprintResponse")
|
||||||
|
proto.RegisterType((*CloseSprintRequest)(nil), "sprint.CloseSprintRequest")
|
||||||
|
proto.RegisterType((*CloseSprintResponse)(nil), "sprint.CloseSprintResponse")
|
||||||
|
proto.RegisterType((*GetSprintRequest)(nil), "sprint.GetSprintRequest")
|
||||||
|
proto.RegisterType((*GetSprintResponse)(nil), "sprint.GetSprintResponse")
|
||||||
|
proto.RegisterType((*Sprint)(nil), "sprint.Sprint")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ context.Context
|
||||||
|
var _ grpc.ClientConn
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the grpc package it is being compiled against.
|
||||||
|
const _ = grpc.SupportPackageIsVersion4
|
||||||
|
|
||||||
|
// Client API for SprintService service
|
||||||
|
|
||||||
|
type SprintServiceClient interface {
|
||||||
|
AddSprint(ctx context.Context, in *AddSprintRequest, opts ...grpc.CallOption) (*AddSprintResponse, error)
|
||||||
|
CloseSprint(ctx context.Context, in *CloseSprintRequest, opts ...grpc.CallOption) (*CloseSprintResponse, error)
|
||||||
|
GetSprint(ctx context.Context, in *GetSprintRequest, opts ...grpc.CallOption) (*GetSprintResponse, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type sprintServiceClient struct {
|
||||||
|
cc *grpc.ClientConn
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewSprintServiceClient(cc *grpc.ClientConn) SprintServiceClient {
|
||||||
|
return &sprintServiceClient{cc}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *sprintServiceClient) AddSprint(ctx context.Context, in *AddSprintRequest, opts ...grpc.CallOption) (*AddSprintResponse, error) {
|
||||||
|
out := new(AddSprintResponse)
|
||||||
|
err := grpc.Invoke(ctx, "/sprint.SprintService/AddSprint", in, out, c.cc, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *sprintServiceClient) CloseSprint(ctx context.Context, in *CloseSprintRequest, opts ...grpc.CallOption) (*CloseSprintResponse, error) {
|
||||||
|
out := new(CloseSprintResponse)
|
||||||
|
err := grpc.Invoke(ctx, "/sprint.SprintService/CloseSprint", in, out, c.cc, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *sprintServiceClient) GetSprint(ctx context.Context, in *GetSprintRequest, opts ...grpc.CallOption) (*GetSprintResponse, error) {
|
||||||
|
out := new(GetSprintResponse)
|
||||||
|
err := grpc.Invoke(ctx, "/sprint.SprintService/GetSprint", in, out, c.cc, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server API for SprintService service
|
||||||
|
|
||||||
|
type SprintServiceServer interface {
|
||||||
|
AddSprint(context.Context, *AddSprintRequest) (*AddSprintResponse, error)
|
||||||
|
CloseSprint(context.Context, *CloseSprintRequest) (*CloseSprintResponse, error)
|
||||||
|
GetSprint(context.Context, *GetSprintRequest) (*GetSprintResponse, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterSprintServiceServer(s *grpc.Server, srv SprintServiceServer) {
|
||||||
|
s.RegisterService(&_SprintService_serviceDesc, srv)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _SprintService_AddSprint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(AddSprintRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(SprintServiceServer).AddSprint(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: "/sprint.SprintService/AddSprint",
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(SprintServiceServer).AddSprint(ctx, req.(*AddSprintRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _SprintService_CloseSprint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(CloseSprintRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(SprintServiceServer).CloseSprint(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: "/sprint.SprintService/CloseSprint",
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(SprintServiceServer).CloseSprint(ctx, req.(*CloseSprintRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _SprintService_GetSprint_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(GetSprintRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(SprintServiceServer).GetSprint(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: "/sprint.SprintService/GetSprint",
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(SprintServiceServer).GetSprint(ctx, req.(*GetSprintRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
var _SprintService_serviceDesc = grpc.ServiceDesc{
|
||||||
|
ServiceName: "sprint.SprintService",
|
||||||
|
HandlerType: (*SprintServiceServer)(nil),
|
||||||
|
Methods: []grpc.MethodDesc{
|
||||||
|
{
|
||||||
|
MethodName: "AddSprint",
|
||||||
|
Handler: _SprintService_AddSprint_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "CloseSprint",
|
||||||
|
Handler: _SprintService_CloseSprint_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "GetSprint",
|
||||||
|
Handler: _SprintService_GetSprint_Handler,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Streams: []grpc.StreamDesc{},
|
||||||
|
Metadata: "services/sprint/sprint.proto",
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("services/sprint/sprint.proto", fileDescriptor0) }
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 290 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xac, 0x52, 0x4d, 0x4b, 0xc3, 0x40,
|
||||||
|
0x10, 0x6d, 0xaa, 0x44, 0x32, 0xa5, 0xa5, 0x1d, 0x0f, 0xc6, 0xa8, 0x20, 0x8b, 0x14, 0x4f, 0x11,
|
||||||
|
0xea, 0x2f, 0x68, 0x3d, 0x28, 0x88, 0x97, 0xb4, 0xf7, 0x12, 0xbb, 0x43, 0x09, 0xd8, 0x24, 0xee,
|
||||||
|
0xac, 0xfe, 0x5f, 0xff, 0x89, 0xb0, 0xbb, 0xcd, 0x57, 0x8b, 0x27, 0x4f, 0xc9, 0xec, 0xbc, 0x7d,
|
||||||
|
0x6f, 0xe6, 0xbd, 0x85, 0x6b, 0x26, 0xf5, 0x9d, 0x6d, 0x88, 0x1f, 0xb8, 0x54, 0x59, 0xae, 0xdd,
|
||||||
|
0x27, 0x2e, 0x55, 0xa1, 0x0b, 0xf4, 0x6d, 0x25, 0xa6, 0x30, 0x9e, 0x4b, 0xb9, 0x34, 0x45, 0x42,
|
||||||
|
0x9f, 0x5f, 0xc4, 0x1a, 0x11, 0x4e, 0xf3, 0x74, 0x47, 0xa1, 0x77, 0xeb, 0xdd, 0x07, 0x89, 0xf9,
|
||||||
|
0x17, 0x2b, 0x98, 0x34, 0x70, 0x5c, 0x16, 0x39, 0x13, 0x4e, 0xc1, 0xd1, 0x18, 0xe8, 0x60, 0x36,
|
||||||
|
0x8a, 0x9d, 0x86, 0xc3, 0xb9, 0x2e, 0x5e, 0xc0, 0x19, 0x29, 0xb5, 0xde, 0xf1, 0x36, 0xec, 0x1b,
|
||||||
|
0x4e, 0x9f, 0x94, 0x7a, 0xe3, 0xad, 0xb8, 0x03, 0x7c, 0xfa, 0x28, 0x98, 0xda, 0xfa, 0x23, 0xe8,
|
||||||
|
0x67, 0xd2, 0xa9, 0xf7, 0x33, 0x29, 0x62, 0x38, 0x6f, 0xa1, 0x9c, 0x7a, 0x83, 0xd5, 0x6b, 0xb1,
|
||||||
|
0x0a, 0x18, 0x3f, 0x93, 0xfe, 0x9b, 0x73, 0x05, 0x93, 0x06, 0xe6, 0xbf, 0xf6, 0x79, 0x05, 0xdf,
|
||||||
|
0x42, 0xbb, 0x7a, 0x78, 0x03, 0xb0, 0x51, 0x94, 0x6a, 0x92, 0xeb, 0x54, 0x9b, 0x5b, 0xc3, 0x24,
|
||||||
|
0x70, 0x27, 0xf3, 0xda, 0xf2, 0x93, 0xda, 0xf2, 0xd9, 0x8f, 0x07, 0x43, 0xcb, 0xb6, 0xb4, 0x49,
|
||||||
|
0xe2, 0x02, 0x82, 0x2a, 0x04, 0x0c, 0xf7, 0xc3, 0x75, 0xf3, 0x8b, 0x2e, 0x8f, 0x74, 0xec, 0x86,
|
||||||
|
0xa2, 0x87, 0x2f, 0x30, 0x68, 0x98, 0x89, 0xd1, 0x1e, 0x7b, 0x98, 0x43, 0x74, 0x75, 0xb4, 0x57,
|
||||||
|
0x31, 0x2d, 0x20, 0xa8, 0x2c, 0xac, 0xa7, 0xe9, 0x3a, 0x5f, 0x4f, 0x73, 0xe0, 0xb7, 0xe8, 0xbd,
|
||||||
|
0xfb, 0xe6, 0x35, 0x3e, 0xfe, 0x06, 0x00, 0x00, 0xff, 0xff, 0xf0, 0x9e, 0xb2, 0x1e, 0xad, 0x02,
|
||||||
|
0x00, 0x00,
|
||||||
|
}
|
109
examples/go-kit/services/sprint/gen/transports/grpc/grpc.go
Normal file
109
examples/go-kit/services/sprint/gen/transports/grpc/grpc.go
Normal file
@@ -0,0 +1,109 @@
|
|||||||
|
package sprint_grpctransport
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
|
oldcontext "golang.org/x/net/context"
|
||||||
|
|
||||||
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
// avoid import errors
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
|
||||||
|
func MakeGRPCServer(endpoints endpoints.Endpoints) pb.SprintServiceServer {
|
||||||
|
var options []grpctransport.ServerOption
|
||||||
|
_ = options
|
||||||
|
return &grpcServer{
|
||||||
|
|
||||||
|
addsprint: grpctransport.NewServer(
|
||||||
|
endpoints.AddSprintEndpoint,
|
||||||
|
decodeRequest,
|
||||||
|
encodeAddSprintResponse,
|
||||||
|
options...,
|
||||||
|
),
|
||||||
|
|
||||||
|
closesprint: grpctransport.NewServer(
|
||||||
|
endpoints.CloseSprintEndpoint,
|
||||||
|
decodeRequest,
|
||||||
|
encodeCloseSprintResponse,
|
||||||
|
options...,
|
||||||
|
),
|
||||||
|
|
||||||
|
getsprint: grpctransport.NewServer(
|
||||||
|
endpoints.GetSprintEndpoint,
|
||||||
|
decodeRequest,
|
||||||
|
encodeGetSprintResponse,
|
||||||
|
options...,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type grpcServer struct {
|
||||||
|
addsprint grpctransport.Handler
|
||||||
|
|
||||||
|
closesprint grpctransport.Handler
|
||||||
|
|
||||||
|
getsprint grpctransport.Handler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *grpcServer) AddSprint(ctx oldcontext.Context, req *pb.AddSprintRequest) (*pb.AddSprintResponse, error) {
|
||||||
|
_, rep, err := s.addsprint.ServeGRPC(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return rep.(*pb.AddSprintResponse), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeAddSprintResponse(ctx context.Context, response interface{}) (interface{}, error) {
|
||||||
|
resp := response.(*pb.AddSprintResponse)
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *grpcServer) CloseSprint(ctx oldcontext.Context, req *pb.CloseSprintRequest) (*pb.CloseSprintResponse, error) {
|
||||||
|
_, rep, err := s.closesprint.ServeGRPC(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return rep.(*pb.CloseSprintResponse), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeCloseSprintResponse(ctx context.Context, response interface{}) (interface{}, error) {
|
||||||
|
resp := response.(*pb.CloseSprintResponse)
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *grpcServer) GetSprint(ctx oldcontext.Context, req *pb.GetSprintRequest) (*pb.GetSprintResponse, error) {
|
||||||
|
_, rep, err := s.getsprint.ServeGRPC(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return rep.(*pb.GetSprintResponse), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeGetSprintResponse(ctx context.Context, response interface{}) (interface{}, error) {
|
||||||
|
resp := response.(*pb.GetSprintResponse)
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeRequest(ctx context.Context, grpcReq interface{}) (interface{}, error) {
|
||||||
|
return grpcReq, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type streamHandler interface {
|
||||||
|
Do(server interface{}, req interface{}) (err error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type server struct {
|
||||||
|
e endpoints.StreamEndpoint
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s server) Do(server interface{}, req interface{}) (err error) {
|
||||||
|
if err := s.e(server, req); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
86
examples/go-kit/services/sprint/gen/transports/http/http.go
Normal file
86
examples/go-kit/services/sprint/gen/transports/http/http.go
Normal file
@@ -0,0 +1,86 @@
|
|||||||
|
package sprint_httptransport
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
||||||
|
httptransport "github.com/go-kit/kit/transport/http"
|
||||||
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/endpoints"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = log.Printf
|
||||||
|
var _ = gokit_endpoint.Chain
|
||||||
|
var _ = httptransport.NewClient
|
||||||
|
|
||||||
|
func MakeAddSprintHandler(svc pb.SprintServiceServer, endpoint gokit_endpoint.Endpoint) *httptransport.Server {
|
||||||
|
return httptransport.NewServer(
|
||||||
|
endpoint,
|
||||||
|
decodeAddSprintRequest,
|
||||||
|
encodeResponse,
|
||||||
|
[]httptransport.ServerOption{}...,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeAddSprintRequest(ctx context.Context, r *http.Request) (interface{}, error) {
|
||||||
|
var req pb.AddSprintRequest
|
||||||
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeCloseSprintHandler(svc pb.SprintServiceServer, endpoint gokit_endpoint.Endpoint) *httptransport.Server {
|
||||||
|
return httptransport.NewServer(
|
||||||
|
endpoint,
|
||||||
|
decodeCloseSprintRequest,
|
||||||
|
encodeResponse,
|
||||||
|
[]httptransport.ServerOption{}...,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeCloseSprintRequest(ctx context.Context, r *http.Request) (interface{}, error) {
|
||||||
|
var req pb.CloseSprintRequest
|
||||||
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeGetSprintHandler(svc pb.SprintServiceServer, endpoint gokit_endpoint.Endpoint) *httptransport.Server {
|
||||||
|
return httptransport.NewServer(
|
||||||
|
endpoint,
|
||||||
|
decodeGetSprintRequest,
|
||||||
|
encodeResponse,
|
||||||
|
[]httptransport.ServerOption{}...,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeGetSprintRequest(ctx context.Context, r *http.Request) (interface{}, error) {
|
||||||
|
var req pb.GetSprintRequest
|
||||||
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
|
||||||
|
return json.NewEncoder(w).Encode(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterHandlers(svc pb.SprintServiceServer, mux *http.ServeMux, endpoints endpoints.Endpoints) error {
|
||||||
|
|
||||||
|
log.Println("new HTTP endpoint: \"/AddSprint\" (service=Sprint)")
|
||||||
|
mux.Handle("/AddSprint", MakeAddSprintHandler(svc, endpoints.AddSprintEndpoint))
|
||||||
|
|
||||||
|
log.Println("new HTTP endpoint: \"/CloseSprint\" (service=Sprint)")
|
||||||
|
mux.Handle("/CloseSprint", MakeCloseSprintHandler(svc, endpoints.CloseSprintEndpoint))
|
||||||
|
|
||||||
|
log.Println("new HTTP endpoint: \"/GetSprint\" (service=Sprint)")
|
||||||
|
mux.Handle("/GetSprint", MakeGetSprintHandler(svc, endpoints.GetSprintEndpoint))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
27
examples/go-kit/services/sprint/service.go
Normal file
27
examples/go-kit/services/sprint/service.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package sprintsvc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/sprint/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Service struct{}
|
||||||
|
|
||||||
|
func New() pb.SprintServiceServer {
|
||||||
|
return &Service{}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svc *Service) AddSprint(ctx context.Context, in *pb.AddSprintRequest) (*pb.AddSprintResponse, error) {
|
||||||
|
return nil, fmt.Errorf("not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svc *Service) CloseSprint(ctx context.Context, in *pb.CloseSprintRequest) (*pb.CloseSprintResponse, error) {
|
||||||
|
return nil, fmt.Errorf("not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svc *Service) GetSprint(ctx context.Context, in *pb.GetSprintRequest) (*pb.GetSprintResponse, error) {
|
||||||
|
return nil, fmt.Errorf("not implemented")
|
||||||
|
}
|
38
examples/go-kit/services/sprint/sprint.proto
Normal file
38
examples/go-kit/services/sprint/sprint.proto
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package sprint;
|
||||||
|
|
||||||
|
service SprintService {
|
||||||
|
rpc AddSprint(AddSprintRequest) returns (AddSprintResponse) {}
|
||||||
|
rpc CloseSprint(CloseSprintRequest) returns (CloseSprintResponse) {}
|
||||||
|
rpc GetSprint(GetSprintRequest) returns (GetSprintResponse) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
message AddSprintRequest {
|
||||||
|
string name = 1;
|
||||||
|
}
|
||||||
|
message AddSprintResponse {
|
||||||
|
Sprint sprint = 1;
|
||||||
|
string err_msg = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message CloseSprintRequest {
|
||||||
|
string id = 1;
|
||||||
|
}
|
||||||
|
message CloseSprintResponse {
|
||||||
|
string err_msg = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetSprintRequest {
|
||||||
|
string id = 1;
|
||||||
|
}
|
||||||
|
message GetSprintResponse {
|
||||||
|
Sprint sprint = 1;
|
||||||
|
string err_msg = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Sprint {
|
||||||
|
string id = 1;
|
||||||
|
uint32 created_at = 2;
|
||||||
|
string name = 3;
|
||||||
|
}
|
0
examples/go-kit/services/user/gen/README.md
Normal file
0
examples/go-kit/services/user/gen/README.md
Normal file
70
examples/go-kit/services/user/gen/client/grpc/client.go
Normal file
70
examples/go-kit/services/user/gen/client/grpc/client.go
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
package user_clientgrpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
|
||||||
|
jwt "github.com/go-kit/kit/auth/jwt"
|
||||||
|
"github.com/go-kit/kit/endpoint"
|
||||||
|
"github.com/go-kit/kit/log"
|
||||||
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
|
||||||
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
func New(conn *grpc.ClientConn, logger log.Logger) pb.UserServiceServer {
|
||||||
|
|
||||||
|
var createuserEndpoint endpoint.Endpoint
|
||||||
|
{
|
||||||
|
createuserEndpoint = grpctransport.NewClient(
|
||||||
|
conn,
|
||||||
|
"user.UserService",
|
||||||
|
"CreateUser",
|
||||||
|
EncodeCreateUserRequest,
|
||||||
|
DecodeCreateUserResponse,
|
||||||
|
pb.CreateUserResponse{},
|
||||||
|
append([]grpctransport.ClientOption{}, grpctransport.ClientBefore(jwt.FromGRPCContext()))...,
|
||||||
|
).Endpoint()
|
||||||
|
}
|
||||||
|
|
||||||
|
var getuserEndpoint endpoint.Endpoint
|
||||||
|
{
|
||||||
|
getuserEndpoint = grpctransport.NewClient(
|
||||||
|
conn,
|
||||||
|
"user.UserService",
|
||||||
|
"GetUser",
|
||||||
|
EncodeGetUserRequest,
|
||||||
|
DecodeGetUserResponse,
|
||||||
|
pb.GetUserResponse{},
|
||||||
|
append([]grpctransport.ClientOption{}, grpctransport.ClientBefore(jwt.FromGRPCContext()))...,
|
||||||
|
).Endpoint()
|
||||||
|
}
|
||||||
|
|
||||||
|
return &endpoints.Endpoints{
|
||||||
|
|
||||||
|
CreateUserEndpoint: createuserEndpoint,
|
||||||
|
|
||||||
|
GetUserEndpoint: getuserEndpoint,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func EncodeCreateUserRequest(_ context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.CreateUserRequest)
|
||||||
|
return req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DecodeCreateUserResponse(_ context.Context, grpcResponse interface{}) (interface{}, error) {
|
||||||
|
response := grpcResponse.(*pb.CreateUserResponse)
|
||||||
|
return response, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func EncodeGetUserRequest(_ context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.GetUserRequest)
|
||||||
|
return req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func DecodeGetUserResponse(_ context.Context, grpcResponse interface{}) (interface{}, error) {
|
||||||
|
response := grpcResponse.(*pb.GetUserResponse)
|
||||||
|
return response, nil
|
||||||
|
}
|
69
examples/go-kit/services/user/gen/endpoints/endpoints.go
Normal file
69
examples/go-kit/services/user/gen/endpoints/endpoints.go
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
package user_endpoints
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"github.com/go-kit/kit/endpoint"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
|
oldcontext "golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = endpoint.Chain
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = context.Background
|
||||||
|
|
||||||
|
type StreamEndpoint func(server interface{}, req interface{}) (err error)
|
||||||
|
|
||||||
|
type Endpoints struct {
|
||||||
|
CreateUserEndpoint endpoint.Endpoint
|
||||||
|
|
||||||
|
GetUserEndpoint endpoint.Endpoint
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Endpoints) CreateUser(ctx oldcontext.Context, in *pb.CreateUserRequest) (*pb.CreateUserResponse, error) {
|
||||||
|
out, err := e.CreateUserEndpoint(ctx, in)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.CreateUserResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return out.(*pb.CreateUserResponse), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func (e *Endpoints) GetUser(ctx oldcontext.Context, in *pb.GetUserRequest) (*pb.GetUserResponse, error) {
|
||||||
|
out, err := e.GetUserEndpoint(ctx, in)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.GetUserResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return out.(*pb.GetUserResponse), err
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeCreateUserEndpoint(svc pb.UserServiceServer) endpoint.Endpoint {
|
||||||
|
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.CreateUserRequest)
|
||||||
|
rep, err := svc.CreateUser(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.CreateUserResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return rep, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeGetUserEndpoint(svc pb.UserServiceServer) endpoint.Endpoint {
|
||||||
|
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.GetUserRequest)
|
||||||
|
rep, err := svc.GetUser(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.GetUserResponse{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return rep, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeEndpoints(svc pb.UserServiceServer) Endpoints {
|
||||||
|
return Endpoints{
|
||||||
|
|
||||||
|
CreateUserEndpoint: MakeCreateUserEndpoint(svc),
|
||||||
|
|
||||||
|
GetUserEndpoint: MakeGetUserEndpoint(svc),
|
||||||
|
}
|
||||||
|
}
|
276
examples/go-kit/services/user/gen/pb/pb.go
Normal file
276
examples/go-kit/services/user/gen/pb/pb.go
Normal file
@@ -0,0 +1,276 @@
|
|||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: services/user/user.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package user is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
services/user/user.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
CreateUserRequest
|
||||||
|
CreateUserResponse
|
||||||
|
GetUserRequest
|
||||||
|
GetUserResponse
|
||||||
|
User
|
||||||
|
*/
|
||||||
|
package user
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "golang.org/x/net/context"
|
||||||
|
grpc "google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||||
|
|
||||||
|
type CreateUserRequest struct {
|
||||||
|
Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CreateUserRequest) Reset() { *m = CreateUserRequest{} }
|
||||||
|
func (m *CreateUserRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*CreateUserRequest) ProtoMessage() {}
|
||||||
|
func (*CreateUserRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func (m *CreateUserRequest) GetName() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Name
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type CreateUserResponse struct {
|
||||||
|
User *User `protobuf:"bytes,1,opt,name=user" json:"user,omitempty"`
|
||||||
|
ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg" json:"err_msg,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CreateUserResponse) Reset() { *m = CreateUserResponse{} }
|
||||||
|
func (m *CreateUserResponse) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*CreateUserResponse) ProtoMessage() {}
|
||||||
|
func (*CreateUserResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
||||||
|
|
||||||
|
func (m *CreateUserResponse) GetUser() *User {
|
||||||
|
if m != nil {
|
||||||
|
return m.User
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *CreateUserResponse) GetErrMsg() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.ErrMsg
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetUserRequest struct {
|
||||||
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetUserRequest) Reset() { *m = GetUserRequest{} }
|
||||||
|
func (m *GetUserRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*GetUserRequest) ProtoMessage() {}
|
||||||
|
func (*GetUserRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
|
||||||
|
|
||||||
|
func (m *GetUserRequest) GetId() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Id
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetUserResponse struct {
|
||||||
|
User *User `protobuf:"bytes,1,opt,name=user" json:"user,omitempty"`
|
||||||
|
ErrMsg string `protobuf:"bytes,2,opt,name=err_msg,json=errMsg" json:"err_msg,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetUserResponse) Reset() { *m = GetUserResponse{} }
|
||||||
|
func (m *GetUserResponse) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*GetUserResponse) ProtoMessage() {}
|
||||||
|
func (*GetUserResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} }
|
||||||
|
|
||||||
|
func (m *GetUserResponse) GetUser() *User {
|
||||||
|
if m != nil {
|
||||||
|
return m.User
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetUserResponse) GetErrMsg() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.ErrMsg
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type User struct {
|
||||||
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
|
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *User) Reset() { *m = User{} }
|
||||||
|
func (m *User) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*User) ProtoMessage() {}
|
||||||
|
func (*User) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} }
|
||||||
|
|
||||||
|
func (m *User) GetId() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Id
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *User) GetName() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Name
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*CreateUserRequest)(nil), "user.CreateUserRequest")
|
||||||
|
proto.RegisterType((*CreateUserResponse)(nil), "user.CreateUserResponse")
|
||||||
|
proto.RegisterType((*GetUserRequest)(nil), "user.GetUserRequest")
|
||||||
|
proto.RegisterType((*GetUserResponse)(nil), "user.GetUserResponse")
|
||||||
|
proto.RegisterType((*User)(nil), "user.User")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ context.Context
|
||||||
|
var _ grpc.ClientConn
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the grpc package it is being compiled against.
|
||||||
|
const _ = grpc.SupportPackageIsVersion4
|
||||||
|
|
||||||
|
// Client API for UserService service
|
||||||
|
|
||||||
|
type UserServiceClient interface {
|
||||||
|
CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*CreateUserResponse, error)
|
||||||
|
GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type userServiceClient struct {
|
||||||
|
cc *grpc.ClientConn
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewUserServiceClient(cc *grpc.ClientConn) UserServiceClient {
|
||||||
|
return &userServiceClient{cc}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *userServiceClient) CreateUser(ctx context.Context, in *CreateUserRequest, opts ...grpc.CallOption) (*CreateUserResponse, error) {
|
||||||
|
out := new(CreateUserResponse)
|
||||||
|
err := grpc.Invoke(ctx, "/user.UserService/CreateUser", in, out, c.cc, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*GetUserResponse, error) {
|
||||||
|
out := new(GetUserResponse)
|
||||||
|
err := grpc.Invoke(ctx, "/user.UserService/GetUser", in, out, c.cc, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server API for UserService service
|
||||||
|
|
||||||
|
type UserServiceServer interface {
|
||||||
|
CreateUser(context.Context, *CreateUserRequest) (*CreateUserResponse, error)
|
||||||
|
GetUser(context.Context, *GetUserRequest) (*GetUserResponse, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterUserServiceServer(s *grpc.Server, srv UserServiceServer) {
|
||||||
|
s.RegisterService(&_UserService_serviceDesc, srv)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _UserService_CreateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(CreateUserRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(UserServiceServer).CreateUser(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: "/user.UserService/CreateUser",
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(UserServiceServer).CreateUser(ctx, req.(*CreateUserRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(GetUserRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(UserServiceServer).GetUser(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: "/user.UserService/GetUser",
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(UserServiceServer).GetUser(ctx, req.(*GetUserRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
var _UserService_serviceDesc = grpc.ServiceDesc{
|
||||||
|
ServiceName: "user.UserService",
|
||||||
|
HandlerType: (*UserServiceServer)(nil),
|
||||||
|
Methods: []grpc.MethodDesc{
|
||||||
|
{
|
||||||
|
MethodName: "CreateUser",
|
||||||
|
Handler: _UserService_CreateUser_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "GetUser",
|
||||||
|
Handler: _UserService_GetUser_Handler,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Streams: []grpc.StreamDesc{},
|
||||||
|
Metadata: "services/user/user.proto",
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("services/user/user.proto", fileDescriptor0) }
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 236 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xe2, 0x92, 0x28, 0x4e, 0x2d, 0x2a,
|
||||||
|
0xcb, 0x4c, 0x4e, 0x2d, 0xd6, 0x2f, 0x2d, 0x4e, 0x2d, 0x02, 0x13, 0x7a, 0x05, 0x45, 0xf9, 0x25,
|
||||||
|
0xf9, 0x42, 0x2c, 0x20, 0xb6, 0x92, 0x3a, 0x97, 0xa0, 0x73, 0x51, 0x6a, 0x62, 0x49, 0x6a, 0x68,
|
||||||
|
0x71, 0x6a, 0x51, 0x50, 0x6a, 0x61, 0x69, 0x6a, 0x71, 0x89, 0x90, 0x10, 0x17, 0x4b, 0x5e, 0x62,
|
||||||
|
0x6e, 0xaa, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x98, 0xad, 0xe4, 0xcb, 0x25, 0x84, 0xac,
|
||||||
|
0xb0, 0xb8, 0x20, 0x3f, 0xaf, 0x38, 0x55, 0x48, 0x8e, 0x0b, 0x6c, 0x0c, 0x58, 0x25, 0xb7, 0x11,
|
||||||
|
0x97, 0x1e, 0xd8, 0x7c, 0xb0, 0x0a, 0xb0, 0xb8, 0x90, 0x38, 0x17, 0x7b, 0x6a, 0x51, 0x51, 0x7c,
|
||||||
|
0x6e, 0x71, 0xba, 0x04, 0x13, 0xd8, 0x30, 0xb6, 0xd4, 0xa2, 0x22, 0xdf, 0xe2, 0x74, 0x25, 0x05,
|
||||||
|
0x2e, 0x3e, 0xf7, 0xd4, 0x12, 0x64, 0x4b, 0xf9, 0xb8, 0x98, 0x32, 0x53, 0xa0, 0x56, 0x32, 0x65,
|
||||||
|
0xa6, 0x28, 0x79, 0x71, 0xf1, 0xc3, 0x55, 0x50, 0x6a, 0x9b, 0x16, 0x17, 0x0b, 0x48, 0x19, 0xba,
|
||||||
|
0x1d, 0x70, 0x8f, 0x32, 0x21, 0x3c, 0x6a, 0xd4, 0xc5, 0xc8, 0xc5, 0x0d, 0x52, 0x1c, 0x0c, 0x09,
|
||||||
|
0x38, 0x21, 0x47, 0x2e, 0x2e, 0x84, 0xc7, 0x85, 0xc4, 0x21, 0x96, 0x62, 0x84, 0x99, 0x94, 0x04,
|
||||||
|
0xa6, 0x04, 0xc4, 0xd5, 0x4a, 0x0c, 0x42, 0x16, 0x5c, 0xec, 0x50, 0xaf, 0x08, 0x89, 0x40, 0x94,
|
||||||
|
0xa1, 0xfa, 0x5d, 0x4a, 0x14, 0x4d, 0x14, 0xa6, 0x33, 0x89, 0x0d, 0x1c, 0x57, 0xc6, 0x80, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0xce, 0xde, 0xa3, 0x2e, 0xc7, 0x01, 0x00, 0x00,
|
||||||
|
}
|
87
examples/go-kit/services/user/gen/transports/grpc/grpc.go
Normal file
87
examples/go-kit/services/user/gen/transports/grpc/grpc.go
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
package user_grpctransport
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
|
oldcontext "golang.org/x/net/context"
|
||||||
|
|
||||||
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
// avoid import errors
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
|
||||||
|
func MakeGRPCServer(endpoints endpoints.Endpoints) pb.UserServiceServer {
|
||||||
|
var options []grpctransport.ServerOption
|
||||||
|
_ = options
|
||||||
|
return &grpcServer{
|
||||||
|
|
||||||
|
createuser: grpctransport.NewServer(
|
||||||
|
endpoints.CreateUserEndpoint,
|
||||||
|
decodeRequest,
|
||||||
|
encodeCreateUserResponse,
|
||||||
|
options...,
|
||||||
|
),
|
||||||
|
|
||||||
|
getuser: grpctransport.NewServer(
|
||||||
|
endpoints.GetUserEndpoint,
|
||||||
|
decodeRequest,
|
||||||
|
encodeGetUserResponse,
|
||||||
|
options...,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type grpcServer struct {
|
||||||
|
createuser grpctransport.Handler
|
||||||
|
|
||||||
|
getuser grpctransport.Handler
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *grpcServer) CreateUser(ctx oldcontext.Context, req *pb.CreateUserRequest) (*pb.CreateUserResponse, error) {
|
||||||
|
_, rep, err := s.createuser.ServeGRPC(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return rep.(*pb.CreateUserResponse), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeCreateUserResponse(ctx context.Context, response interface{}) (interface{}, error) {
|
||||||
|
resp := response.(*pb.CreateUserResponse)
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *grpcServer) GetUser(ctx oldcontext.Context, req *pb.GetUserRequest) (*pb.GetUserResponse, error) {
|
||||||
|
_, rep, err := s.getuser.ServeGRPC(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return rep.(*pb.GetUserResponse), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeGetUserResponse(ctx context.Context, response interface{}) (interface{}, error) {
|
||||||
|
resp := response.(*pb.GetUserResponse)
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeRequest(ctx context.Context, grpcReq interface{}) (interface{}, error) {
|
||||||
|
return grpcReq, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type streamHandler interface {
|
||||||
|
Do(server interface{}, req interface{}) (err error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type server struct {
|
||||||
|
e endpoints.StreamEndpoint
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s server) Do(server interface{}, req interface{}) (err error) {
|
||||||
|
if err := s.e(server, req); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
66
examples/go-kit/services/user/gen/transports/http/http.go
Normal file
66
examples/go-kit/services/user/gen/transports/http/http.go
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
package user_httptransport
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"encoding/json"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
||||||
|
httptransport "github.com/go-kit/kit/transport/http"
|
||||||
|
endpoints "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/endpoints"
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = log.Printf
|
||||||
|
var _ = gokit_endpoint.Chain
|
||||||
|
var _ = httptransport.NewClient
|
||||||
|
|
||||||
|
func MakeCreateUserHandler(svc pb.UserServiceServer, endpoint gokit_endpoint.Endpoint) *httptransport.Server {
|
||||||
|
return httptransport.NewServer(
|
||||||
|
endpoint,
|
||||||
|
decodeCreateUserRequest,
|
||||||
|
encodeResponse,
|
||||||
|
[]httptransport.ServerOption{}...,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeCreateUserRequest(ctx context.Context, r *http.Request) (interface{}, error) {
|
||||||
|
var req pb.CreateUserRequest
|
||||||
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func MakeGetUserHandler(svc pb.UserServiceServer, endpoint gokit_endpoint.Endpoint) *httptransport.Server {
|
||||||
|
return httptransport.NewServer(
|
||||||
|
endpoint,
|
||||||
|
decodeGetUserRequest,
|
||||||
|
encodeResponse,
|
||||||
|
[]httptransport.ServerOption{}...,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func decodeGetUserRequest(ctx context.Context, r *http.Request) (interface{}, error) {
|
||||||
|
var req pb.GetUserRequest
|
||||||
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
|
||||||
|
return json.NewEncoder(w).Encode(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterHandlers(svc pb.UserServiceServer, mux *http.ServeMux, endpoints endpoints.Endpoints) error {
|
||||||
|
|
||||||
|
log.Println("new HTTP endpoint: \"/CreateUser\" (service=User)")
|
||||||
|
mux.Handle("/CreateUser", MakeCreateUserHandler(svc, endpoints.CreateUserEndpoint))
|
||||||
|
|
||||||
|
log.Println("new HTTP endpoint: \"/GetUser\" (service=User)")
|
||||||
|
mux.Handle("/GetUser", MakeGetUserHandler(svc, endpoints.GetUserEndpoint))
|
||||||
|
|
||||||
|
return nil
|
||||||
|
}
|
21
examples/go-kit/services/user/service.go
Normal file
21
examples/go-kit/services/user/service.go
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
package usersvc
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
|
||||||
|
pb "moul.io/protoc-gen-gotemplate/examples/go-kit/services/user/gen/pb"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Service struct{}
|
||||||
|
|
||||||
|
func New() pb.UserServiceServer { return &Service{} }
|
||||||
|
|
||||||
|
func (svc *Service) CreateUser(ctx context.Context, in *pb.CreateUserRequest) (*pb.CreateUserResponse, error) {
|
||||||
|
return nil, fmt.Errorf("not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (svc *Service) GetUser(ctx context.Context, in *pb.GetUserRequest) (*pb.GetUserResponse, error) {
|
||||||
|
return nil, fmt.Errorf("not implemented")
|
||||||
|
}
|
29
examples/go-kit/services/user/user.proto
Normal file
29
examples/go-kit/services/user/user.proto
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package user;
|
||||||
|
|
||||||
|
service UserService {
|
||||||
|
rpc CreateUser(CreateUserRequest) returns (CreateUserResponse) {}
|
||||||
|
rpc GetUser(GetUserRequest) returns (GetUserResponse) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
message CreateUserRequest {
|
||||||
|
string name = 1;
|
||||||
|
}
|
||||||
|
message CreateUserResponse {
|
||||||
|
User user = 1;
|
||||||
|
string err_msg = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message GetUserRequest {
|
||||||
|
string id = 1;
|
||||||
|
}
|
||||||
|
message GetUserResponse {
|
||||||
|
User user = 1;
|
||||||
|
string err_msg = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message User {
|
||||||
|
string id = 1;
|
||||||
|
string name = 2;
|
||||||
|
}
|
@@ -0,0 +1,57 @@
|
|||||||
|
package {{.File.Package}}_clientgrpc
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
|
||||||
|
"github.com/go-kit/kit/log"
|
||||||
|
"google.golang.org/grpc"
|
||||||
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
|
"github.com/go-kit/kit/endpoint"
|
||||||
|
jwt "github.com/go-kit/kit/auth/jwt"
|
||||||
|
|
||||||
|
pb "{{cat .GoPWD "/" .DestinationDir | nospace | clean}}/pb"
|
||||||
|
endpoints "{{cat .GoPWD "/" .DestinationDir | nospace | clean}}/endpoints"
|
||||||
|
)
|
||||||
|
|
||||||
|
{{$file:=.File}}
|
||||||
|
|
||||||
|
func New(conn *grpc.ClientConn, logger log.Logger) pb.{{.File.Package | title}}ServiceServer {
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{if and (not .ServerStreaming) (not .ClientStreaming)}}
|
||||||
|
var {{.Name | lower}}Endpoint endpoint.Endpoint
|
||||||
|
{
|
||||||
|
{{.Name | lower}}Endpoint = grpctransport.NewClient(
|
||||||
|
conn,
|
||||||
|
"{{$file.Package}}.{{$file.Package | title}}Service",
|
||||||
|
"{{.Name}}",
|
||||||
|
Encode{{.Name}}Request,
|
||||||
|
Decode{{.Name}}Response,
|
||||||
|
pb.{{.Name}}Response{},
|
||||||
|
append([]grpctransport.ClientOption{}, grpctransport.ClientBefore(jwt.FromGRPCContext()))...,
|
||||||
|
).Endpoint()
|
||||||
|
}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
return &endpoints.Endpoints {
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{if and (not .ServerStreaming) (not .ClientStreaming)}}
|
||||||
|
{{.Name | title}}Endpoint: {{.Name | lower}}Endpoint,
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{if and (not .ServerStreaming) (not .ClientStreaming)}}
|
||||||
|
func Encode{{.Name}}Request(_ context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.{{.Name}}Request)
|
||||||
|
return req, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func Decode{{.Name}}Response(_ context.Context, grpcResponse interface{}) (interface{}, error) {
|
||||||
|
response := grpcResponse.(*pb.{{.Name}}Response)
|
||||||
|
return response, nil
|
||||||
|
}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
@@ -0,0 +1,89 @@
|
|||||||
|
package {{.File.Package}}_endpoints
|
||||||
|
|
||||||
|
{{$file := .File}}
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
oldcontext "golang.org/x/net/context"
|
||||||
|
pb "{{cat .GoPWD "/" .DestinationDir | nospace | clean}}/pb"
|
||||||
|
"github.com/go-kit/kit/endpoint"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = endpoint.Chain
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = context.Background
|
||||||
|
|
||||||
|
type StreamEndpoint func(server interface{}, req interface{}) (err error)
|
||||||
|
|
||||||
|
type Endpoints struct {
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{if or (.ClientStreaming) (.ServerStreaming)}}
|
||||||
|
{{.Name}}Endpoint StreamEndpoint
|
||||||
|
{{else}}
|
||||||
|
{{.Name}}Endpoint endpoint.Endpoint
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{if .ServerStreaming}}
|
||||||
|
{{if .ClientStreaming}}
|
||||||
|
func (e *Endpoints){{.Name}}(server pb.{{$file.Package | title}}Service_{{.Name}}Server) error {
|
||||||
|
return fmt.Errorf("not implemented")
|
||||||
|
}
|
||||||
|
{{else}}
|
||||||
|
func (e *Endpoints){{.Name}}(in *pb.{{.Name}}Request, server pb.{{$file.Package | title}}Service_{{.Name}}Server) error {
|
||||||
|
return fmt.Errorf("not implemented")
|
||||||
|
}
|
||||||
|
{{end}}
|
||||||
|
{{else}}
|
||||||
|
{{if .ClientStreaming}}
|
||||||
|
func (e *Endpoints){{.Name}}(server pb.{{$file.Package | title}}Service_{{.Name}}Server) error {
|
||||||
|
return fmt.Errorf("not implemented")
|
||||||
|
}
|
||||||
|
{{else}}
|
||||||
|
func (e *Endpoints){{.Name}}(ctx oldcontext.Context, in *pb.{{.InputType | splitArray "." | last}}) (*pb.{{.OutputType | splitArray "." | last}}, error) {
|
||||||
|
out, err := e.{{.Name}}Endpoint(ctx, in)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.{{.OutputType | splitArray "." | last}}{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return out.(*pb.{{.OutputType | splitArray "." | last}}), err
|
||||||
|
}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{if or (.ServerStreaming) (.ClientStreaming)}}
|
||||||
|
func Make{{.Name}}Endpoint(svc pb.{{$file.Package | title}}ServiceServer) StreamEndpoint {
|
||||||
|
return func(server interface{}, request interface{}) error {
|
||||||
|
{{if .ClientStreaming}}
|
||||||
|
return svc.{{.Name}}(server.(pb.{{$file.Package | title}}Service_{{.Name}}Server))
|
||||||
|
{{else}}
|
||||||
|
return svc.{{.Name}}(request.(*pb.{{.Name}}Request), server.(pb.{{$file.Package | title}}Service_{{.Name}}Server))
|
||||||
|
{{end}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{{else}}
|
||||||
|
func Make{{.Name}}Endpoint(svc pb.{{$file.Package | title}}ServiceServer) endpoint.Endpoint {
|
||||||
|
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
||||||
|
req := request.(*pb.{{.InputType | splitArray "." | last}})
|
||||||
|
rep, err := svc.{{.Name}}(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return &pb.{{.OutputType | splitArray "." | last}}{ErrMsg: err.Error()}, err
|
||||||
|
}
|
||||||
|
return rep, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
func MakeEndpoints(svc pb.{{.File.Package | title}}ServiceServer) Endpoints {
|
||||||
|
return Endpoints{
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{.Name}}Endpoint: Make{{.Name}}Endpoint(svc),
|
||||||
|
{{end}}
|
||||||
|
}
|
||||||
|
}
|
@@ -0,0 +1,92 @@
|
|||||||
|
package {{.File.Package}}_grpctransport
|
||||||
|
|
||||||
|
{{$file := .File}}
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "context"
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
oldcontext "golang.org/x/net/context"
|
||||||
|
grpctransport "github.com/go-kit/kit/transport/grpc"
|
||||||
|
|
||||||
|
pb "{{cat .GoPWD "/" .DestinationDir | nospace | clean}}/pb"
|
||||||
|
endpoints "{{cat .GoPWD "/" .DestinationDir | nospace | clean}}/endpoints"
|
||||||
|
)
|
||||||
|
|
||||||
|
// avoid import errors
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
|
||||||
|
func MakeGRPCServer(endpoints endpoints.Endpoints) pb.{{.File.Package | title}}ServiceServer {
|
||||||
|
var options []grpctransport.ServerOption
|
||||||
|
_ = options
|
||||||
|
return &grpcServer{
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{if or (.ClientStreaming) (.ServerStreaming)}}
|
||||||
|
{{.Name | lower}}: &server{
|
||||||
|
e: endpoints.{{.Name}}Endpoint,
|
||||||
|
},
|
||||||
|
{{else}}
|
||||||
|
{{.Name | lower}}: grpctransport.NewServer(
|
||||||
|
endpoints.{{.Name}}Endpoint,
|
||||||
|
decodeRequest,
|
||||||
|
encode{{.Name}}Response,
|
||||||
|
options...,
|
||||||
|
),
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
type grpcServer struct {
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{if or (.ClientStreaming) (.ServerStreaming)}}
|
||||||
|
{{.Name | lower}} streamHandler
|
||||||
|
{{else}}
|
||||||
|
{{.Name | lower}} grpctransport.Handler
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{if .ClientStreaming}}
|
||||||
|
func (s *grpcServer) {{.Name}}(server pb.{{$file.Package | title}}Service_{{.Name}}Server) error {
|
||||||
|
return s.{{.Name | lower}}.Do(server, nil)
|
||||||
|
}
|
||||||
|
{{else if .ServerStreaming}}
|
||||||
|
func (s *grpcServer) {{.Name}}(req *pb.{{.Name}}Request, server pb.{{$file.Package | title}}Service_{{.Name}}Server) error {
|
||||||
|
return s.{{.Name | lower}}.Do(server, req)
|
||||||
|
}
|
||||||
|
{{else}}
|
||||||
|
func (s *grpcServer) {{.Name}}(ctx oldcontext.Context, req *pb.{{.InputType | splitArray "." | last}}) (*pb.{{.OutputType | splitArray "." | last}}, error) {
|
||||||
|
_, rep, err := s.{{.Name | lower}}.ServeGRPC(ctx, req)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return rep.(*pb.{{.OutputType | splitArray "." | last}}), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func encode{{.Name}}Response(ctx context.Context, response interface{}) (interface{}, error) {
|
||||||
|
resp := response.(*pb.{{.OutputType | splitArray "." | last}})
|
||||||
|
return resp, nil
|
||||||
|
}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
func decodeRequest(ctx context.Context, grpcReq interface{}) (interface{}, error) {
|
||||||
|
return grpcReq, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type streamHandler interface{
|
||||||
|
Do(server interface{}, req interface{}) (err error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type server struct {
|
||||||
|
e endpoints.StreamEndpoint
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s server) Do(server interface{}, req interface{}) (err error) {
|
||||||
|
if err := s.e(server, req); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
@@ -0,0 +1,55 @@
|
|||||||
|
package {{.File.Package}}_httptransport
|
||||||
|
|
||||||
|
{{$file := .File}}
|
||||||
|
|
||||||
|
import (
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"encoding/json"
|
||||||
|
"context"
|
||||||
|
|
||||||
|
pb "{{cat .GoPWD "/" .DestinationDir | nospace | clean}}/pb"
|
||||||
|
gokit_endpoint "github.com/go-kit/kit/endpoint"
|
||||||
|
httptransport "github.com/go-kit/kit/transport/http"
|
||||||
|
endpoints "{{cat .GoPWD "/" .DestinationDir | nospace | clean}}/endpoints"
|
||||||
|
)
|
||||||
|
|
||||||
|
var _ = log.Printf
|
||||||
|
var _ = gokit_endpoint.Chain
|
||||||
|
var _ = httptransport.NewClient
|
||||||
|
|
||||||
|
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{if and (not .ServerStreaming) (not .ClientStreaming)}}
|
||||||
|
func Make{{.Name}}Handler(svc pb.{{$file.Package | title}}ServiceServer, endpoint gokit_endpoint.Endpoint) *httptransport.Server {
|
||||||
|
return httptransport.NewServer(
|
||||||
|
endpoint,
|
||||||
|
decode{{.Name}}Request,
|
||||||
|
encodeResponse,
|
||||||
|
[]httptransport.ServerOption{}...,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
func decode{{.Name}}Request(ctx context.Context, r *http.Request) (interface{}, error) {
|
||||||
|
var req pb.{{.InputType | splitArray "." | last}}
|
||||||
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return &req, nil
|
||||||
|
}
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
|
||||||
|
func encodeResponse(ctx context.Context, w http.ResponseWriter, response interface{}) error {
|
||||||
|
return json.NewEncoder(w).Encode(response)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterHandlers(svc pb.{{$file.Package | title}}ServiceServer, mux *http.ServeMux, endpoints endpoints.Endpoints) error {
|
||||||
|
{{range .Service.Method}}
|
||||||
|
{{if and (not .ServerStreaming) (not .ClientStreaming)}}
|
||||||
|
log.Println("new HTTP endpoint: \"/{{.Name}}\" (service={{$file.Package | title}})")
|
||||||
|
mux.Handle("/{{.Name}}", Make{{.Name}}Handler(svc, endpoints.{{.Name}}Endpoint))
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
||||||
|
return nil
|
||||||
|
}
|
0
examples/go.mod
Normal file
0
examples/go.mod
Normal file
@@ -1,7 +1,7 @@
|
|||||||
.PHONY: build
|
.PHONY: build
|
||||||
build:
|
build:
|
||||||
mkdir -p output
|
mkdir -p output
|
||||||
protoc -I. --gotemplate_out=output *.proto
|
protoc -I. --gotemplate_out=template_dir=.,debug=true:. *.proto
|
||||||
|
|
||||||
|
|
||||||
.PHONY: re
|
.PHONY: re
|
58
examples/helpers/example.txt
Normal file
58
examples/helpers/example.txt
Normal file
@@ -0,0 +1,58 @@
|
|||||||
|
# Common variables
|
||||||
|
{{.File.Name}}: helpers.proto
|
||||||
|
{{.File.Name | upper}}: HELPERS.PROTO
|
||||||
|
{{.File.Package | base | replace "." "-"}} dummy
|
||||||
|
{{$packageDir := .File.Name | dir}}{{$packageDir}} .
|
||||||
|
{{$packageName := .File.Name | base | replace ".proto" ""}}{{$packageName}} helpers
|
||||||
|
{{$packageImport := .File.Package | replace "." "_"}}{{$packageImport}} dummy
|
||||||
|
{{$namespacedPackage := .File.Package}}{{$namespacedPackage}} dummy
|
||||||
|
{{$currentFile := .File.Name | getProtoFile}}{{$currentFile}} <nil>
|
||||||
|
{{- /*{{- $currentPackageName := $currentFile.GoPkg.Name}}{{$currentPackageName}}*/}}
|
||||||
|
# TODO: more variables
|
||||||
|
|
||||||
|
# Sprig: strings
|
||||||
|
{{trim " hello "}}: hello
|
||||||
|
{{trimAll "$" "$5.00"}}: 5.00
|
||||||
|
{{trimSuffix "-" "hello-"}}: hello
|
||||||
|
{{upper "hello"}}: HELLO
|
||||||
|
{{lower "HELLO"}}: hello
|
||||||
|
{{title "hello world"}}: Hello World
|
||||||
|
{{untitle "Hello World"}}: hello world
|
||||||
|
{{repeat 3 "hello"}}: hellohellohello
|
||||||
|
{{substr 0 5 "hello world"}}: hello
|
||||||
|
{{nospace "hello w o r l d"}}: helloworld
|
||||||
|
{{trunc 5 "hello world"}}: hello
|
||||||
|
{{abbrev 5 "hello world"}}: he...
|
||||||
|
{{abbrevboth 5 10 "1234 5678 9123"}}: ...5678...
|
||||||
|
{{initials "First Try"}}: FT
|
||||||
|
{{randNumeric 3}}: 528
|
||||||
|
{{- /*{{wrap 80 $someText}}*/}}:
|
||||||
|
{{wrapWith 5 "\t" "Hello World"}}: Hello World
|
||||||
|
{{contains "cat" "catch"}}: true
|
||||||
|
{{hasPrefix "cat" "catch"}}: true
|
||||||
|
{{cat "hello" "beautiful" "world"}}: hello beautiful world
|
||||||
|
{{- /*{{indent 4 $lots_of_text}}*/}}:
|
||||||
|
{{- /*{{indent 4 $lots_of_text}}*/}}:
|
||||||
|
{{"I Am Henry VIII" | replace " " "-"}}: I-Am-Henry-VIII
|
||||||
|
{{len .Service.Method | plural "one anchovy" "many anchovies"}}: many anchovies
|
||||||
|
{{snakecase "FirstName"}}: first_name
|
||||||
|
{{camelcase "http_server"}}: HttpServer
|
||||||
|
{{shuffle "hello"}}: holle
|
||||||
|
{{regexMatch "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}" "test@acme.com"}}: true
|
||||||
|
{{- /*{{regexFindAll "[2,4,6,8]" "123456789"}}*/}}:
|
||||||
|
{{regexFind "[a-zA-Z][1-9]" "abcd1234"}}: d1
|
||||||
|
{{regexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W"}}: -W-xxW-
|
||||||
|
{{regexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "${1}"}}: -${1}-${1}-
|
||||||
|
{{regexSplit "z+" "pizza" -1}}: [pi a]
|
||||||
|
|
||||||
|
# Get one specific method on array method using index
|
||||||
|
{{ index .Service.Method 1 }}: name:"Iii" input_type:".dummy.Dummy2" output_type:".dummy.Dummy1" options:<>
|
||||||
|
|
||||||
|
# Sprig: advanced
|
||||||
|
{{if contains "cat" "catch"}}yes{{else}}no{{end}}: yes
|
||||||
|
{{1 | plural "one anchovy" "many anchovies"}}: one anchovy
|
||||||
|
{{2 | plural "one anchovy" "many anchovies"}}: many anchovies
|
||||||
|
{{3 | plural "one anchovy" "many anchovies"}}: many anchovies
|
||||||
|
|
||||||
|
# TODO: more sprig examples
|
||||||
|
# TODO: all built-in examples
|
59
examples/helpers/example.txt.tmpl
Normal file
59
examples/helpers/example.txt.tmpl
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
# Common variables
|
||||||
|
{{`{{.File.Name}}`}}: {{.File.Name}}
|
||||||
|
{{`{{.File.Name | upper}}`}}: {{.File.Name | upper}}
|
||||||
|
{{`{{.File.Package | base | replace "." "-"}}`}} {{.File.Package | base | replace "." "-"}}
|
||||||
|
{{- /*{{`{{$file := .File}}{{$file}}`}} {{$file := .File}}{{$file}}*/}}
|
||||||
|
{{`{{$packageDir := .File.Name | dir}}{{$packageDir}}`}} {{$packageDir := .File.Name | dir}}{{$packageDir}}
|
||||||
|
{{`{{$packageName := .File.Name | base | replace ".proto" ""}}{{$packageName}}`}} {{$packageName := .File.Name | base | replace ".proto" ""}}{{$packageName}}
|
||||||
|
{{`{{$packageImport := .File.Package | replace "." "_"}}{{$packageImport}}`}} {{$packageImport := .File.Package | replace "." "_"}}{{$packageImport}}
|
||||||
|
{{`{{$namespacedPackage := .File.Package}}{{$namespacedPackage}}`}} {{$namespacedPackage := .File.Package}}{{$namespacedPackage}}
|
||||||
|
{{`{{$currentFile := .File.Name | getProtoFile}}{{$currentFile}}`}} {{$currentFile := .File.Name | getProtoFile}}{{$currentFile}}
|
||||||
|
{{`{{- /*{{- $currentPackageName := $currentFile.GoPkg.Name}}{{$currentPackageName}}*/}}`}} {{- /*{{- $currentPackageName := $currentFile.GoPkg.Name}}{{$currentPackageName}}*/}}
|
||||||
|
# TODO: more variables
|
||||||
|
|
||||||
|
# Sprig: strings
|
||||||
|
{{`{{trim " hello "}}`}}: {{trim " hello "}}
|
||||||
|
{{`{{trimAll "$" "$5.00"}}`}}: {{trimAll "$" "$5.00"}}
|
||||||
|
{{`{{trimSuffix "-" "hello-"}}`}}: {{trimSuffix "-" "hello-"}}
|
||||||
|
{{`{{upper "hello"}}`}}: {{upper "hello"}}
|
||||||
|
{{`{{lower "HELLO"}}`}}: {{lower "HELLO"}}
|
||||||
|
{{`{{title "hello world"}}`}}: {{title "hello world"}}
|
||||||
|
{{`{{untitle "Hello World"}}`}}: {{untitle "Hello World"}}
|
||||||
|
{{`{{repeat 3 "hello"}}`}}: {{repeat 3 "hello"}}
|
||||||
|
{{`{{substr 0 5 "hello world"}}`}}: {{substr 0 5 "hello world"}}
|
||||||
|
{{`{{nospace "hello w o r l d"}}`}}: {{nospace "hello w o r l d"}}
|
||||||
|
{{`{{trunc 5 "hello world"}}`}}: {{trunc 5 "hello world"}}
|
||||||
|
{{`{{abbrev 5 "hello world"}}`}}: {{abbrev 5 "hello world"}}
|
||||||
|
{{`{{abbrevboth 5 10 "1234 5678 9123"}}`}}: {{abbrevboth 5 10 "1234 5678 9123"}}
|
||||||
|
{{`{{initials "First Try"}}`}}: {{initials "First Try"}}
|
||||||
|
{{`{{randNumeric 3}}`}}: {{randNumeric 3}}
|
||||||
|
{{`{{- /*{{wrap 80 $someText}}*/}}`}}: {{- /*{{wrap 80 $someText}}*/}}
|
||||||
|
{{`{{wrapWith 5 "\t" "Hello World"}}`}}: {{wrapWith 5 "\t" "Hello World"}}
|
||||||
|
{{`{{contains "cat" "catch"}}`}}: {{contains "cat" "catch"}}
|
||||||
|
{{`{{hasPrefix "cat" "catch"}}`}}: {{hasPrefix "cat" "catch"}}
|
||||||
|
{{`{{cat "hello" "beautiful" "world"}}`}}: {{cat "hello" "beautiful" "world"}}
|
||||||
|
{{`{{- /*{{indent 4 $lots_of_text}}*/}}`}}: {{- /*{{indent 4 $lots_of_text}}*/}}
|
||||||
|
{{`{{- /*{{indent 4 $lots_of_text}}*/}}`}}: {{- /*{{indent 4 $lots_of_text}}*/}}
|
||||||
|
{{`{{"I Am Henry VIII" | replace " " "-"}}`}}: {{"I Am Henry VIII" | replace " " "-"}}
|
||||||
|
{{`{{len .Service.Method | plural "one anchovy" "many anchovies"}}`}}: {{len .Service.Method | plural "one anchovy" "many anchovies"}}
|
||||||
|
{{`{{snakecase "FirstName"}}`}}: {{snakecase "FirstName"}}
|
||||||
|
{{`{{camelcase "http_server"}}`}}: {{camelcase "http_server"}}
|
||||||
|
{{`{{shuffle "hello"}}`}}: {{shuffle "hello"}}
|
||||||
|
{{`{{regexMatch "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}" "test@acme.com"}}`}}: {{regexMatch "[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}" "test@acme.com"}}
|
||||||
|
{{`{{- /*{{regexFindAll "[2,4,6,8]" "123456789"}}*/}}`}}: {{- /*{{regexFindAll "[2,4,6,8]" "123456789"}}*/}}
|
||||||
|
{{`{{regexFind "[a-zA-Z][1-9]" "abcd1234"}}`}}: {{regexFind "[a-zA-Z][1-9]" "abcd1234"}}
|
||||||
|
{{`{{regexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W"}}`}}: {{regexReplaceAll "a(x*)b" "-ab-axxb-" "${1}W"}}
|
||||||
|
{{`{{regexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "${1}"}}`}}: {{regexReplaceAllLiteral "a(x*)b" "-ab-axxb-" "${1}"}}
|
||||||
|
{{`{{regexSplit "z+" "pizza" -1}}`}}: {{regexSplit "z+" "pizza" -1}}
|
||||||
|
|
||||||
|
# Get one specific method on array method using index
|
||||||
|
{{`{{ index .Service.Method 1 }}`}}: {{ index .Service.Method 1 }}
|
||||||
|
|
||||||
|
# Sprig: advanced
|
||||||
|
{{`{{if contains "cat" "catch"}}yes{{else}}no{{end}}`}}: {{if contains "cat" "catch"}}yes{{else}}no{{end}}
|
||||||
|
{{`{{1 | plural "one anchovy" "many anchovies"}}`}}: {{1 | plural "one anchovy" "many anchovies"}}
|
||||||
|
{{`{{2 | plural "one anchovy" "many anchovies"}}`}}: {{2 | plural "one anchovy" "many anchovies"}}
|
||||||
|
{{`{{3 | plural "one anchovy" "many anchovies"}}`}}: {{3 | plural "one anchovy" "many anchovies"}}
|
||||||
|
|
||||||
|
# TODO: more sprig examples
|
||||||
|
# TODO: all built-in examples
|
25
examples/helpers/helpers.proto
Normal file
25
examples/helpers/helpers.proto
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package dummy;
|
||||||
|
|
||||||
|
option go_package = "moul.io/protoc-gen-gotemplate/examples/helpers";
|
||||||
|
|
||||||
|
message Dummy1 {
|
||||||
|
float aaa = 1;
|
||||||
|
string bbb = 2;
|
||||||
|
int32 ccc = 3;
|
||||||
|
int64 ddd = 4;
|
||||||
|
repeated string eee = 5;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Dummy2 {
|
||||||
|
float fff = 1;
|
||||||
|
Dummy1 ggg = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Dummy3 {}
|
||||||
|
|
||||||
|
service DummyService {
|
||||||
|
rpc Hhh(Dummy1) returns (Dummy2) {}
|
||||||
|
rpc Iii(Dummy2) returns (Dummy1) {}
|
||||||
|
}
|
18
examples/import/Makefile
Normal file
18
examples/import/Makefile
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
mkdir -p output
|
||||||
|
|
||||||
|
# generate pb.go inluding imported proto
|
||||||
|
protoc --go_out=Mproto/common.proto=moul.io/protoc-gen-gotemplate/examples/import/output/models/common:./output proto/article.proto
|
||||||
|
protoc --go_out=,plugins=grpc:./output proto/common.proto
|
||||||
|
|
||||||
|
# build our go file based on our template
|
||||||
|
protoc -I. --gotemplate_out=template_dir=templates,debug=true:output proto/article.proto
|
||||||
|
|
||||||
|
.PHONY: re
|
||||||
|
re: clean build
|
||||||
|
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf output
|
141
examples/import/output/models/article/article.pb.go
Normal file
141
examples/import/output/models/article/article.pb.go
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
|
// source: proto/article.proto
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package article is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
proto/article.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
GetArticleRequest
|
||||||
|
GetArticleResponse
|
||||||
|
Article
|
||||||
|
*/
|
||||||
|
package article
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
import common "moul.io/protoc-gen-gotemplate/examples/import/output/models/common"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||||
|
|
||||||
|
type GetArticleRequest struct {
|
||||||
|
Getarticle *common.GetArticle `protobuf:"bytes,1,opt,name=getarticle" json:"getarticle,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetArticleRequest) Reset() { *m = GetArticleRequest{} }
|
||||||
|
func (m *GetArticleRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*GetArticleRequest) ProtoMessage() {}
|
||||||
|
func (*GetArticleRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func (m *GetArticleRequest) GetGetarticle() *common.GetArticle {
|
||||||
|
if m != nil {
|
||||||
|
return m.Getarticle
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetArticleResponse struct {
|
||||||
|
Article *Article `protobuf:"bytes,1,opt,name=article" json:"article,omitempty"`
|
||||||
|
// The generated output should write []*GetArticleResponse_Storage.Storage for this field.
|
||||||
|
Storages []*GetArticleResponse_Storage `protobuf:"bytes,2,rep,name=storages" json:"storages,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetArticleResponse) Reset() { *m = GetArticleResponse{} }
|
||||||
|
func (m *GetArticleResponse) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*GetArticleResponse) ProtoMessage() {}
|
||||||
|
func (*GetArticleResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
||||||
|
|
||||||
|
func (m *GetArticleResponse) GetArticle() *Article {
|
||||||
|
if m != nil {
|
||||||
|
return m.Article
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetArticleResponse) GetStorages() []*GetArticleResponse_Storage {
|
||||||
|
if m != nil {
|
||||||
|
return m.Storages
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type GetArticleResponse_Storage struct {
|
||||||
|
Code string `protobuf:"bytes,1,opt,name=code" json:"code,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetArticleResponse_Storage) Reset() { *m = GetArticleResponse_Storage{} }
|
||||||
|
func (m *GetArticleResponse_Storage) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*GetArticleResponse_Storage) ProtoMessage() {}
|
||||||
|
func (*GetArticleResponse_Storage) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1, 0} }
|
||||||
|
|
||||||
|
func (m *GetArticleResponse_Storage) GetCode() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Code
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type Article struct {
|
||||||
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
|
Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Article) Reset() { *m = Article{} }
|
||||||
|
func (m *Article) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*Article) ProtoMessage() {}
|
||||||
|
func (*Article) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} }
|
||||||
|
|
||||||
|
func (m *Article) GetId() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Id
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *Article) GetName() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Name
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*GetArticleRequest)(nil), "company.GetArticleRequest")
|
||||||
|
proto.RegisterType((*GetArticleResponse)(nil), "company.GetArticleResponse")
|
||||||
|
proto.RegisterType((*GetArticleResponse_Storage)(nil), "company.GetArticleResponse.Storage")
|
||||||
|
proto.RegisterType((*Article)(nil), "company.Article")
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("proto/article.proto", fileDescriptor0) }
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 256 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x7c, 0x91, 0x41, 0x4b, 0xc4, 0x30,
|
||||||
|
0x10, 0x85, 0x6d, 0x15, 0xab, 0xb3, 0x20, 0x3a, 0x82, 0x94, 0x8a, 0xb0, 0xd4, 0xcb, 0x22, 0x18,
|
||||||
|
0xa1, 0x1e, 0x3d, 0x88, 0x5e, 0x7a, 0xaf, 0x78, 0xf1, 0x56, 0xd3, 0x61, 0x29, 0x6c, 0x3a, 0xb5,
|
||||||
|
0x89, 0x82, 0xff, 0xc6, 0x9f, 0x2a, 0x9b, 0x4c, 0xd7, 0x8a, 0xb2, 0xa7, 0x4e, 0xf3, 0xbe, 0xf7,
|
||||||
|
0xf2, 0xc8, 0xc0, 0x69, 0x3f, 0xb0, 0xe3, 0x9b, 0x7a, 0x70, 0xad, 0x5e, 0x91, 0xf2, 0x7f, 0x98,
|
||||||
|
0x68, 0x36, 0x7d, 0xdd, 0x7d, 0x66, 0x18, 0x54, 0xcd, 0xc6, 0x70, 0x17, 0xc4, 0xbc, 0x84, 0x93,
|
||||||
|
0x92, 0xdc, 0x43, 0x30, 0x54, 0xf4, 0xf6, 0x4e, 0xd6, 0x61, 0x01, 0xb0, 0x24, 0x27, 0x29, 0x69,
|
||||||
|
0x34, 0x8f, 0x16, 0xb3, 0x02, 0x95, 0xf8, 0x26, 0xf8, 0x84, 0xca, 0xbf, 0x22, 0xc0, 0x69, 0x92,
|
||||||
|
0xed, 0xb9, 0xb3, 0x84, 0x57, 0x90, 0xfc, 0xce, 0x39, 0x56, 0x52, 0x47, 0x8d, 0xe8, 0x08, 0xe0,
|
||||||
|
0x3d, 0x1c, 0x58, 0xc7, 0x43, 0xbd, 0x24, 0x9b, 0xc6, 0xf3, 0xdd, 0xc5, 0xac, 0xb8, 0xdc, 0xc0,
|
||||||
|
0x7f, 0xa3, 0xd5, 0x53, 0x60, 0xab, 0x8d, 0x29, 0xbb, 0x80, 0x44, 0x0e, 0x11, 0x61, 0x4f, 0x73,
|
||||||
|
0x13, 0x2e, 0x3d, 0xac, 0xfc, 0x9c, 0x5f, 0x43, 0x22, 0x19, 0x78, 0x04, 0x71, 0xdb, 0x88, 0x18,
|
||||||
|
0xb7, 0xcd, 0x1a, 0xef, 0x6a, 0x43, 0x69, 0x1c, 0xf0, 0xf5, 0x5c, 0x3c, 0x03, 0x48, 0x33, 0xfb,
|
||||||
|
0xa1, 0xb1, 0x04, 0xf8, 0xe9, 0x80, 0xd9, 0xbf, 0xc5, 0xfc, 0xeb, 0x65, 0xe7, 0x5b, 0x4a, 0xe7,
|
||||||
|
0x3b, 0x8f, 0xe9, 0xcb, 0x99, 0xe1, 0x86, 0x56, 0x76, 0x5c, 0xd3, 0x9d, 0x7c, 0x5f, 0xf7, 0xfd,
|
||||||
|
0x4a, 0x6e, 0xbf, 0x03, 0x00, 0x00, 0xff, 0xff, 0x93, 0xb5, 0x4a, 0x95, 0xc6, 0x01, 0x00, 0x00,
|
||||||
|
}
|
69
examples/import/output/models/common/common.pb.go
Normal file
69
examples/import/output/models/common/common.pb.go
Normal file
@@ -0,0 +1,69 @@
|
|||||||
|
// Code generated by protoc-gen-go. DO NOT EDIT.
|
||||||
|
// source: proto/common.proto
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package common is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
proto/common.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
GetArticle
|
||||||
|
*/
|
||||||
|
package common
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||||
|
|
||||||
|
type GetArticle struct {
|
||||||
|
Id string `protobuf:"bytes,1,opt,name=id" json:"id,omitempty"`
|
||||||
|
Tenant string `protobuf:"bytes,2,opt,name=tenant" json:"tenant,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetArticle) Reset() { *m = GetArticle{} }
|
||||||
|
func (m *GetArticle) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*GetArticle) ProtoMessage() {}
|
||||||
|
func (*GetArticle) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func (m *GetArticle) GetId() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Id
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *GetArticle) GetTenant() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Tenant
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*GetArticle)(nil), "common.GetArticle")
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("proto/common.proto", fileDescriptor0) }
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 110 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x12, 0x2a, 0x28, 0xca, 0x2f,
|
||||||
|
0xc9, 0xd7, 0x4f, 0xce, 0xcf, 0xcd, 0xcd, 0xcf, 0xd3, 0x03, 0x73, 0x84, 0xd8, 0x20, 0x3c, 0x25,
|
||||||
|
0x13, 0x2e, 0x2e, 0xf7, 0xd4, 0x12, 0xc7, 0xa2, 0x92, 0xcc, 0xe4, 0x9c, 0x54, 0x21, 0x3e, 0x2e,
|
||||||
|
0xa6, 0xcc, 0x14, 0x09, 0x46, 0x05, 0x46, 0x0d, 0xce, 0x20, 0xa6, 0xcc, 0x14, 0x21, 0x31, 0x2e,
|
||||||
|
0xb6, 0x92, 0xd4, 0xbc, 0xc4, 0xbc, 0x12, 0x09, 0x26, 0xb0, 0x18, 0x94, 0xe7, 0x24, 0x16, 0x25,
|
||||||
|
0x92, 0x9b, 0x9f, 0x92, 0x9a, 0x53, 0x0c, 0x35, 0xd4, 0x1a, 0x42, 0x25, 0xb1, 0x81, 0x0d, 0x37,
|
||||||
|
0x06, 0x04, 0x00, 0x00, 0xff, 0xff, 0x89, 0x5a, 0x1d, 0x73, 0x72, 0x00, 0x00, 0x00,
|
||||||
|
}
|
40
examples/import/output/output.go
Normal file
40
examples/import/output/output.go
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
// Code generated by protoc-gen-gotemplate
|
||||||
|
package company
|
||||||
|
|
||||||
|
import (
|
||||||
|
"moul.io/protoc-gen-gotemplate/examples/import/output/models/article"
|
||||||
|
"moul.io/protoc-gen-gotemplate/examples/import/output/models/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Repository interface {
|
||||||
|
GetArticle(getarticle *common.GetArticle ) (*company.Article, []*company.Storage, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------- Public SDK -----------------------------
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// GetArticle : proto: missing extension proto: missing extension
|
||||||
|
func (sdk *Sdk) GetArticle(ctx context.Context,
|
||||||
|
getarticle *article.GetArticle, token, requestID string)(article *article.Article, storages []*article.GetArticleResponse_Storage, err error) {
|
||||||
|
|
||||||
|
out := &pb.GetArticleResponse{}
|
||||||
|
_ = out
|
||||||
|
|
||||||
|
|
||||||
|
return out.Article, out.Storages, nil
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
31
examples/import/proto/article.proto
Normal file
31
examples/import/proto/article.proto
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package company;
|
||||||
|
|
||||||
|
option go_package = "models/article;article";
|
||||||
|
|
||||||
|
import "proto/common.proto";
|
||||||
|
|
||||||
|
message GetArticleRequest {
|
||||||
|
common.GetArticle getarticle = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
message GetArticleResponse {
|
||||||
|
Article article = 1;
|
||||||
|
|
||||||
|
message Storage {
|
||||||
|
string code = 1;
|
||||||
|
}
|
||||||
|
// The generated output should write []*GetArticleResponse_Storage.Storage for this field.
|
||||||
|
repeated Storage storages = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
message Article{
|
||||||
|
string id = 1;
|
||||||
|
string name = 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
service articlesvc {
|
||||||
|
rpc GetArticle (GetArticleRequest) returns (GetArticleResponse){}
|
||||||
|
}
|
10
examples/import/proto/common.proto
Normal file
10
examples/import/proto/common.proto
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package common;
|
||||||
|
|
||||||
|
option go_package = "models/common;common";
|
||||||
|
|
||||||
|
message GetArticle{
|
||||||
|
string id = 1;
|
||||||
|
string tenant = 2;
|
||||||
|
}
|
41
examples/import/templates/output.go.tmpl
Normal file
41
examples/import/templates/output.go.tmpl
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
// Code generated by protoc-gen-gotemplate
|
||||||
|
{{- $file := .File}}
|
||||||
|
package {{.File.Package}}
|
||||||
|
|
||||||
|
import (
|
||||||
|
"moul.io/protoc-gen-gotemplate/examples/import/output/models/article"
|
||||||
|
"moul.io/protoc-gen-gotemplate/examples/import/output/models/common"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Repository interface {
|
||||||
|
{{range $m := .Service.Method}}{{with $t := $m.InputType | getMessageType $.File}} {{$m.Name}}({{range $f := $t.Field}}{{$f.Name|lowerCamelCase}} {{$f| goTypeWithPackage }} {{end}}) ({{with $out := $m.OutputType | getMessageType $.File}}{{range $f := $out.Field}}{{$f | goTypeWithPackage}}, {{end}}{{end}} error){{end}}{{end}}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
// ------------------------- Public SDK -----------------------------
|
||||||
|
{{$pkg := "pb"}}
|
||||||
|
|
||||||
|
|
||||||
|
{{range $m := .Service.Method}}
|
||||||
|
{{with $t := $m.InputType | getMessageType $.File}}
|
||||||
|
{{if and (not $m.ServerStreaming) (not $m.ClientStreaming)}}
|
||||||
|
{{/* ----------------------------- nominal case ---------------------------- */}}
|
||||||
|
// {{$m.Name}} : {{$m | httpVerb}} {{$m | httpPath}}
|
||||||
|
func (sdk *Sdk) {{$m.Name}}(ctx context.Context, {{if $t.OneofDecl}} req *{{$pkg}}.{{$m.Name}}Request,{{else}}{{range $f := $t.Field}}
|
||||||
|
{{$f.Name|lowerCamelCase}} {{$f| goTypeWithGoPackage $.File}},{{end}}{{end}} token, requestID string)({{with $out := $m.OutputType | getMessageType $.File}}{{range $f := $out.Field}}{{$f.Name|lowerCamelCase}} {{$f | goTypeWithGoPackage $.File}}, {{end}}{{end}}err error) {
|
||||||
|
|
||||||
|
out := &{{$pkg}}.{{$m.Name}}Response{}
|
||||||
|
_ = out
|
||||||
|
|
||||||
|
{{with $out := $m.OutputType | getMessageType $.File}}
|
||||||
|
return {{range $f := $out.Field}}out.{{$f.Name|camelCase}}, {{end}}nil
|
||||||
|
{{end}} {{/* with */}}
|
||||||
|
}
|
||||||
|
|
||||||
|
{{end}} {{/* streaming ifs */}}
|
||||||
|
{{end}}{{end}} {{/* range with */}}
|
10
examples/k8s/Makefile
Normal file
10
examples/k8s/Makefile
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
SOURCES := $(shell find . -name "*.proto" -not -path ./vendor/\*)
|
||||||
|
|
||||||
|
TARGETS_K8S := $(foreach source, $(SOURCES), $(source)_k8s)
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
|
build: $(TARGETS_K8S)
|
||||||
|
|
||||||
|
$(TARGETS_K8S): %_k8s:
|
||||||
|
@mkdir -p $(dir $*)gen
|
||||||
|
protoc $(PROTOC_OPTS) --gotemplate_out=debug=true,template_dir=./templates:$(dir $*)gen "$*"
|
18
examples/k8s/gen/nginx/dpl.yaml
Normal file
18
examples/k8s/gen/nginx/dpl.yaml
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: nginx
|
||||||
|
labels:
|
||||||
|
method: Hello-World-nginx
|
||||||
|
spec:
|
||||||
|
replicas: 3
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: nginx
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
10
examples/k8s/gen/nginx/svc.yaml
Normal file
10
examples/k8s/gen/nginx/svc.yaml
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: nginx
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: nginx
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 80
|
11
examples/k8s/nginx.proto
Normal file
11
examples/k8s/nginx.proto
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package nginx;
|
||||||
|
|
||||||
|
message Empty {
|
||||||
|
}
|
||||||
|
|
||||||
|
service Nginx {
|
||||||
|
rpc Hello(Empty) returns (Empty) {}
|
||||||
|
rpc World(Empty) returns (Empty) {}
|
||||||
|
}
|
18
examples/k8s/templates/{{.File.Package}}/dpl.yaml.tmpl
Normal file
18
examples/k8s/templates/{{.File.Package}}/dpl.yaml.tmpl
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
apiVersion: extensions/v1beta1
|
||||||
|
kind: Deployment
|
||||||
|
metadata:
|
||||||
|
name: {{.File.Package}}
|
||||||
|
labels:
|
||||||
|
method: {{range .Service.Method}}{{.Name}}-{{end}}{{.File.Package}}
|
||||||
|
spec:
|
||||||
|
replicas: 3
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: {{.File.Package}}
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: nginx
|
||||||
|
image: nginx
|
||||||
|
ports:
|
||||||
|
- containerPort: 80
|
10
examples/k8s/templates/{{.File.Package}}/svc.yaml.tmpl
Normal file
10
examples/k8s/templates/{{.File.Package}}/svc.yaml.tmpl
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: Service
|
||||||
|
metadata:
|
||||||
|
name: {{.File.Package}}
|
||||||
|
spec:
|
||||||
|
selector:
|
||||||
|
app: {{.File.Package}}
|
||||||
|
ports:
|
||||||
|
- name: http
|
||||||
|
port: 80
|
26
examples/single-package-mode/Makefile
Normal file
26
examples/single-package-mode/Makefile
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
.PHONY: re
|
||||||
|
re: clean build test
|
||||||
|
|
||||||
|
.PHONY: build
|
||||||
|
build:
|
||||||
|
@mkdir -p output
|
||||||
|
|
||||||
|
@# proto-gen-go
|
||||||
|
protoc -I./proto --go_out=plugins=grpc:output proto/aaa/aaa.proto
|
||||||
|
protoc -I./proto --go_out=plugins=grpc:output proto/bbb/bbb.proto
|
||||||
|
@rm -rf output/aaa output/bbb
|
||||||
|
@mv output/moul.io/protoc-gen-gotemplate/examples/single-package-mode/output/* output/
|
||||||
|
@rm -rf output/github.com
|
||||||
|
|
||||||
|
@# protoc-gen-gotemplate
|
||||||
|
protoc -I./proto --gotemplate_out=template_dir=templates,single-package-mode=true:output proto/bbb/bbb.proto
|
||||||
|
gofmt -w .
|
||||||
|
|
||||||
|
.PHONY: test
|
||||||
|
test:
|
||||||
|
go test -i ./output/...
|
||||||
|
go test -v ./output/...
|
||||||
|
|
||||||
|
.PHONY: clean
|
||||||
|
clean:
|
||||||
|
rm -rf output
|
84
examples/single-package-mode/output/aaa/aaa.pb.go
Normal file
84
examples/single-package-mode/output/aaa/aaa.pb.go
Normal file
@@ -0,0 +1,84 @@
|
|||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: aaa/aaa.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package aaa is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
aaa/aaa.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
AaaRequest
|
||||||
|
AaaReply
|
||||||
|
*/
|
||||||
|
package aaa
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||||
|
|
||||||
|
type AaaRequest struct {
|
||||||
|
Blah string `protobuf:"bytes,1,opt,name=blah" json:"blah,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *AaaRequest) Reset() { *m = AaaRequest{} }
|
||||||
|
func (m *AaaRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*AaaRequest) ProtoMessage() {}
|
||||||
|
func (*AaaRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func (m *AaaRequest) GetBlah() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Blah
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
type AaaReply struct {
|
||||||
|
Error string `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *AaaReply) Reset() { *m = AaaReply{} }
|
||||||
|
func (m *AaaReply) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*AaaReply) ProtoMessage() {}
|
||||||
|
func (*AaaReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
||||||
|
|
||||||
|
func (m *AaaReply) GetError() string {
|
||||||
|
if m != nil {
|
||||||
|
return m.Error
|
||||||
|
}
|
||||||
|
return ""
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*AaaRequest)(nil), "the.aaa.package.AaaRequest")
|
||||||
|
proto.RegisterType((*AaaReply)(nil), "the.aaa.package.AaaReply")
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("aaa/aaa.proto", fileDescriptor0) }
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 172 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x2c, 0x8e, 0x31, 0x0b, 0xc2, 0x30,
|
||||||
|
0x10, 0x46, 0x29, 0xa8, 0x68, 0x40, 0x84, 0xe0, 0xe0, 0x58, 0x3a, 0xb9, 0xa4, 0x19, 0xfc, 0x05,
|
||||||
|
0xba, 0x8b, 0xd0, 0xd1, 0xed, 0x5a, 0x8f, 0xb4, 0x78, 0xe9, 0xc5, 0xf4, 0x02, 0xfa, 0xef, 0xc5,
|
||||||
|
0xd8, 0xed, 0x1e, 0xbc, 0xe3, 0x7b, 0x6a, 0x0b, 0x00, 0x16, 0x00, 0xea, 0x10, 0x59, 0x58, 0xef,
|
||||||
|
0xa4, 0xc7, 0x3a, 0x23, 0x74, 0x4f, 0x70, 0x58, 0x95, 0x4a, 0x9d, 0x01, 0x1a, 0x7c, 0x25, 0x9c,
|
||||||
|
0x44, 0x6b, 0xb5, 0x68, 0x09, 0xfa, 0x43, 0x51, 0x16, 0xc7, 0x4d, 0x93, 0xef, 0xaa, 0x54, 0xeb,
|
||||||
|
0x6c, 0x04, 0xfa, 0xe8, 0xbd, 0x5a, 0x62, 0x8c, 0x1c, 0x67, 0xe1, 0x0f, 0x97, 0xdb, 0xfd, 0xea,
|
||||||
|
0x06, 0xe9, 0x53, 0x5b, 0x77, 0xec, 0xad, 0xe7, 0x44, 0x36, 0xaf, 0x75, 0xc6, 0xe1, 0x68, 0x1c,
|
||||||
|
0x0b, 0xfa, 0x40, 0x20, 0x68, 0xf1, 0x0d, 0x3e, 0x10, 0x4e, 0x76, 0x1a, 0x46, 0x47, 0x68, 0xe6,
|
||||||
|
0x08, 0xe3, 0xf9, 0x81, 0x96, 0x93, 0x84, 0x24, 0xbf, 0xd6, 0x76, 0x95, 0xdf, 0x4f, 0xdf, 0x00,
|
||||||
|
0x00, 0x00, 0xff, 0xff, 0x93, 0x24, 0x48, 0x9c, 0xbd, 0x00, 0x00, 0x00,
|
||||||
|
}
|
200
examples/single-package-mode/output/bbb/bbb.pb.go
Normal file
200
examples/single-package-mode/output/bbb/bbb.pb.go
Normal file
@@ -0,0 +1,200 @@
|
|||||||
|
// Code generated by protoc-gen-go.
|
||||||
|
// source: bbb/bbb.proto
|
||||||
|
// DO NOT EDIT!
|
||||||
|
|
||||||
|
/*
|
||||||
|
Package bbb is a generated protocol buffer package.
|
||||||
|
|
||||||
|
It is generated from these files:
|
||||||
|
bbb/bbb.proto
|
||||||
|
|
||||||
|
It has these top-level messages:
|
||||||
|
BbbRequest
|
||||||
|
BbbReply
|
||||||
|
*/
|
||||||
|
package bbb
|
||||||
|
|
||||||
|
import proto "github.com/golang/protobuf/proto"
|
||||||
|
import fmt "fmt"
|
||||||
|
import math "math"
|
||||||
|
import the_aaa_package "moul.io/protoc-gen-gotemplate/examples/single-package-mode/output/aaa"
|
||||||
|
|
||||||
|
import (
|
||||||
|
context "golang.org/x/net/context"
|
||||||
|
grpc "google.golang.org/grpc"
|
||||||
|
)
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ = proto.Marshal
|
||||||
|
var _ = fmt.Errorf
|
||||||
|
var _ = math.Inf
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the proto package it is being compiled against.
|
||||||
|
// A compilation error at this line likely means your copy of the
|
||||||
|
// proto package needs to be updated.
|
||||||
|
const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package
|
||||||
|
|
||||||
|
type BbbRequest struct {
|
||||||
|
Enable bool `protobuf:"varint,1,opt,name=enable" json:"enable,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *BbbRequest) Reset() { *m = BbbRequest{} }
|
||||||
|
func (m *BbbRequest) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*BbbRequest) ProtoMessage() {}
|
||||||
|
func (*BbbRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} }
|
||||||
|
|
||||||
|
func (m *BbbRequest) GetEnable() bool {
|
||||||
|
if m != nil {
|
||||||
|
return m.Enable
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
type BbbReply struct {
|
||||||
|
Done bool `protobuf:"varint,1,opt,name=done" json:"done,omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (m *BbbReply) Reset() { *m = BbbReply{} }
|
||||||
|
func (m *BbbReply) String() string { return proto.CompactTextString(m) }
|
||||||
|
func (*BbbReply) ProtoMessage() {}
|
||||||
|
func (*BbbReply) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} }
|
||||||
|
|
||||||
|
func (m *BbbReply) GetDone() bool {
|
||||||
|
if m != nil {
|
||||||
|
return m.Done
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() {
|
||||||
|
proto.RegisterType((*BbbRequest)(nil), "the.bbb.package.BbbRequest")
|
||||||
|
proto.RegisterType((*BbbReply)(nil), "the.bbb.package.BbbReply")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reference imports to suppress errors if they are not otherwise used.
|
||||||
|
var _ context.Context
|
||||||
|
var _ grpc.ClientConn
|
||||||
|
|
||||||
|
// This is a compile-time assertion to ensure that this generated file
|
||||||
|
// is compatible with the grpc package it is being compiled against.
|
||||||
|
const _ = grpc.SupportPackageIsVersion4
|
||||||
|
|
||||||
|
// Client API for BbbService service
|
||||||
|
|
||||||
|
type BbbServiceClient interface {
|
||||||
|
Aaa(ctx context.Context, in *the_aaa_package.AaaRequest, opts ...grpc.CallOption) (*the_aaa_package.AaaReply, error)
|
||||||
|
Bbb(ctx context.Context, in *BbbRequest, opts ...grpc.CallOption) (*BbbReply, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
type bbbServiceClient struct {
|
||||||
|
cc *grpc.ClientConn
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewBbbServiceClient(cc *grpc.ClientConn) BbbServiceClient {
|
||||||
|
return &bbbServiceClient{cc}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *bbbServiceClient) Aaa(ctx context.Context, in *the_aaa_package.AaaRequest, opts ...grpc.CallOption) (*the_aaa_package.AaaReply, error) {
|
||||||
|
out := new(the_aaa_package.AaaReply)
|
||||||
|
err := grpc.Invoke(ctx, "/the.bbb.package.BbbService/Aaa", in, out, c.cc, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (c *bbbServiceClient) Bbb(ctx context.Context, in *BbbRequest, opts ...grpc.CallOption) (*BbbReply, error) {
|
||||||
|
out := new(BbbReply)
|
||||||
|
err := grpc.Invoke(ctx, "/the.bbb.package.BbbService/Bbb", in, out, c.cc, opts...)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return out, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// Server API for BbbService service
|
||||||
|
|
||||||
|
type BbbServiceServer interface {
|
||||||
|
Aaa(context.Context, *the_aaa_package.AaaRequest) (*the_aaa_package.AaaReply, error)
|
||||||
|
Bbb(context.Context, *BbbRequest) (*BbbReply, error)
|
||||||
|
}
|
||||||
|
|
||||||
|
func RegisterBbbServiceServer(s *grpc.Server, srv BbbServiceServer) {
|
||||||
|
s.RegisterService(&_BbbService_serviceDesc, srv)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _BbbService_Aaa_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(the_aaa_package.AaaRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(BbbServiceServer).Aaa(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: "/the.bbb.package.BbbService/Aaa",
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(BbbServiceServer).Aaa(ctx, req.(*the_aaa_package.AaaRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
func _BbbService_Bbb_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
|
||||||
|
in := new(BbbRequest)
|
||||||
|
if err := dec(in); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if interceptor == nil {
|
||||||
|
return srv.(BbbServiceServer).Bbb(ctx, in)
|
||||||
|
}
|
||||||
|
info := &grpc.UnaryServerInfo{
|
||||||
|
Server: srv,
|
||||||
|
FullMethod: "/the.bbb.package.BbbService/Bbb",
|
||||||
|
}
|
||||||
|
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
|
||||||
|
return srv.(BbbServiceServer).Bbb(ctx, req.(*BbbRequest))
|
||||||
|
}
|
||||||
|
return interceptor(ctx, in, info, handler)
|
||||||
|
}
|
||||||
|
|
||||||
|
var _BbbService_serviceDesc = grpc.ServiceDesc{
|
||||||
|
ServiceName: "the.bbb.package.BbbService",
|
||||||
|
HandlerType: (*BbbServiceServer)(nil),
|
||||||
|
Methods: []grpc.MethodDesc{
|
||||||
|
{
|
||||||
|
MethodName: "Aaa",
|
||||||
|
Handler: _BbbService_Aaa_Handler,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
MethodName: "Bbb",
|
||||||
|
Handler: _BbbService_Bbb_Handler,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
Streams: []grpc.StreamDesc{},
|
||||||
|
Metadata: "bbb/bbb.proto",
|
||||||
|
}
|
||||||
|
|
||||||
|
func init() { proto.RegisterFile("bbb/bbb.proto", fileDescriptor0) }
|
||||||
|
|
||||||
|
var fileDescriptor0 = []byte{
|
||||||
|
// 242 bytes of a gzipped FileDescriptorProto
|
||||||
|
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x90, 0x41, 0x4b, 0x03, 0x31,
|
||||||
|
0x10, 0x85, 0x59, 0x2a, 0xa5, 0x04, 0x8a, 0x90, 0x83, 0x68, 0x05, 0x91, 0xe2, 0xc1, 0xcb, 0x26,
|
||||||
|
0xa0, 0xe7, 0x1e, 0xba, 0x77, 0x11, 0xea, 0xcd, 0xdb, 0xcc, 0x76, 0x48, 0x17, 0x93, 0x9d, 0xd8,
|
||||||
|
0x9d, 0x88, 0xfd, 0x0b, 0xfe, 0x6a, 0xd9, 0x34, 0xa2, 0x60, 0x6f, 0x19, 0xde, 0xbc, 0xf7, 0xbd,
|
||||||
|
0x8c, 0x9a, 0x23, 0xa2, 0x45, 0x44, 0x13, 0xf7, 0x2c, 0xac, 0xcf, 0x65, 0x47, 0x26, 0x8f, 0xd0,
|
||||||
|
0xbe, 0x81, 0xa3, 0xc5, 0x1c, 0x00, 0x2c, 0x00, 0x1c, 0xf5, 0xe5, 0x9d, 0x52, 0x0d, 0xe2, 0x86,
|
||||||
|
0xde, 0x13, 0x0d, 0xa2, 0x2f, 0xd4, 0x94, 0x7a, 0x40, 0x4f, 0x97, 0xd5, 0x6d, 0x75, 0x3f, 0xdb,
|
||||||
|
0x94, 0x69, 0x79, 0xa3, 0x66, 0x79, 0x2b, 0xfa, 0x83, 0xd6, 0xea, 0x6c, 0xcb, 0xfd, 0xcf, 0x46,
|
||||||
|
0x7e, 0x3f, 0x7c, 0x55, 0x39, 0xe6, 0x85, 0xf6, 0x1f, 0x5d, 0x4b, 0x7a, 0xa5, 0x26, 0x6b, 0x00,
|
||||||
|
0x7d, 0x6d, 0x46, 0x78, 0x66, 0x1d, 0xe1, 0x66, 0x0d, 0x50, 0x50, 0x8b, 0xab, 0xd3, 0xe2, 0x48,
|
||||||
|
0x58, 0xa9, 0x49, 0x83, 0x58, 0xec, 0x7f, 0xba, 0x9b, 0xdf, 0xa6, 0xc5, 0xfe, 0x4f, 0x8c, 0xfe,
|
||||||
|
0xd0, 0x3c, 0xbf, 0x3e, 0xb9, 0x4e, 0x76, 0x09, 0x4d, 0xcb, 0xc1, 0x06, 0x4e, 0xde, 0xe6, 0xbf,
|
||||||
|
0xb6, 0xb5, 0xa3, 0xbe, 0x76, 0x2c, 0x14, 0xa2, 0x07, 0x21, 0x4b, 0x9f, 0x10, 0xa2, 0xa7, 0xc1,
|
||||||
|
0x0e, 0x5d, 0xef, 0x3c, 0xd5, 0x25, 0xa9, 0x0e, 0xbc, 0x25, 0xcb, 0x49, 0x62, 0x92, 0xf1, 0x92,
|
||||||
|
0x38, 0xcd, 0xf6, 0xc7, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xe0, 0xe1, 0x26, 0xcb, 0x5b, 0x01,
|
||||||
|
0x00, 0x00,
|
||||||
|
}
|
19
examples/single-package-mode/output/bbb/service.go
Normal file
19
examples/single-package-mode/output/bbb/service.go
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
// file generated with protoc-gen-gotemplate
|
||||||
|
package bbb
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
|
||||||
|
"moul.io/protoc-gen-gotemplate/examples/single-package-mode/output/aaa"
|
||||||
|
"golang.org/x/net/context"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Service struct{}
|
||||||
|
|
||||||
|
func (service Service) Aaa(ctx context.Context, input *aaa.AaaRequest) (*aaa.AaaReply, error) {
|
||||||
|
return nil, fmt.Errorf("method not implemented")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (service Service) Bbb(ctx context.Context, input *BbbRequest) (*BbbReply, error) {
|
||||||
|
return nil, fmt.Errorf("method not implemented")
|
||||||
|
}
|
12
examples/single-package-mode/proto/aaa/aaa.proto
Normal file
12
examples/single-package-mode/proto/aaa/aaa.proto
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
option go_package = "moul.io/protoc-gen-gotemplate/examples/single-package-mode/output/aaa";
|
||||||
|
|
||||||
|
package the.aaa.package;
|
||||||
|
|
||||||
|
message AaaRequest {
|
||||||
|
string blah = 1;
|
||||||
|
}
|
||||||
|
message AaaReply {
|
||||||
|
string error = 1;
|
||||||
|
}
|
19
examples/single-package-mode/proto/bbb/bbb.proto
Normal file
19
examples/single-package-mode/proto/bbb/bbb.proto
Normal file
@@ -0,0 +1,19 @@
|
|||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package the.bbb.package;
|
||||||
|
|
||||||
|
option go_package = "moul.io/protoc-gen-gotemplate/examples/single-package-mode/output/bbb";
|
||||||
|
|
||||||
|
import "aaa/aaa.proto";
|
||||||
|
|
||||||
|
service BbbService {
|
||||||
|
rpc Aaa(the.aaa.package.AaaRequest) returns (the.aaa.package.AaaReply);
|
||||||
|
rpc Bbb(BbbRequest) returns (BbbReply);
|
||||||
|
}
|
||||||
|
|
||||||
|
message BbbRequest {
|
||||||
|
bool enable = 1;
|
||||||
|
}
|
||||||
|
message BbbReply {
|
||||||
|
bool done = 1;
|
||||||
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user