├── .gitignore
├── buf.work.yaml
├── README.md
├── third_party
├── embed.go
└── OpenAPI
│ ├── favicon-16x16.png
│ ├── favicon-32x32.png
│ ├── index.html
│ ├── oauth2-redirect.html
│ ├── users
│ └── v1
│ │ └── users.swagger.json
│ └── LICENSE
├── proto
├── buf.lock
├── buf.yaml
└── users
│ └── v1
│ ├── users.proto
│ ├── usersv1connect
│ └── users.connect.go
│ ├── users_grpc.pb.go
│ ├── users.pb.go
│ └── usersv1gateway
│ └── users.pb.gw.go
├── Makefile
├── go.mod
├── LICENSE
├── buf.gen.yaml
├── main.go
├── server
└── server.go
└── go.sum
/.gitignore:
--------------------------------------------------------------------------------
1 | .vscode
--------------------------------------------------------------------------------
/buf.work.yaml:
--------------------------------------------------------------------------------
1 | version: v1
2 | directories:
3 | - proto
4 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # connect-gateway-example
2 | Example of using the gRPC-Gateway with Connect
3 |
--------------------------------------------------------------------------------
/third_party/embed.go:
--------------------------------------------------------------------------------
1 | package third_party
2 |
3 | import (
4 | "embed"
5 | )
6 |
7 | //go:embed OpenAPI/*
8 | var OpenAPI embed.FS
9 |
--------------------------------------------------------------------------------
/third_party/OpenAPI/favicon-16x16.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johanbrandhorst/connect-gateway-example/HEAD/third_party/OpenAPI/favicon-16x16.png
--------------------------------------------------------------------------------
/third_party/OpenAPI/favicon-32x32.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/johanbrandhorst/connect-gateway-example/HEAD/third_party/OpenAPI/favicon-32x32.png
--------------------------------------------------------------------------------
/proto/buf.lock:
--------------------------------------------------------------------------------
1 | # Generated by buf. DO NOT EDIT.
2 | version: v1
3 | deps:
4 | - remote: buf.build
5 | owner: googleapis
6 | repository: googleapis
7 | commit: 8d7204855ec14631a499bd7393ce1970
8 |
--------------------------------------------------------------------------------
/proto/buf.yaml:
--------------------------------------------------------------------------------
1 | version: v1
2 | name: buf.build/johan/connect-gateway-example
3 | deps:
4 | - buf.build/googleapis/googleapis
5 | lint:
6 | use:
7 | - DEFAULT
8 | ignore_only:
9 | RPC_REQUEST_RESPONSE_UNIQUE:
10 | - users/v1/users.proto
11 | RPC_RESPONSE_STANDARD_NAME:
12 | - users/v1/users.proto
13 |
--------------------------------------------------------------------------------
/Makefile:
--------------------------------------------------------------------------------
1 | BUF_VERSION:=1.4.0
2 |
3 | install:
4 | go install github.com/bufbuild/buf/cmd/buf@v$(BUF_VERSION)
5 |
6 | format:
7 | @buf format -w
8 |
9 | generate:
10 | @buf generate
11 |
12 | lint:
13 | @buf lint
14 | @buf breaking --against 'https://github.com/johanbrandhorst/connect-gateway-example.git#branch=master'
15 |
16 | .PHONY: install format generate lint
17 |
--------------------------------------------------------------------------------
/go.mod:
--------------------------------------------------------------------------------
1 | module github.com/johanbrandhorst/connect-gateway-example
2 |
3 | go 1.18
4 |
5 | require (
6 | github.com/bufbuild/connect-go v0.1.0
7 | github.com/gofrs/uuid v4.2.0+incompatible
8 | github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0
9 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4
10 | google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83
11 | google.golang.org/grpc v1.40.0
12 | google.golang.org/protobuf v1.28.0
13 | )
14 |
15 | require (
16 | github.com/golang/protobuf v1.5.2 // indirect
17 | golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 // indirect
18 | golang.org/x/text v0.3.5 // indirect
19 | )
20 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2022 Johan Brandhorst-Satzkorn
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/buf.gen.yaml:
--------------------------------------------------------------------------------
1 | version: v1
2 | managed:
3 | enabled: true
4 | go_package_prefix:
5 | default: github.com/johanbrandhorst/connect-gateway-example/proto
6 | except:
7 | - buf.build/googleapis/googleapis
8 | plugins:
9 | - remote: buf.build/protocolbuffers/plugins/go:v1.28.0-1
10 | out: proto
11 | opt:
12 | - paths=source_relative
13 | - remote: buf.build/bufbuild/plugins/connect-go:v0.1.0-1
14 | out: proto
15 | opt:
16 | - paths=source_relative
17 | - remote: buf.build/grpc/plugins/go:v1.2.0-1
18 | out: proto
19 | opt:
20 | - paths=source_relative
21 | - require_unimplemented_servers=false
22 | - remote: buf.build/grpc-ecosystem/plugins/grpc-gateway:v2.10.2-1
23 | # Note: This is a super hacky way to get the gateway generator
24 | # to output into a separate directory. Do not try this at home.
25 | out: proto/users/v1/usersv1gateway
26 | opt:
27 | - paths=import
28 | - module=github.com/johanbrandhorst/connect-gateway-example/proto/users/v1
29 | - standalone=true
30 | - remote: buf.build/grpc-ecosystem/plugins/openapiv2:v2.10.2-1
31 | out: third_party/OpenAPI
32 | opt:
33 | - json_names_for_fields=false
34 |
--------------------------------------------------------------------------------
/proto/users/v1/users.proto:
--------------------------------------------------------------------------------
1 | syntax = "proto3";
2 |
3 | package users.v1;
4 |
5 | import "google/protobuf/timestamp.proto";
6 | import "google/protobuf/field_mask.proto";
7 | import "google/api/annotations.proto";
8 |
9 | service UserService {
10 | rpc AddUser(AddUserRequest) returns (User) {
11 | option (google.api.http) = {
12 | post: "/api/v1/users"
13 | body: "*"
14 | };
15 | }
16 | rpc GetUser(GetUserRequest) returns (User) {
17 | option (google.api.http) = {
18 | get: "/api/v1/users/{id}"
19 | };
20 | }
21 | rpc ListUsers(ListUsersRequest) returns (stream User) {
22 | option (google.api.http) = {
23 | get: "/api/v1/users"
24 | };
25 | }
26 | rpc UpdateUser(UpdateUserRequest) returns (User) {
27 | option (google.api.http) = {
28 | patch: "/api/v1/user/{user.id}"
29 | body: "user"
30 | };
31 | }
32 | }
33 |
34 | message AddUserRequest {
35 | string email = 1;
36 | }
37 |
38 | message GetUserRequest {
39 | string id = 1;
40 | }
41 |
42 | message ListUsersRequest {}
43 |
44 | message UpdateUserRequest {
45 | User user = 1;
46 | google.protobuf.FieldMask update_mask = 2;
47 | }
48 |
49 | message User {
50 | // Id uniquely identifies a user. Output only.
51 | string id = 1;
52 | string email = 2;
53 | // Output only.
54 | google.protobuf.Timestamp create_time = 3;
55 | }
56 |
--------------------------------------------------------------------------------
/third_party/OpenAPI/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | Swagger UI
7 |
8 |
9 |
10 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
59 |
60 |
61 |
--------------------------------------------------------------------------------
/main.go:
--------------------------------------------------------------------------------
1 | package main
2 |
3 | import (
4 | "context"
5 | "fmt"
6 | "io/fs"
7 | "io/ioutil"
8 | "log"
9 | "mime"
10 | "net/http"
11 | "os"
12 |
13 | "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
14 | "github.com/johanbrandhorst/connect-gateway-example/proto/users/v1/usersv1connect"
15 | usersv1 "github.com/johanbrandhorst/connect-gateway-example/proto/users/v1/usersv1gateway"
16 | "github.com/johanbrandhorst/connect-gateway-example/server"
17 | "github.com/johanbrandhorst/connect-gateway-example/third_party"
18 | "golang.org/x/net/http2"
19 | "golang.org/x/net/http2/h2c"
20 | "google.golang.org/grpc"
21 | "google.golang.org/grpc/grpclog"
22 | "google.golang.org/protobuf/encoding/protojson"
23 | )
24 |
25 | func main() {
26 | if err := run(); err != nil {
27 | log.Fatalln(err)
28 | }
29 | }
30 |
31 | // getOpenAPIHandler serves an OpenAPI UI.
32 | // Adapted from https://github.com/philips/grpc-gateway-example/blob/a269bcb5931ca92be0ceae6130ac27ae89582ecc/cmd/serve.go#L63
33 | func getOpenAPIHandler() http.Handler {
34 | mime.AddExtensionType(".svg", "image/svg+xml")
35 | // Use subdirectory in embedded files
36 | subFS, err := fs.Sub(third_party.OpenAPI, "OpenAPI")
37 | if err != nil {
38 | panic("couldn't create sub filesystem: " + err.Error())
39 | }
40 | return http.FileServer(http.FS(subFS))
41 | }
42 |
43 | func run() error {
44 | log := grpclog.NewLoggerV2(os.Stdout, ioutil.Discard, ioutil.Discard)
45 | grpclog.SetLoggerV2(log)
46 |
47 | addr := "0.0.0.0:8080"
48 | // Note: this will succeed asynchronously, once we've started the server below.
49 | conn, err := grpc.DialContext(
50 | context.Background(),
51 | "dns:///"+addr,
52 | grpc.WithInsecure(),
53 | )
54 | if err != nil {
55 | return fmt.Errorf("failed to dial server: %w", err)
56 | }
57 |
58 | gwmux := runtime.NewServeMux(
59 | runtime.WithMarshalerOption("*", &runtime.HTTPBodyMarshaler{
60 | Marshaler: &runtime.JSONPb{
61 | MarshalOptions: protojson.MarshalOptions{UseProtoNames: true},
62 | },
63 | }),
64 | )
65 | err = usersv1.RegisterUserServiceHandler(context.Background(), gwmux, conn)
66 | if err != nil {
67 | return fmt.Errorf("failed to register gateway: %w", err)
68 | }
69 |
70 | mux := http.NewServeMux()
71 | mux.Handle("/", getOpenAPIHandler())
72 | mux.Handle(usersv1connect.NewUserServiceHandler(server.New()))
73 | mux.Handle("/api/v1/", gwmux)
74 | server := &http.Server{
75 | Addr: addr,
76 | Handler: h2c.NewHandler(mux, &http2.Server{}),
77 | }
78 |
79 | log.Info("Serving Connect, gRPC-Gateway and OpenAPI Documentation on http://", addr)
80 | return server.ListenAndServe()
81 | }
82 |
--------------------------------------------------------------------------------
/third_party/OpenAPI/oauth2-redirect.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | Swagger UI: OAuth2 Redirect
5 |
6 |
7 |
8 |
9 |
75 |
--------------------------------------------------------------------------------
/server/server.go:
--------------------------------------------------------------------------------
1 | package server
2 |
3 | import (
4 | "context"
5 | "sync"
6 | "fmt"
7 |
8 | connect "github.com/bufbuild/connect-go"
9 | "github.com/gofrs/uuid"
10 | usersv1 "github.com/johanbrandhorst/connect-gateway-example/proto/users/v1"
11 | "google.golang.org/protobuf/types/known/timestamppb"
12 | )
13 |
14 | // Backend implements the protobuf interface
15 | type Backend struct {
16 | mu *sync.RWMutex
17 | users []*usersv1.User
18 | }
19 |
20 | // New initializes a new Backend struct.
21 | func New() *Backend {
22 | return &Backend{
23 | mu: &sync.RWMutex{},
24 | }
25 | }
26 |
27 | // AddUser adds a user to the in-memory store.
28 | func (b *Backend) AddUser(ctx context.Context, req *connect.Request[usersv1.AddUserRequest]) (*connect.Response[usersv1.User], error) {
29 | b.mu.Lock()
30 | defer b.mu.Unlock()
31 |
32 | user := &usersv1.User{
33 | Id: uuid.Must(uuid.NewV4()).String(),
34 | Email: req.Msg.GetEmail(),
35 | CreateTime: timestamppb.Now(),
36 | }
37 | b.users = append(b.users, user)
38 |
39 | return connect.NewResponse(user), nil
40 | }
41 |
42 | // GetUser gets a user from the store.
43 | func (b *Backend) GetUser(ctx context.Context, req *connect.Request[usersv1.GetUserRequest]) (*connect.Response[usersv1.User], error) {
44 | b.mu.RLock()
45 | defer b.mu.RUnlock()
46 |
47 | for _, user := range b.users {
48 | if user.Id == req.Msg.GetId() {
49 | return connect.NewResponse(user), nil
50 | }
51 | }
52 |
53 | return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("user with ID %q could not be found", req.Msg.GetId()))
54 | }
55 |
56 | // ListUsers lists all users in the store.
57 | func (b *Backend) ListUsers(ctx context.Context, req *connect.Request[usersv1.ListUsersRequest], srv *connect.ServerStream[usersv1.User]) error {
58 | b.mu.RLock()
59 | defer b.mu.RUnlock()
60 |
61 | for _, user := range b.users {
62 | err := srv.Send(user)
63 | if err != nil {
64 | return err
65 | }
66 | }
67 |
68 | return nil
69 | }
70 |
71 | // UpdateUser updates properties on a user.
72 | func (b *Backend) UpdateUser(ctx context.Context, req *connect.Request[usersv1.UpdateUserRequest]) (*connect.Response[usersv1.User], error) {
73 | b.mu.Lock()
74 | defer b.mu.Unlock()
75 |
76 | var u *usersv1.User
77 | for _, user := range b.users {
78 | if user.Id == req.Msg.GetUser().GetId() {
79 | u = user
80 | break
81 | }
82 | }
83 | if u == nil {
84 | return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("user with ID %q could not be found", req.Msg.GetUser().GetId()))
85 | }
86 |
87 | for _, path := range req.Msg.GetUpdateMask().GetPaths() {
88 | switch path {
89 | case "email":
90 | u.Email = req.Msg.GetUser().GetEmail()
91 | default:
92 | return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("cannot update field %q on user", path))
93 | }
94 | }
95 |
96 | return connect.NewResponse(u), nil
97 | }
98 |
--------------------------------------------------------------------------------
/third_party/OpenAPI/users/v1/users.swagger.json:
--------------------------------------------------------------------------------
1 | {
2 | "swagger": "2.0",
3 | "info": {
4 | "title": "users/v1/users.proto",
5 | "version": "version not set"
6 | },
7 | "tags": [
8 | {
9 | "name": "UserService"
10 | }
11 | ],
12 | "consumes": [
13 | "application/json"
14 | ],
15 | "produces": [
16 | "application/json"
17 | ],
18 | "paths": {
19 | "/api/v1/user/{user.id}": {
20 | "patch": {
21 | "operationId": "UserService_UpdateUser",
22 | "responses": {
23 | "200": {
24 | "description": "A successful response.",
25 | "schema": {
26 | "$ref": "#/definitions/v1User"
27 | }
28 | },
29 | "default": {
30 | "description": "An unexpected error response.",
31 | "schema": {
32 | "$ref": "#/definitions/rpcStatus"
33 | }
34 | }
35 | },
36 | "parameters": [
37 | {
38 | "name": "user.id",
39 | "description": "Id uniquely identifies a user. Output only.",
40 | "in": "path",
41 | "required": true,
42 | "type": "string"
43 | },
44 | {
45 | "name": "user",
46 | "in": "body",
47 | "required": true,
48 | "schema": {
49 | "type": "object",
50 | "properties": {
51 | "email": {
52 | "type": "string"
53 | },
54 | "create_time": {
55 | "type": "string",
56 | "format": "date-time",
57 | "description": "Output only.",
58 | "readOnly": true
59 | }
60 | }
61 | }
62 | },
63 | {
64 | "name": "update_mask",
65 | "in": "query",
66 | "required": false,
67 | "type": "string"
68 | }
69 | ],
70 | "tags": [
71 | "UserService"
72 | ]
73 | }
74 | },
75 | "/api/v1/users": {
76 | "get": {
77 | "operationId": "UserService_ListUsers",
78 | "responses": {
79 | "200": {
80 | "description": "A successful response.(streaming responses)",
81 | "schema": {
82 | "type": "object",
83 | "properties": {
84 | "result": {
85 | "$ref": "#/definitions/v1User"
86 | },
87 | "error": {
88 | "$ref": "#/definitions/rpcStatus"
89 | }
90 | },
91 | "title": "Stream result of v1User"
92 | }
93 | },
94 | "default": {
95 | "description": "An unexpected error response.",
96 | "schema": {
97 | "$ref": "#/definitions/rpcStatus"
98 | }
99 | }
100 | },
101 | "tags": [
102 | "UserService"
103 | ]
104 | },
105 | "post": {
106 | "operationId": "UserService_AddUser",
107 | "responses": {
108 | "200": {
109 | "description": "A successful response.",
110 | "schema": {
111 | "$ref": "#/definitions/v1User"
112 | }
113 | },
114 | "default": {
115 | "description": "An unexpected error response.",
116 | "schema": {
117 | "$ref": "#/definitions/rpcStatus"
118 | }
119 | }
120 | },
121 | "parameters": [
122 | {
123 | "name": "body",
124 | "in": "body",
125 | "required": true,
126 | "schema": {
127 | "$ref": "#/definitions/v1AddUserRequest"
128 | }
129 | }
130 | ],
131 | "tags": [
132 | "UserService"
133 | ]
134 | }
135 | },
136 | "/api/v1/users/{id}": {
137 | "get": {
138 | "operationId": "UserService_GetUser",
139 | "responses": {
140 | "200": {
141 | "description": "A successful response.",
142 | "schema": {
143 | "$ref": "#/definitions/v1User"
144 | }
145 | },
146 | "default": {
147 | "description": "An unexpected error response.",
148 | "schema": {
149 | "$ref": "#/definitions/rpcStatus"
150 | }
151 | }
152 | },
153 | "parameters": [
154 | {
155 | "name": "id",
156 | "in": "path",
157 | "required": true,
158 | "type": "string"
159 | }
160 | ],
161 | "tags": [
162 | "UserService"
163 | ]
164 | }
165 | }
166 | },
167 | "definitions": {
168 | "protobufAny": {
169 | "type": "object",
170 | "properties": {
171 | "@type": {
172 | "type": "string"
173 | }
174 | },
175 | "additionalProperties": {}
176 | },
177 | "rpcStatus": {
178 | "type": "object",
179 | "properties": {
180 | "code": {
181 | "type": "integer",
182 | "format": "int32"
183 | },
184 | "message": {
185 | "type": "string"
186 | },
187 | "details": {
188 | "type": "array",
189 | "items": {
190 | "$ref": "#/definitions/protobufAny"
191 | }
192 | }
193 | }
194 | },
195 | "v1AddUserRequest": {
196 | "type": "object",
197 | "properties": {
198 | "email": {
199 | "type": "string"
200 | }
201 | }
202 | },
203 | "v1User": {
204 | "type": "object",
205 | "properties": {
206 | "id": {
207 | "type": "string",
208 | "description": "Id uniquely identifies a user. Output only.",
209 | "readOnly": true
210 | },
211 | "email": {
212 | "type": "string"
213 | },
214 | "create_time": {
215 | "type": "string",
216 | "format": "date-time",
217 | "description": "Output only.",
218 | "readOnly": true
219 | }
220 | }
221 | }
222 | }
223 | }
224 |
--------------------------------------------------------------------------------
/proto/users/v1/usersv1connect/users.connect.go:
--------------------------------------------------------------------------------
1 | // Code generated by protoc-gen-connect-go. DO NOT EDIT.
2 | //
3 | // Source: users/v1/users.proto
4 |
5 | package usersv1connect
6 |
7 | import (
8 | context "context"
9 | errors "errors"
10 | connect_go "github.com/bufbuild/connect-go"
11 | v1 "github.com/johanbrandhorst/connect-gateway-example/proto/users/v1"
12 | http "net/http"
13 | strings "strings"
14 | )
15 |
16 | // This is a compile-time assertion to ensure that this generated file and the connect package are
17 | // compatible. If you get a compiler error that this constant is not defined, this code was
18 | // generated with a version of connect newer than the one compiled into your binary. You can fix the
19 | // problem by either regenerating this code with an older version of connect or updating the connect
20 | // version compiled into your binary.
21 | const _ = connect_go.IsAtLeastVersion0_1_0
22 |
23 | const (
24 | // UserServiceName is the fully-qualified name of the UserService service.
25 | UserServiceName = "users.v1.UserService"
26 | )
27 |
28 | // UserServiceClient is a client for the users.v1.UserService service.
29 | type UserServiceClient interface {
30 | AddUser(context.Context, *connect_go.Request[v1.AddUserRequest]) (*connect_go.Response[v1.User], error)
31 | GetUser(context.Context, *connect_go.Request[v1.GetUserRequest]) (*connect_go.Response[v1.User], error)
32 | ListUsers(context.Context, *connect_go.Request[v1.ListUsersRequest]) (*connect_go.ServerStreamForClient[v1.User], error)
33 | UpdateUser(context.Context, *connect_go.Request[v1.UpdateUserRequest]) (*connect_go.Response[v1.User], error)
34 | }
35 |
36 | // NewUserServiceClient constructs a client for the users.v1.UserService service. By default, it
37 | // uses the Connect protocol with the binary Protobuf Codec, asks for gzipped responses, and sends
38 | // uncompressed requests. To use the gRPC or gRPC-Web protocols, supply the connect.WithGRPC() or
39 | // connect.WithGRPCWeb() options.
40 | //
41 | // The URL supplied here should be the base URL for the Connect or gRPC server (for example,
42 | // http://api.acme.com or https://acme.com/grpc).
43 | func NewUserServiceClient(httpClient connect_go.HTTPClient, baseURL string, opts ...connect_go.ClientOption) UserServiceClient {
44 | baseURL = strings.TrimRight(baseURL, "/")
45 | return &userServiceClient{
46 | addUser: connect_go.NewClient[v1.AddUserRequest, v1.User](
47 | httpClient,
48 | baseURL+"/users.v1.UserService/AddUser",
49 | opts...,
50 | ),
51 | getUser: connect_go.NewClient[v1.GetUserRequest, v1.User](
52 | httpClient,
53 | baseURL+"/users.v1.UserService/GetUser",
54 | opts...,
55 | ),
56 | listUsers: connect_go.NewClient[v1.ListUsersRequest, v1.User](
57 | httpClient,
58 | baseURL+"/users.v1.UserService/ListUsers",
59 | opts...,
60 | ),
61 | updateUser: connect_go.NewClient[v1.UpdateUserRequest, v1.User](
62 | httpClient,
63 | baseURL+"/users.v1.UserService/UpdateUser",
64 | opts...,
65 | ),
66 | }
67 | }
68 |
69 | // userServiceClient implements UserServiceClient.
70 | type userServiceClient struct {
71 | addUser *connect_go.Client[v1.AddUserRequest, v1.User]
72 | getUser *connect_go.Client[v1.GetUserRequest, v1.User]
73 | listUsers *connect_go.Client[v1.ListUsersRequest, v1.User]
74 | updateUser *connect_go.Client[v1.UpdateUserRequest, v1.User]
75 | }
76 |
77 | // AddUser calls users.v1.UserService.AddUser.
78 | func (c *userServiceClient) AddUser(ctx context.Context, req *connect_go.Request[v1.AddUserRequest]) (*connect_go.Response[v1.User], error) {
79 | return c.addUser.CallUnary(ctx, req)
80 | }
81 |
82 | // GetUser calls users.v1.UserService.GetUser.
83 | func (c *userServiceClient) GetUser(ctx context.Context, req *connect_go.Request[v1.GetUserRequest]) (*connect_go.Response[v1.User], error) {
84 | return c.getUser.CallUnary(ctx, req)
85 | }
86 |
87 | // ListUsers calls users.v1.UserService.ListUsers.
88 | func (c *userServiceClient) ListUsers(ctx context.Context, req *connect_go.Request[v1.ListUsersRequest]) (*connect_go.ServerStreamForClient[v1.User], error) {
89 | return c.listUsers.CallServerStream(ctx, req)
90 | }
91 |
92 | // UpdateUser calls users.v1.UserService.UpdateUser.
93 | func (c *userServiceClient) UpdateUser(ctx context.Context, req *connect_go.Request[v1.UpdateUserRequest]) (*connect_go.Response[v1.User], error) {
94 | return c.updateUser.CallUnary(ctx, req)
95 | }
96 |
97 | // UserServiceHandler is an implementation of the users.v1.UserService service.
98 | type UserServiceHandler interface {
99 | AddUser(context.Context, *connect_go.Request[v1.AddUserRequest]) (*connect_go.Response[v1.User], error)
100 | GetUser(context.Context, *connect_go.Request[v1.GetUserRequest]) (*connect_go.Response[v1.User], error)
101 | ListUsers(context.Context, *connect_go.Request[v1.ListUsersRequest], *connect_go.ServerStream[v1.User]) error
102 | UpdateUser(context.Context, *connect_go.Request[v1.UpdateUserRequest]) (*connect_go.Response[v1.User], error)
103 | }
104 |
105 | // NewUserServiceHandler builds an HTTP handler from the service implementation. It returns the path
106 | // on which to mount the handler and the handler itself.
107 | //
108 | // By default, handlers support the Connect, gRPC, and gRPC-Web protocols with the binary Protobuf
109 | // and JSON codecs. They also support gzip compression.
110 | func NewUserServiceHandler(svc UserServiceHandler, opts ...connect_go.HandlerOption) (string, http.Handler) {
111 | mux := http.NewServeMux()
112 | mux.Handle("/users.v1.UserService/AddUser", connect_go.NewUnaryHandler(
113 | "/users.v1.UserService/AddUser",
114 | svc.AddUser,
115 | opts...,
116 | ))
117 | mux.Handle("/users.v1.UserService/GetUser", connect_go.NewUnaryHandler(
118 | "/users.v1.UserService/GetUser",
119 | svc.GetUser,
120 | opts...,
121 | ))
122 | mux.Handle("/users.v1.UserService/ListUsers", connect_go.NewServerStreamHandler(
123 | "/users.v1.UserService/ListUsers",
124 | svc.ListUsers,
125 | opts...,
126 | ))
127 | mux.Handle("/users.v1.UserService/UpdateUser", connect_go.NewUnaryHandler(
128 | "/users.v1.UserService/UpdateUser",
129 | svc.UpdateUser,
130 | opts...,
131 | ))
132 | return "/users.v1.UserService/", mux
133 | }
134 |
135 | // UnimplementedUserServiceHandler returns CodeUnimplemented from all methods.
136 | type UnimplementedUserServiceHandler struct{}
137 |
138 | func (UnimplementedUserServiceHandler) AddUser(context.Context, *connect_go.Request[v1.AddUserRequest]) (*connect_go.Response[v1.User], error) {
139 | return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("users.v1.UserService.AddUser is not implemented"))
140 | }
141 |
142 | func (UnimplementedUserServiceHandler) GetUser(context.Context, *connect_go.Request[v1.GetUserRequest]) (*connect_go.Response[v1.User], error) {
143 | return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("users.v1.UserService.GetUser is not implemented"))
144 | }
145 |
146 | func (UnimplementedUserServiceHandler) ListUsers(context.Context, *connect_go.Request[v1.ListUsersRequest], *connect_go.ServerStream[v1.User]) error {
147 | return connect_go.NewError(connect_go.CodeUnimplemented, errors.New("users.v1.UserService.ListUsers is not implemented"))
148 | }
149 |
150 | func (UnimplementedUserServiceHandler) UpdateUser(context.Context, *connect_go.Request[v1.UpdateUserRequest]) (*connect_go.Response[v1.User], error) {
151 | return nil, connect_go.NewError(connect_go.CodeUnimplemented, errors.New("users.v1.UserService.UpdateUser is not implemented"))
152 | }
153 |
--------------------------------------------------------------------------------
/proto/users/v1/users_grpc.pb.go:
--------------------------------------------------------------------------------
1 | // Code generated by protoc-gen-go-grpc. DO NOT EDIT.
2 | // versions:
3 | // - protoc-gen-go-grpc v1.2.0
4 | // - protoc (unknown)
5 | // source: users/v1/users.proto
6 |
7 | package usersv1
8 |
9 | import (
10 | context "context"
11 | grpc "google.golang.org/grpc"
12 | codes "google.golang.org/grpc/codes"
13 | status "google.golang.org/grpc/status"
14 | )
15 |
16 | // This is a compile-time assertion to ensure that this generated file
17 | // is compatible with the grpc package it is being compiled against.
18 | // Requires gRPC-Go v1.32.0 or later.
19 | const _ = grpc.SupportPackageIsVersion7
20 |
21 | // UserServiceClient is the client API for UserService service.
22 | //
23 | // 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.
24 | type UserServiceClient interface {
25 | AddUser(ctx context.Context, in *AddUserRequest, opts ...grpc.CallOption) (*User, error)
26 | GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*User, error)
27 | ListUsers(ctx context.Context, in *ListUsersRequest, opts ...grpc.CallOption) (UserService_ListUsersClient, error)
28 | UpdateUser(ctx context.Context, in *UpdateUserRequest, opts ...grpc.CallOption) (*User, error)
29 | }
30 |
31 | type userServiceClient struct {
32 | cc grpc.ClientConnInterface
33 | }
34 |
35 | func NewUserServiceClient(cc grpc.ClientConnInterface) UserServiceClient {
36 | return &userServiceClient{cc}
37 | }
38 |
39 | func (c *userServiceClient) AddUser(ctx context.Context, in *AddUserRequest, opts ...grpc.CallOption) (*User, error) {
40 | out := new(User)
41 | err := c.cc.Invoke(ctx, "/users.v1.UserService/AddUser", in, out, opts...)
42 | if err != nil {
43 | return nil, err
44 | }
45 | return out, nil
46 | }
47 |
48 | func (c *userServiceClient) GetUser(ctx context.Context, in *GetUserRequest, opts ...grpc.CallOption) (*User, error) {
49 | out := new(User)
50 | err := c.cc.Invoke(ctx, "/users.v1.UserService/GetUser", in, out, opts...)
51 | if err != nil {
52 | return nil, err
53 | }
54 | return out, nil
55 | }
56 |
57 | func (c *userServiceClient) ListUsers(ctx context.Context, in *ListUsersRequest, opts ...grpc.CallOption) (UserService_ListUsersClient, error) {
58 | stream, err := c.cc.NewStream(ctx, &UserService_ServiceDesc.Streams[0], "/users.v1.UserService/ListUsers", opts...)
59 | if err != nil {
60 | return nil, err
61 | }
62 | x := &userServiceListUsersClient{stream}
63 | if err := x.ClientStream.SendMsg(in); err != nil {
64 | return nil, err
65 | }
66 | if err := x.ClientStream.CloseSend(); err != nil {
67 | return nil, err
68 | }
69 | return x, nil
70 | }
71 |
72 | type UserService_ListUsersClient interface {
73 | Recv() (*User, error)
74 | grpc.ClientStream
75 | }
76 |
77 | type userServiceListUsersClient struct {
78 | grpc.ClientStream
79 | }
80 |
81 | func (x *userServiceListUsersClient) Recv() (*User, error) {
82 | m := new(User)
83 | if err := x.ClientStream.RecvMsg(m); err != nil {
84 | return nil, err
85 | }
86 | return m, nil
87 | }
88 |
89 | func (c *userServiceClient) UpdateUser(ctx context.Context, in *UpdateUserRequest, opts ...grpc.CallOption) (*User, error) {
90 | out := new(User)
91 | err := c.cc.Invoke(ctx, "/users.v1.UserService/UpdateUser", in, out, opts...)
92 | if err != nil {
93 | return nil, err
94 | }
95 | return out, nil
96 | }
97 |
98 | // UserServiceServer is the server API for UserService service.
99 | // All implementations should embed UnimplementedUserServiceServer
100 | // for forward compatibility
101 | type UserServiceServer interface {
102 | AddUser(context.Context, *AddUserRequest) (*User, error)
103 | GetUser(context.Context, *GetUserRequest) (*User, error)
104 | ListUsers(*ListUsersRequest, UserService_ListUsersServer) error
105 | UpdateUser(context.Context, *UpdateUserRequest) (*User, error)
106 | }
107 |
108 | // UnimplementedUserServiceServer should be embedded to have forward compatible implementations.
109 | type UnimplementedUserServiceServer struct {
110 | }
111 |
112 | func (UnimplementedUserServiceServer) AddUser(context.Context, *AddUserRequest) (*User, error) {
113 | return nil, status.Errorf(codes.Unimplemented, "method AddUser not implemented")
114 | }
115 | func (UnimplementedUserServiceServer) GetUser(context.Context, *GetUserRequest) (*User, error) {
116 | return nil, status.Errorf(codes.Unimplemented, "method GetUser not implemented")
117 | }
118 | func (UnimplementedUserServiceServer) ListUsers(*ListUsersRequest, UserService_ListUsersServer) error {
119 | return status.Errorf(codes.Unimplemented, "method ListUsers not implemented")
120 | }
121 | func (UnimplementedUserServiceServer) UpdateUser(context.Context, *UpdateUserRequest) (*User, error) {
122 | return nil, status.Errorf(codes.Unimplemented, "method UpdateUser not implemented")
123 | }
124 |
125 | // UnsafeUserServiceServer may be embedded to opt out of forward compatibility for this service.
126 | // Use of this interface is not recommended, as added methods to UserServiceServer will
127 | // result in compilation errors.
128 | type UnsafeUserServiceServer interface {
129 | mustEmbedUnimplementedUserServiceServer()
130 | }
131 |
132 | func RegisterUserServiceServer(s grpc.ServiceRegistrar, srv UserServiceServer) {
133 | s.RegisterService(&UserService_ServiceDesc, srv)
134 | }
135 |
136 | func _UserService_AddUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
137 | in := new(AddUserRequest)
138 | if err := dec(in); err != nil {
139 | return nil, err
140 | }
141 | if interceptor == nil {
142 | return srv.(UserServiceServer).AddUser(ctx, in)
143 | }
144 | info := &grpc.UnaryServerInfo{
145 | Server: srv,
146 | FullMethod: "/users.v1.UserService/AddUser",
147 | }
148 | handler := func(ctx context.Context, req interface{}) (interface{}, error) {
149 | return srv.(UserServiceServer).AddUser(ctx, req.(*AddUserRequest))
150 | }
151 | return interceptor(ctx, in, info, handler)
152 | }
153 |
154 | func _UserService_GetUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
155 | in := new(GetUserRequest)
156 | if err := dec(in); err != nil {
157 | return nil, err
158 | }
159 | if interceptor == nil {
160 | return srv.(UserServiceServer).GetUser(ctx, in)
161 | }
162 | info := &grpc.UnaryServerInfo{
163 | Server: srv,
164 | FullMethod: "/users.v1.UserService/GetUser",
165 | }
166 | handler := func(ctx context.Context, req interface{}) (interface{}, error) {
167 | return srv.(UserServiceServer).GetUser(ctx, req.(*GetUserRequest))
168 | }
169 | return interceptor(ctx, in, info, handler)
170 | }
171 |
172 | func _UserService_ListUsers_Handler(srv interface{}, stream grpc.ServerStream) error {
173 | m := new(ListUsersRequest)
174 | if err := stream.RecvMsg(m); err != nil {
175 | return err
176 | }
177 | return srv.(UserServiceServer).ListUsers(m, &userServiceListUsersServer{stream})
178 | }
179 |
180 | type UserService_ListUsersServer interface {
181 | Send(*User) error
182 | grpc.ServerStream
183 | }
184 |
185 | type userServiceListUsersServer struct {
186 | grpc.ServerStream
187 | }
188 |
189 | func (x *userServiceListUsersServer) Send(m *User) error {
190 | return x.ServerStream.SendMsg(m)
191 | }
192 |
193 | func _UserService_UpdateUser_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
194 | in := new(UpdateUserRequest)
195 | if err := dec(in); err != nil {
196 | return nil, err
197 | }
198 | if interceptor == nil {
199 | return srv.(UserServiceServer).UpdateUser(ctx, in)
200 | }
201 | info := &grpc.UnaryServerInfo{
202 | Server: srv,
203 | FullMethod: "/users.v1.UserService/UpdateUser",
204 | }
205 | handler := func(ctx context.Context, req interface{}) (interface{}, error) {
206 | return srv.(UserServiceServer).UpdateUser(ctx, req.(*UpdateUserRequest))
207 | }
208 | return interceptor(ctx, in, info, handler)
209 | }
210 |
211 | // UserService_ServiceDesc is the grpc.ServiceDesc for UserService service.
212 | // It's only intended for direct use with grpc.RegisterService,
213 | // and not to be introspected or modified (even as a copy)
214 | var UserService_ServiceDesc = grpc.ServiceDesc{
215 | ServiceName: "users.v1.UserService",
216 | HandlerType: (*UserServiceServer)(nil),
217 | Methods: []grpc.MethodDesc{
218 | {
219 | MethodName: "AddUser",
220 | Handler: _UserService_AddUser_Handler,
221 | },
222 | {
223 | MethodName: "GetUser",
224 | Handler: _UserService_GetUser_Handler,
225 | },
226 | {
227 | MethodName: "UpdateUser",
228 | Handler: _UserService_UpdateUser_Handler,
229 | },
230 | },
231 | Streams: []grpc.StreamDesc{
232 | {
233 | StreamName: "ListUsers",
234 | Handler: _UserService_ListUsers_Handler,
235 | ServerStreams: true,
236 | },
237 | },
238 | Metadata: "users/v1/users.proto",
239 | }
240 |
--------------------------------------------------------------------------------
/third_party/OpenAPI/LICENSE:
--------------------------------------------------------------------------------
1 | Apache License
2 | Version 2.0, January 2004
3 | http://www.apache.org/licenses/
4 |
5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
6 |
7 | 1. Definitions.
8 |
9 | "License" shall mean the terms and conditions for use, reproduction,
10 | and distribution as defined by Sections 1 through 9 of this document.
11 |
12 | "Licensor" shall mean the copyright owner or entity authorized by
13 | the copyright owner that is granting the License.
14 |
15 | "Legal Entity" shall mean the union of the acting entity and all
16 | other entities that control, are controlled by, or are under common
17 | control with that entity. For the purposes of this definition,
18 | "control" means (i) the power, direct or indirect, to cause the
19 | direction or management of such entity, whether by contract or
20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the
21 | outstanding shares, or (iii) beneficial ownership of such entity.
22 |
23 | "You" (or "Your") shall mean an individual or Legal Entity
24 | exercising permissions granted by this License.
25 |
26 | "Source" form shall mean the preferred form for making modifications,
27 | including but not limited to software source code, documentation
28 | source, and configuration files.
29 |
30 | "Object" form shall mean any form resulting from mechanical
31 | transformation or translation of a Source form, including but
32 | not limited to compiled object code, generated documentation,
33 | and conversions to other media types.
34 |
35 | "Work" shall mean the work of authorship, whether in Source or
36 | Object form, made available under the License, as indicated by a
37 | copyright notice that is included in or attached to the work
38 | (an example is provided in the Appendix below).
39 |
40 | "Derivative Works" shall mean any work, whether in Source or Object
41 | form, that is based on (or derived from) the Work and for which the
42 | editorial revisions, annotations, elaborations, or other modifications
43 | represent, as a whole, an original work of authorship. For the purposes
44 | of this License, Derivative Works shall not include works that remain
45 | separable from, or merely link (or bind by name) to the interfaces of,
46 | the Work and Derivative Works thereof.
47 |
48 | "Contribution" shall mean any work of authorship, including
49 | the original version of the Work and any modifications or additions
50 | to that Work or Derivative Works thereof, that is intentionally
51 | submitted to Licensor for inclusion in the Work by the copyright owner
52 | or by an individual or Legal Entity authorized to submit on behalf of
53 | the copyright owner. For the purposes of this definition, "submitted"
54 | means any form of electronic, verbal, or written communication sent
55 | to the Licensor or its representatives, including but not limited to
56 | communication on electronic mailing lists, source code control systems,
57 | and issue tracking systems that are managed by, or on behalf of, the
58 | Licensor for the purpose of discussing and improving the Work, but
59 | excluding communication that is conspicuously marked or otherwise
60 | designated in writing by the copyright owner as "Not a Contribution."
61 |
62 | "Contributor" shall mean Licensor and any individual or Legal Entity
63 | on behalf of whom a Contribution has been received by Licensor and
64 | subsequently incorporated within the Work.
65 |
66 | 2. Grant of Copyright License. Subject to the terms and conditions of
67 | this License, each Contributor hereby grants to You a perpetual,
68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
69 | copyright license to reproduce, prepare Derivative Works of,
70 | publicly display, publicly perform, sublicense, and distribute the
71 | Work and such Derivative Works in Source or Object form.
72 |
73 | 3. Grant of Patent License. Subject to the terms and conditions of
74 | this License, each Contributor hereby grants to You a perpetual,
75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable
76 | (except as stated in this section) patent license to make, have made,
77 | use, offer to sell, sell, import, and otherwise transfer the Work,
78 | where such license applies only to those patent claims licensable
79 | by such Contributor that are necessarily infringed by their
80 | Contribution(s) alone or by combination of their Contribution(s)
81 | with the Work to which such Contribution(s) was submitted. If You
82 | institute patent litigation against any entity (including a
83 | cross-claim or counterclaim in a lawsuit) alleging that the Work
84 | or a Contribution incorporated within the Work constitutes direct
85 | or contributory patent infringement, then any patent licenses
86 | granted to You under this License for that Work shall terminate
87 | as of the date such litigation is filed.
88 |
89 | 4. Redistribution. You may reproduce and distribute copies of the
90 | Work or Derivative Works thereof in any medium, with or without
91 | modifications, and in Source or Object form, provided that You
92 | meet the following conditions:
93 |
94 | (a) You must give any other recipients of the Work or
95 | Derivative Works a copy of this License; and
96 |
97 | (b) You must cause any modified files to carry prominent notices
98 | stating that You changed the files; and
99 |
100 | (c) You must retain, in the Source form of any Derivative Works
101 | that You distribute, all copyright, patent, trademark, and
102 | attribution notices from the Source form of the Work,
103 | excluding those notices that do not pertain to any part of
104 | the Derivative Works; and
105 |
106 | (d) If the Work includes a "NOTICE" text file as part of its
107 | distribution, then any Derivative Works that You distribute must
108 | include a readable copy of the attribution notices contained
109 | within such NOTICE file, excluding those notices that do not
110 | pertain to any part of the Derivative Works, in at least one
111 | of the following places: within a NOTICE text file distributed
112 | as part of the Derivative Works; within the Source form or
113 | documentation, if provided along with the Derivative Works; or,
114 | within a display generated by the Derivative Works, if and
115 | wherever such third-party notices normally appear. The contents
116 | of the NOTICE file are for informational purposes only and
117 | do not modify the License. You may add Your own attribution
118 | notices within Derivative Works that You distribute, alongside
119 | or as an addendum to the NOTICE text from the Work, provided
120 | that such additional attribution notices cannot be construed
121 | as modifying the License.
122 |
123 | You may add Your own copyright statement to Your modifications and
124 | may provide additional or different license terms and conditions
125 | for use, reproduction, or distribution of Your modifications, or
126 | for any such Derivative Works as a whole, provided Your use,
127 | reproduction, and distribution of the Work otherwise complies with
128 | the conditions stated in this License.
129 |
130 | 5. Submission of Contributions. Unless You explicitly state otherwise,
131 | any Contribution intentionally submitted for inclusion in the Work
132 | by You to the Licensor shall be under the terms and conditions of
133 | this License, without any additional terms or conditions.
134 | Notwithstanding the above, nothing herein shall supersede or modify
135 | the terms of any separate license agreement you may have executed
136 | with Licensor regarding such Contributions.
137 |
138 | 6. Trademarks. This License does not grant permission to use the trade
139 | names, trademarks, service marks, or product names of the Licensor,
140 | except as required for reasonable and customary use in describing the
141 | origin of the Work and reproducing the content of the NOTICE file.
142 |
143 | 7. Disclaimer of Warranty. Unless required by applicable law or
144 | agreed to in writing, Licensor provides the Work (and each
145 | Contributor provides its Contributions) on an "AS IS" BASIS,
146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
147 | implied, including, without limitation, any warranties or conditions
148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
149 | PARTICULAR PURPOSE. You are solely responsible for determining the
150 | appropriateness of using or redistributing the Work and assume any
151 | risks associated with Your exercise of permissions under this License.
152 |
153 | 8. Limitation of Liability. In no event and under no legal theory,
154 | whether in tort (including negligence), contract, or otherwise,
155 | unless required by applicable law (such as deliberate and grossly
156 | negligent acts) or agreed to in writing, shall any Contributor be
157 | liable to You for damages, including any direct, indirect, special,
158 | incidental, or consequential damages of any character arising as a
159 | result of this License or out of the use or inability to use the
160 | Work (including but not limited to damages for loss of goodwill,
161 | work stoppage, computer failure or malfunction, or any and all
162 | other commercial damages or losses), even if such Contributor
163 | has been advised of the possibility of such damages.
164 |
165 | 9. Accepting Warranty or Additional Liability. While redistributing
166 | the Work or Derivative Works thereof, You may choose to offer,
167 | and charge a fee for, acceptance of support, warranty, indemnity,
168 | or other liability obligations and/or rights consistent with this
169 | License. However, in accepting such obligations, You may act only
170 | on Your own behalf and on Your sole responsibility, not on behalf
171 | of any other Contributor, and only if You agree to indemnify,
172 | defend, and hold each Contributor harmless for any liability
173 | incurred by, or claims asserted against, such Contributor by reason
174 | of your accepting any such warranty or additional liability.
175 |
176 | END OF TERMS AND CONDITIONS
177 |
178 | APPENDIX: How to apply the Apache License to your work.
179 |
180 | To apply the Apache License to your work, attach the following
181 | boilerplate notice, with the fields enclosed by brackets "[]"
182 | replaced with your own identifying information. (Don't include
183 | the brackets!) The text should be enclosed in the appropriate
184 | comment syntax for the file format. We also recommend that a
185 | file or class name and description of purpose be included on the
186 | same "printed page" as the copyright notice for easier
187 | identification within third-party archives.
188 |
189 | Copyright 2020 SmartBear Software Inc.
190 |
191 | Licensed under the Apache License, Version 2.0 (the "License");
192 | you may not use this file except in compliance with the License.
193 | You may obtain a copy of the License at
194 |
195 | http://www.apache.org/licenses/LICENSE-2.0
196 |
197 | Unless required by applicable law or agreed to in writing, software
198 | distributed under the License is distributed on an "AS IS" BASIS,
199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
200 | See the License for the specific language governing permissions and
201 | limitations under the License.
202 |
--------------------------------------------------------------------------------
/proto/users/v1/users.pb.go:
--------------------------------------------------------------------------------
1 | // Code generated by protoc-gen-go. DO NOT EDIT.
2 | // versions:
3 | // protoc-gen-go v1.28.0-devel
4 | // protoc (unknown)
5 | // source: users/v1/users.proto
6 |
7 | package usersv1
8 |
9 | import (
10 | _ "google.golang.org/genproto/googleapis/api/annotations"
11 | protoreflect "google.golang.org/protobuf/reflect/protoreflect"
12 | protoimpl "google.golang.org/protobuf/runtime/protoimpl"
13 | fieldmaskpb "google.golang.org/protobuf/types/known/fieldmaskpb"
14 | timestamppb "google.golang.org/protobuf/types/known/timestamppb"
15 | reflect "reflect"
16 | sync "sync"
17 | )
18 |
19 | const (
20 | // Verify that this generated code is sufficiently up-to-date.
21 | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
22 | // Verify that runtime/protoimpl is sufficiently up-to-date.
23 | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
24 | )
25 |
26 | type AddUserRequest struct {
27 | state protoimpl.MessageState
28 | sizeCache protoimpl.SizeCache
29 | unknownFields protoimpl.UnknownFields
30 |
31 | Email string `protobuf:"bytes,1,opt,name=email,proto3" json:"email,omitempty"`
32 | }
33 |
34 | func (x *AddUserRequest) Reset() {
35 | *x = AddUserRequest{}
36 | if protoimpl.UnsafeEnabled {
37 | mi := &file_users_v1_users_proto_msgTypes[0]
38 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
39 | ms.StoreMessageInfo(mi)
40 | }
41 | }
42 |
43 | func (x *AddUserRequest) String() string {
44 | return protoimpl.X.MessageStringOf(x)
45 | }
46 |
47 | func (*AddUserRequest) ProtoMessage() {}
48 |
49 | func (x *AddUserRequest) ProtoReflect() protoreflect.Message {
50 | mi := &file_users_v1_users_proto_msgTypes[0]
51 | if protoimpl.UnsafeEnabled && x != nil {
52 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
53 | if ms.LoadMessageInfo() == nil {
54 | ms.StoreMessageInfo(mi)
55 | }
56 | return ms
57 | }
58 | return mi.MessageOf(x)
59 | }
60 |
61 | // Deprecated: Use AddUserRequest.ProtoReflect.Descriptor instead.
62 | func (*AddUserRequest) Descriptor() ([]byte, []int) {
63 | return file_users_v1_users_proto_rawDescGZIP(), []int{0}
64 | }
65 |
66 | func (x *AddUserRequest) GetEmail() string {
67 | if x != nil {
68 | return x.Email
69 | }
70 | return ""
71 | }
72 |
73 | type GetUserRequest struct {
74 | state protoimpl.MessageState
75 | sizeCache protoimpl.SizeCache
76 | unknownFields protoimpl.UnknownFields
77 |
78 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
79 | }
80 |
81 | func (x *GetUserRequest) Reset() {
82 | *x = GetUserRequest{}
83 | if protoimpl.UnsafeEnabled {
84 | mi := &file_users_v1_users_proto_msgTypes[1]
85 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
86 | ms.StoreMessageInfo(mi)
87 | }
88 | }
89 |
90 | func (x *GetUserRequest) String() string {
91 | return protoimpl.X.MessageStringOf(x)
92 | }
93 |
94 | func (*GetUserRequest) ProtoMessage() {}
95 |
96 | func (x *GetUserRequest) ProtoReflect() protoreflect.Message {
97 | mi := &file_users_v1_users_proto_msgTypes[1]
98 | if protoimpl.UnsafeEnabled && x != nil {
99 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
100 | if ms.LoadMessageInfo() == nil {
101 | ms.StoreMessageInfo(mi)
102 | }
103 | return ms
104 | }
105 | return mi.MessageOf(x)
106 | }
107 |
108 | // Deprecated: Use GetUserRequest.ProtoReflect.Descriptor instead.
109 | func (*GetUserRequest) Descriptor() ([]byte, []int) {
110 | return file_users_v1_users_proto_rawDescGZIP(), []int{1}
111 | }
112 |
113 | func (x *GetUserRequest) GetId() string {
114 | if x != nil {
115 | return x.Id
116 | }
117 | return ""
118 | }
119 |
120 | type ListUsersRequest struct {
121 | state protoimpl.MessageState
122 | sizeCache protoimpl.SizeCache
123 | unknownFields protoimpl.UnknownFields
124 | }
125 |
126 | func (x *ListUsersRequest) Reset() {
127 | *x = ListUsersRequest{}
128 | if protoimpl.UnsafeEnabled {
129 | mi := &file_users_v1_users_proto_msgTypes[2]
130 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
131 | ms.StoreMessageInfo(mi)
132 | }
133 | }
134 |
135 | func (x *ListUsersRequest) String() string {
136 | return protoimpl.X.MessageStringOf(x)
137 | }
138 |
139 | func (*ListUsersRequest) ProtoMessage() {}
140 |
141 | func (x *ListUsersRequest) ProtoReflect() protoreflect.Message {
142 | mi := &file_users_v1_users_proto_msgTypes[2]
143 | if protoimpl.UnsafeEnabled && x != nil {
144 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
145 | if ms.LoadMessageInfo() == nil {
146 | ms.StoreMessageInfo(mi)
147 | }
148 | return ms
149 | }
150 | return mi.MessageOf(x)
151 | }
152 |
153 | // Deprecated: Use ListUsersRequest.ProtoReflect.Descriptor instead.
154 | func (*ListUsersRequest) Descriptor() ([]byte, []int) {
155 | return file_users_v1_users_proto_rawDescGZIP(), []int{2}
156 | }
157 |
158 | type UpdateUserRequest struct {
159 | state protoimpl.MessageState
160 | sizeCache protoimpl.SizeCache
161 | unknownFields protoimpl.UnknownFields
162 |
163 | User *User `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"`
164 | UpdateMask *fieldmaskpb.FieldMask `protobuf:"bytes,2,opt,name=update_mask,json=updateMask,proto3" json:"update_mask,omitempty"`
165 | }
166 |
167 | func (x *UpdateUserRequest) Reset() {
168 | *x = UpdateUserRequest{}
169 | if protoimpl.UnsafeEnabled {
170 | mi := &file_users_v1_users_proto_msgTypes[3]
171 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
172 | ms.StoreMessageInfo(mi)
173 | }
174 | }
175 |
176 | func (x *UpdateUserRequest) String() string {
177 | return protoimpl.X.MessageStringOf(x)
178 | }
179 |
180 | func (*UpdateUserRequest) ProtoMessage() {}
181 |
182 | func (x *UpdateUserRequest) ProtoReflect() protoreflect.Message {
183 | mi := &file_users_v1_users_proto_msgTypes[3]
184 | if protoimpl.UnsafeEnabled && x != nil {
185 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
186 | if ms.LoadMessageInfo() == nil {
187 | ms.StoreMessageInfo(mi)
188 | }
189 | return ms
190 | }
191 | return mi.MessageOf(x)
192 | }
193 |
194 | // Deprecated: Use UpdateUserRequest.ProtoReflect.Descriptor instead.
195 | func (*UpdateUserRequest) Descriptor() ([]byte, []int) {
196 | return file_users_v1_users_proto_rawDescGZIP(), []int{3}
197 | }
198 |
199 | func (x *UpdateUserRequest) GetUser() *User {
200 | if x != nil {
201 | return x.User
202 | }
203 | return nil
204 | }
205 |
206 | func (x *UpdateUserRequest) GetUpdateMask() *fieldmaskpb.FieldMask {
207 | if x != nil {
208 | return x.UpdateMask
209 | }
210 | return nil
211 | }
212 |
213 | type User struct {
214 | state protoimpl.MessageState
215 | sizeCache protoimpl.SizeCache
216 | unknownFields protoimpl.UnknownFields
217 |
218 | // Id uniquely identifies a user. Output only.
219 | Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"`
220 | Email string `protobuf:"bytes,2,opt,name=email,proto3" json:"email,omitempty"`
221 | // Output only.
222 | CreateTime *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=create_time,json=createTime,proto3" json:"create_time,omitempty"`
223 | }
224 |
225 | func (x *User) Reset() {
226 | *x = User{}
227 | if protoimpl.UnsafeEnabled {
228 | mi := &file_users_v1_users_proto_msgTypes[4]
229 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
230 | ms.StoreMessageInfo(mi)
231 | }
232 | }
233 |
234 | func (x *User) String() string {
235 | return protoimpl.X.MessageStringOf(x)
236 | }
237 |
238 | func (*User) ProtoMessage() {}
239 |
240 | func (x *User) ProtoReflect() protoreflect.Message {
241 | mi := &file_users_v1_users_proto_msgTypes[4]
242 | if protoimpl.UnsafeEnabled && x != nil {
243 | ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
244 | if ms.LoadMessageInfo() == nil {
245 | ms.StoreMessageInfo(mi)
246 | }
247 | return ms
248 | }
249 | return mi.MessageOf(x)
250 | }
251 |
252 | // Deprecated: Use User.ProtoReflect.Descriptor instead.
253 | func (*User) Descriptor() ([]byte, []int) {
254 | return file_users_v1_users_proto_rawDescGZIP(), []int{4}
255 | }
256 |
257 | func (x *User) GetId() string {
258 | if x != nil {
259 | return x.Id
260 | }
261 | return ""
262 | }
263 |
264 | func (x *User) GetEmail() string {
265 | if x != nil {
266 | return x.Email
267 | }
268 | return ""
269 | }
270 |
271 | func (x *User) GetCreateTime() *timestamppb.Timestamp {
272 | if x != nil {
273 | return x.CreateTime
274 | }
275 | return nil
276 | }
277 |
278 | var File_users_v1_users_proto protoreflect.FileDescriptor
279 |
280 | var file_users_v1_users_proto_rawDesc = []byte{
281 | 0x0a, 0x14, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73,
282 | 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x08, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x76, 0x31,
283 | 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75,
284 | 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74,
285 | 0x6f, 0x1a, 0x20, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62,
286 | 0x75, 0x66, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x2e, 0x70, 0x72,
287 | 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f,
288 | 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74,
289 | 0x6f, 0x22, 0x26, 0x0a, 0x0e, 0x41, 0x64, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75,
290 | 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x01, 0x20, 0x01,
291 | 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x22, 0x20, 0x0a, 0x0e, 0x47, 0x65, 0x74,
292 | 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69,
293 | 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x12, 0x0a, 0x10, 0x4c,
294 | 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22,
295 | 0x74, 0x0a, 0x11, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71,
296 | 0x75, 0x65, 0x73, 0x74, 0x12, 0x22, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01,
297 | 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73,
298 | 0x65, 0x72, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x3b, 0x0a, 0x0b, 0x75, 0x70, 0x64, 0x61,
299 | 0x74, 0x65, 0x5f, 0x6d, 0x61, 0x73, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e,
300 | 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e,
301 | 0x46, 0x69, 0x65, 0x6c, 0x64, 0x4d, 0x61, 0x73, 0x6b, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74,
302 | 0x65, 0x4d, 0x61, 0x73, 0x6b, 0x22, 0x69, 0x0a, 0x04, 0x55, 0x73, 0x65, 0x72, 0x12, 0x0e, 0x0a,
303 | 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a,
304 | 0x05, 0x65, 0x6d, 0x61, 0x69, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x6d,
305 | 0x61, 0x69, 0x6c, 0x12, 0x3b, 0x0a, 0x0b, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69,
306 | 0x6d, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c,
307 | 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73,
308 | 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65,
309 | 0x32, 0xe0, 0x02, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65,
310 | 0x12, 0x4d, 0x0a, 0x07, 0x41, 0x64, 0x64, 0x55, 0x73, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x75, 0x73,
311 | 0x65, 0x72, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x64, 0x64, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65,
312 | 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x76, 0x31,
313 | 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x18, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x12, 0x3a, 0x01, 0x2a,
314 | 0x22, 0x0d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x12,
315 | 0x4f, 0x0a, 0x07, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x75, 0x73, 0x65,
316 | 0x72, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71,
317 | 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x76, 0x31, 0x2e,
318 | 0x55, 0x73, 0x65, 0x72, 0x22, 0x1a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x61,
319 | 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d,
320 | 0x12, 0x50, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x2e,
321 | 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x55, 0x73, 0x65,
322 | 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x75, 0x73, 0x65, 0x72,
323 | 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x15, 0x82, 0xd3, 0xe4, 0x93, 0x02,
324 | 0x0f, 0x12, 0x0d, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x73,
325 | 0x30, 0x01, 0x12, 0x5f, 0x0a, 0x0a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x55, 0x73, 0x65, 0x72,
326 | 0x12, 0x1b, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61,
327 | 0x74, 0x65, 0x55, 0x73, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e,
328 | 0x75, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x22, 0x24, 0x82,
329 | 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x32, 0x16, 0x2f, 0x61, 0x70,
330 | 0x69, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x2f, 0x7b, 0x75, 0x73, 0x65, 0x72, 0x2e,
331 | 0x69, 0x64, 0x7d, 0x42, 0xa6, 0x01, 0x0a, 0x0c, 0x63, 0x6f, 0x6d, 0x2e, 0x75, 0x73, 0x65, 0x72,
332 | 0x73, 0x2e, 0x76, 0x31, 0x42, 0x0a, 0x55, 0x73, 0x65, 0x72, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f,
333 | 0x50, 0x01, 0x5a, 0x49, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6a,
334 | 0x6f, 0x68, 0x61, 0x6e, 0x62, 0x72, 0x61, 0x6e, 0x64, 0x68, 0x6f, 0x72, 0x73, 0x74, 0x2f, 0x63,
335 | 0x6f, 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x2d, 0x67, 0x61, 0x74, 0x65, 0x77, 0x61, 0x79, 0x2d, 0x65,
336 | 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x75, 0x73, 0x65,
337 | 0x72, 0x73, 0x2f, 0x76, 0x31, 0x3b, 0x75, 0x73, 0x65, 0x72, 0x73, 0x76, 0x31, 0xa2, 0x02, 0x03,
338 | 0x55, 0x58, 0x58, 0xaa, 0x02, 0x08, 0x55, 0x73, 0x65, 0x72, 0x73, 0x2e, 0x56, 0x31, 0xca, 0x02,
339 | 0x08, 0x55, 0x73, 0x65, 0x72, 0x73, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x14, 0x55, 0x73, 0x65, 0x72,
340 | 0x73, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61,
341 | 0xea, 0x02, 0x09, 0x55, 0x73, 0x65, 0x72, 0x73, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72,
342 | 0x6f, 0x74, 0x6f, 0x33,
343 | }
344 |
345 | var (
346 | file_users_v1_users_proto_rawDescOnce sync.Once
347 | file_users_v1_users_proto_rawDescData = file_users_v1_users_proto_rawDesc
348 | )
349 |
350 | func file_users_v1_users_proto_rawDescGZIP() []byte {
351 | file_users_v1_users_proto_rawDescOnce.Do(func() {
352 | file_users_v1_users_proto_rawDescData = protoimpl.X.CompressGZIP(file_users_v1_users_proto_rawDescData)
353 | })
354 | return file_users_v1_users_proto_rawDescData
355 | }
356 |
357 | var file_users_v1_users_proto_msgTypes = make([]protoimpl.MessageInfo, 5)
358 | var file_users_v1_users_proto_goTypes = []interface{}{
359 | (*AddUserRequest)(nil), // 0: users.v1.AddUserRequest
360 | (*GetUserRequest)(nil), // 1: users.v1.GetUserRequest
361 | (*ListUsersRequest)(nil), // 2: users.v1.ListUsersRequest
362 | (*UpdateUserRequest)(nil), // 3: users.v1.UpdateUserRequest
363 | (*User)(nil), // 4: users.v1.User
364 | (*fieldmaskpb.FieldMask)(nil), // 5: google.protobuf.FieldMask
365 | (*timestamppb.Timestamp)(nil), // 6: google.protobuf.Timestamp
366 | }
367 | var file_users_v1_users_proto_depIdxs = []int32{
368 | 4, // 0: users.v1.UpdateUserRequest.user:type_name -> users.v1.User
369 | 5, // 1: users.v1.UpdateUserRequest.update_mask:type_name -> google.protobuf.FieldMask
370 | 6, // 2: users.v1.User.create_time:type_name -> google.protobuf.Timestamp
371 | 0, // 3: users.v1.UserService.AddUser:input_type -> users.v1.AddUserRequest
372 | 1, // 4: users.v1.UserService.GetUser:input_type -> users.v1.GetUserRequest
373 | 2, // 5: users.v1.UserService.ListUsers:input_type -> users.v1.ListUsersRequest
374 | 3, // 6: users.v1.UserService.UpdateUser:input_type -> users.v1.UpdateUserRequest
375 | 4, // 7: users.v1.UserService.AddUser:output_type -> users.v1.User
376 | 4, // 8: users.v1.UserService.GetUser:output_type -> users.v1.User
377 | 4, // 9: users.v1.UserService.ListUsers:output_type -> users.v1.User
378 | 4, // 10: users.v1.UserService.UpdateUser:output_type -> users.v1.User
379 | 7, // [7:11] is the sub-list for method output_type
380 | 3, // [3:7] is the sub-list for method input_type
381 | 3, // [3:3] is the sub-list for extension type_name
382 | 3, // [3:3] is the sub-list for extension extendee
383 | 0, // [0:3] is the sub-list for field type_name
384 | }
385 |
386 | func init() { file_users_v1_users_proto_init() }
387 | func file_users_v1_users_proto_init() {
388 | if File_users_v1_users_proto != nil {
389 | return
390 | }
391 | if !protoimpl.UnsafeEnabled {
392 | file_users_v1_users_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
393 | switch v := v.(*AddUserRequest); i {
394 | case 0:
395 | return &v.state
396 | case 1:
397 | return &v.sizeCache
398 | case 2:
399 | return &v.unknownFields
400 | default:
401 | return nil
402 | }
403 | }
404 | file_users_v1_users_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} {
405 | switch v := v.(*GetUserRequest); i {
406 | case 0:
407 | return &v.state
408 | case 1:
409 | return &v.sizeCache
410 | case 2:
411 | return &v.unknownFields
412 | default:
413 | return nil
414 | }
415 | }
416 | file_users_v1_users_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} {
417 | switch v := v.(*ListUsersRequest); i {
418 | case 0:
419 | return &v.state
420 | case 1:
421 | return &v.sizeCache
422 | case 2:
423 | return &v.unknownFields
424 | default:
425 | return nil
426 | }
427 | }
428 | file_users_v1_users_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} {
429 | switch v := v.(*UpdateUserRequest); i {
430 | case 0:
431 | return &v.state
432 | case 1:
433 | return &v.sizeCache
434 | case 2:
435 | return &v.unknownFields
436 | default:
437 | return nil
438 | }
439 | }
440 | file_users_v1_users_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} {
441 | switch v := v.(*User); i {
442 | case 0:
443 | return &v.state
444 | case 1:
445 | return &v.sizeCache
446 | case 2:
447 | return &v.unknownFields
448 | default:
449 | return nil
450 | }
451 | }
452 | }
453 | type x struct{}
454 | out := protoimpl.TypeBuilder{
455 | File: protoimpl.DescBuilder{
456 | GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
457 | RawDescriptor: file_users_v1_users_proto_rawDesc,
458 | NumEnums: 0,
459 | NumMessages: 5,
460 | NumExtensions: 0,
461 | NumServices: 1,
462 | },
463 | GoTypes: file_users_v1_users_proto_goTypes,
464 | DependencyIndexes: file_users_v1_users_proto_depIdxs,
465 | MessageInfos: file_users_v1_users_proto_msgTypes,
466 | }.Build()
467 | File_users_v1_users_proto = out.File
468 | file_users_v1_users_proto_rawDesc = nil
469 | file_users_v1_users_proto_goTypes = nil
470 | file_users_v1_users_proto_depIdxs = nil
471 | }
472 |
--------------------------------------------------------------------------------
/proto/users/v1/usersv1gateway/users.pb.gw.go:
--------------------------------------------------------------------------------
1 | // Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
2 | // source: users/v1/users.proto
3 |
4 | /*
5 | Package usersv1 is a reverse proxy.
6 |
7 | It translates gRPC into RESTful JSON APIs.
8 | */
9 | package usersv1
10 |
11 | import (
12 | "context"
13 | "io"
14 | "net/http"
15 |
16 | "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
17 | "github.com/grpc-ecosystem/grpc-gateway/v2/utilities"
18 | extUsersv1 "github.com/johanbrandhorst/connect-gateway-example/proto/users/v1"
19 | "google.golang.org/grpc"
20 | "google.golang.org/grpc/codes"
21 | "google.golang.org/grpc/grpclog"
22 | "google.golang.org/grpc/metadata"
23 | "google.golang.org/grpc/status"
24 | "google.golang.org/protobuf/proto"
25 | )
26 |
27 | // Suppress "imported and not used" errors
28 | var _ codes.Code
29 | var _ io.Reader
30 | var _ status.Status
31 | var _ = runtime.String
32 | var _ = utilities.NewDoubleArray
33 | var _ = metadata.Join
34 |
35 | func request_UserService_AddUser_0(ctx context.Context, marshaler runtime.Marshaler, client extUsersv1.UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
36 | var protoReq extUsersv1.AddUserRequest
37 | var metadata runtime.ServerMetadata
38 |
39 | newReader, berr := utilities.IOReaderFactory(req.Body)
40 | if berr != nil {
41 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
42 | }
43 | if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
44 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
45 | }
46 |
47 | msg, err := client.AddUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
48 | return msg, metadata, err
49 |
50 | }
51 |
52 | func local_request_UserService_AddUser_0(ctx context.Context, marshaler runtime.Marshaler, server extUsersv1.UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
53 | var protoReq extUsersv1.AddUserRequest
54 | var metadata runtime.ServerMetadata
55 |
56 | newReader, berr := utilities.IOReaderFactory(req.Body)
57 | if berr != nil {
58 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
59 | }
60 | if err := marshaler.NewDecoder(newReader()).Decode(&protoReq); err != nil && err != io.EOF {
61 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
62 | }
63 |
64 | msg, err := server.AddUser(ctx, &protoReq)
65 | return msg, metadata, err
66 |
67 | }
68 |
69 | func request_UserService_GetUser_0(ctx context.Context, marshaler runtime.Marshaler, client extUsersv1.UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
70 | var protoReq extUsersv1.GetUserRequest
71 | var metadata runtime.ServerMetadata
72 |
73 | var (
74 | val string
75 | ok bool
76 | err error
77 | _ = err
78 | )
79 |
80 | val, ok = pathParams["id"]
81 | if !ok {
82 | return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id")
83 | }
84 |
85 | protoReq.Id, err = runtime.String(val)
86 | if err != nil {
87 | return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err)
88 | }
89 |
90 | msg, err := client.GetUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
91 | return msg, metadata, err
92 |
93 | }
94 |
95 | func local_request_UserService_GetUser_0(ctx context.Context, marshaler runtime.Marshaler, server extUsersv1.UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
96 | var protoReq extUsersv1.GetUserRequest
97 | var metadata runtime.ServerMetadata
98 |
99 | var (
100 | val string
101 | ok bool
102 | err error
103 | _ = err
104 | )
105 |
106 | val, ok = pathParams["id"]
107 | if !ok {
108 | return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id")
109 | }
110 |
111 | protoReq.Id, err = runtime.String(val)
112 | if err != nil {
113 | return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id", err)
114 | }
115 |
116 | msg, err := server.GetUser(ctx, &protoReq)
117 | return msg, metadata, err
118 |
119 | }
120 |
121 | func request_UserService_ListUsers_0(ctx context.Context, marshaler runtime.Marshaler, client extUsersv1.UserServiceClient, req *http.Request, pathParams map[string]string) (extUsersv1.UserService_ListUsersClient, runtime.ServerMetadata, error) {
122 | var protoReq extUsersv1.ListUsersRequest
123 | var metadata runtime.ServerMetadata
124 |
125 | stream, err := client.ListUsers(ctx, &protoReq)
126 | if err != nil {
127 | return nil, metadata, err
128 | }
129 | header, err := stream.Header()
130 | if err != nil {
131 | return nil, metadata, err
132 | }
133 | metadata.HeaderMD = header
134 | return stream, metadata, nil
135 |
136 | }
137 |
138 | var (
139 | filter_UserService_UpdateUser_0 = &utilities.DoubleArray{Encoding: map[string]int{"user": 0, "id": 1}, Base: []int{1, 2, 1, 0, 0}, Check: []int{0, 1, 2, 3, 2}}
140 | )
141 |
142 | func request_UserService_UpdateUser_0(ctx context.Context, marshaler runtime.Marshaler, client extUsersv1.UserServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
143 | var protoReq extUsersv1.UpdateUserRequest
144 | var metadata runtime.ServerMetadata
145 |
146 | newReader, berr := utilities.IOReaderFactory(req.Body)
147 | if berr != nil {
148 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
149 | }
150 | if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.User); err != nil && err != io.EOF {
151 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
152 | }
153 | if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 {
154 | if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.User); err != nil {
155 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
156 | } else {
157 | protoReq.UpdateMask = fieldMask
158 | }
159 | }
160 |
161 | var (
162 | val string
163 | ok bool
164 | err error
165 | _ = err
166 | )
167 |
168 | val, ok = pathParams["user.id"]
169 | if !ok {
170 | return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user.id")
171 | }
172 |
173 | err = runtime.PopulateFieldFromPath(&protoReq, "user.id", val)
174 | if err != nil {
175 | return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user.id", err)
176 | }
177 |
178 | if err := req.ParseForm(); err != nil {
179 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
180 | }
181 | if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_UpdateUser_0); err != nil {
182 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
183 | }
184 |
185 | msg, err := client.UpdateUser(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
186 | return msg, metadata, err
187 |
188 | }
189 |
190 | func local_request_UserService_UpdateUser_0(ctx context.Context, marshaler runtime.Marshaler, server extUsersv1.UserServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
191 | var protoReq extUsersv1.UpdateUserRequest
192 | var metadata runtime.ServerMetadata
193 |
194 | newReader, berr := utilities.IOReaderFactory(req.Body)
195 | if berr != nil {
196 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", berr)
197 | }
198 | if err := marshaler.NewDecoder(newReader()).Decode(&protoReq.User); err != nil && err != io.EOF {
199 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
200 | }
201 | if protoReq.UpdateMask == nil || len(protoReq.UpdateMask.GetPaths()) == 0 {
202 | if fieldMask, err := runtime.FieldMaskFromRequestBody(newReader(), protoReq.User); err != nil {
203 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
204 | } else {
205 | protoReq.UpdateMask = fieldMask
206 | }
207 | }
208 |
209 | var (
210 | val string
211 | ok bool
212 | err error
213 | _ = err
214 | )
215 |
216 | val, ok = pathParams["user.id"]
217 | if !ok {
218 | return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "user.id")
219 | }
220 |
221 | err = runtime.PopulateFieldFromPath(&protoReq, "user.id", val)
222 | if err != nil {
223 | return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "user.id", err)
224 | }
225 |
226 | if err := req.ParseForm(); err != nil {
227 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
228 | }
229 | if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_UserService_UpdateUser_0); err != nil {
230 | return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err)
231 | }
232 |
233 | msg, err := server.UpdateUser(ctx, &protoReq)
234 | return msg, metadata, err
235 |
236 | }
237 |
238 | // RegisterUserServiceHandlerServer registers the http handlers for service UserService to "mux".
239 | // UnaryRPC :call UserServiceServer directly.
240 | // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
241 | // Note that using this registration option will cause many gRPC library features to stop working. Consider using RegisterUserServiceHandlerFromEndpoint instead.
242 | func RegisterUserServiceHandlerServer(ctx context.Context, mux *runtime.ServeMux, server extUsersv1.UserServiceServer) error {
243 |
244 | mux.Handle("POST", pattern_UserService_AddUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
245 | ctx, cancel := context.WithCancel(req.Context())
246 | defer cancel()
247 | var stream runtime.ServerTransportStream
248 | ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
249 | inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
250 | var err error
251 | ctx, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/users.v1.UserService/AddUser", runtime.WithHTTPPathPattern("/api/v1/users"))
252 | if err != nil {
253 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
254 | return
255 | }
256 | resp, md, err := local_request_UserService_AddUser_0(ctx, inboundMarshaler, server, req, pathParams)
257 | md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
258 | ctx = runtime.NewServerMetadataContext(ctx, md)
259 | if err != nil {
260 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
261 | return
262 | }
263 |
264 | forward_UserService_AddUser_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
265 |
266 | })
267 |
268 | mux.Handle("GET", pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
269 | ctx, cancel := context.WithCancel(req.Context())
270 | defer cancel()
271 | var stream runtime.ServerTransportStream
272 | ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
273 | inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
274 | var err error
275 | ctx, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/users.v1.UserService/GetUser", runtime.WithHTTPPathPattern("/api/v1/users/{id}"))
276 | if err != nil {
277 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
278 | return
279 | }
280 | resp, md, err := local_request_UserService_GetUser_0(ctx, inboundMarshaler, server, req, pathParams)
281 | md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
282 | ctx = runtime.NewServerMetadataContext(ctx, md)
283 | if err != nil {
284 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
285 | return
286 | }
287 |
288 | forward_UserService_GetUser_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
289 |
290 | })
291 |
292 | mux.Handle("GET", pattern_UserService_ListUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
293 | err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport")
294 | _, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
295 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
296 | return
297 | })
298 |
299 | mux.Handle("PATCH", pattern_UserService_UpdateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
300 | ctx, cancel := context.WithCancel(req.Context())
301 | defer cancel()
302 | var stream runtime.ServerTransportStream
303 | ctx = grpc.NewContextWithServerTransportStream(ctx, &stream)
304 | inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
305 | var err error
306 | ctx, err = runtime.AnnotateIncomingContext(ctx, mux, req, "/users.v1.UserService/UpdateUser", runtime.WithHTTPPathPattern("/api/v1/user/{user.id}"))
307 | if err != nil {
308 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
309 | return
310 | }
311 | resp, md, err := local_request_UserService_UpdateUser_0(ctx, inboundMarshaler, server, req, pathParams)
312 | md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer())
313 | ctx = runtime.NewServerMetadataContext(ctx, md)
314 | if err != nil {
315 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
316 | return
317 | }
318 |
319 | forward_UserService_UpdateUser_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
320 |
321 | })
322 |
323 | return nil
324 | }
325 |
326 | // RegisterUserServiceHandlerFromEndpoint is same as RegisterUserServiceHandler but
327 | // automatically dials to "endpoint" and closes the connection when "ctx" gets done.
328 | func RegisterUserServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
329 | conn, err := grpc.Dial(endpoint, opts...)
330 | if err != nil {
331 | return err
332 | }
333 | defer func() {
334 | if err != nil {
335 | if cerr := conn.Close(); cerr != nil {
336 | grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
337 | }
338 | return
339 | }
340 | go func() {
341 | <-ctx.Done()
342 | if cerr := conn.Close(); cerr != nil {
343 | grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
344 | }
345 | }()
346 | }()
347 |
348 | return RegisterUserServiceHandler(ctx, mux, conn)
349 | }
350 |
351 | // RegisterUserServiceHandler registers the http handlers for service UserService to "mux".
352 | // The handlers forward requests to the grpc endpoint over "conn".
353 | func RegisterUserServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
354 | return RegisterUserServiceHandlerClient(ctx, mux, extUsersv1.NewUserServiceClient(conn))
355 | }
356 |
357 | // RegisterUserServiceHandlerClient registers the http handlers for service UserService
358 | // to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "extUsersv1.UserServiceClient".
359 | // Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "extUsersv1.UserServiceClient"
360 | // doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
361 | // "extUsersv1.UserServiceClient" to call the correct interceptors.
362 | func RegisterUserServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client extUsersv1.UserServiceClient) error {
363 |
364 | mux.Handle("POST", pattern_UserService_AddUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
365 | ctx, cancel := context.WithCancel(req.Context())
366 | defer cancel()
367 | inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
368 | var err error
369 | ctx, err = runtime.AnnotateContext(ctx, mux, req, "/users.v1.UserService/AddUser", runtime.WithHTTPPathPattern("/api/v1/users"))
370 | if err != nil {
371 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
372 | return
373 | }
374 | resp, md, err := request_UserService_AddUser_0(ctx, inboundMarshaler, client, req, pathParams)
375 | ctx = runtime.NewServerMetadataContext(ctx, md)
376 | if err != nil {
377 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
378 | return
379 | }
380 |
381 | forward_UserService_AddUser_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
382 |
383 | })
384 |
385 | mux.Handle("GET", pattern_UserService_GetUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
386 | ctx, cancel := context.WithCancel(req.Context())
387 | defer cancel()
388 | inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
389 | var err error
390 | ctx, err = runtime.AnnotateContext(ctx, mux, req, "/users.v1.UserService/GetUser", runtime.WithHTTPPathPattern("/api/v1/users/{id}"))
391 | if err != nil {
392 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
393 | return
394 | }
395 | resp, md, err := request_UserService_GetUser_0(ctx, inboundMarshaler, client, req, pathParams)
396 | ctx = runtime.NewServerMetadataContext(ctx, md)
397 | if err != nil {
398 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
399 | return
400 | }
401 |
402 | forward_UserService_GetUser_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
403 |
404 | })
405 |
406 | mux.Handle("GET", pattern_UserService_ListUsers_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
407 | ctx, cancel := context.WithCancel(req.Context())
408 | defer cancel()
409 | inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
410 | var err error
411 | ctx, err = runtime.AnnotateContext(ctx, mux, req, "/users.v1.UserService/ListUsers", runtime.WithHTTPPathPattern("/api/v1/users"))
412 | if err != nil {
413 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
414 | return
415 | }
416 | resp, md, err := request_UserService_ListUsers_0(ctx, inboundMarshaler, client, req, pathParams)
417 | ctx = runtime.NewServerMetadataContext(ctx, md)
418 | if err != nil {
419 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
420 | return
421 | }
422 |
423 | forward_UserService_ListUsers_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...)
424 |
425 | })
426 |
427 | mux.Handle("PATCH", pattern_UserService_UpdateUser_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
428 | ctx, cancel := context.WithCancel(req.Context())
429 | defer cancel()
430 | inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
431 | var err error
432 | ctx, err = runtime.AnnotateContext(ctx, mux, req, "/users.v1.UserService/UpdateUser", runtime.WithHTTPPathPattern("/api/v1/user/{user.id}"))
433 | if err != nil {
434 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
435 | return
436 | }
437 | resp, md, err := request_UserService_UpdateUser_0(ctx, inboundMarshaler, client, req, pathParams)
438 | ctx = runtime.NewServerMetadataContext(ctx, md)
439 | if err != nil {
440 | runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
441 | return
442 | }
443 |
444 | forward_UserService_UpdateUser_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
445 |
446 | })
447 |
448 | return nil
449 | }
450 |
451 | var (
452 | pattern_UserService_AddUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "users"}, ""))
453 |
454 | pattern_UserService_GetUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "users", "id"}, ""))
455 |
456 | pattern_UserService_ListUsers_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"api", "v1", "users"}, ""))
457 |
458 | pattern_UserService_UpdateUser_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"api", "v1", "user", "user.id"}, ""))
459 | )
460 |
461 | var (
462 | forward_UserService_AddUser_0 = runtime.ForwardResponseMessage
463 |
464 | forward_UserService_GetUser_0 = runtime.ForwardResponseMessage
465 |
466 | forward_UserService_ListUsers_0 = runtime.ForwardResponseStream
467 |
468 | forward_UserService_UpdateUser_0 = runtime.ForwardResponseMessage
469 | )
470 |
--------------------------------------------------------------------------------
/go.sum:
--------------------------------------------------------------------------------
1 | cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
2 | cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
3 | cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
4 | cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
5 | cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
6 | cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
7 | cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
8 | cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
9 | cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
10 | cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
11 | cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
12 | cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
13 | cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
14 | cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
15 | cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
16 | cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
17 | cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
18 | cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
19 | cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
20 | cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
21 | cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
22 | cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
23 | cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
24 | cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
25 | cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
26 | cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
27 | cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
28 | cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
29 | cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
30 | cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
31 | cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
32 | cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
33 | dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
34 | github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
35 | github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
36 | github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
37 | github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
38 | github.com/bufbuild/connect-go v0.1.0 h1:LxjZl0psAeiFuy3PIKoZpmixo3P6Dd+pLoy3QYVEAS0=
39 | github.com/bufbuild/connect-go v0.1.0/go.mod h1:4efZ2eXFENwd4p7tuLaL9m0qtTsCOzuBvrohvRGevDM=
40 | github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
41 | github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
42 | github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
43 | github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
44 | github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
45 | github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
46 | github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
47 | github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
48 | github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
49 | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
50 | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
51 | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
52 | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
53 | github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
54 | github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
55 | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
56 | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
57 | github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1/go.mod h1:vR7hzQXu2zJy9AVAgeJqvqgH9Q5CA+iKCZ2gyEVpxRU=
58 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
59 | github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
60 | github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0=
61 | github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM=
62 | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
63 | github.com/golang/glog v1.0.0 h1:nfP3RFugxnNRyKgeWd4oI1nYvXpxrx8ck8ZrcizshdQ=
64 | github.com/golang/glog v1.0.0/go.mod h1:EWib/APOK0SL3dFbYqvxE3UYd8E6s1ouQ7iEp/0LWV4=
65 | github.com/golang/groupcache v0.0.0-20190702054246-869f871628b6/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
66 | github.com/golang/groupcache v0.0.0-20191227052852-215e87163ea7/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
67 | github.com/golang/groupcache v0.0.0-20200121045136-8c9f03a8e57e/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
68 | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
69 | github.com/golang/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
70 | github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFUx0Y=
71 | github.com/golang/mock v1.4.0/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
72 | github.com/golang/mock v1.4.1/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
73 | github.com/golang/mock v1.4.3/go.mod h1:UOMv5ysSaYNkG+OFQykRIcU/QvvxJf3p21QfJ2Bt3cw=
74 | github.com/golang/mock v1.4.4/go.mod h1:l3mdAwkq5BuhzHwde/uurv3sEJeZMXNpwsxVWU71h+4=
75 | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
76 | github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
77 | github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
78 | github.com/golang/protobuf v1.3.3/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
79 | github.com/golang/protobuf v1.3.4/go.mod h1:vzj43D7+SQXF/4pzW/hwtAqwc6iTitCiVSaWz5lYuqw=
80 | github.com/golang/protobuf v1.3.5/go.mod h1:6O5/vntMXwX2lRkT1hjjk0nAC1IDOTvTlVgjlRvqsdk=
81 | github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
82 | github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
83 | github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs=
84 | github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w=
85 | github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0=
86 | github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QDs8UjoX8=
87 | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
88 | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
89 | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
90 | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw=
91 | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
92 | github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
93 | github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
94 | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
95 | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
96 | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
97 | github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
98 | github.com/google/go-cmp v0.4.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
99 | github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
100 | github.com/google/go-cmp v0.5.1/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
101 | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
102 | github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
103 | github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
104 | github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs=
105 | github.com/google/martian/v3 v3.0.0/go.mod h1:y5Zk1BBys9G+gd6Jrk0W3cC1+ELVxBWuIGO+w/tUAp0=
106 | github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
107 | github.com/google/pprof v0.0.0-20190515194954-54271f7e092f/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc=
108 | github.com/google/pprof v0.0.0-20191218002539-d4f498aebedc/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
109 | github.com/google/pprof v0.0.0-20200212024743-f11f1df84d12/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
110 | github.com/google/pprof v0.0.0-20200229191704-1ebb73c60ed3/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
111 | github.com/google/pprof v0.0.0-20200430221834-fc25d7d30c6d/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
112 | github.com/google/pprof v0.0.0-20200708004538-1a94d8640e99/go.mod h1:ZgVRPoUq/hfqzAqh7sHMqb3I9Rq5C59dIz2SbBwJ4eM=
113 | github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
114 | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
115 | github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg=
116 | github.com/googleapis/gax-go/v2 v2.0.5/go.mod h1:DWXyrwAJ9X0FpwwEdw+IPEYBICEFu5mhpdKc/us6bOk=
117 | github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
118 | github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0 h1:rgxjzoDmDXw5q8HONgyHhBas4to0/XWRo/gPpJhsUNQ=
119 | github.com/grpc-ecosystem/grpc-gateway/v2 v2.6.0/go.mod h1:qrJPVzv9YlhsrxJc3P/Q85nr0w1lIRikTl4JlhdDH5w=
120 | github.com/hashicorp/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
121 | github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8=
122 | github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
123 | github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU=
124 | github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/XSXhF0NWZEnDohbsk=
125 | github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
126 | github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
127 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
128 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
129 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
130 | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
131 | github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ=
132 | github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
133 | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
134 | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
135 | github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
136 | github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
137 | github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
138 | github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
139 | github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
140 | github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
141 | go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU=
142 | go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8=
143 | go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
144 | go.opencensus.io v0.22.3/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
145 | go.opencensus.io v0.22.4/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw=
146 | go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
147 | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
148 | golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
149 | golang.org/x/crypto v0.0.0-20190605123033-f99c8df09eb5/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
150 | golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
151 | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
152 | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
153 | golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
154 | golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
155 | golang.org/x/exp v0.0.0-20190829153037-c13cbed26979/go.mod h1:86+5VVa7VpoJ4kLfm080zCjGlMRFzhUhsZKEZO7MGek=
156 | golang.org/x/exp v0.0.0-20191030013958-a1ab85dbe136/go.mod h1:JXzH8nQsPlswgeRAPE3MuO9GYsAcnJvJ4vnMwN/5qkY=
157 | golang.org/x/exp v0.0.0-20191129062945-2f5052295587/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
158 | golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
159 | golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4=
160 | golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM=
161 | golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU=
162 | golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
163 | golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
164 | golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
165 | golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU=
166 | golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
167 | golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
168 | golang.org/x/lint v0.0.0-20190409202823-959b441ac422/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
169 | golang.org/x/lint v0.0.0-20190909230951-414d861bb4ac/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
170 | golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
171 | golang.org/x/lint v0.0.0-20191125180803-fdd1cda4f05f/go.mod h1:5qLYkcX4OjUUV8bRuDixDT3tpyyb+LUpUlRWLxfhWrs=
172 | golang.org/x/lint v0.0.0-20200130185559-910be7a94367/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
173 | golang.org/x/lint v0.0.0-20200302205851-738671d3881b/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
174 | golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY=
175 | golang.org/x/mobile v0.0.0-20190312151609-d3739f865fa6/go.mod h1:z+o9i4GpDbdi3rU15maQ/Ox0txvL9dWGYEHz965HBQE=
176 | golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028/go.mod h1:E/iHnbuqvinMTCcRqshq8CkpyQDoeVncDDYHnLhea+o=
177 | golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
178 | golang.org/x/mod v0.1.0/go.mod h1:0QHyrYULN0/3qlju5TqG8bIK38QM8yzMo5ekMj3DlcY=
179 | golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
180 | golang.org/x/mod v0.1.1-0.20191107180719-034126e5016b/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
181 | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
182 | golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
183 | golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
184 | golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
185 | golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
186 | golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
187 | golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
188 | golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
189 | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
190 | golang.org/x/net v0.0.0-20190501004415-9ce7a6920f09/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
191 | golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
192 | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
193 | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
194 | golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
195 | golang.org/x/net v0.0.0-20190724013045-ca1201d0de80/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
196 | golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
197 | golang.org/x/net v0.0.0-20200114155413-6afb5195e5aa/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
198 | golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
199 | golang.org/x/net v0.0.0-20200222125558-5a598a2470a0/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
200 | golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
201 | golang.org/x/net v0.0.0-20200301022130-244492dfa37a/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
202 | golang.org/x/net v0.0.0-20200324143707-d3edc9973b7e/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
203 | golang.org/x/net v0.0.0-20200501053045-e0ff5e5a1de5/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
204 | golang.org/x/net v0.0.0-20200506145744-7e3656a0809f/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
205 | golang.org/x/net v0.0.0-20200513185701-a91f0712d120/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
206 | golang.org/x/net v0.0.0-20200520182314-0ba52f642ac2/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
207 | golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
208 | golang.org/x/net v0.0.0-20200707034311-ab3426394381/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
209 | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
210 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4 h1:4nGaVu0QrbjT/AK2PRLuQfQuh6DJve+pELhqTdAj3x0=
211 | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
212 | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
213 | golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
214 | golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
215 | golang.org/x/oauth2 v0.0.0-20191202225959-858c2ad4c8b6/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
216 | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
217 | golang.org/x/oauth2 v0.0.0-20210819190943-2bc19b11175f/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A=
218 | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
219 | golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
220 | golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
221 | golang.org/x/sync v0.0.0-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
222 | golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
223 | golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
224 | golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
225 | golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
226 | golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
227 | golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
228 | golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
229 | golang.org/x/sys v0.0.0-20190312061237-fead79001313/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
230 | golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
231 | golang.org/x/sys v0.0.0-20190502145724-3ef323f4f1fd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
232 | golang.org/x/sys v0.0.0-20190507160741-ecd444e8653b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
233 | golang.org/x/sys v0.0.0-20190606165138-5da285871e9c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
234 | golang.org/x/sys v0.0.0-20190624142023-c5567b49c5d0/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
235 | golang.org/x/sys v0.0.0-20190726091711-fc99dfbffb4e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
236 | golang.org/x/sys v0.0.0-20191001151750-bb3f8db39f24/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
237 | golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
238 | golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
239 | golang.org/x/sys v0.0.0-20200113162924-86b910548bc1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
240 | golang.org/x/sys v0.0.0-20200122134326-e047566fdf82/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
241 | golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
242 | golang.org/x/sys v0.0.0-20200212091648-12a6c2dcc1e4/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
243 | golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
244 | golang.org/x/sys v0.0.0-20200302150141-5c8b2ff67527/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
245 | golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
246 | golang.org/x/sys v0.0.0-20200331124033-c3d80250170d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
247 | golang.org/x/sys v0.0.0-20200501052902-10377860bb8e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
248 | golang.org/x/sys v0.0.0-20200511232937-7e40ca221e25/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
249 | golang.org/x/sys v0.0.0-20200515095857-1151b9dac4a9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
250 | golang.org/x/sys v0.0.0-20200523222454-059865788121/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
251 | golang.org/x/sys v0.0.0-20200803210538-64077c9b5642/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
252 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
253 | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
254 | golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
255 | golang.org/x/sys v0.0.0-20211019181941-9d821ace8654 h1:id054HUawV2/6IGm2IV8KZQjqtwAOo2CYlOToYqa0d0=
256 | golang.org/x/sys v0.0.0-20211019181941-9d821ace8654/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
257 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
258 | golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
259 | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
260 | golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
261 | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
262 | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
263 | golang.org/x/text v0.3.5 h1:i6eZZ+zk0SOf0xgBpEpPD18qWcJda6q1sxt3S0kzyUQ=
264 | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
265 | golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
266 | golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
267 | golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
268 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
269 | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
270 | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
271 | golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
272 | golang.org/x/tools v0.0.0-20190312151545-0bb0c0a6e846/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
273 | golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
274 | golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
275 | golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
276 | golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
277 | golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
278 | golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
279 | golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
280 | golang.org/x/tools v0.0.0-20190816200558-6889da9d5479/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
281 | golang.org/x/tools v0.0.0-20190911174233-4f2ddba30aff/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
282 | golang.org/x/tools v0.0.0-20191012152004-8de300cfc20a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
283 | golang.org/x/tools v0.0.0-20191113191852-77e3bb0ad9e7/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
284 | golang.org/x/tools v0.0.0-20191115202509-3a792d9c32b2/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
285 | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
286 | golang.org/x/tools v0.0.0-20191125144606-a911d9008d1f/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
287 | golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
288 | golang.org/x/tools v0.0.0-20191216173652-a0e659d51361/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
289 | golang.org/x/tools v0.0.0-20191227053925-7b8e75db28f4/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
290 | golang.org/x/tools v0.0.0-20200117161641-43d50277825c/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
291 | golang.org/x/tools v0.0.0-20200122220014-bf1340f18c4a/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
292 | golang.org/x/tools v0.0.0-20200130002326-2f3ba24bd6e7/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
293 | golang.org/x/tools v0.0.0-20200204074204-1cc6d1ef6c74/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
294 | golang.org/x/tools v0.0.0-20200207183749-b753a1ba74fa/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
295 | golang.org/x/tools v0.0.0-20200212150539-ea181f53ac56/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
296 | golang.org/x/tools v0.0.0-20200224181240-023911ca70b2/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
297 | golang.org/x/tools v0.0.0-20200227222343-706bc42d1f0d/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
298 | golang.org/x/tools v0.0.0-20200304193943-95d2e580d8eb/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
299 | golang.org/x/tools v0.0.0-20200312045724-11d5b4c81c7d/go.mod h1:o4KQGtdN14AW+yjsvvwRTJJuXz8XRtIHtEnmAXLyFUw=
300 | golang.org/x/tools v0.0.0-20200331025713-a30bf2db82d4/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
301 | golang.org/x/tools v0.0.0-20200501065659-ab2804fb9c9d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
302 | golang.org/x/tools v0.0.0-20200512131952-2bc93b1c0c88/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
303 | golang.org/x/tools v0.0.0-20200515010526-7d3b6ebf133d/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
304 | golang.org/x/tools v0.0.0-20200618134242-20370b0cb4b2/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
305 | golang.org/x/tools v0.0.0-20200729194436-6467de6f59a7/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
306 | golang.org/x/tools v0.0.0-20200804011535-6c149bb5ef0d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
307 | golang.org/x/tools v0.0.0-20200825202427-b303f430e36d/go.mod h1:njjCfa9FT2d7l9Bc6FUM5FLjQPp3cFF28FI3qnDFljA=
308 | golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
309 | golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
310 | golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
311 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
312 | golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
313 | google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE=
314 | google.golang.org/api v0.7.0/go.mod h1:WtwebWUNSVBH/HAw79HIFXZNqEvBhG+Ra+ax0hx3E3M=
315 | google.golang.org/api v0.8.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
316 | google.golang.org/api v0.9.0/go.mod h1:o4eAsZoiT+ibD93RtjEohWalFOjRDx6CVaqeizhEnKg=
317 | google.golang.org/api v0.13.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
318 | google.golang.org/api v0.14.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
319 | google.golang.org/api v0.15.0/go.mod h1:iLdEw5Ide6rF15KTC1Kkl0iskquN2gFfn9o9XIsbkAI=
320 | google.golang.org/api v0.17.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
321 | google.golang.org/api v0.18.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
322 | google.golang.org/api v0.19.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
323 | google.golang.org/api v0.20.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
324 | google.golang.org/api v0.22.0/go.mod h1:BwFmGc8tA3vsd7r/7kR8DY7iEEGSU04BFxCo5jP/sfE=
325 | google.golang.org/api v0.24.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
326 | google.golang.org/api v0.28.0/go.mod h1:lIXQywCXRcnZPGlsd8NbLnOjtAoL6em04bJ9+z0MncE=
327 | google.golang.org/api v0.29.0/go.mod h1:Lcubydp8VUV7KeIHD9z2Bys/sm/vGKnG1UHuDBSrHWM=
328 | google.golang.org/api v0.30.0/go.mod h1:QGmEvQ87FHZNiUVJkT14jQNYJ4ZJjdRF23ZXz5138Fc=
329 | google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
330 | google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
331 | google.golang.org/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
332 | google.golang.org/appengine v1.6.1/go.mod h1:i06prIuMbXzDqacNJfV5OdTW448YApPu5ww/cMBSeb0=
333 | google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
334 | google.golang.org/appengine v1.6.6/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc=
335 | google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
336 | google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
337 | google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
338 | google.golang.org/genproto v0.0.0-20190425155659-357c62f0e4bb/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
339 | google.golang.org/genproto v0.0.0-20190502173448-54afdca5d873/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE=
340 | google.golang.org/genproto v0.0.0-20190801165951-fa694d86fc64/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
341 | google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
342 | google.golang.org/genproto v0.0.0-20190911173649-1774047e7e51/go.mod h1:IbNlFCBrqXvoKpeg0TB2l7cyZUmoaFKYIwrEpbDKLA8=
343 | google.golang.org/genproto v0.0.0-20191108220845-16a3f7862a1a/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
344 | google.golang.org/genproto v0.0.0-20191115194625-c23dd37a84c9/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
345 | google.golang.org/genproto v0.0.0-20191216164720-4f79533eabd1/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
346 | google.golang.org/genproto v0.0.0-20191230161307-f3c370f40bfb/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
347 | google.golang.org/genproto v0.0.0-20200115191322-ca5a22157cba/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
348 | google.golang.org/genproto v0.0.0-20200122232147-0452cf42e150/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc=
349 | google.golang.org/genproto v0.0.0-20200204135345-fa8e72b47b90/go.mod h1:GmwEX6Z4W5gMy59cAlVYjN9JhxgbQH6Gn+gFDQe2lzA=
350 | google.golang.org/genproto v0.0.0-20200212174721-66ed5ce911ce/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
351 | google.golang.org/genproto v0.0.0-20200224152610-e50cd9704f63/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
352 | google.golang.org/genproto v0.0.0-20200228133532-8c2c7df3a383/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
353 | google.golang.org/genproto v0.0.0-20200305110556-506484158171/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
354 | google.golang.org/genproto v0.0.0-20200312145019-da6875a35672/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
355 | google.golang.org/genproto v0.0.0-20200331122359-1ee6d9798940/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
356 | google.golang.org/genproto v0.0.0-20200430143042-b979b6f78d84/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
357 | google.golang.org/genproto v0.0.0-20200511104702-f5ebc3bea380/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
358 | google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
359 | google.golang.org/genproto v0.0.0-20200515170657-fc4c6c6a6587/go.mod h1:YsZOwe1myG/8QRHRsmBRE1LrgQY60beZKjly0O1fX9U=
360 | google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
361 | google.golang.org/genproto v0.0.0-20200618031413-b414f8b61790/go.mod h1:jDfRM7FcilCzHH/e9qn6dsT145K34l5v+OpcnNgKAAA=
362 | google.golang.org/genproto v0.0.0-20200729003335-053ba62fc06f/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
363 | google.golang.org/genproto v0.0.0-20200804131852-c06518451d9c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
364 | google.golang.org/genproto v0.0.0-20200825200019-8632dd797987/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no=
365 | google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83 h1:3V2dxSZpz4zozWWUq36vUxXEKnSYitEH2LdsAx+RUmg=
366 | google.golang.org/genproto v0.0.0-20210903162649-d08c68adba83/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY=
367 | google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
368 | google.golang.org/grpc v1.20.1/go.mod h1:10oTOabMzJvdu6/UiuZezV6QK5dSlG84ov/aaiqXj38=
369 | google.golang.org/grpc v1.21.1/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
370 | google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
371 | google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
372 | google.golang.org/grpc v1.26.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
373 | google.golang.org/grpc v1.27.0/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
374 | google.golang.org/grpc v1.27.1/go.mod h1:qbnxyOmOxrQa7FizSgH+ReBfzJrCY1pSN7KXBS8abTk=
375 | google.golang.org/grpc v1.28.0/go.mod h1:rpkK4SK4GF4Ach/+MFLZUBavHOvF2JJB5uozKKal+60=
376 | google.golang.org/grpc v1.29.1/go.mod h1:itym6AZVZYACWQqET3MqgPpjcuV5QH3BxFS3IjizoKk=
377 | google.golang.org/grpc v1.30.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
378 | google.golang.org/grpc v1.31.0/go.mod h1:N36X2cJ7JwdamYAgDz+s+rVMFjt3numwzf/HckM8pak=
379 | google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTpR3n0=
380 | google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
381 | google.golang.org/grpc v1.40.0 h1:AGJ0Ih4mHjSeibYkFGh1dD9KJ/eOtZ93I6hoHhukQ5Q=
382 | google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34=
383 | google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
384 | google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
385 | google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
386 | google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE=
387 | google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo=
388 | google.golang.org/protobuf v1.22.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
389 | google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
390 | google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
391 | google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGjtUeSXeh4=
392 | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
393 | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
394 | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
395 | google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
396 | google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
397 | google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
398 | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
399 | gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
400 | gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
401 | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
402 | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
403 | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
404 | honnef.co/go/tools v0.0.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
405 | honnef.co/go/tools v0.0.0-20190418001031-e561f6794a2a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
406 | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
407 | honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
408 | honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
409 | honnef.co/go/tools v0.0.1-2020.1.4/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
410 | rsc.io/binaryregexp v0.2.0/go.mod h1:qTv7/COck+e2FymRvadv62gMdZztPaShugOCi3I+8D8=
411 | rsc.io/quote/v3 v3.1.0/go.mod h1:yEA65RcK8LyAZtP9Kv3t0HmxON59tX3rD+tICJqUlj0=
412 | rsc.io/sampler v1.3.0/go.mod h1:T1hPZKmBbMNahiBKFy5HrXp6adAjACjK9JXDnKaTXpA=
413 |
--------------------------------------------------------------------------------