├── .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 | --------------------------------------------------------------------------------