├── cmd ├── README.md ├── tools │ └── tools.go ├── client │ └── main.go └── server │ └── main.go ├── pkg ├── README.md ├── pbs │ ├── messages.proto │ ├── services.proto │ ├── messages.pb.go │ ├── services_grpc.pb.go │ └── services.pb.go └── serv │ └── serv.go ├── internal └── README.md ├── model └── README.md ├── .gitignore ├── go.mod ├── .github └── workflows │ ├── ci.yml │ └── setup.yml ├── Makefile ├── README.md └── go.sum /cmd/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pkg/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /internal/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /model/README.md: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /pkg/pbs/messages.proto: -------------------------------------------------------------------------------- 1 | syntax="proto3"; 2 | package pkg.pbs; 3 | 4 | option go_package = "github.com/codingpot/server-client-template-go/pkg/pbs"; 5 | 6 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.exe~ 4 | *.dll 5 | *.so 6 | *.dylib 7 | *.zip 8 | 9 | # Test binary, built with `go test -c` 10 | *.test 11 | 12 | # Output of the go coverage tool, specifically when used with LiteIDE 13 | *.out 14 | 15 | # Dependency directories (remove the comment below to include it) 16 | # vendor/ 17 | 18 | .idea/ 19 | -------------------------------------------------------------------------------- /pkg/serv/serv.go: -------------------------------------------------------------------------------- 1 | package serv 2 | 3 | import ( 4 | "context" 5 | 6 | "github.com/codingpot/server-client-template-go/pkg/pbs" 7 | ) 8 | 9 | type Server struct { 10 | pbs.UnimplementedDummyServiceServer 11 | } 12 | 13 | func (s Server) GetHello(ctx context.Context, in *pbs.HelloRequest) (*pbs.HelloResponse, error) { 14 | return &pbs.HelloResponse{ 15 | Body: "World", 16 | }, nil 17 | } 18 | -------------------------------------------------------------------------------- /pkg/pbs/services.proto: -------------------------------------------------------------------------------- 1 | syntax="proto3"; 2 | package pkg.pbs; 3 | 4 | option go_package = "github.com/codingpot/server-client-template-go/pkg/pbs"; 5 | 6 | import "pkg/pbs/messages.proto"; 7 | // please modify the messages, services below 8 | message HelloRequest { string body = 1; } 9 | 10 | message HelloResponse { string body = 1; } 11 | 12 | service DummyService { 13 | rpc GetHello(HelloRequest) returns (HelloResponse) {}; 14 | } -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/codingpot/server-client-template-go 2 | 3 | go 1.16 4 | 5 | require ( 6 | golang.org/x/net v0.0.0-20210525063256-abc453219eb5 // indirect 7 | golang.org/x/sys v0.0.0-20210531225629-47163c9f4e4f // indirect 8 | google.golang.org/genproto v0.0.0-20210524171403-669157292da3 // indirect 9 | google.golang.org/grpc v1.38.0 10 | google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 11 | google.golang.org/protobuf v1.26.0 12 | ) 13 | -------------------------------------------------------------------------------- /.github/workflows/ci.yml: -------------------------------------------------------------------------------- 1 | name: CI 2 | 3 | on: 4 | push: 5 | branches: [main] 6 | pull_request: 7 | workflow_dispatch: 8 | 9 | jobs: 10 | go-build: 11 | if: (github.event.commits[0].message != 'Initial commit') && (github.run_number != 1) 12 | runs-on: ubuntu-latest 13 | steps: 14 | - uses: actions/checkout@v2 15 | - uses: actions/setup-go@v2 16 | with: 17 | go-version: "1.16" 18 | - run: go build -o server cmd/server/main.go 19 | - run: go build -o client cmd/client/main.go 20 | -------------------------------------------------------------------------------- /cmd/tools/tools.go: -------------------------------------------------------------------------------- 1 | // +build tools 2 | 3 | // tools is a special package to capture the following packages into `go.mod`. 4 | // 5 | // These tools are used to generate Go files from Protocol Buffers. 6 | // But, these tools are not used directly in the code. 7 | // That's why we're capturing the packages in this file. 8 | // 9 | // Then, the following command will always install the same versions defined in `go.mod`. 10 | // 11 | // go install google.golang.org/grpc/cmd/protoc-gen-go-grpc google.golang.org/protobuf/cmd/protoc-gen-go 12 | package tools 13 | 14 | import ( 15 | _ "google.golang.org/grpc/cmd/protoc-gen-go-grpc" 16 | _ "google.golang.org/protobuf/cmd/protoc-gen-go" 17 | ) -------------------------------------------------------------------------------- /cmd/client/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "context" 5 | "log" 6 | 7 | "github.com/codingpot/server-client-template-go/pkg/pbs" 8 | 9 | "google.golang.org/grpc" 10 | ) 11 | 12 | func main() { 13 | 14 | var conn *grpc.ClientConn 15 | conn, err := grpc.Dial(":9000", grpc.WithInsecure()) 16 | if err != nil { 17 | log.Fatalf("did not connect: %s", err) 18 | } 19 | defer conn.Close() 20 | 21 | c := pbs.NewDummyServiceClient(conn) 22 | 23 | response, err := c.GetHello(context.Background(), &pbs.HelloRequest{Body: "hello"}) 24 | // response, err := c.GetHello(context.Background(), &pr12er.HelloRequest{Body: "hi server!"}) 25 | if err != nil { 26 | log.Fatalf("Error when calling SayHello: %s", err) 27 | } 28 | log.Printf("Response from server: %s", response) 29 | } 30 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | .DEFAULT_GOAL := all 2 | 3 | PROTOC_VERSION ?= 3.17.2 4 | PROTOC_RELEASE := https://github.com/protocolbuffers/protobuf/releases 5 | PROTO_FILES := $(shell find . -name "*.proto" -type f) 6 | UNAME := $(shell uname) 7 | 8 | .PHONY: install 9 | install: 10 | ifeq ($(UNAME),Darwin) 11 | brew install protobuf 12 | endif 13 | ifeq ($(UNAME), Linux) 14 | curl -LO "$(PROTOC_RELEASE)/download/v$(PROTOC_VERSION)/protoc-$(PROTOC_VERSION)-linux-x86_64.zip" && \ 15 | unzip protoc-$(PROTOC_VERSION)-linux-x86_64.zip -d $${HOME}/.local && \ 16 | export PATH="$${PATH}:$${HOME}/.local/bin" 17 | rm protoc-*.zip 18 | endif 19 | go mod download && grep _ ./cmd/tools/tools.go | cut -d' ' -f2 | sed 's/\r//' | xargs go install -v 20 | 21 | .PHONY: all 22 | all: 23 | mkdir -p ./pkg/pbs/ 24 | protoc \ 25 | --proto_path=. \ 26 | --go_out=. \ 27 | --go_opt=paths=source_relative \ 28 | --go-grpc_out=. \ 29 | --go-grpc_opt=paths=source_relative \ 30 | $(PROTO_FILES) 31 | 32 | .PHONY: clean 33 | clean: 34 | rm -rf ./pkg/pbs/*.pb.go 35 | -------------------------------------------------------------------------------- /cmd/server/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "log" 6 | "net" 7 | 8 | "github.com/codingpot/server-client-template-go/pkg/pbs" 9 | "github.com/codingpot/server-client-template-go/pkg/serv" 10 | 11 | "google.golang.org/grpc" 12 | "google.golang.org/grpc/health" 13 | "google.golang.org/grpc/health/grpc_health_v1" 14 | "google.golang.org/grpc/reflection" 15 | ) 16 | 17 | func main() { 18 | fmt.Printf("gRPC server is listening at 0.0.0.0:%s\n", "9000") 19 | 20 | listener, err := net.Listen("tcp", fmt.Sprintf(":%s", "9000")) 21 | if err != nil { 22 | log.Fatalf("failed to listen: %v", err) 23 | } 24 | 25 | s := serv.Server{} 26 | 27 | grpcServer := grpc.NewServer() 28 | 29 | pbs.RegisterDummyServiceServer(grpcServer, &s) 30 | 31 | healthServer := health.NewServer() 32 | healthServer.SetServingStatus("grpc.health.v1.Health", grpc_health_v1.HealthCheckResponse_SERVING) 33 | grpc_health_v1.RegisterHealthServer(grpcServer, healthServer) 34 | 35 | reflection.Register(grpcServer) 36 | 37 | if err := grpcServer.Serve(listener); err != nil { 38 | log.Fatalf("failed to serve: %s", err) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /pkg/pbs/messages.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // versions: 3 | // protoc-gen-go v1.26.0 4 | // protoc v3.17.2 5 | // source: pkg/pbs/messages.proto 6 | 7 | package pbs 8 | 9 | import ( 10 | protoreflect "google.golang.org/protobuf/reflect/protoreflect" 11 | protoimpl "google.golang.org/protobuf/runtime/protoimpl" 12 | reflect "reflect" 13 | ) 14 | 15 | const ( 16 | // Verify that this generated code is sufficiently up-to-date. 17 | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) 18 | // Verify that runtime/protoimpl is sufficiently up-to-date. 19 | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) 20 | ) 21 | 22 | var File_pkg_pbs_messages_proto protoreflect.FileDescriptor 23 | 24 | var file_pkg_pbs_messages_proto_rawDesc = []byte{ 25 | 0x0a, 0x16, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x73, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 26 | 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x70, 0x6b, 0x67, 0x2e, 0x70, 0x62, 27 | 0x73, 0x42, 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 28 | 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x70, 0x6f, 0x74, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 29 | 0x2d, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 30 | 0x2d, 0x67, 0x6f, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 31 | 0x74, 0x6f, 0x33, 32 | } 33 | 34 | var file_pkg_pbs_messages_proto_goTypes = []interface{}{} 35 | var file_pkg_pbs_messages_proto_depIdxs = []int32{ 36 | 0, // [0:0] is the sub-list for method output_type 37 | 0, // [0:0] is the sub-list for method input_type 38 | 0, // [0:0] is the sub-list for extension type_name 39 | 0, // [0:0] is the sub-list for extension extendee 40 | 0, // [0:0] is the sub-list for field type_name 41 | } 42 | 43 | func init() { file_pkg_pbs_messages_proto_init() } 44 | func file_pkg_pbs_messages_proto_init() { 45 | if File_pkg_pbs_messages_proto != nil { 46 | return 47 | } 48 | type x struct{} 49 | out := protoimpl.TypeBuilder{ 50 | File: protoimpl.DescBuilder{ 51 | GoPackagePath: reflect.TypeOf(x{}).PkgPath(), 52 | RawDescriptor: file_pkg_pbs_messages_proto_rawDesc, 53 | NumEnums: 0, 54 | NumMessages: 0, 55 | NumExtensions: 0, 56 | NumServices: 0, 57 | }, 58 | GoTypes: file_pkg_pbs_messages_proto_goTypes, 59 | DependencyIndexes: file_pkg_pbs_messages_proto_depIdxs, 60 | }.Build() 61 | File_pkg_pbs_messages_proto = out.File 62 | file_pkg_pbs_messages_proto_rawDesc = nil 63 | file_pkg_pbs_messages_proto_goTypes = nil 64 | file_pkg_pbs_messages_proto_depIdxs = nil 65 | } 66 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | [![CI](https://github.com/codingpot/server-client-template-go/actions/workflows/ci.yml/badge.svg)](https://github.com/codingpot/server-client-template-go/actions/workflows/ci.yml) [![Go Report Card](https://goreportcard.com/badge/github.com/codingpot/server-client-template-go)](https://goreportcard.com/report/github.com/codingpot/server-client-template-go) 2 | 3 | # Server & Client Template in Golang (gRPC/protobuf) 4 | 5 | This repository provides server & client boilerplate codes written in golang. The server & client communicated via gRPC/protobuf interface. It's boring to fork the repo and replace all the placeholders to fit your own environment. Instead, this repository give an easy way to **"copy"**. 6 | 7 | # Initial Setup 8 | 9 | 1. Click **"Use this template"** button. 10 | 2. Fill up the name of repository that you want to create. 11 | 3. When the repository is copied over to your place, a `setup` GitHub Action gets triggered. It essentially leaves a `PR` when it is done. 12 | 4. Merge the `PR` named `Initial Setup`. 13 | 5. When the `PR` is done merged, it triggers another `ci` GitHub Action. Wait until it ends. 14 | 6. Run `make install`. You can also specify PROTOC_VERSION if needed like this: 15 | ```shell 16 | PROTOC_VERSION=3.17.0 make install 17 | ``` 18 | 19 | # What can you do with initial setup? 20 | 21 | You can simply ping from a client to server with a dummy message via `DummyService`. 22 | 23 | # What should you do after initial setup? 24 | 25 | 1. Simply define your own protocol buffer services and messages in `/pkg/pbs/`. 26 | 2. Generate `*.pb.go` files via `make clean install all`. 27 | 3. Implement your message receiving logic in `/pkg/serv/`. 28 | 4. Write your own business logic to leverage your own gRPC/protobuf services and messages. 29 | 30 | # Directory Structure 31 | 32 | ``` 33 | |-- .github -- (D)(0) 34 | | 35 | |-- cmd 36 | | |-- client -- (D)(1) 37 | | | 38 | | |-- server -- (D)(2) 39 | | | 40 | | `-- tools -- (D)(3) 41 | | 42 | | 43 | |-- internal -- (D)(4) 44 | | 45 | |-- model -- (D)(5) 46 | | 47 | |-- pkg 48 | | |-- pbs -- (D)(6) 49 | | | 50 | | `-- serv -- (D)(7) 51 | | 52 | `-- Makefile -- (F)(8) 53 | ``` 54 | 55 | _(D) indicates `Directory`, and (F) indicated `File`_ 56 | 57 | 0. Any GitHub Action should go into `.github`. Basic CI workflow is provided. It simply builds `cmd/client/main.go` and `cmd/server/main.go` to check if there is any errors. 58 | 59 | 1. `cmd/client` is for launching Client application. Boilerplate codes for sending out `DummyService`'s `GetHello` rpc is provided. 60 | 61 | 2. `cmd/server` is for launching Server application. Boilerplate codes for set Server and listening on a specific port is provided. 62 | 63 | 3. `cmd/tools` is for listing up any go packages to be included. Boilerplate codes list up `protoc-gen-go-grpc` and `protoc-gen-go`. 64 | 65 | 4. `internal` is an empty as in the initial setup. You can store any business logics for any internal use here. 66 | 67 | 5. `model` is an empty as in the initial setup. You can store any models to work with internal business logics here. 68 | 69 | 6. `pkg/pbs` contains protocol buffer related stuff. Usually files with the extensions of `*.proto`, `*.pb.go` should be stored in here. 70 | 71 | 7. `pkg/serv` is there to handle incoming messages from client to server. 72 | 73 | 8. `Makefile` mainly provides two rules, installing gRPC/protobuf environment via `make install` and generating protobuf into the appropriate folder `pkg/pbs` via `make all`. 74 | -------------------------------------------------------------------------------- /pkg/pbs/services_grpc.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go-grpc. DO NOT EDIT. 2 | 3 | package pbs 4 | 5 | import ( 6 | context "context" 7 | grpc "google.golang.org/grpc" 8 | codes "google.golang.org/grpc/codes" 9 | status "google.golang.org/grpc/status" 10 | ) 11 | 12 | // This is a compile-time assertion to ensure that this generated file 13 | // is compatible with the grpc package it is being compiled against. 14 | // Requires gRPC-Go v1.32.0 or later. 15 | const _ = grpc.SupportPackageIsVersion7 16 | 17 | // DummyServiceClient is the client API for DummyService service. 18 | // 19 | // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. 20 | type DummyServiceClient interface { 21 | GetHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloResponse, error) 22 | } 23 | 24 | type dummyServiceClient struct { 25 | cc grpc.ClientConnInterface 26 | } 27 | 28 | func NewDummyServiceClient(cc grpc.ClientConnInterface) DummyServiceClient { 29 | return &dummyServiceClient{cc} 30 | } 31 | 32 | func (c *dummyServiceClient) GetHello(ctx context.Context, in *HelloRequest, opts ...grpc.CallOption) (*HelloResponse, error) { 33 | out := new(HelloResponse) 34 | err := c.cc.Invoke(ctx, "/pkg.pbs.DummyService/GetHello", in, out, opts...) 35 | if err != nil { 36 | return nil, err 37 | } 38 | return out, nil 39 | } 40 | 41 | // DummyServiceServer is the server API for DummyService service. 42 | // All implementations must embed UnimplementedDummyServiceServer 43 | // for forward compatibility 44 | type DummyServiceServer interface { 45 | GetHello(context.Context, *HelloRequest) (*HelloResponse, error) 46 | mustEmbedUnimplementedDummyServiceServer() 47 | } 48 | 49 | // UnimplementedDummyServiceServer must be embedded to have forward compatible implementations. 50 | type UnimplementedDummyServiceServer struct { 51 | } 52 | 53 | func (UnimplementedDummyServiceServer) GetHello(context.Context, *HelloRequest) (*HelloResponse, error) { 54 | return nil, status.Errorf(codes.Unimplemented, "method GetHello not implemented") 55 | } 56 | func (UnimplementedDummyServiceServer) mustEmbedUnimplementedDummyServiceServer() {} 57 | 58 | // UnsafeDummyServiceServer may be embedded to opt out of forward compatibility for this service. 59 | // Use of this interface is not recommended, as added methods to DummyServiceServer will 60 | // result in compilation errors. 61 | type UnsafeDummyServiceServer interface { 62 | mustEmbedUnimplementedDummyServiceServer() 63 | } 64 | 65 | func RegisterDummyServiceServer(s grpc.ServiceRegistrar, srv DummyServiceServer) { 66 | s.RegisterService(&DummyService_ServiceDesc, srv) 67 | } 68 | 69 | func _DummyService_GetHello_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { 70 | in := new(HelloRequest) 71 | if err := dec(in); err != nil { 72 | return nil, err 73 | } 74 | if interceptor == nil { 75 | return srv.(DummyServiceServer).GetHello(ctx, in) 76 | } 77 | info := &grpc.UnaryServerInfo{ 78 | Server: srv, 79 | FullMethod: "/pkg.pbs.DummyService/GetHello", 80 | } 81 | handler := func(ctx context.Context, req interface{}) (interface{}, error) { 82 | return srv.(DummyServiceServer).GetHello(ctx, req.(*HelloRequest)) 83 | } 84 | return interceptor(ctx, in, info, handler) 85 | } 86 | 87 | // DummyService_ServiceDesc is the grpc.ServiceDesc for DummyService service. 88 | // It's only intended for direct use with grpc.RegisterService, 89 | // and not to be introspected or modified (even as a copy) 90 | var DummyService_ServiceDesc = grpc.ServiceDesc{ 91 | ServiceName: "pkg.pbs.DummyService", 92 | HandlerType: (*DummyServiceServer)(nil), 93 | Methods: []grpc.MethodDesc{ 94 | { 95 | MethodName: "GetHello", 96 | Handler: _DummyService_GetHello_Handler, 97 | }, 98 | }, 99 | Streams: []grpc.StreamDesc{}, 100 | Metadata: "pkg/pbs/services.proto", 101 | } 102 | -------------------------------------------------------------------------------- /.github/workflows/setup.yml: -------------------------------------------------------------------------------- 1 | name: Setup 2 | on: push 3 | 4 | jobs: 5 | setup: 6 | if: (github.event.commits[0].message == 'Initial commit') && (github.run_number == 1) 7 | runs-on: ubuntu-latest 8 | steps: 9 | - name: Set up Python 10 | uses: actions/setup-python@v1 11 | with: 12 | python-version: 3.6 13 | 14 | - name: Set up GO 15 | uses: actions/setup-go@v2 16 | with: 17 | go-version: "1.16" 18 | 19 | - name: Copy Repository Contents 20 | uses: actions/checkout@v2 21 | 22 | - name: remove old files 23 | run: | 24 | rm go.mod go.sum 25 | 26 | - name: modify files 27 | run: | 28 | import re, os 29 | from pathlib import Path 30 | from configparser import ConfigParser 31 | 32 | nwo = os.getenv('GITHUB_REPOSITORY') 33 | username, repo_name = nwo.split('/') 34 | 35 | readme_path = Path('README.md') 36 | serv_path = Path('pkg/serv/serv.go') 37 | msg_path = Path('pkg/pbs/messages.proto') 38 | svc_path = Path('pkg/pbs/services.proto') 39 | server_path = Path('cmd/server/main.go') 40 | client_path = Path('cmd/client/main.go') 41 | 42 | readme = readme_path.read_text().replace('codingpot/server-client-template-go', username + '/' + repo_name) 43 | serv = serv_path.read_text().replace('codingpot/server-client-template-go', username + '/' + repo_name) 44 | msg = msg_path.read_text().replace('codingpot/server-client-template-go', username + '/' + repo_name) 45 | svc = svc_path.read_text().replace('codingpot/server-client-template-go', username + '/' + repo_name) 46 | server = server_path.read_text().replace('codingpot/server-client-template-go', username + '/' + repo_name) 47 | client = client_path.read_text().replace('codingpot/server-client-template-go', username + '/' + repo_name) 48 | 49 | readme_path.write_text(readme) 50 | serv_path.write_text(serv) 51 | msg_path.write_text(msg) 52 | svc_path.write_text(svc) 53 | server_path.write_text(server) 54 | client_path.write_text(client) 55 | shell: python 56 | 57 | - name: get unsername and reponame 58 | env: 59 | ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' 60 | run: | 61 | export username="$(cut -d'/' -f1 <<<$GITHUB_REPOSITORY)" 62 | export repo_name="$(cut -d'/' -f2 <<<$GITHUB_REPOSITORY)" 63 | echo "::set-env name=username::$username" 64 | echo "::set-env name=repo_name::$repo_name" 65 | 66 | - name: go mod && tidy 67 | env: 68 | ACTIONS_ALLOW_UNSECURE_COMMANDS: 'true' 69 | run: | 70 | echo github.com/$username/$repo_name 71 | go mod init github.com/$username/$repo_name 72 | go mod tidy 73 | 74 | - name: protoc 75 | run: | 76 | make clean 77 | make install all 78 | 79 | - name: commit changes 80 | run: | 81 | git config --global user.email "${GH_EMAIL}" 82 | git config --global user.name "${GH_USERNAME}" 83 | git checkout -B automated-setup 84 | git rm .github/workflows/setup.yml 85 | git add go.mod go.sum 86 | git add . 87 | git commit -m'setup repo' 88 | git push -f --set-upstream origin automated-setup 89 | env: 90 | GH_EMAIL: ${{ github.event.commits[0].author.email }} 91 | GH_USERNAME: ${{ github.event.commits[0].author.username }} 92 | 93 | - name: Open a PR 94 | uses: actions/github-script@0.5.0 95 | with: 96 | github-token: ${{ secrets.GITHUB_TOKEN }} 97 | script: | 98 | var fs = require('fs'); 99 | var contents = 'your initial PR'; 100 | github.pulls.create({ 101 | owner: context.repo.owner, 102 | repo: context.repo.repo, 103 | title: 'Initial Setup', 104 | head: 'automated-setup', 105 | base: 'main', 106 | body: `${contents}` 107 | }); 108 | -------------------------------------------------------------------------------- /pkg/pbs/services.pb.go: -------------------------------------------------------------------------------- 1 | // Code generated by protoc-gen-go. DO NOT EDIT. 2 | // versions: 3 | // protoc-gen-go v1.26.0 4 | // protoc v3.17.2 5 | // source: pkg/pbs/services.proto 6 | 7 | package pbs 8 | 9 | import ( 10 | protoreflect "google.golang.org/protobuf/reflect/protoreflect" 11 | protoimpl "google.golang.org/protobuf/runtime/protoimpl" 12 | reflect "reflect" 13 | sync "sync" 14 | ) 15 | 16 | const ( 17 | // Verify that this generated code is sufficiently up-to-date. 18 | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion) 19 | // Verify that runtime/protoimpl is sufficiently up-to-date. 20 | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) 21 | ) 22 | 23 | // please modify the messages, services below 24 | type HelloRequest struct { 25 | state protoimpl.MessageState 26 | sizeCache protoimpl.SizeCache 27 | unknownFields protoimpl.UnknownFields 28 | 29 | Body string `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` 30 | } 31 | 32 | func (x *HelloRequest) Reset() { 33 | *x = HelloRequest{} 34 | if protoimpl.UnsafeEnabled { 35 | mi := &file_pkg_pbs_services_proto_msgTypes[0] 36 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 37 | ms.StoreMessageInfo(mi) 38 | } 39 | } 40 | 41 | func (x *HelloRequest) String() string { 42 | return protoimpl.X.MessageStringOf(x) 43 | } 44 | 45 | func (*HelloRequest) ProtoMessage() {} 46 | 47 | func (x *HelloRequest) ProtoReflect() protoreflect.Message { 48 | mi := &file_pkg_pbs_services_proto_msgTypes[0] 49 | if protoimpl.UnsafeEnabled && x != nil { 50 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 51 | if ms.LoadMessageInfo() == nil { 52 | ms.StoreMessageInfo(mi) 53 | } 54 | return ms 55 | } 56 | return mi.MessageOf(x) 57 | } 58 | 59 | // Deprecated: Use HelloRequest.ProtoReflect.Descriptor instead. 60 | func (*HelloRequest) Descriptor() ([]byte, []int) { 61 | return file_pkg_pbs_services_proto_rawDescGZIP(), []int{0} 62 | } 63 | 64 | func (x *HelloRequest) GetBody() string { 65 | if x != nil { 66 | return x.Body 67 | } 68 | return "" 69 | } 70 | 71 | type HelloResponse struct { 72 | state protoimpl.MessageState 73 | sizeCache protoimpl.SizeCache 74 | unknownFields protoimpl.UnknownFields 75 | 76 | Body string `protobuf:"bytes,1,opt,name=body,proto3" json:"body,omitempty"` 77 | } 78 | 79 | func (x *HelloResponse) Reset() { 80 | *x = HelloResponse{} 81 | if protoimpl.UnsafeEnabled { 82 | mi := &file_pkg_pbs_services_proto_msgTypes[1] 83 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 84 | ms.StoreMessageInfo(mi) 85 | } 86 | } 87 | 88 | func (x *HelloResponse) String() string { 89 | return protoimpl.X.MessageStringOf(x) 90 | } 91 | 92 | func (*HelloResponse) ProtoMessage() {} 93 | 94 | func (x *HelloResponse) ProtoReflect() protoreflect.Message { 95 | mi := &file_pkg_pbs_services_proto_msgTypes[1] 96 | if protoimpl.UnsafeEnabled && x != nil { 97 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) 98 | if ms.LoadMessageInfo() == nil { 99 | ms.StoreMessageInfo(mi) 100 | } 101 | return ms 102 | } 103 | return mi.MessageOf(x) 104 | } 105 | 106 | // Deprecated: Use HelloResponse.ProtoReflect.Descriptor instead. 107 | func (*HelloResponse) Descriptor() ([]byte, []int) { 108 | return file_pkg_pbs_services_proto_rawDescGZIP(), []int{1} 109 | } 110 | 111 | func (x *HelloResponse) GetBody() string { 112 | if x != nil { 113 | return x.Body 114 | } 115 | return "" 116 | } 117 | 118 | var File_pkg_pbs_services_proto protoreflect.FileDescriptor 119 | 120 | var file_pkg_pbs_services_proto_rawDesc = []byte{ 121 | 0x0a, 0x16, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x73, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 122 | 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x07, 0x70, 0x6b, 0x67, 0x2e, 0x70, 0x62, 123 | 0x73, 0x1a, 0x16, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x73, 0x2f, 0x6d, 0x65, 0x73, 0x73, 0x61, 124 | 0x67, 0x65, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x22, 0x0a, 0x0c, 0x48, 0x65, 0x6c, 125 | 0x6c, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x62, 0x6f, 0x64, 126 | 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x22, 0x23, 0x0a, 127 | 0x0d, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 128 | 0x0a, 0x04, 0x62, 0x6f, 0x64, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x62, 0x6f, 129 | 0x64, 0x79, 0x32, 0x4b, 0x0a, 0x0c, 0x44, 0x75, 0x6d, 0x6d, 0x79, 0x53, 0x65, 0x72, 0x76, 0x69, 130 | 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x12, 0x15, 131 | 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x70, 0x62, 0x73, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 132 | 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x70, 0x6b, 0x67, 0x2e, 0x70, 0x62, 0x73, 0x2e, 133 | 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 134 | 0x38, 0x5a, 0x36, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 135 | 0x64, 0x69, 0x6e, 0x67, 0x70, 0x6f, 0x74, 0x2f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x2d, 0x63, 136 | 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2d, 0x74, 0x65, 0x6d, 0x70, 0x6c, 0x61, 0x74, 0x65, 0x2d, 0x67, 137 | 0x6f, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x70, 0x62, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 138 | 0x33, 139 | } 140 | 141 | var ( 142 | file_pkg_pbs_services_proto_rawDescOnce sync.Once 143 | file_pkg_pbs_services_proto_rawDescData = file_pkg_pbs_services_proto_rawDesc 144 | ) 145 | 146 | func file_pkg_pbs_services_proto_rawDescGZIP() []byte { 147 | file_pkg_pbs_services_proto_rawDescOnce.Do(func() { 148 | file_pkg_pbs_services_proto_rawDescData = protoimpl.X.CompressGZIP(file_pkg_pbs_services_proto_rawDescData) 149 | }) 150 | return file_pkg_pbs_services_proto_rawDescData 151 | } 152 | 153 | var file_pkg_pbs_services_proto_msgTypes = make([]protoimpl.MessageInfo, 2) 154 | var file_pkg_pbs_services_proto_goTypes = []interface{}{ 155 | (*HelloRequest)(nil), // 0: pkg.pbs.HelloRequest 156 | (*HelloResponse)(nil), // 1: pkg.pbs.HelloResponse 157 | } 158 | var file_pkg_pbs_services_proto_depIdxs = []int32{ 159 | 0, // 0: pkg.pbs.DummyService.GetHello:input_type -> pkg.pbs.HelloRequest 160 | 1, // 1: pkg.pbs.DummyService.GetHello:output_type -> pkg.pbs.HelloResponse 161 | 1, // [1:2] is the sub-list for method output_type 162 | 0, // [0:1] is the sub-list for method input_type 163 | 0, // [0:0] is the sub-list for extension type_name 164 | 0, // [0:0] is the sub-list for extension extendee 165 | 0, // [0:0] is the sub-list for field type_name 166 | } 167 | 168 | func init() { file_pkg_pbs_services_proto_init() } 169 | func file_pkg_pbs_services_proto_init() { 170 | if File_pkg_pbs_services_proto != nil { 171 | return 172 | } 173 | file_pkg_pbs_messages_proto_init() 174 | if !protoimpl.UnsafeEnabled { 175 | file_pkg_pbs_services_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { 176 | switch v := v.(*HelloRequest); i { 177 | case 0: 178 | return &v.state 179 | case 1: 180 | return &v.sizeCache 181 | case 2: 182 | return &v.unknownFields 183 | default: 184 | return nil 185 | } 186 | } 187 | file_pkg_pbs_services_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { 188 | switch v := v.(*HelloResponse); i { 189 | case 0: 190 | return &v.state 191 | case 1: 192 | return &v.sizeCache 193 | case 2: 194 | return &v.unknownFields 195 | default: 196 | return nil 197 | } 198 | } 199 | } 200 | type x struct{} 201 | out := protoimpl.TypeBuilder{ 202 | File: protoimpl.DescBuilder{ 203 | GoPackagePath: reflect.TypeOf(x{}).PkgPath(), 204 | RawDescriptor: file_pkg_pbs_services_proto_rawDesc, 205 | NumEnums: 0, 206 | NumMessages: 2, 207 | NumExtensions: 0, 208 | NumServices: 1, 209 | }, 210 | GoTypes: file_pkg_pbs_services_proto_goTypes, 211 | DependencyIndexes: file_pkg_pbs_services_proto_depIdxs, 212 | MessageInfos: file_pkg_pbs_services_proto_msgTypes, 213 | }.Build() 214 | File_pkg_pbs_services_proto = out.File 215 | file_pkg_pbs_services_proto_rawDesc = nil 216 | file_pkg_pbs_services_proto_goTypes = nil 217 | file_pkg_pbs_services_proto_depIdxs = nil 218 | } 219 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= 2 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= 3 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= 4 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= 5 | github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk= 6 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 7 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 8 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 9 | github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= 10 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= 11 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= 12 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= 13 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 14 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 15 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= 16 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= 17 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= 18 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= 19 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= 20 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= 21 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8= 22 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 23 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= 24 | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= 25 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= 26 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= 27 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 28 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= 29 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 30 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 31 | github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= 32 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 33 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 34 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 35 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= 36 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= 37 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= 38 | github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= 39 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= 40 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= 41 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 42 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= 43 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= 44 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= 45 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= 46 | golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= 47 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg= 48 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= 49 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 50 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 51 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= 52 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 53 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= 54 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= 55 | golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= 56 | golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= 57 | golang.org/x/net v0.0.0-20210525063256-abc453219eb5 h1:wjuX4b5yYQnEQHzd+CBcrcC6OVR2J1CN6mUy0oSxIPo= 58 | golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 59 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= 60 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 61 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 62 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 63 | golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= 64 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 65 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= 66 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 67 | golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 68 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 69 | golang.org/x/sys v0.0.0-20210119212857-b64e53b001e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 70 | golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 71 | golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 72 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 73 | golang.org/x/sys v0.0.0-20210531225629-47163c9f4e4f h1:+Ii8opn6u9IsmvA8n/o8/AnDBQ3kxJne3HZxBhdZd9A= 74 | golang.org/x/sys v0.0.0-20210531225629-47163c9f4e4f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= 75 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 76 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= 77 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 78 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 79 | golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= 80 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 81 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 82 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 83 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= 84 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= 85 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= 86 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= 87 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= 88 | golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= 89 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 90 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 91 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 92 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1 h1:go1bK/D/BFZV2I8cIQd1NKEZ+0owSTG1fDTci4IqFcE= 93 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 94 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM= 95 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= 96 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= 97 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= 98 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo= 99 | google.golang.org/genproto v0.0.0-20210524171403-669157292da3 h1:xFyh6GBb+NO1L0xqb978I3sBPQpk6FrKO0jJGRvdj/0= 100 | google.golang.org/genproto v0.0.0-20210524171403-669157292da3/go.mod h1:P3QM42oQyzQSnHPnZ/vqoCdDmzH28fzWByN9asMeM8A= 101 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c= 102 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg= 103 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY= 104 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk= 105 | google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= 106 | google.golang.org/grpc v1.38.0 h1:/9BgsAsa5nWe26HqOlvlgJnqBuktYOLCgjCPqsa56W0= 107 | google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= 108 | google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= 109 | google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= 110 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= 111 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= 112 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= 113 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= 114 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= 115 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 116 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 117 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= 118 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= 119 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= 120 | google.golang.org/protobuf v1.26.0 h1:bxAC2xTBsZGibn2RTntX0oH50xLsqy1OxA9tTL3p/lk= 121 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= 122 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= 123 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= 124 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 125 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= 126 | --------------------------------------------------------------------------------