Showing preview only (458K chars total). Download the full file or copy to clipboard to get everything.
Repository: evrone/go-clean-template
Branch: master
Commit: f089e8af4189
Files: 81
Total size: 433.4 KB
Directory structure:
gitextract_7prstv14/
├── .dockerignore
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ └── ci.yml
├── .gitignore
├── .golangci.yml
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── README_CN.md
├── README_RU.md
├── cmd/
│ └── app/
│ └── main.go
├── config/
│ └── config.go
├── docker-compose-integration-test.yml
├── docker-compose.yml
├── docs/
│ ├── docs.go
│ ├── proto/
│ │ └── v1/
│ │ ├── translation.history.pb.go
│ │ ├── translation.history.proto
│ │ └── translation.history_grpc.pb.go
│ ├── swagger.json
│ └── swagger.yaml
├── go.mod
├── go.sum
├── integration-test/
│ ├── Dockerfile
│ └── integration_test.go
├── internal/
│ ├── app/
│ │ ├── app.go
│ │ └── migrate.go
│ ├── controller/
│ │ ├── amqp_rpc/
│ │ │ ├── router.go
│ │ │ └── v1/
│ │ │ ├── controller.go
│ │ │ ├── router.go
│ │ │ └── translation.go
│ │ ├── grpc/
│ │ │ ├── router.go
│ │ │ └── v1/
│ │ │ ├── controller.go
│ │ │ ├── response/
│ │ │ │ └── translation.history.go
│ │ │ ├── router.go
│ │ │ └── translation.go
│ │ ├── nats_rpc/
│ │ │ ├── router.go
│ │ │ └── v1/
│ │ │ ├── controller.go
│ │ │ ├── router.go
│ │ │ └── translation.go
│ │ └── restapi/
│ │ ├── middleware/
│ │ │ ├── logger.go
│ │ │ └── recovery.go
│ │ ├── router.go
│ │ └── v1/
│ │ ├── controller.go
│ │ ├── error.go
│ │ ├── request/
│ │ │ └── translate.go
│ │ ├── response/
│ │ │ └── error.go
│ │ ├── router.go
│ │ └── translation.go
│ ├── entity/
│ │ ├── translation.go
│ │ └── translation.history.go
│ ├── repo/
│ │ ├── contracts.go
│ │ ├── persistent/
│ │ │ └── translation_postgres.go
│ │ └── webapi/
│ │ └── translation_google.go
│ └── usecase/
│ ├── contracts.go
│ ├── mocks_repo_test.go
│ ├── mocks_usecase_test.go
│ ├── translation/
│ │ └── translation.go
│ └── translation_test.go
├── migrations/
│ ├── 20210221023242_migrate_name.down.sql
│ └── 20210221023242_migrate_name.up.sql
├── nginx/
│ └── nginx.conf
└── pkg/
├── grpcserver/
│ ├── options.go
│ └── server.go
├── httpserver/
│ ├── options.go
│ └── server.go
├── logger/
│ ├── logger.go
│ └── logger_test.go
├── nats/
│ └── nats_rpc/
│ ├── client/
│ │ ├── client.go
│ │ └── options.go
│ ├── errors.go
│ └── server/
│ ├── options.go
│ └── server.go
├── postgres/
│ ├── options.go
│ └── postgres.go
└── rabbitmq/
└── rmq_rpc/
├── client/
│ ├── client.go
│ └── options.go
├── connection.go
├── errors.go
└── server/
├── options.go
└── server.go
================================================
FILE CONTENTS
================================================
================================================
FILE: .dockerignore
================================================
.idea
.git
.github
nginx
.dockerignore
.env
.env.example
.golangci.yml
.gitignore
coverage.txt
docker-compose.yml
LICENSE
Makefile
README*
================================================
FILE: .github/dependabot.yml
================================================
version: 2
updates:
- package-ecosystem: gomod
directory: "/"
schedule:
interval: daily
time: "02:00"
open-pull-requests-limit: 10
- package-ecosystem: github-actions
directory: "/"
schedule:
interval: daily
time: "02:00"
open-pull-requests-limit: 10
- package-ecosystem: docker
directory: "/"
schedule:
interval: daily
time: "02:00"
open-pull-requests-limit: 10
- package-ecosystem: docker-compose
directory: "/"
schedule:
interval: daily
time: "02:00"
open-pull-requests-limit: 10
================================================
FILE: .github/workflows/ci.yml
================================================
name: CI
on: pull_request
jobs:
golangci-lint:
name: runner / golangci-lint
runs-on: ubuntu-latest
steps:
- name: Check out code into the Go module directory
uses: actions/checkout@v6
- uses: actions/setup-go@v6
with:
go-version: '1.26'
cache: false
- name: golangci-lint
uses: golangci/golangci-lint-action@v9
with:
args: --timeout=15m
yamllint:
name: runner / yamllint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: reviewdog/action-yamllint@v1
with:
fail_on_error: true
reporter: github-pr-review
yamllint_flags: '-d "{extends: default, rules: {truthy: disable}}" .'
hadolint:
name: runner / hadolint
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: reviewdog/action-hadolint@v1
with:
fail_on_error: true
reporter: github-pr-review
dotenv-linter:
name: runner / dotenv-linter
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: dotenv-linter/action-dotenv-linter@v3
with:
reporter: github-pr-review
check-dependencies:
name: runner / check-dependencies
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-go@v6
with:
go-version: 1.26
- name: WriteGoList
run: go list -json -m all > go.list
- name: Nancy
uses: sonatype-nexus-community/nancy-github-action@main
continue-on-error: true
unit-tests:
name: runner / tests / unit
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: actions/setup-go@v6
with:
go-version: 1.26
- name: Unit Tests
run: "make test"
- name: Upload coverage report
run: bash <(curl -s https://codecov.io/bash)
integration-tests:
name: runner / tests / integration
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- name: Integration tests
run: "make compose-up-integration-test"
================================================
FILE: .gitignore
================================================
# IDE
.idea
.vscode
# Config
.env
# Binaries for programs and plugins
*.exe
*.exe~
*.dll
*.so
*.dylib
bin/
# Test binary, built with `go test -c`
*.test
# Output of the go coverage tool, specifically when used with LiteIDE
*.out
# Dependency directories (remove the comment below to include it)
vendor/
coverage.txt
================================================
FILE: .golangci.yml
================================================
version: "2"
linters:
default: none
enable:
- wsl_v5
- asciicheck
- bodyclose
- copyloopvar
- cyclop
- dogsled
- dupl
- durationcheck
- err113
- errcheck
- errorlint
- exhaustive
- forbidigo
- funlen
- gochecknoglobals
- gochecknoinits
- gocognit
- goconst
- gocritic
- gocyclo
- godot
- godox
- gomodguard
- goprintffuncname
- gosec
- govet
- ineffassign
- makezero
- misspell
- mnd
- nakedret
- nestif
- nlreturn
- noctx
- nolintlint
- paralleltest
- predeclared
- revive
- rowserrcheck
- sqlclosecheck
- staticcheck
- thelper
- tparallel
- unconvert
- unparam
- unused
- whitespace
settings:
wsl_v5:
allow-first-in-block: true
allow-whole-block: false
branch-max-lines: 2
dupl:
threshold: 100
errcheck:
check-type-assertions: true
check-blank: true
errorlint:
errorf: true
exhaustive:
default-signifies-exhaustive: false
funlen:
lines: 65
statements: 40
gocognit:
min-complexity: 15
goconst:
min-len: 2
min-occurrences: 2
gocritic:
disabled-checks:
- dupImport
- unnecessaryBlock
enabled-tags:
- diagnostic
- experimental
- opinionated
- performance
- style
gocyclo:
min-complexity: 10
misspell:
locale: US
nestif:
min-complexity: 4
nolintlint:
require-explanation: true
require-specific: true
exclusions:
generated: lax
presets:
- comments
- common-false-positives
- legacy
- std-error-handling
rules:
- linters:
- godot
- paralleltest
path: integration-test
- linters:
- godot
path: internal
paths:
- bin/
- third_party$
- builtin$
- examples$
formatters:
enable:
- gci
- gofmt
- gofumpt
- goimports
settings:
gofumpt:
extra-rules: true
exclusions:
generated: lax
paths:
- bin/
- third_party$
- builtin$
- examples$
================================================
FILE: Dockerfile
================================================
# Step 1: Modules caching
FROM golang:1.26-alpine3.23 AS modules
COPY go.mod go.sum /modules/
WORKDIR /modules
RUN go mod download
# Step 2: Builder
FROM golang:1.26-alpine3.23 AS builder
COPY --from=modules /go/pkg /go/pkg
COPY . /app
WORKDIR /app
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \
go build -tags migrate -o /bin/app ./cmd/app
# Step 3: Final
FROM scratch
COPY --from=builder /app/config /config
COPY --from=builder /app/migrations /migrations
COPY --from=builder /bin/app /app
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
CMD ["/app"]
================================================
FILE: LICENSE
================================================
MIT License
Copyright (c) 2021 Evrone <mail@evrone.com>
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
================================================
FILE: Makefile
================================================
ifneq ($(wildcard .env),)
include .env
export
else
$(warning WARNING: .env file not found! Using .env.example)
include .env.example
export
endif
BASE_STACK = docker compose -f docker-compose.yml
INTEGRATION_TEST_STACK = $(BASE_STACK) -f docker-compose-integration-test.yml
ALL_STACK = $(INTEGRATION_TEST_STACK)
# HELP =================================================================================================================
# This will output the help for each task
# thanks to https://marmelab.com/blog/2016/02/29/auto-documented-makefile.html
.PHONY: help
help: ## Display this help screen
@awk 'BEGIN {FS = ":.*##"; printf "\nUsage:\n make \033[36m<target>\033[0m\n"} /^[a-zA-Z_-]+:.*?##/ { printf " \033[36m%-15s\033[0m %s\n", $$1, $$2 } /^##@/ { printf "\n\033[1m%s\033[0m\n", substr($$0, 5) } ' $(MAKEFILE_LIST)
compose-up: ### Run docker compose (without backend and reverse proxy)
$(BASE_STACK) up --build -d db rabbitmq nats && docker compose logs -f
.PHONY: compose-up
compose-up-all: ### Run docker compose (with backend and reverse proxy)
$(BASE_STACK) up --build -d
.PHONY: compose-up-all
compose-up-integration-test: ### Run docker compose with integration test
$(INTEGRATION_TEST_STACK) up --build --abort-on-container-exit --exit-code-from integration-test
.PHONY: compose-up-integration-test
compose-down: ### Down docker compose
$(ALL_STACK) down --remove-orphans
.PHONY: compose-down
swag-v1: ### swag init
swag init -g internal/controller/restapi/router.go
.PHONY: swag-v1
proto-v1: ### generate source files from proto
protoc --go_out=. \
--go_opt=paths=source_relative \
--go-grpc_out=. \
--go-grpc_opt=paths=source_relative \
docs/proto/v1/*.proto
.PHONY: proto-v1
deps: ### deps tidy + verify
go mod tidy && go mod verify
.PHONY: deps
deps-audit: ### check dependencies vulnerabilities
govulncheck ./...
.PHONY: deps-audit
fix-diff: ### Show code changes by `go fix`
go fix -diff ./...
.PHONY: fix-diff
format: ### Run code formatter
go fix ./...
gofumpt -l -w .
gci write . --skip-generated -s standard -s default
.PHONY: format
run: deps swag-v1 proto-v1 ### swag run for API v1
go mod download && \
CGO_ENABLED=0 go run -tags migrate ./cmd/app
.PHONY: run
docker-rm-volume: ### remove docker volume
docker volume rm go-clean-template_pg-data
.PHONY: docker-rm-volume
linter-golangci: ### check by golangci linter
golangci-lint run
.PHONY: linter-golangci
linter-hadolint: ### check by hadolint linter
git ls-files --exclude='Dockerfile*' --ignored | xargs hadolint
.PHONY: linter-hadolint
linter-dotenv: ### check by dotenv linter
dotenv-linter
.PHONY: linter-dotenv
test: ### run test
go test -v -race -covermode atomic -coverprofile=coverage.txt ./internal/... ./pkg/...
.PHONY: test
integration-test: ### run integration-test
go clean -testcache && go test -v ./integration-test/...
.PHONY: integration-test
mock: ### run mockgen
mockgen -source ./internal/repo/contracts.go -package usecase_test > ./internal/usecase/mocks_repo_test.go
mockgen -source ./internal/usecase/contracts.go -package usecase_test > ./internal/usecase/mocks_usecase_test.go
.PHONY: mock
migrate-create: ### create new migration
migrate create -ext sql -dir migrations '$(word 2,$(MAKECMDGOALS))'
.PHONY: migrate-create
migrate-up: ### migration up
migrate -path migrations -database '$(PG_URL)?sslmode=disable' up
.PHONY: migrate-up
bin-deps: ### install tools
go install tool
go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate
.PHONY: bin-deps
pre-commit: swag-v1 proto-v1 mock format linter-golangci test ### run pre-commit
.PHONY: pre-commit
================================================
FILE: README.md
================================================

# Go Clean template
[🇨🇳 中文](README_CN.md)
[🇷🇺 RU](README_RU.md)
Clean Architecture template for Golang services
[](https://github.com/evrone/go-clean-template/releases/)
[](https://github.com/evrone/go-clean-template/blob/master/LICENSE)
[](https://goreportcard.com/report/github.com/evrone/go-clean-template)
[](https://codecov.io/gh/evrone/go-clean-template)
[](https://github.com/gofiber/fiber)
[](https://github.com/swaggo/swag)
[](https://github.com/go-playground/validator)
[](https://github.com/goccy/go-json)
[](https://github.com/Masterminds/squirrel)
[](https://github.com/golang-migrate/migrate)
[](https://github.com/rs/zerolog)
[](https://github.com/ansrivas/fiberprometheus)
[](https://github.com/stretchr/testify)
[](https://go.uber.org/mock)
## Overview
The purpose of the template is to show:
- how to organize a project and prevent it from turning into spaghetti code
- where to store business logic so that it remains independent, clean, and extensible
- how not to lose control when a microservice grows
Using the principles of Robert Martin (aka Uncle Bob).
[Go-clean-template](https://evrone.com/go-clean-template?utm_source=github&utm_campaign=go-clean-template) is created &
supported by [Evrone](https://evrone.com/?utm_source=github&utm_campaign=go-clean-template).
This template implements three types of servers:
- AMQP RPC (based on RabbitMQ as [transport](https://github.com/rabbitmq/amqp091-go)
and [Request-Reply pattern](https://www.enterpriseintegrationpatterns.com/patterns/messaging/RequestReply.html))
- MQ RPC (based on NATS as [transport](https://github.com/nats-io/nats.go)
and [Request-Reply pattern](https://www.enterpriseintegrationpatterns.com/patterns/messaging/RequestReply.html))
- gRPC ([gRPC](https://grpc.io/) framework based on protobuf)
- REST API ([Fiber](https://github.com/gofiber/fiber) framework)
## Content
- [Quick start](#quick-start)
- [Project structure](#project-structure)
- [Dependency Injection](#dependency-injection)
- [Clean Architecture](#clean-architecture)
## Quick start
### Local development
```sh
# Postgres, RabbitMQ, NATS
make compose-up
# Run app with migrations
make run
```
### Integration tests (can be run in CI)
```sh
# DB, app + migrations, integration tests
make compose-up-integration-test
```
### Full docker stack with reverse proxy
```sh
make compose-up-all
```
Check services:
- AMQP RPC:
- URL: `amqp://guest:guest@127.0.0.1:5672/`
- Client Exchange: `rpc_client`
- Server Exchange: `rpc_server`
- NATS RPC:
- URL: `nats://guest:guest@127.0.0.1:4222/`
- Server Exchange: `rpc_server`
- REST API:
- http://app.lvh.me/healthz | http://127.0.0.1:8080/healthz
- http://app.lvh.me/metrics | http://127.0.0.1:8080/metrics
- http://app.lvh.me/swagger | http://127.0.0.1:8080/swagger
- gRPC:
- URL: `tcp://grpc.lvh.me:8081` | `tcp://127.0.0.1:8081`
- [v1/translation.history.proto](docs/proto/v1/translation.history.proto)
- PostgreSQL:
- `postgres://user:myAwEsOm3pa55@w0rd@127.0.0.1:5432/db`
- RabbitMQ:
- http://rabbitmq.lvh.me | http://127.0.0.1:15672
- Credentials: `guest` / `guest`
- NATS monitoring:
- http://nats.lvh.me | http://127.0.0.1:8222/
- Credentials: `guest` / `guest`
## Project structure
### `cmd/app/main.go`
Configuration and logger initialization. Then the main function "continues" in
`internal/app/app.go`.
### `config`
The twelve-factor app stores config in environment variables (often shortened to `env vars` or `env`). Env vars are easy
to change between deploys without changing any code; unlike config files, there is little chance of them being checked
into the code repo accidentally; and unlike custom config files, or other config mechanisms such as Java System
Properties, they are a language- and OS-agnostic standard.
Config: [config.go](config/config.go)
Example: [.env.example](.env.example)
[docker-compose.yml](docker-compose.yml) uses `env` variables to configure services.
### `docs`
Swagger documentation. Auto-generated by [swag](https://github.com/swaggo/swag) library.
You don't need to correct anything by yourself.
#### `docs/proto`
Protobuf files. They are used to generate Go code for gRPC services.
The proto files are also used to generate documentation for gRPC services.
You don't need to correct anything by yourself.
### `integration-test`
Integration tests.
They are launched as a separate container, next to the application container.
### `internal/app`
There is always one _Run_ function in the `app.go` file, which "continues" the _main_ function.
This is where all the main objects are created.
Dependency injection occurs through the "New ..." constructors (see Dependency Injection).
This technique allows us to layer the application using the [Dependency Injection](#dependency-injection) principle.
This makes the business logic independent from other layers.
Next, we start the server and wait for signals in _select_ for graceful completion.
If `app.go` starts to grow, you can split it into multiple files.
For a large number of injections, [wire](https://github.com/google/wire) can be used.
The `migrate.go` file is used for database auto migrations.
It is included if an argument with the _migrate_ tag is specified.
For example:
```sh
go run -tags migrate ./cmd/app
```
### `internal/controller`
Server handler layer (MVC controllers). The template shows 3 servers:
- AMQP RPC (based on RabbitMQ as transport)
- gRPC ([gRPC](https://grpc.io/) framework based on protobuf)
- REST API ([Fiber](https://github.com/gofiber/fiber) framework)
Server routers are written in the same style:
- Handlers are grouped by area of application (by a common basis)
- For each group, its own router structure is created, the methods of which process paths
- The structure of the business logic is injected into the router structure, which will be called by the handlers
#### `internal/controller/amqp_rpc`
Simple RPC versioning.
For v2, we will need to add the `amqp_rpc/v2` folder with the same content.
And in the file `internal/controller/amqp_rpc/router.go` add the line:
```go
routes := make(map[string]server.CallHandler)
{
v1.NewTranslationRoutes(routes, t, l)
}
{
v2.NewTranslationRoutes(routes, t, l)
}
```
#### `internal/controller/grpc`
Simple gRPC versioning.
For v2, we will need to add the `grpc/v2` folder with the same content.
Also add the `v2` folder to the proto files in `docs/proto`.
And in the file `internal/controller/grpc/router.go` add the line:
```go
{
v1.NewTranslationRoutes(app, t, l)
}
{
v2.NewTranslationRoutes(app, t, l)
}
reflection.Register(app)
```
#### `internal/controller/nats_rpc`
Simple RPC versioning.
For v2, we will need to add the `nats_rpc/v2` folder with the same content.
And in the file `internal/controller/nats_rpc/router.go` add the line:
```go
routes := make(map[string]server.CallHandler)
{
v1.NewTranslationRoutes(routes, t, l)
}
{
v2.NewTranslationRoutes(routes, t, l)
}
```
#### `internal/controller/restapi`
Simple REST versioning.
For v2, we will need to add the `restapi/v2` folder with the same content.
And in the file `internal/controller/restapi/router.go` add the line:
```go
apiV1Group := app.Group("/v1")
{
v1.NewTranslationRoutes(apiV1Group, t, l)
}
apiV2Group := app.Group("/v2")
{
v2.NewTranslationRoutes(apiV2Group, t, l)
}
```
Instead of [Fiber](https://github.com/gofiber/fiber), you can use any other http framework.
In `router.go` and above the handler methods, there are comments for generating swagger documentation
using [swag](https://github.com/swaggo/swag).
### `internal/entity`
Entities of business logic (models) can be used in any layer.
There can also be methods, for example, for validation.
### `internal/usecase`
Business logic.
- Methods are grouped by area of application (on a common basis)
- Each group has its own structure
- One file - one structure
Repositories, webapi, rpc, and other business logic structures are injected into business logic structures
(see [Dependency Injection](#dependency-injection)).
#### `internal/repo/persistent`
A repository is an abstract storage (database) that business logic works with.
#### `internal/repo/webapi`
It is an abstract web API that business logic works with.
For example, it could be another microservice that business logic accesses via the REST API.
The package name changes depending on the purpose.
### `pkg/rabbitmq`
RabbitMQ RPC pattern:
- There is no routing inside RabbitMQ
- Exchange fanout is used, to which 1 exclusive queue is bound, this is the most productive config
- Reconnect on the loss of connection
## Dependency Injection
In order to remove the dependence of business logic on external packages, dependency injection is used.
For example, through the New constructor, we inject the dependency into the structure of the business logic.
This makes the business logic independent (and portable).
We can override the implementation of the interface without making changes to the `usecase` package.
```go
package usecase
import (
// Nothing!
)
type Repository interface {
Get()
}
type UseCase struct {
repo Repository
}
func New(r Repository) *UseCase {
return &UseCase{
repo: r,
}
}
func (uc *UseCase) Do() {
uc.repo.Get()
}
```
It will also allow us to do auto-generation of mocks (for example with [mockery](https://github.com/vektra/mockery)) and
easily write unit tests.
> We are not tied to specific implementations in order to always be able to change one component to another.
> If the new component implements the interface, nothing needs to be changed in the business logic.
## Clean Architecture
### Key idea
Programmers realize the optimal architecture for an application after most of the code has been written.
> A good architecture allows decisions to be delayed to as late as possible.
### The main principle
Dependency Inversion (the same one from SOLID) is the principle of dependency injection.
The direction of dependencies goes from the outer layer to the inner layer.
Due to this, business logic and entities remain independent from other parts of the system.
So, the application is divided into 2 layers, internal and external:
1. **Business logic** (Go standard library).
2. **Tools** (databases, servers, message brokers, any other packages and frameworks).

**The inner layer** with business logic should be clean. It should:
- Not have package imports from the outer layer.
- Use only the capabilities of the standard library.
- Make calls to the outer layer through the interface (!).
The business logic doesn't know anything about Postgres or a specific web API.
Business logic has an interface for working with an _abstract_ database or _abstract_ web API.
**The outer layer** has other limitations:
- All components of this layer are unaware of each other's existence. How to call another from one tool? Not directly,
only through the inner layer of business logic.
- All calls to the inner layer are made through the interface (!).
- Data is transferred in a format that is convenient for business logic (`internal/entity`).
For example, you need to access the database from HTTP (controller).
Both HTTP and database are in the outer layer, which means they know nothing about each other.
The communication between them is carried out through `usecase` (business logic):
```
HTTP > usecase
usecase > repository (Postgres)
usecase < repository (Postgres)
HTTP < usecase
```
The symbols > and < show the intersection of layer boundaries through Interfaces.
The same is shown in the picture:

Or more complex business logic:
```
HTTP > usecase
usecase > repository
usecase < repository
usecase > webapi
usecase < webapi
usecase > RPC
usecase < RPC
usecase > repository
usecase < repository
HTTP < usecase
```
### Layers

### Clean Architecture Terminology
- **Entities** are structures that business logic operates on.
They are located in the `internal/entity` folder.
In MVC terms, entities are models.
- **Use Cases** is business logic located in `internal/usecase`.
The layer with which business logic directly interacts is usually called the _infrastructure_ layer.
These can be repositories `internal/usecase/repo`, external webapi `internal/usecase/webapi`, any pkg, and other
microservices.
In the template, the _infrastructure_ packages are located inside `internal/usecase`.
You can choose how to call the entry points as you wish. The options are:
- controller (in our case)
- delivery
- transport
- gateways
- entrypoints
- primary
- input
### Additional layers
The classic version
of [Clean Architecture](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) was designed for
building large monolithic applications and has 4 layers.
In the original version, the outer layer is divided into two more, which also have an inversion of dependencies
to each other (directed inward) and communicate through interfaces.
The inner layer is also divided into two (with separation of interfaces), in the case of complex logic.
---
Complex tools can be divided into additional layers.
However, you should add layers only if really necessary.
### Alternative approaches
In addition to Clean architecture, _Onion architecture_ and _Hexagonal_ (_Ports and adapters_) are similar to it.
Both are based on the principle of Dependency Inversion.
_Ports and adapters_ are very close to _Clean Architecture_, the differences are mainly in terminology.
## Similar projects
- [https://github.com/bxcodec/go-clean-arch](https://github.com/bxcodec/go-clean-arch)
- [https://github.com/zhashkevych/courses-backend](https://github.com/zhashkevych/courses-backend)
## Useful links
- [The Clean Architecture article](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)
- [Twelve factors](https://12factor.net/ru/)
================================================
FILE: README_CN.md
================================================

# Go 整洁模板
golang服务的整洁架构模板
[](https://github.com/evrone/go-clean-template/releases/)
[](https://github.com/evrone/go-clean-template/blob/master/LICENSE)
[](https://goreportcard.com/report/github.com/evrone/go-clean-template)
[](https://codecov.io/gh/evrone/go-clean-template)
[](https://github.com/gofiber/fiber)
[](https://github.com/swaggo/swag)
[](https://github.com/go-playground/validator)
[](https://github.com/goccy/go-json)
[](https://github.com/Masterminds/squirrel)
[](https://github.com/golang-migrate/migrate)
[](https://github.com/rs/zerolog)
[](https://github.com/ansrivas/fiberprometheus)
[](https://github.com/stretchr/testify)
[](https://go.uber.org/mock)
## 综述
模板的目的为了展示:
- 如何组织项目,以防止项目演化成难以维护的代码
- 在哪里处理业务逻辑,以维护代码的独立、清晰和可扩展
- 当微服务增长时,不要失去控制
使用了 Robert Martin 的原则
[Go 整洁模板](https://evrone.com/go-clean-template?utm_source=github&utm_campaign=go-clean-template) 由
[Evrone](https://evrone.com/?utm_source=github&utm_campaign=go-clean-template) 创建和提供支持.
此模板实现了三种类型的服务器:
- AMQP RPC(基于 RabbitMQ 作为传输)
- NATS RPC(基于 NATS 作为传输)
- gRPC(基于 protobuf 的 [gRPC](https://grpc.io/) 框架)
- REST API(基于 [Fiber](https://github.com/gofiber/fiber) 框架)
## 内容
- [快速开始](#快速开始)
- [工程架构](#工程架构)
- [依赖注入](#依赖注入)
- [整洁架构](#整洁架构)
## Quick start
### Local development
```sh
# Postgres, RabbitMQ, NATS
make compose-up
# Run app with migrations
make run
```
### Integration tests (can be run in CI)
```sh
# DB, app + migrations, integration tests
make compose-up-integration-test
```
### Full docker stack with reverse proxy
```sh
make compose-up-all
```
Check services:
- AMQP RPC:
- URL: `amqp://guest:guest@127.0.0.1:5672/`
- Client Exchange: `rpc_client`
- Server Exchange: `rpc_server`
- NATS RPC:
- URL: `nats://guest:guest@127.0.0.1:4222/`
- Server Exchange: `rpc_server`
- REST API:
- http://app.lvh.me/healthz | http://127.0.0.1:8080/healthz
- http://app.lvh.me/metrics | http://127.0.0.1:8080/metrics
- http://app.lvh.me/swagger | http://127.0.0.1:8080/swagger
- gRPC:
- URL: `tcp://grpc.lvh.me:8081` | `tcp://127.0.0.1:8081`
- Proto: [v1/translation.history.proto](docs/proto/v1/translation.history.proto)
- PostgreSQL:
- `postgres://user:myAwEsOm3pa55@w0rd@127.0.0.1:5432/db`
- RabbitMQ:
- http://rabbitmq.lvh.me | http://127.0.0.1:15672
- Credentials: `guest` / `guest`
- NATS monitoring:
- http://nats.lvh.me | http://127.0.0.1:8222/
- Credentials: `guest` / `guest`
## 工程架构
### `cmd/app/main.go`
配置和日志能力初始化。主要的功能在 `internal/app/app.go`
### `config`
12-Factor推荐将应用的配置存储于 环境变量 中( `env vars`, `env` )。环境变量可以非常方便地在不同的部署间做修改,却不动一行代码;
与配置文件不同,不小心把它们签入代码库的概率微乎其微;与一些传统的解决配置问题的机制(比如 Java 的属性配置文件)相比,
环境变量与语言和系统无关。
設定:[config.go](config/config.go)
例如:[.env.example](.env.example)
[docker-compose.yml](docker-compose.yml) 使用 `env` 變數來配置服務。
### `docs`
Swagger 文档。由 [swag](https://github.com/swaggo/swag) 库自动生成
你不需要自己修改任何内容
#### `docs/proto`
Protobuf 文件。它们用于为 gRPC 服务生成 Go 代码。
这些 proto 文件也用于生成 gRPC 服务的文档。
您不需要自己修改任何内容。
### `integration-test`
集成测试
它会在应用容器旁启动独立的容器
## `internal/app`
这里只有通常只有一个 _Run_ 函数在 `app.go` 文件种。它是 _main_ 函数的延续
主要的对象在这里生成
依赖注入通过 "New ..." 构造 (阅读依赖注入),这个技术允许使用[依赖注入](#依赖注入)的原则进行分层,使得业务逻辑独立于其他层。
接下来,我们启动服务器并阻塞等待_select_ 中的信号正常完成。
如果 `app.go`的规模增长了,你可以将它拆分为多个文件.
对于大量的依赖,可以使用[wire](https://github.com/google/wire)
`migrate.go` 文件用于是数据库自动构建
它显示的包扣了 _migrate_ 标签
```sh
go run -tags migrate ./cmd/app
```
### `internal/controller`
服务器处理层(MVC 控制器)。模板展示了 3 种服务器:
- AMQP RPC(基于 RabbitMQ 作为传输)
- gRPC(基于 protobuf 的 [gRPC](https://grpc.io/) 框架)
- REST API(基于 [Fiber](https://github.com/gofiber/fiber) 框架)
服务器路由器以相同的风格编写:
- 处理程序按应用领域分组(基于共同的基础)
- 为每个组创建自己的路由器结构,其方法处理路径
- 业务逻辑的结构被注入到路由器结构中,处理程序将调用它
#### `internal/controller/amqp_rpc`
简单的 RPC 版本控制。
对于 v2,我们需要添加 `amqp_rpc/v2` 文件夹,内容相同。
并在文件 `internal/controller/amqp_rpc/router.go` 中添加以下行:
```go
routes := make(map[string]server.CallHandler)
{
v1.NewTranslationRoutes(routes, t, l)
}
{
v2.NewTranslationRoutes(routes, t, l)
}
```
#### `internal/controller/grpc`
简单的 gRPC 版本控制。
对于 v2,我们需要添加 `grpc/v2` 文件夹,内容相同。
还需要将 `v2` 文件夹添加到 `docs/proto` 中的 proto 文件中。
并在文件 `internal/controller/grpc/router.go` 中添加以下行:
```go
{
v1.NewTranslationRoutes(app, t, l)
}
{
v2.NewTranslationRoutes(app, t, l)
}
reflection.Register(app)
```
#### `internal/controller/nats_rpc`
简单的 RPC 版本控制。
对于 v2,我们需要添加 `nats_rpc/v2` 文件夹,内容相同。
并在文件 `internal/controller/nats_rpc/router.go` 中添加以下行:
```go
routes := make(map[string]server.CallHandler)
{
v1.NewTranslationRoutes(routes, t, l)
}
{
v2.NewTranslationRoutes(routes, t, l)
}
```
#### `internal/controller/restapi`
简单的 REST 版本控制
对于v2版本,我们需要添加`restapi/v2`文件夹,内容相同
在文件 `internal/controller/restapi/router.go` 中添加以下行:
```go
apiV1Group := app.Group("/v1")
{
v1.NewTranslationRoutes(apiV1Group, t, l)
}
apiV2Group := app.Group("/v2")
{
v2.NewTranslationRoutes(apiV2Group, t, l)
}
```
除了 [Fiber](https://github.com/gofiber/fiber),您可以使用任何其他 http 框架。
在 `router.go` 及以上的处理程序方法中,可以使用[swag](https://github.com/swaggo/swag) swagger 通过注释生成swagger文档.
### `internal/entity`
业务逻辑实体(模型)可用于任何层.
这里包括一些方法,例如:参数检验.
### `internal/usecase`
业务逻辑.
- 方法按应用领域分组(在共同的基础上)
- 每个组都有自己的结构
- 一个文件对应一个结构
Repositories、webapi、rpc等业务逻辑结构被注入到业务逻辑结构中
(阅读 [依赖注入](#dependency-injection)).
#### `internal/repo/persistent`
是持久化存储的业务逻辑逻辑抽象,如数据库.
#### `internal/repo/webapi`
是webapi业务逻辑使用的抽象.
例如,它可能是业务逻辑通过 REST API 访问的另一个微服务。
包名称根据业务的实际用途进行命名
### `pkg/rabbitmq`
RabbitMQ RPC 模式:
- RabbitMQ 中没有路由
- 使用Exchange fanout出并绑定 1 个独占队列,这么配置是最高效的
- 在连接丢失时重新连接
## 依赖注入
为了去除业务逻辑对外部包的依赖,使用了依赖注入.
例如,通过New构造函数,我们将依赖注入到业务逻辑的结构中.
这使得业务逻辑独立(且可移植)
我们可以覆盖接口的实现,而无需更改 `usecase` 包.
它还将允许我们自动生成相关mock(例如使用 [mockery](https://github.com/vektra/mockery)),以便进行单元测试.
> 我们不依赖于特定的实现,以便始终能够将一个组件更改为另一个组件
> 如果新组件实现了接口,则业务逻辑无需更改。
```go
package usecase
import (
// Nothing!
)
type Repository interface {
Get()
}
type UseCase struct {
repo Repository
}
func New(r Repository) *UseCase {
return &UseCase{
repo: r,
}
}
func (uc *UseCase) Do() {
uc.repo.Get()
}
```
## 整洁架构
## 关键的观点
在编写完大部分代码后,程序员会意识到应用程序的最佳架构
> 一个好的架构允许尽可能晚地做出决策
### 主要原则
依赖倒置的原理(与 SOLID 相同)
依赖的方向是从外层到内层。
因此,业务逻辑和实体可以保持独立于系统的其他部分。
因此,应用程序分为 2 层,内部和外部:
1. **业务逻辑**(Go标准库)
2. **工具**(数据库、服务器、消息代理、任何其他包和框架)

**带有业务逻辑的内层**应该是干净的,它应该有如下特征:
- 没有从外层导入的包
- 仅使用标准库的功能
- 通过接口调用外层(!)
业务逻辑对 数据存储 或特定的 Web API 是无感知的.
业务逻辑用抽象接口处理 数据库或 web API。
**外层**有其他限制:
- 该层的所有组件都不知道彼此的存在。如何进行组件间的调用呢? 只能通过业务逻辑的内层间接调用
- 所有对内层的调用都是通过接口进行的(!)
- 为了便捷地进行业务数据传输,数据格式得进行标标准化(`internal/entity`)。
例如,您需要从 HTTP(控制器)访问数据库
HTTP 和数据库都在外层,这意味着他们彼此无法感知
它们之间的通信是通过`usecase`(业务逻辑)进行的:
```
HTTP > usecase
usecase > repository (repo)
usecase < repository (repo)
HTTP < usecase
```
符号 > 和 < 通过接口显示层边界的交集
如图所示

更加复杂的业务逻辑
```
HTTP > usecase
usecase > repository
usecase < repository
usecase > webapi
usecase < webapi
usecase > RPC
usecase < RPC
usecase > repository
usecase < repository
HTTP < usecase
```
### 层

### 整洁的架构相关术语
- **ENTITY**是业务逻辑运行的结构。
它们位于`internal/entity`文件夹中。
在 MVC 术语中,实体是models
- **Use Cases** 业务逻辑位于 `internal/usecase` 中
与业务逻辑直接交互的层通常称为_infrastructure_ 层
这些可以是存储库 `internal/usecase/repo`、外部 webapi `internal/usecase/webapi`、任何包和其他微服务。
在模板中,_infrastructure_ 包位于 `internal/usecase` 中
您可以根据需要决定你要调用的入口点,包括:
- controller
- delivery
- transport
- gateways
- entrypoints
- primary
- input
### 附加层
[整洁架构](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html) 的经典版本是为构建大型单体应用程序而设计的,有
4 层
原版中,外层多分为两层,也使用依赖倒置原理
彼此(向内)通过接口进行通信
在复杂逻辑的情况下,内层也分为两层(通过接口进行分层)
_______________________________
复杂的工具可以通过分层设计。切记只有在你有需要的时候菜进行分层
### 替代品
除了整洁的架构, _Onion architecture_ 和 _Hexagonal_ (接口适配层) 一样能达到目的,他们都符合依赖倒置的原则
这三种模式都非常接近,不同的知识术语不同
## 相似的工程
- [https://github.com/bxcodec/go-clean-arch](https://github.com/bxcodec/go-clean-arch)
- [https://github.com/zhashkevych/courses-backend](https://github.com/zhashkevych/courses-backend)
## 可能有用的链接
- [The Clean Architecture article](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)
- [Twelve factors](https://12factor.net/ru/)
================================================
FILE: README_RU.md
================================================

# Go Чистая Архитектура
Шаблон Чистой Архитектуры для приложений на Golang
[](https://github.com/evrone/go-clean-template/releases/)
[](https://github.com/evrone/go-clean-template/blob/master/LICENSE)
[](https://goreportcard.com/report/github.com/evrone/go-clean-template)
[](https://codecov.io/gh/evrone/go-clean-template)
[](https://github.com/gofiber/fiber)
[](https://github.com/swaggo/swag)
[](https://github.com/go-playground/validator)
[](https://github.com/goccy/go-json)
[](https://github.com/Masterminds/squirrel)
[](https://github.com/golang-migrate/migrate)
[](https://github.com/rs/zerolog)
[](https://github.com/ansrivas/fiberprometheus)
[](https://github.com/stretchr/testify)
[](https://go.uber.org/mock)
## Обзор
Цель этого шаблона - показать принципы Чистой Архитектуры Роберта Мартина (дядюшки Боба):
- как структурировать проект и не дать ему превратиться в спагетти-код
- где хранить бизнес-логику, чтобы она оставалась независимой, чистой и расширяемой
- как не потерять контроль при росте проекта
[Go-clean-template](https://evrone.com/go-clean-template?utm_source=github&utm_campaign=go-clean-template) создан и
поддерживается [Evrone](https://evrone.com/?utm_source=github&utm_campaign=go-clean-template).
Этот шаблон поддерживает три типа серверов:
- AMQP RPC (на основе RabbitMQ в качестве [транспорта](https://github.com/rabbitmq/amqp091-go)
и [Request-Reply паттерна]((https://www.enterpriseintegrationpatterns.com/patterns/messaging/RequestReply.html)))
- NATS RPC (на основе NATS в качестве [транспорта](https://github.com/nats-io/nats.go)
и [Request-Reply паттерна]((https://www.enterpriseintegrationpatterns.com/patterns/messaging/RequestReply.html))))
- gRPC ([gRPC](https://grpc.io/) фреймворк на основе protobuf)
- REST API ([Fiber](https://github.com/gofiber/fiber) фреймворк)
## Содержание
- [Быстрый старт](#быстрый-старт)
- [Структура проекта](#структура-проекта)
- [Внедрение зависимостей](#внедрение-зависимостей)
- [Чистая Архитектура](#чистая-архитектура)
## Быстрый старт
### Локальная разработка
```sh
# Postgres, RabbitMQ, NATS
make compose-up
# Запуск приложения и миграций
make run
```
### Интеграционные тесты (может быть использовано с CI)
```sh
# DB, app + migrations, integration tests
make compose-up-integration-test
```
### Весь docker stack с reverse proxy
```sh
make compose-up-all
```
Проверьте сервисы:
- AMQP RPC:
- URL: `amqp://guest:guest@127.0.0.1:5672/`
- Client Exchange: `rpc_client`
- Server Exchange: `rpc_server`
- NATS RPC:
- URL: `nats://guest:guest@127.0.0.1:4222/`
- Server Exchange: `rpc_server`
- REST API:
- http://app.lvh.me/healthz | http://127.0.0.1:8080/healthz
- http://app.lvh.me/metrics | http://127.0.0.1:8080/metrics
- http://app.lvh.me/swagger | http://127.0.0.1:8080/swagger
- gRPC:
- URL: `tcp://grpc.lvh.me:8081` | `tcp://127.0.0.1:8081`
- [v1/translation.history.proto](docs/proto/v1/translation.history.proto)
- PostgreSQL:
- `postgres://user:myAwEsOm3pa55@w0rd@127.0.0.1:5432/db`
- RabbitMQ:
- http://rabbitmq.lvh.me | http://127.0.0.1:15672
- Credentials: `guest` / `guest`
- NATS monitoring:
- http://nats.lvh.me | http://127.0.0.1:8222/
- Credentials: `guest` / `guest`
## Структура проекта
### `cmd/app/main.go`
Инициализация конфигурации и логгера. Здесь вызывается основная часть приложения из `internal/app/app.go`.
### `config`
Приложение двенадцати факторов хранит конфигурацию в переменных окружения (часто сокращается до `env vars` или `env`).
Переменные окружения легко изменить между развёртываниями, не изменяя код; в отличие от файлов конфигурации, менее
вероятно случайно сохранить их в репозиторий кода; и в отличие от пользовательских конфигурационных файлов или других
механизмов конфигурации, таких как Java System Properties, они являются независимым от языка и операционной системы
стандартом.
Конфигурация: [config.go](config/config.go)
Пример: [.env.example](.env.example)
[docker-compose.yml](docker-compose.yml) использует переменные `env` для настройки сервисов.
### `docs`
Документация Swagger. Генерируется автоматически с помощью библиотеки [swag](https://github.com/swaggo/swag).
Вам не нужно ничего редактировать вручную.
#### `docs/proto`
Protobuf файлы. Они используются для генерации Go-кода для gRPC сервисов.
Protobuf файлы также используются для генерации документации для gRPC сервисов.
Вам не нужно ничего исправлять самостоятельно.
### `integration-test`
Интеграционные тесты.
Они запускаются в отдельном контейнере, рядом с контейнером приложения.
### `internal/app`
Здесь находится только одна функция _Run_. Она размещена в файле `app.go` и является логическим продолжением функции
_main_.
Здесь создаются все основные объекты.
[Внедрение зависимостей](#внедрение-зависимостей) происходит через конструктор "New ...".
Это позволяет слоировать приложение, делая бизнес-логику независимой от других слоев.
Далее запускается сервер и ожидается сигнал в _select_ для корректного завершения работы.
Если `app.go` стал слишком большим, вы можете разделить его на несколько файлов.
Если зависимостей много, то для удобства можно использовать [wire](https://github.com/google/wire).
Файл `migrate.go` используется для автоматической миграции базы данных.
Он включается в компиляцию только при указании тега _migrate_.
Пример:
```sh
go run -tags migrate ./cmd/app
```
### `internal/controller`
Слой хэндлеров сервера (MVC контроллеры). В шаблоне показана работа 3 серверов:
- AMQP RPC (на основе RabbitMQ в качестве транспорта)
- gRPC ([gRPC](https://grpc.io/) фреймворк на основе protobuf)
- REST API ([Fiber](https://github.com/gofiber/fiber) фреймворк)
Маршрутизаторы http сервера пишутся в едином стиле:
- Хэндлеры группируются по области применения (по общему критерию)
- Для каждой группы создается свой маршрутизатор
- Объект бизнес-логики передается в маршрутизатор, чтобы быть доступным внутри хэндлеров
#### `internal/controller/amqp_rpc`
Простое версионирование RPC.
Для версии v2 нужно будет добавить папку `amqp_rpc/v2` с таким же содержимым.
А в файле `internal/controller/amqp_rpc/router.go` добавить строку:
```go
routes := make(map[string]server.CallHandler)
{
v1.NewTranslationRoutes(routes, t, l)
}
{
v2.NewTranslationRoutes(routes, t, l)
}
```
#### `internal/controller/grpc`
Простое версионирование gRPC.
Для версии v2 нужно будет добавить папку `grpc/v2` с таким же содержимым.
Также добавьте папку `v2` в proto-файлы в `docs/proto`.
И в файле `internal/controller/grpc/router.go` добавьте строку:
```go
{
v1.NewTranslationRoutes(app, t, l)
}
{
v2.NewTranslationRoutes(app, t, l)
}
reflection.Register(app)
```
#### `internal/controller/nats_rpc`
Простое версионирование RPC.
Для версии v2 нужно будет добавить папку `nats_rpc/v2` с таким же содержимым.
А в файле `internal/controller/nats_rpc/router.go` добавить строку:
```go
routes := make(map[string]server.CallHandler)
{
v1.NewTranslationRoutes(routes, t, l)
}
{
v2.NewTranslationRoutes(routes, t, l)
}
```
#### `internal/controller/restapi`
Простое версионирование REST API.
Для создания версии v2 нужно создать папку `restapi/v2` с таким же содержимым.
Добавить в файл `internal/controller/restapi/router.go` строки:
```go
apiV1Group := app.Group("/v1")
{
v1.NewTranslationRoutes(apiV1Group, t, l)
}
apiV2Group := app.Group("/v2")
{
v2.NewTranslationRoutes(apiV2Group, t, l)
}
```
Вместо [Fiber](https://github.com/gofiber/fiber) можно использовать любой другой http фреймворк.
В файле `router.go` над хэндлером написаны комментарии для генерации документации через
swagger [swag](https://github.com/swaggo/swag).
### `internal/entity`
Сущности бизнес-логики (модели). Могут быть использованы в любом слое.
Также они могут иметь методы, например, для валидации.
### `internal/usecase`
Бизнес-логика.
- Методы группируются по области применения (по общему критерию)
- У каждой группы своя отдельная структура
- Один файл - одна структура
Репозитории, webapi, rpc и другие структуры передаются в слой бизнес-логики в связующем файле `internal/app/app.go`
(смотрите [Внедрение зависимостей](#внедрение-зависимостей)).
#### `internal/repo/persistent`
Репозиторий — это абстрактное хранилище (база данных), с которым взаимодействует бизнес-логика.
#### `internal/repo/webapi`
Это абстрактное web API, с которым взаимодействует бизнес-логика.
Например, это может быть внешний микросервис, к которому бизнес-логика обращается через REST API.
Название пакета выбирается таким, чтобы соответствовать его назначению.
### `pkg/rabbitmq`
RabbitMQ RPC паттерн:
- Внутри RabbitMQ не используется маршрутизация
- Используется fanout-обмен, к которому привязана одна эксклюзивная очередь - это наиболее производительная конфигурация
- Переподключение при потере соединения
## Внедрение зависимостей
Для устранения зависимости бизнес-логики от внешних пакетов используется внедрение зависимостей.
Например, через конструктор "New" внедряется репозиторий в слой бизнес-логики.
Это делает бизнес-логику независимой и переносимой.
Мы можем переписать реализацию интерфейса репозитория, не внося изменения в пакет бизнес-логики `usecase`.
```go
package usecase
import (
// Nothing!
)
type Repository interface {
Get()
}
type UseCase struct {
repo Repository
}
func New(r Repository) *UseCase {
return &UseCase{
repo: r,
}
}
func (uc *UseCase) Do() {
uc.repo.Get()
}
```
Благодаря разделению через интерфейсы можно генерировать моки (например,
используя [mockery](https://github.com/vektra/mockery)) и легко писать юнит-тесты.
> Мы не привязаны к конкретным реализациям и всегда можем заменить один компонент на другой.
> Если новый компонент реализует интерфейс, то в бизнес-логике ничего не нужно менять.
## Чистая Архитектура
### Ключевая идея
Программисты создают оптимальную архитектуру приложения после написания основной части кода.
> Хорошая архитектура позволяет откладывать изменения как можно дольше.
### Основной принцип
Инверсия зависимостей (та же, что и в SOLID) используется как принцип для внедрения зависимостей.
Зависимости направлены от внешнего слоя к внутреннему.
Благодаря этому бизнес-логика и сущности остаются независимыми от других частей системы.
Например, приложение можно разделить на два слоя - внутренний и внешний:
1. **Бизнес-логика** (например, стандартная библиотека Go).
2. **Инструменты** (базы данных, серверы, брокеры сообщений и другие библиотеки и фреймворки).

**Внутренний слой** с бизнес-логикой должен быть чистым. Он обязан:
- Не импортировать пакеты из внешних слоев.
- Использовать только стандартную библиотеку.
- Взаимодействовать с внешними слоями через интерфейсы (!).
Бизнес-логика не должна ничего знать о Postgres или о реализации web API.
Бизнес-логика имеет интерфейс для взаимодействия с _абстрактной_ базой данных или _абстрактным_ web API.
**Внешний слой** имеет ограничения:
- Компоненты этого слоя не могут знать друг о друге и взаимодействовать напрямую. Обращение друг к другу происходит
через внутренний слой - слой бизнес-логики.
- Вызовы во внутренний слой выполняются через интерфейсы (!).
- Данные передаются в формате, удобном для бизнес-логики (структуры хранятся в `internal/entity`).
Например, нужно обратиться к базе данных из HTTP хэндлера (в слое контроллер).
База данных и HTTP находятся во внешнем слое. Они не знают друг о друге ничего и не могут взаимодействовать напрямую.
Взаимодействие будет происходить через слой бизнес-логики `usecase`:
```
HTTP > usecase
usecase > repository (Postgres)
usecase < repository (Postgres)
HTTP < usecase
```
Символы > и < показывают пересечения слоев через интерфейсы и направления.
Это же показано на схеме:

Пример более сложного пути данных:
```
HTTP > usecase
usecase > repository
usecase < repository
usecase > webapi
usecase < webapi
usecase > RPC
usecase < RPC
usecase > repository
usecase < repository
HTTP < usecase
```
### Слои

### Терминология в Чистой Архитектуре
- **Entities** (сущности) - это структуры, с которыми работает бизнес-логика.
Они располагаются в папке `internal/entity`.
В терминологии MVC сущности - это модели.
- **Use Cases** - это бизнес-логика. Располагается в папке `internal/usecase`.
Слой, с которым бизнес-логика взаимодействует напрямую, обычно называется _инфраструктурным_ слоем.
Это может быть репозиторий `internal/usecase/repo`, внешнее webapi `internal/usecase/webapi`, любой пакет или
микросервис.
В шаблоне пакеты _infrastructure_ размещены внутри `internal/usecase`.
Вы можете выбирать, как называть точки входа, по своему усмотрению. Варианты такие:
- controller (в нашем случае)
- delivery
- transport
- gateways
- entrypoints
- primary
- input
### Дополнительные слои
В классической версии [Чистой Архитектуры](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)
для создания больших монолитных приложений предложено 4 слоя.
В исходной версии внешний слой делится на два, которые также имеют инверсию зависимостей в другие слои и взаимодействуют
через интерфейсы.
Внутренний слой также делится на два (с использованием интерфейсов) в случае сложной логики.
---
Сложные инструменты могут быть разделены на дополнительные слои.
Однако добавлять слои следует только в том случае, если это действительно необходимо.
### Другие подходы
Кроме Чистой Архитектуры есть и другие подходы:
- Луковая Архитектура
- Гексагональная (_Порты и адаптеры_ также похожа на неё)
Они обе основаны на принципе инверсии зависимостей.
_Порты и адаптеры_ очень похожи на _Чистую Архитектуру_. Различия в основном заключаются в терминологии.
## Похожие проекты
- [https://github.com/bxcodec/go-clean-arch](https://github.com/bxcodec/go-clean-arch)
- [https://github.com/zhashkevych/courses-backend](https://github.com/zhashkevych/courses-backend)
## Дополнительная информация
- [The Clean Architecture article](https://blog.cleancoder.com/uncle-bob/2012/08/13/the-clean-architecture.html)
- [Twelve factors](https://12factor.net/ru/)
================================================
FILE: cmd/app/main.go
================================================
package main
import (
"log"
"github.com/evrone/go-clean-template/config"
"github.com/evrone/go-clean-template/internal/app"
)
func main() {
// Configuration
cfg, err := config.NewConfig()
if err != nil {
log.Fatalf("Config error: %s", err)
}
// Run
app.Run(cfg)
}
================================================
FILE: config/config.go
================================================
package config
import (
"fmt"
"github.com/caarlos0/env/v11"
)
type (
// Config -.
Config struct {
App App
HTTP HTTP
Log Log
PG PG
GRPC GRPC
RMQ RMQ
NATS NATS
Metrics Metrics
Swagger Swagger
}
// App -.
App struct {
Name string `env:"APP_NAME,required"`
Version string `env:"APP_VERSION,required"`
}
// HTTP -.
HTTP struct {
Port string `env:"HTTP_PORT,required"`
UsePreforkMode bool `env:"HTTP_USE_PREFORK_MODE" envDefault:"false"`
}
// Log -.
Log struct {
Level string `env:"LOG_LEVEL,required"`
}
// PG -.
PG struct {
PoolMax int `env:"PG_POOL_MAX,required"`
URL string `env:"PG_URL,required"`
}
// GRPC -.
GRPC struct {
Port string `env:"GRPC_PORT,required"`
}
// RMQ -.
RMQ struct {
ServerExchange string `env:"RMQ_RPC_SERVER,required"`
ClientExchange string `env:"RMQ_RPC_CLIENT,required"`
URL string `env:"RMQ_URL,required"`
}
// NATS -.
NATS struct {
ServerExchange string `env:"NATS_RPC_SERVER,required"`
URL string `env:"NATS_URL,required"`
}
// Metrics -.
Metrics struct {
Enabled bool `env:"METRICS_ENABLED" envDefault:"true"`
}
// Swagger -.
Swagger struct {
Enabled bool `env:"SWAGGER_ENABLED" envDefault:"false"`
}
)
// NewConfig returns app config.
func NewConfig() (*Config, error) {
cfg := &Config{}
if err := env.Parse(cfg); err != nil {
return nil, fmt.Errorf("config error: %w", err)
}
return cfg, nil
}
================================================
FILE: docker-compose-integration-test.yml
================================================
version: "3.9"
services:
integration-test:
container_name: integration-test
platform: linux/amd64
pid: "host"
build:
context: .
dockerfile: integration-test/Dockerfile
depends_on:
- app
networks:
app_network:
aliases:
- test.lvh.me
networks:
app_network:
external: false
================================================
FILE: docker-compose.yml
================================================
version: "3.9"
x-db-environment: &x-db-environment
POSTGRES_SSL_MODE: "disable"
POSTGRES_HOST: "db"
POSTGRES_PORT: "5432"
POSTGRES_DB: "db"
POSTGRES_PASSWORD: "myAwEsOm3pa55@w0rd"
POSTGRES_USER: "user"
x-rabbitmq-variables: &x-rabbitmq-variables
RABBITMQ_DEFAULT_USER: "guest"
RABBITMQ_DEFAULT_PASS: "guest"
x-backend-app-environment: &x-backend-app-environment
GOMAXPROCS: "1"
# App
APP_NAME: "go-clean-template"
APP_VERSION: "1.0.0"
# HTTP settings
HTTP_PORT: "8080"
HTTP_USE_PREFORK_MODE: "false"
# Logger
LOG_LEVEL: "debug"
# PG
PG_POOL_MAX: "2"
PG_URL: "postgres://user:myAwEsOm3pa55@w0rd@db:5432/db"
# gRPC
GRPC_PORT: "8081"
# RMQ
RMQ_RPC_SERVER: "rpc_server"
RMQ_RPC_CLIENT: "rpc_client"
RMQ_URL: "amqp://guest:guest@rabbitmq:5672/"
# NATS
NATS_RPC_SERVER: "rpc_server"
NATS_URL: "nats://guest:guest@nats:4222/"
# Metrics
METRICS_ENABLED: "true"
# Swagger
SWAGGER_ENABLED: "true"
services:
db:
container_name: db
image: postgres:18.3-alpine
environment:
<<: *x-db-environment
volumes:
- db_data:/var/lib/postgresql/data
ports:
- "5432:5432"
networks:
app_network:
aliases:
- db.lvh.me
rabbitmq:
container_name: rabbitmq
image: rabbitmq:4.2.5-management
environment:
<<: *x-rabbitmq-variables
ports:
- "15672:15672"
- "5672:5672"
volumes:
- rabbitmq_data:/var/lib/rabbitmq
networks:
app_network:
aliases:
- rabbitmq.lvh.me
nats:
container_name: nats
image: nats:2.12-alpine
command: [ "-m", "8222", "-sd", "/nats-data", "-user", "guest", "-pass", "guest" ]
ports:
- "4222:4222"
- "8222:8222"
volumes:
- nats_data:/nats-data
networks:
app_network:
aliases:
- nats.lvh.me
app:
container_name: app
platform: linux/amd64
pid: "host"
build:
context: .
environment:
<<: *x-backend-app-environment
ports:
- "8080:8080"
- "8081:8081"
depends_on:
- db
- rabbitmq
deploy:
resources:
limits:
cpus: '1.00'
memory: '2Gb'
reservations:
cpus: '0.60'
memory: '1Gb'
networks:
app_network:
aliases:
- app.lvh.me
nginx:
container_name: nginx
image: nginx:1.29.6-alpine
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf
ports:
- "80:80"
depends_on:
- rabbitmq
- app
networks:
app_network:
aliases:
- nginx.lvh.me
networks:
app_network:
external: false
volumes:
db_data:
rabbitmq_data:
nats_data:
================================================
FILE: docs/docs.go
================================================
// Package docs Code generated by swaggo/swag. DO NOT EDIT
package docs
import "github.com/swaggo/swag"
const docTemplate = `{
"schemes": {{ marshal .Schemes }},
"swagger": "2.0",
"info": {
"description": "{{escape .Description}}",
"title": "{{.Title}}",
"contact": {},
"version": "{{.Version}}"
},
"host": "{{.Host}}",
"basePath": "{{.BasePath}}",
"paths": {
"/translation/do-translate": {
"post": {
"description": "Translate a text",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"translation"
],
"summary": "Translate",
"operationId": "do-translate",
"parameters": [
{
"description": "Set up translation",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/request.Translate"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Translation"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.Error"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.Error"
}
}
}
}
},
"/translation/history": {
"get": {
"description": "Show all translation history",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"translation"
],
"summary": "Show history",
"operationId": "history",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.TranslationHistory"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.Error"
}
}
}
}
}
},
"definitions": {
"entity.Translation": {
"type": "object",
"properties": {
"destination": {
"type": "string",
"example": "en"
},
"original": {
"type": "string",
"example": "текст для перевода"
},
"source": {
"type": "string",
"example": "auto"
},
"translation": {
"type": "string",
"example": "text for translation"
}
}
},
"entity.TranslationHistory": {
"type": "object",
"properties": {
"history": {
"type": "array",
"items": {
"$ref": "#/definitions/entity.Translation"
}
}
}
},
"request.Translate": {
"type": "object",
"required": [
"destination",
"original",
"source"
],
"properties": {
"destination": {
"type": "string",
"example": "en"
},
"original": {
"type": "string",
"example": "текст для перевода"
},
"source": {
"type": "string",
"example": "auto"
}
}
},
"response.Error": {
"type": "object",
"properties": {
"error": {
"type": "string",
"example": "message"
}
}
}
}
}`
// SwaggerInfo holds exported Swagger Info so clients can modify it
var SwaggerInfo = &swag.Spec{
Version: "1.0",
Host: "localhost:8080",
BasePath: "/v1",
Schemes: []string{},
Title: "Go Clean Template API",
Description: "Using a translation service as an example",
InfoInstanceName: "swagger",
SwaggerTemplate: docTemplate,
LeftDelim: "{{",
RightDelim: "}}",
}
func init() {
swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo)
}
================================================
FILE: docs/proto/v1/translation.history.pb.go
================================================
// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// protoc-gen-go v1.36.11
// protoc v6.33.0
// source: docs/proto/v1/translation.history.proto
package v1
import (
protoreflect "google.golang.org/protobuf/reflect/protoreflect"
protoimpl "google.golang.org/protobuf/runtime/protoimpl"
reflect "reflect"
sync "sync"
unsafe "unsafe"
)
const (
// Verify that this generated code is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
// Verify that runtime/protoimpl is sufficiently up-to-date.
_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)
// Request message for GetHistory.
type GetHistoryRequest struct {
state protoimpl.MessageState `protogen:"open.v1"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetHistoryRequest) Reset() {
*x = GetHistoryRequest{}
mi := &file_docs_proto_v1_translation_history_proto_msgTypes[0]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GetHistoryRequest) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetHistoryRequest) ProtoMessage() {}
func (x *GetHistoryRequest) ProtoReflect() protoreflect.Message {
mi := &file_docs_proto_v1_translation_history_proto_msgTypes[0]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GetHistoryRequest.ProtoReflect.Descriptor instead.
func (*GetHistoryRequest) Descriptor() ([]byte, []int) {
return file_docs_proto_v1_translation_history_proto_rawDescGZIP(), []int{0}
}
// Response message for GetHistory.
type GetHistoryResponse struct {
state protoimpl.MessageState `protogen:"open.v1"`
History []*TranslationHistory `protobuf:"bytes,1,rep,name=history,proto3" json:"history,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *GetHistoryResponse) Reset() {
*x = GetHistoryResponse{}
mi := &file_docs_proto_v1_translation_history_proto_msgTypes[1]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *GetHistoryResponse) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*GetHistoryResponse) ProtoMessage() {}
func (x *GetHistoryResponse) ProtoReflect() protoreflect.Message {
mi := &file_docs_proto_v1_translation_history_proto_msgTypes[1]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use GetHistoryResponse.ProtoReflect.Descriptor instead.
func (*GetHistoryResponse) Descriptor() ([]byte, []int) {
return file_docs_proto_v1_translation_history_proto_rawDescGZIP(), []int{1}
}
func (x *GetHistoryResponse) GetHistory() []*TranslationHistory {
if x != nil {
return x.History
}
return nil
}
// Translation message structure.
type TranslationHistory struct {
state protoimpl.MessageState `protogen:"open.v1"`
Source string `protobuf:"bytes,1,opt,name=source,proto3" json:"source,omitempty"`
Destination string `protobuf:"bytes,2,opt,name=destination,proto3" json:"destination,omitempty"`
Original string `protobuf:"bytes,3,opt,name=original,proto3" json:"original,omitempty"`
Translation string `protobuf:"bytes,4,opt,name=translation,proto3" json:"translation,omitempty"`
unknownFields protoimpl.UnknownFields
sizeCache protoimpl.SizeCache
}
func (x *TranslationHistory) Reset() {
*x = TranslationHistory{}
mi := &file_docs_proto_v1_translation_history_proto_msgTypes[2]
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
ms.StoreMessageInfo(mi)
}
func (x *TranslationHistory) String() string {
return protoimpl.X.MessageStringOf(x)
}
func (*TranslationHistory) ProtoMessage() {}
func (x *TranslationHistory) ProtoReflect() protoreflect.Message {
mi := &file_docs_proto_v1_translation_history_proto_msgTypes[2]
if x != nil {
ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
if ms.LoadMessageInfo() == nil {
ms.StoreMessageInfo(mi)
}
return ms
}
return mi.MessageOf(x)
}
// Deprecated: Use TranslationHistory.ProtoReflect.Descriptor instead.
func (*TranslationHistory) Descriptor() ([]byte, []int) {
return file_docs_proto_v1_translation_history_proto_rawDescGZIP(), []int{2}
}
func (x *TranslationHistory) GetSource() string {
if x != nil {
return x.Source
}
return ""
}
func (x *TranslationHistory) GetDestination() string {
if x != nil {
return x.Destination
}
return ""
}
func (x *TranslationHistory) GetOriginal() string {
if x != nil {
return x.Original
}
return ""
}
func (x *TranslationHistory) GetTranslation() string {
if x != nil {
return x.Translation
}
return ""
}
var File_docs_proto_v1_translation_history_proto protoreflect.FileDescriptor
const file_docs_proto_v1_translation_history_proto_rawDesc = "" +
"\n" +
"'docs/proto/v1/translation.history.proto\x12\agrpc.v1\"\x13\n" +
"\x11GetHistoryRequest\"K\n" +
"\x12GetHistoryResponse\x125\n" +
"\ahistory\x18\x01 \x03(\v2\x1b.grpc.v1.TranslationHistoryR\ahistory\"\x8c\x01\n" +
"\x12TranslationHistory\x12\x16\n" +
"\x06source\x18\x01 \x01(\tR\x06source\x12 \n" +
"\vdestination\x18\x02 \x01(\tR\vdestination\x12\x1a\n" +
"\boriginal\x18\x03 \x01(\tR\boriginal\x12 \n" +
"\vtranslation\x18\x04 \x01(\tR\vtranslation2T\n" +
"\vTranslation\x12E\n" +
"\n" +
"GetHistory\x12\x1a.grpc.v1.GetHistoryRequest\x1a\x1b.grpc.v1.GetHistoryResponseB\x0fZ\rdocs/proto/v1b\x06proto3"
var (
file_docs_proto_v1_translation_history_proto_rawDescOnce sync.Once
file_docs_proto_v1_translation_history_proto_rawDescData []byte
)
func file_docs_proto_v1_translation_history_proto_rawDescGZIP() []byte {
file_docs_proto_v1_translation_history_proto_rawDescOnce.Do(func() {
file_docs_proto_v1_translation_history_proto_rawDescData = protoimpl.X.CompressGZIP(unsafe.Slice(unsafe.StringData(file_docs_proto_v1_translation_history_proto_rawDesc), len(file_docs_proto_v1_translation_history_proto_rawDesc)))
})
return file_docs_proto_v1_translation_history_proto_rawDescData
}
var file_docs_proto_v1_translation_history_proto_msgTypes = make([]protoimpl.MessageInfo, 3)
var file_docs_proto_v1_translation_history_proto_goTypes = []any{
(*GetHistoryRequest)(nil), // 0: grpc.v1.GetHistoryRequest
(*GetHistoryResponse)(nil), // 1: grpc.v1.GetHistoryResponse
(*TranslationHistory)(nil), // 2: grpc.v1.TranslationHistory
}
var file_docs_proto_v1_translation_history_proto_depIdxs = []int32{
2, // 0: grpc.v1.GetHistoryResponse.history:type_name -> grpc.v1.TranslationHistory
0, // 1: grpc.v1.Translation.GetHistory:input_type -> grpc.v1.GetHistoryRequest
1, // 2: grpc.v1.Translation.GetHistory:output_type -> grpc.v1.GetHistoryResponse
2, // [2:3] is the sub-list for method output_type
1, // [1:2] is the sub-list for method input_type
1, // [1:1] is the sub-list for extension type_name
1, // [1:1] is the sub-list for extension extendee
0, // [0:1] is the sub-list for field type_name
}
func init() { file_docs_proto_v1_translation_history_proto_init() }
func file_docs_proto_v1_translation_history_proto_init() {
if File_docs_proto_v1_translation_history_proto != nil {
return
}
type x struct{}
out := protoimpl.TypeBuilder{
File: protoimpl.DescBuilder{
GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
RawDescriptor: unsafe.Slice(unsafe.StringData(file_docs_proto_v1_translation_history_proto_rawDesc), len(file_docs_proto_v1_translation_history_proto_rawDesc)),
NumEnums: 0,
NumMessages: 3,
NumExtensions: 0,
NumServices: 1,
},
GoTypes: file_docs_proto_v1_translation_history_proto_goTypes,
DependencyIndexes: file_docs_proto_v1_translation_history_proto_depIdxs,
MessageInfos: file_docs_proto_v1_translation_history_proto_msgTypes,
}.Build()
File_docs_proto_v1_translation_history_proto = out.File
file_docs_proto_v1_translation_history_proto_goTypes = nil
file_docs_proto_v1_translation_history_proto_depIdxs = nil
}
================================================
FILE: docs/proto/v1/translation.history.proto
================================================
syntax = "proto3";
package grpc.v1;
option go_package = "docs/proto/v1";
// The Translation service definition.
service Translation {
// RPC method to get translation history.
rpc GetHistory (GetHistoryRequest) returns (GetHistoryResponse);
}
// Request message for GetHistory.
message GetHistoryRequest {
// Add fields if needed in the future.
}
// Response message for GetHistory.
message GetHistoryResponse {
repeated TranslationHistory history = 1;
}
// Translation message structure.
message TranslationHistory {
string source = 1;
string destination = 2;
string original = 3;
string translation = 4;
}
================================================
FILE: docs/proto/v1/translation.history_grpc.pb.go
================================================
// Code generated by protoc-gen-go-grpc. DO NOT EDIT.
// versions:
// - protoc-gen-go-grpc v1.6.1
// - protoc v6.33.0
// source: docs/proto/v1/translation.history.proto
package v1
import (
context "context"
grpc "google.golang.org/grpc"
codes "google.golang.org/grpc/codes"
status "google.golang.org/grpc/status"
)
// This is a compile-time assertion to ensure that this generated file
// is compatible with the grpc package it is being compiled against.
// Requires gRPC-Go v1.64.0 or later.
const _ = grpc.SupportPackageIsVersion9
const (
Translation_GetHistory_FullMethodName = "/grpc.v1.Translation/GetHistory"
)
// TranslationClient is the client API for Translation service.
//
// 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.
//
// The Translation service definition.
type TranslationClient interface {
// RPC method to get translation history.
GetHistory(ctx context.Context, in *GetHistoryRequest, opts ...grpc.CallOption) (*GetHistoryResponse, error)
}
type translationClient struct {
cc grpc.ClientConnInterface
}
func NewTranslationClient(cc grpc.ClientConnInterface) TranslationClient {
return &translationClient{cc}
}
func (c *translationClient) GetHistory(ctx context.Context, in *GetHistoryRequest, opts ...grpc.CallOption) (*GetHistoryResponse, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetHistoryResponse)
err := c.cc.Invoke(ctx, Translation_GetHistory_FullMethodName, in, out, cOpts...)
if err != nil {
return nil, err
}
return out, nil
}
// TranslationServer is the server API for Translation service.
// All implementations must embed UnimplementedTranslationServer
// for forward compatibility.
//
// The Translation service definition.
type TranslationServer interface {
// RPC method to get translation history.
GetHistory(context.Context, *GetHistoryRequest) (*GetHistoryResponse, error)
mustEmbedUnimplementedTranslationServer()
}
// UnimplementedTranslationServer must be embedded to have
// forward compatible implementations.
//
// NOTE: this should be embedded by value instead of pointer to avoid a nil
// pointer dereference when methods are called.
type UnimplementedTranslationServer struct{}
func (UnimplementedTranslationServer) GetHistory(context.Context, *GetHistoryRequest) (*GetHistoryResponse, error) {
return nil, status.Error(codes.Unimplemented, "method GetHistory not implemented")
}
func (UnimplementedTranslationServer) mustEmbedUnimplementedTranslationServer() {}
func (UnimplementedTranslationServer) testEmbeddedByValue() {}
// UnsafeTranslationServer may be embedded to opt out of forward compatibility for this service.
// Use of this interface is not recommended, as added methods to TranslationServer will
// result in compilation errors.
type UnsafeTranslationServer interface {
mustEmbedUnimplementedTranslationServer()
}
func RegisterTranslationServer(s grpc.ServiceRegistrar, srv TranslationServer) {
// If the following call panics, it indicates UnimplementedTranslationServer was
// embedded by pointer and is nil. This will cause panics if an
// unimplemented method is ever invoked, so we test this at initialization
// time to prevent it from happening at runtime later due to I/O.
if t, ok := srv.(interface{ testEmbeddedByValue() }); ok {
t.testEmbeddedByValue()
}
s.RegisterService(&Translation_ServiceDesc, srv)
}
func _Translation_GetHistory_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetHistoryRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(TranslationServer).GetHistory(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: Translation_GetHistory_FullMethodName,
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(TranslationServer).GetHistory(ctx, req.(*GetHistoryRequest))
}
return interceptor(ctx, in, info, handler)
}
// Translation_ServiceDesc is the grpc.ServiceDesc for Translation service.
// It's only intended for direct use with grpc.RegisterService,
// and not to be introspected or modified (even as a copy)
var Translation_ServiceDesc = grpc.ServiceDesc{
ServiceName: "grpc.v1.Translation",
HandlerType: (*TranslationServer)(nil),
Methods: []grpc.MethodDesc{
{
MethodName: "GetHistory",
Handler: _Translation_GetHistory_Handler,
},
},
Streams: []grpc.StreamDesc{},
Metadata: "docs/proto/v1/translation.history.proto",
}
================================================
FILE: docs/swagger.json
================================================
{
"swagger": "2.0",
"info": {
"description": "Using a translation service as an example",
"title": "Go Clean Template API",
"contact": {},
"version": "1.0"
},
"host": "localhost:8080",
"basePath": "/v1",
"paths": {
"/translation/do-translate": {
"post": {
"description": "Translate a text",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"translation"
],
"summary": "Translate",
"operationId": "do-translate",
"parameters": [
{
"description": "Set up translation",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/request.Translate"
}
}
],
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.Translation"
}
},
"400": {
"description": "Bad Request",
"schema": {
"$ref": "#/definitions/response.Error"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.Error"
}
}
}
}
},
"/translation/history": {
"get": {
"description": "Show all translation history",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"translation"
],
"summary": "Show history",
"operationId": "history",
"responses": {
"200": {
"description": "OK",
"schema": {
"$ref": "#/definitions/entity.TranslationHistory"
}
},
"500": {
"description": "Internal Server Error",
"schema": {
"$ref": "#/definitions/response.Error"
}
}
}
}
}
},
"definitions": {
"entity.Translation": {
"type": "object",
"properties": {
"destination": {
"type": "string",
"example": "en"
},
"original": {
"type": "string",
"example": "текст для перевода"
},
"source": {
"type": "string",
"example": "auto"
},
"translation": {
"type": "string",
"example": "text for translation"
}
}
},
"entity.TranslationHistory": {
"type": "object",
"properties": {
"history": {
"type": "array",
"items": {
"$ref": "#/definitions/entity.Translation"
}
}
}
},
"request.Translate": {
"type": "object",
"required": [
"destination",
"original",
"source"
],
"properties": {
"destination": {
"type": "string",
"example": "en"
},
"original": {
"type": "string",
"example": "текст для перевода"
},
"source": {
"type": "string",
"example": "auto"
}
}
},
"response.Error": {
"type": "object",
"properties": {
"error": {
"type": "string",
"example": "message"
}
}
}
}
}
================================================
FILE: docs/swagger.yaml
================================================
basePath: /v1
definitions:
entity.Translation:
properties:
destination:
example: en
type: string
original:
example: текст для перевода
type: string
source:
example: auto
type: string
translation:
example: text for translation
type: string
type: object
entity.TranslationHistory:
properties:
history:
items:
$ref: '#/definitions/entity.Translation'
type: array
type: object
request.Translate:
properties:
destination:
example: en
type: string
original:
example: текст для перевода
type: string
source:
example: auto
type: string
required:
- destination
- original
- source
type: object
response.Error:
properties:
error:
example: message
type: string
type: object
host: localhost:8080
info:
contact: {}
description: Using a translation service as an example
title: Go Clean Template API
version: "1.0"
paths:
/translation/do-translate:
post:
consumes:
- application/json
description: Translate a text
operationId: do-translate
parameters:
- description: Set up translation
in: body
name: request
required: true
schema:
$ref: '#/definitions/request.Translate'
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/entity.Translation'
"400":
description: Bad Request
schema:
$ref: '#/definitions/response.Error'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/response.Error'
summary: Translate
tags:
- translation
/translation/history:
get:
consumes:
- application/json
description: Show all translation history
operationId: history
produces:
- application/json
responses:
"200":
description: OK
schema:
$ref: '#/definitions/entity.TranslationHistory'
"500":
description: Internal Server Error
schema:
$ref: '#/definitions/response.Error'
summary: Show history
tags:
- translation
swagger: "2.0"
================================================
FILE: go.mod
================================================
module github.com/evrone/go-clean-template
go 1.26
tool (
github.com/daixiang0/gci
github.com/golang-migrate/migrate/v4/cmd/migrate
github.com/golangci/golangci-lint/v2/cmd/golangci-lint
github.com/swaggo/swag/cmd/swag
go.uber.org/mock/mockgen
golang.org/x/vuln/cmd/govulncheck
google.golang.org/grpc/cmd/protoc-gen-go-grpc
google.golang.org/protobuf/cmd/protoc-gen-go
mvdan.cc/gofumpt
)
require (
github.com/Conight/go-googletrans v0.3.0
github.com/Masterminds/squirrel v1.5.4
github.com/ansrivas/fiberprometheus/v2 v2.17.0
github.com/caarlos0/env/v11 v11.4.0
github.com/go-playground/validator/v10 v10.30.1
github.com/goccy/go-json v0.10.6
github.com/gofiber/fiber/v2 v2.52.12
github.com/gofiber/swagger v1.1.1
github.com/golang-migrate/migrate/v4 v4.19.1
github.com/google/uuid v1.6.0
github.com/jackc/pgx/v5 v5.8.0
github.com/nats-io/nats.go v1.49.0
github.com/rabbitmq/amqp091-go v1.10.0
github.com/rs/zerolog v1.34.0
github.com/stretchr/testify v1.11.1
github.com/swaggo/swag v1.16.6
go.uber.org/mock v0.6.0
golang.org/x/sync v0.20.0
google.golang.org/grpc v1.79.3
google.golang.org/protobuf v1.36.11
)
require (
4d63.com/gocheckcompilerdirectives v1.3.0 // indirect
4d63.com/gochecknoglobals v0.2.2 // indirect
cel.dev/expr v0.25.1 // indirect
cloud.google.com/go v0.121.6 // indirect
cloud.google.com/go/auth v0.16.5 // indirect
cloud.google.com/go/auth/oauth2adapt v0.2.8 // indirect
cloud.google.com/go/compute/metadata v0.9.0 // indirect
cloud.google.com/go/iam v1.5.2 // indirect
cloud.google.com/go/longrunning v0.6.7 // indirect
cloud.google.com/go/monitoring v1.24.2 // indirect
cloud.google.com/go/spanner v1.85.0 // indirect
cloud.google.com/go/storage v1.56.0 // indirect
codeberg.org/chavacava/garif v0.2.0 // indirect
codeberg.org/polyfloyd/go-errorlint v1.9.0 // indirect
dev.gaijin.team/go/exhaustruct/v4 v4.0.0 // indirect
dev.gaijin.team/go/golib v0.6.0 // indirect
github.com/4meepo/tagalign v1.4.3 // indirect
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 // indirect
github.com/99designs/keyring v1.2.1 // indirect
github.com/Abirdcfly/dupword v0.1.7 // indirect
github.com/AdminBenni/iota-mixing v1.0.0 // indirect
github.com/AlwxSin/noinlineerr v1.0.5 // indirect
github.com/Antonboom/errname v1.1.1 // indirect
github.com/Antonboom/nilnil v1.1.1 // indirect
github.com/Antonboom/testifylint v1.6.4 // indirect
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 // indirect
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 // indirect
github.com/Azure/go-autorest v14.2.0+incompatible // indirect
github.com/Azure/go-autorest/autorest/adal v0.9.16 // indirect
github.com/Azure/go-autorest/autorest/date v0.3.0 // indirect
github.com/Azure/go-autorest/logger v0.2.1 // indirect
github.com/Azure/go-autorest/tracing v0.6.0 // indirect
github.com/BurntSushi/toml v1.6.0 // indirect
github.com/ClickHouse/clickhouse-go v1.4.3 // indirect
github.com/Djarvur/go-err113 v0.1.1 // indirect
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 // indirect
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/Masterminds/semver/v3 v3.4.0 // indirect
github.com/MirrexOne/unqueryvet v1.5.4 // indirect
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 // indirect
github.com/alecthomas/chroma/v2 v2.23.1 // indirect
github.com/alecthomas/go-check-sumtype v0.3.1 // indirect
github.com/alexkohler/nakedret/v2 v2.0.6 // indirect
github.com/alexkohler/prealloc v1.1.0 // indirect
github.com/alfatraining/structtag v1.0.0 // indirect
github.com/alingse/asasalint v0.0.11 // indirect
github.com/alingse/nilnesserr v0.2.0 // indirect
github.com/andybalholm/brotli v1.2.0 // indirect
github.com/apache/arrow/go/v10 v10.0.1 // indirect
github.com/apache/thrift v0.16.0 // indirect
github.com/ashanbrown/forbidigo/v2 v2.3.0 // indirect
github.com/ashanbrown/makezero/v2 v2.1.0 // indirect
github.com/aws/aws-sdk-go v1.49.6 // indirect
github.com/aws/aws-sdk-go-v2 v1.16.16 // indirect
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.8 // indirect
github.com/aws/aws-sdk-go-v2/credentials v1.12.20 // indirect
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.33 // indirect
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23 // indirect
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17 // indirect
github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.14 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.9 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.18 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17 // indirect
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.17 // indirect
github.com/aws/aws-sdk-go-v2/service/s3 v1.27.11 // indirect
github.com/aws/smithy-go v1.13.3 // indirect
github.com/aymanbagabas/go-osc52/v2 v2.0.1 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/bkielbasa/cyclop v1.2.3 // indirect
github.com/blizzy78/varnamelen v0.8.0 // indirect
github.com/bombsimon/wsl/v4 v4.7.0 // indirect
github.com/bombsimon/wsl/v5 v5.6.0 // indirect
github.com/breml/bidichk v0.3.3 // indirect
github.com/breml/errchkjson v0.4.1 // indirect
github.com/butuzov/ireturn v0.4.0 // indirect
github.com/butuzov/mirror v1.3.0 // indirect
github.com/catenacyber/perfsprint v0.10.1 // indirect
github.com/ccojocar/zxcvbn-go v1.0.4 // indirect
github.com/cenkalti/backoff/v4 v4.1.2 // indirect
github.com/cespare/xxhash/v2 v2.3.0 // indirect
github.com/charithe/durationcheck v0.0.11 // indirect
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc // indirect
github.com/charmbracelet/lipgloss v1.1.0 // indirect
github.com/charmbracelet/x/ansi v0.10.1 // indirect
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd // indirect
github.com/charmbracelet/x/term v0.2.1 // indirect
github.com/ckaznocha/intrange v0.3.1 // indirect
github.com/clipperhouse/uax29/v2 v2.7.0 // indirect
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 // indirect
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 // indirect
github.com/cockroachdb/cockroach-go/v2 v2.1.1 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/curioswitch/go-reassign v0.3.0 // indirect
github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369 // indirect
github.com/daixiang0/gci v0.14.0 // indirect
github.com/danieljoos/wincred v1.1.2 // indirect
github.com/dave/dst v0.27.3 // indirect
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
github.com/denis-tingaikin/go-header v0.5.0 // indirect
github.com/dlclark/regexp2 v1.11.5 // indirect
github.com/dvsekhvalnov/jose2go v1.7.0 // indirect
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 // indirect
github.com/envoyproxy/go-control-plane/envoy v1.36.0 // indirect
github.com/envoyproxy/protoc-gen-validate v1.3.0 // indirect
github.com/ettle/strcase v0.2.0 // indirect
github.com/fatih/color v1.18.0 // indirect
github.com/fatih/structtag v1.2.0 // indirect
github.com/felixge/httpsnoop v1.0.4 // indirect
github.com/firefart/nonamedreturns v1.0.6 // indirect
github.com/form3tech-oss/jwt-go v3.2.5+incompatible // indirect
github.com/fsnotify/fsnotify v1.6.0 // indirect
github.com/fzipp/gocyclo v0.6.0 // indirect
github.com/gabriel-vasile/mimetype v1.4.13 // indirect
github.com/ghostiam/protogetter v0.3.20 // indirect
github.com/go-critic/go-critic v0.14.3 // indirect
github.com/go-jose/go-jose/v4 v4.1.3 // indirect
github.com/go-logr/logr v1.4.3 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/go-openapi/jsonpointer v0.22.5 // indirect
github.com/go-openapi/jsonreference v0.21.5 // indirect
github.com/go-openapi/spec v0.22.4 // indirect
github.com/go-openapi/swag/conv v0.25.5 // indirect
github.com/go-openapi/swag/jsonname v0.25.5 // indirect
github.com/go-openapi/swag/jsonutils v0.25.5 // indirect
github.com/go-openapi/swag/loading v0.25.5 // indirect
github.com/go-openapi/swag/stringutils v0.25.5 // indirect
github.com/go-openapi/swag/typeutils v0.25.5 // indirect
github.com/go-openapi/swag/yamlutils v0.25.5 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-sql-driver/mysql v1.7.1 // indirect
github.com/go-stack/stack v1.8.0 // indirect
github.com/go-toolsmith/astcast v1.1.0 // indirect
github.com/go-toolsmith/astcopy v1.1.0 // indirect
github.com/go-toolsmith/astequal v1.2.0 // indirect
github.com/go-toolsmith/astfmt v1.1.0 // indirect
github.com/go-toolsmith/astp v1.1.0 // indirect
github.com/go-toolsmith/strparse v1.1.0 // indirect
github.com/go-toolsmith/typep v1.1.0 // indirect
github.com/go-viper/mapstructure/v2 v2.5.0 // indirect
github.com/go-xmlfmt/xmlfmt v1.1.3 // indirect
github.com/gobwas/glob v0.2.3 // indirect
github.com/gocql/gocql v0.0.0-20210515062232-b7ef815b4556 // indirect
github.com/godbus/dbus v0.0.0-20190726142602-4481cbc300e2 // indirect
github.com/godoc-lint/godoc-lint v0.11.2 // indirect
github.com/gofrs/flock v0.13.0 // indirect
github.com/golang-jwt/jwt/v4 v4.5.2 // indirect
github.com/golang-sql/civil v0.0.0-20190719163853-cb61b32ac6fe // indirect
github.com/golang-sql/sqlexp v0.1.0 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/golangci/asciicheck v0.5.0 // indirect
github.com/golangci/dupl v0.0.0-20250308024227-f665c8d69b32 // indirect
github.com/golangci/go-printf-func-name v0.1.1 // indirect
github.com/golangci/gofmt v0.0.0-20250106114630-d62b90e6713d // indirect
github.com/golangci/golangci-lint/v2 v2.11.3 // indirect
github.com/golangci/golines v0.15.0 // indirect
github.com/golangci/misspell v0.8.0 // indirect
github.com/golangci/plugin-module-register v0.1.2 // indirect
github.com/golangci/revgrep v0.8.0 // indirect
github.com/golangci/swaggoswag v0.0.0-20250504205917-77f2aca3143e // indirect
github.com/golangci/unconvert v0.0.0-20250410112200-a129a6e6413e // indirect
github.com/google/flatbuffers v2.0.8+incompatible // indirect
github.com/google/go-cmp v0.7.0 // indirect
github.com/google/go-github/v39 v39.2.0 // indirect
github.com/google/go-querystring v1.1.0 // indirect
github.com/google/s2a-go v0.1.9 // indirect
github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect
github.com/googleapis/gax-go/v2 v2.15.0 // indirect
github.com/gordonklaus/ineffassign v0.2.0 // indirect
github.com/gostaticanalysis/analysisutil v0.7.1 // indirect
github.com/gostaticanalysis/comment v1.5.0 // indirect
github.com/gostaticanalysis/forcetypeassert v0.2.0 // indirect
github.com/gostaticanalysis/nilerr v0.1.2 // indirect
github.com/gsterjov/go-libsecret v0.0.0-20161001094733-a6f4afe4910c // indirect
github.com/hailocab/go-hostpool v0.0.0-20160125115350-e80d13ce29ed // indirect
github.com/hashicorp/go-immutable-radix/v2 v2.1.0 // indirect
github.com/hashicorp/go-version v1.8.0 // indirect
github.com/hashicorp/golang-lru/v2 v2.0.7 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
github.com/hexops/gotextdiff v1.0.3 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/jackc/chunkreader/v2 v2.0.1 // indirect
github.com/jackc/pgconn v1.14.3 // indirect
github.com/jackc/pgerrcode v0.0.0-20220416144525-469b46aa5efa // indirect
github.com/jackc/pgio v1.0.0 // indirect
github.com/jackc/pgpassfile v1.0.0 // indirect
github.com/jackc/pgproto3/v2 v2.3.3 // indirect
github.com/jackc/pgservicefile v0.0.0-20240606120523-5a60cdf6a761 // indirect
github.com/jackc/pgtype v1.14.0 // indirect
github.com/jackc/pgx/v4 v4.18.2 // indirect
github.com/jackc/puddle/v2 v2.2.2 // indirect
github.com/jgautheron/goconst v1.8.2 // indirect
github.com/jingyugao/rowserrcheck v1.1.1 // indirect
github.com/jjti/go-spancheck v0.6.5 // indirect
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/julz/importas v0.2.0 // indirect
github.com/k0kubun/pp v2.3.0+incompatible // indirect
github.com/karamaru-alpha/copyloopvar v1.2.2 // indirect
github.com/kardianos/osext v0.0.0-20190222173326-2bc1f35cddc0 // indirect
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51 // indirect
github.com/kisielk/errcheck v1.10.0 // indirect
github.com/kkHAIKE/contextcheck v1.1.6 // indirect
github.com/klauspost/asmfmt v1.3.2 // indirect
github.com/klauspost/compress v1.18.4 // indirect
github.com/klauspost/cpuid/v2 v2.0.9 // indirect
github.com/ktrysmt/go-bitbucket v0.6.4 // indirect
github.com/kulti/thelper v0.7.1 // indirect
github.com/kunwardeep/paralleltest v1.0.15 // indirect
github.com/lann/builder v0.0.0-20180802200727-47ae307949d0 // indirect
github.com/lann/ps v0.0.0-20150810152359-62de8c46ede0 // indirect
github.com/lasiar/canonicalheader v1.1.2 // indirect
github.com/ldez/exptostd v0.4.5 // indirect
github.com/ldez/gomoddirectives v0.8.0 // indirect
github.com/ldez/grignotin v0.10.1 // indirect
github.com/ldez/structtags v0.6.1 // indirect
github.com/ldez/tagliatelle v0.7.2 // indirect
github.com/ldez/usetesting v0.5.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/leonklingele/grouper v1.1.2 // indirect
github.com/lib/pq v1.11.2 // indirect
github.com/lucasb-eyer/go-colorful v1.2.0 // indirect
github.com/macabu/inamedparam v0.2.0 // indirect
github.com/magiconair/properties v1.8.6 // indirect
github.com/manuelarte/embeddedstructfieldcheck v0.4.0 // indirect
github.com/manuelarte/funcorder v0.5.0 // indirect
github.com/maratori/testableexamples v1.0.1 // indirect
github.com/maratori/testpackage v1.1.2 // indirect
github.com/matoous/godox v1.1.0 // indirect
github.com/mattn/go-colorable v0.1.14 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/mattn/go-runewidth v0.0.21 // indirect
github.com/mattn/go-sqlite3 v1.14.22 // indirect
github.com/mgechev/revive v1.15.0 // indirect
github.com/microsoft/go-mssqldb v1.0.0 // indirect
github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 // indirect
github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 // indirect
github.com/mitchellh/go-homedir v1.1.0 // indirect
github.com/mitchellh/mapstructure v1.5.0 // indirect
github.com/moricho/tparallel v0.3.2 // indirect
github.com/mtibben/percent v0.2.1 // indirect
github.com/muesli/termenv v0.16.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/mutecomm/go-sqlcipher/v4 v4.4.0 // indirect
github.com/nakabonne/nestif v0.3.1 // indirect
github.com/nakagami/firebirdsql v0.0.0-20190310045651-3c02a58cfed8 // indirect
github.com/nats-io/nkeys v0.4.15 // indirect
github.com/nats-io/nuid v1.0.1 // indirect
github.com/neo4j/neo4j-go-driver v1.8.1-0.20200803113522-b626aa943eba // indirect
github.com/nishanths/exhaustive v0.12.0 // indirect
github.com/nishanths/predeclared v0.2.2 // indirect
github.com/nunnatsa/ginkgolinter v0.23.0 // indirect
github.com/nxadm/tail v1.4.11 // indirect
github.com/pelletier/go-toml v1.9.5 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/pierrec/lz4/v4 v4.1.16 // indirect
github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
github.com/prometheus/client_golang v1.23.2 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.67.5 // indirect
github.com/prometheus/procfs v0.20.1 // indirect
github.com/quasilyte/go-ruleguard v0.4.5 // indirect
github.com/quasilyte/go-ruleguard/dsl v0.3.23 // indirect
github.com/quasilyte/gogrep v0.5.0 // indirect
github.com/quasilyte/regex/syntax v0.0.0-20210819130434-b3f0c404a727 // indirect
github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 // indirect
github.com/raeperd/recvcheck v0.2.0 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20200410134404-eec4a21b6bb0 // indirect
github.com/rivo/uniseg v0.4.7 // indirect
github.com/rogpeppe/go-internal v1.14.1 // indirect
github.com/rqlite/gorqlite v0.0.0-20230708021416-2acd02b70b79 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/ryancurrah/gomodguard v1.4.1 // indirect
github.com/ryanrolds/sqlclosecheck v0.5.1 // indirect
github.com/sanposhiho/wastedassign/v2 v2.1.0 // indirect
github.com/santhosh-tekuri/jsonschema/v6 v6.0.2 // indirect
github.com/sashamelentyev/interfacebloat v1.1.0 // indirect
github.com/sashamelentyev/usestdlibvars v1.29.0 // indirect
github.com/securego/gosec/v2 v2.24.8-0.20260309165252-619ce2117e08 // indirect
github.com/shopspring/decimal v1.2.0 // indirect
github.com/sirupsen/logrus v1.9.4 // indirect
github.com/sivchari/containedctx v1.0.3 // indirect
github.com/snowflakedb/gosnowflake v1.6.19 // indirect
github.com/sonatard/noctx v0.5.0 // indirect
github.com/sourcegraph/go-diff v0.7.0 // indirect
github.com/spf13/afero v1.15.0 // indirect
github.com/spf13/cast v1.5.0 // indirect
github.com/spf13/cobra v1.10.2 // indirect
github.com/spf13/jwalterweatherman v1.1.0 // indirect
github.com/spf13/pflag v1.0.10 // indirect
github.com/spf13/viper v1.12.0 // indirect
github.com/spiffe/go-spiffe/v2 v2.6.0 // indirect
github.com/ssgreg/nlreturn/v2 v2.2.1 // indirect
github.com/stbenjam/no-sprintf-host-port v0.3.1 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/subosito/gotenv v1.4.1 // indirect
github.com/swaggo/files/v2 v2.0.2 // indirect
github.com/tetafro/godot v1.5.4 // indirect
github.com/timakin/bodyclose v0.0.0-20241222091800-1db5c5ca4d67 // indirect
github.com/timonwong/loggercheck v0.11.0 // indirect
github.com/tomarrell/wrapcheck/v2 v2.12.0 // indirect
github.com/tommy-muehle/go-mnd/v2 v2.5.1 // indirect
github.com/ultraware/funlen v0.2.0 // indirect
github.com/ultraware/whitespace v0.2.0 // indirect
github.com/urfave/cli/v2 v2.3.0 // indirect
github.com/uudashr/gocognit v1.2.1 // indirect
github.com/uudashr/iface v1.4.1 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasthttp v1.69.0 // indirect
github.com/xanzy/go-gitlab v0.15.0 // indirect
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
github.com/xdg-go/scram v1.1.1 // indirect
github.com/xdg-go/stringprep v1.0.3 // indirect
github.com/xen0n/gosmopolitan v1.3.0 // indirect
github.com/xo/terminfo v0.0.0-20220910002029-abceb7e1c41e // indirect
github.com/yagipy/maintidx v1.0.0 // indirect
github.com/yeya24/promlinter v0.3.0 // indirect
github.com/ykadowak/zerologlint v0.1.5 // indirect
github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d // indirect
github.com/zeebo/xxh3 v1.0.2 // indirect
gitlab.com/bosi/decorder v0.4.2 // indirect
gitlab.com/nyarla/go-crypt v0.0.0-20160106005555-d9a5dc2b789b // indirect
go-simpler.org/musttag v0.14.0 // indirect
go-simpler.org/sloglint v0.11.1 // indirect
go.augendre.info/arangolint v0.4.0 // indirect
go.augendre.info/fatcontext v0.9.0 // indirect
go.mongodb.org/mongo-driver v1.7.5 // indirect
go.opencensus.io v0.24.0 // indirect
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
go.opentelemetry.io/contrib/detectors/gcp v1.39.0 // indirect
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.61.0 // indirect
go.opentelemetry.io/otel v1.42.0 // indirect
go.opentelemetry.io/otel/metric v1.42.0 // indirect
go.opentelemetry.io/otel/sdk v1.40.0 // indirect
go.opentelemetry.io/otel/sdk/metric v1.40.0 // indirect
go.opentelemetry.io/otel/trace v1.42.0 // indirect
go.uber.org/multierr v1.10.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.yaml.in/yaml/v2 v2.4.4 // indirect
go.yaml.in/yaml/v3 v3.0.4 // indirect
golang.org/x/crypto v0.49.0 // indirect
golang.org/x/exp/typeparams v0.0.0-20260209203927-2842357ff358 // indirect
golang.org/x/mod v0.34.0 // indirect
golang.org/x/net v0.52.0 // indirect
golang.org/x/oauth2 v0.34.0 // indirect
golang.org/x/sys v0.42.0 // indirect
golang.org/x/telemetry v0.0.0-20260311193753-579e4da9a98c // indirect
golang.org/x/term v0.41.0 // indirect
golang.org/x/text v0.35.0 // indirect
golang.org/x/time v0.12.0 // indirect
golang.org/x/tools v0.43.0 // indirect
golang.org/x/tools/godoc v0.1.0-deprecated // indirect
golang.org/x/vuln v1.1.4 // indirect
golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 // indirect
google.golang.org/api v0.247.0 // indirect
google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect
google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260316173506-9f6642b56129 // indirect
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.6.1 // indirect
gopkg.in/inf.v0 v0.9.1 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
honnef.co/go/tools v0.7.0 // indirect
lukechampine.com/uint128 v1.2.0 // indirect
modernc.org/b v1.0.0 // indirect
modernc.org/cc/v3 v3.36.3 // indirect
modernc.org/ccgo/v3 v3.16.9 // indirect
modernc.org/db v1.0.0 // indirect
modernc.org/file v1.0.0 // indirect
modernc.org/fileutil v1.0.0 // indirect
modernc.org/golex v1.0.0 // indirect
modernc.org/internal v1.0.0 // indirect
modernc.org/libc v1.17.1 // indirect
modernc.org/lldb v1.0.0 // indirect
modernc.org/mathutil v1.5.0 // indirect
modernc.org/memory v1.2.1 // indirect
modernc.org/opt v0.1.3 // indirect
modernc.org/ql v1.0.0 // indirect
modernc.org/sortutil v1.1.0 // indirect
modernc.org/sqlite v1.18.1 // indirect
modernc.org/strutil v1.1.3 // indirect
modernc.org/token v1.0.0 // indirect
modernc.org/zappy v1.0.0 // indirect
mvdan.cc/gofumpt v0.9.2 // indirect
mvdan.cc/unparam v0.0.0-20251027182757-5beb8c8f8f15 // indirect
sigs.k8s.io/yaml v1.3.0 // indirect
)
================================================
FILE: go.sum
================================================
4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A=
4d63.com/gocheckcompilerdirectives v1.3.0/go.mod h1:ofsJ4zx2QAuIP/NO/NAh1ig6R1Fb18/GI7RVMwz7kAY=
4d63.com/gochecknoglobals v0.2.2 h1:H1vdnwnMaZdQW/N+NrkT1SZMTBmcwHe9Vq8lJcYYTtU=
4d63.com/gochecknoglobals v0.2.2/go.mod h1:lLxwTQjL5eIesRbvnzIP3jZtG140FnTdz+AlMa+ogt0=
cel.dev/expr v0.25.1 h1:1KrZg61W6TWSxuNZ37Xy49ps13NUovb66QLprthtwi4=
cel.dev/expr v0.25.1/go.mod h1:hrXvqGP6G6gyx8UAHSHJ5RGk//1Oj5nXQ2NI02Nrsg4=
cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU=
cloud.google.com/go v0.44.1/go.mod h1:iSa0KzasP4Uvy3f1mN/7PiObzGgflwredwwASm/v6AU=
cloud.google.com/go v0.44.2/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.44.3/go.mod h1:60680Gw3Yr4ikxnPRS/oxxkBccT6SA1yMk63TGekxKY=
cloud.google.com/go v0.45.1/go.mod h1:RpBamKRgapWJb87xiFSdk4g1CME7QZg3uwTez+TSTjc=
cloud.google.com/go v0.46.3/go.mod h1:a6bKKbmY7er1mI7TEI4lsAkts/mkhTSZK8w33B4RAg0=
cloud.google.com/go v0.50.0/go.mod h1:r9sluTvynVuxRIOHXQEHMFffphuXHOMZMycpNR5e6To=
cloud.google.com/go v0.52.0/go.mod h1:pXajvRH/6o3+F9jDHZWQ5PbGhn+o8w9qiu/CffaVdO4=
cloud.google.com/go v0.53.0/go.mod h1:fp/UouUEsRkN6ryDKNW/Upv/JBKnv6WDthjR6+vze6M=
cloud.google.com/go v0.54.0/go.mod h1:1rq2OEkV3YMf6n/9ZvGWI3GWw0VoqH/1x2nd8Is/bPc=
cloud.google.com/go v0.56.0/go.mod h1:jr7tqZxxKOVYizybht9+26Z/gUq7tiRzu+ACVAMbKVk=
cloud.google.com/go v0.57.0/go.mod h1:oXiQ6Rzq3RAkkY7N6t3TcE6jE+CIBBbA36lwQ1JyzZs=
cloud.google.com/go v0.62.0/go.mod h1:jmCYTdRCQuc1PHIIJ/maLInMho30T/Y0M4hTdTShOYc=
cloud.google.com/go v0.65.0/go.mod h1:O5N8zS7uWy9vkA9vayVHs65eM1ubvY4h553ofrNHObY=
cloud.google.com/go v0.72.0/go.mod h1:M+5Vjvlc2wnp6tjzE102Dw08nGShTscUx2nZMufOKPI=
cloud.google.com/go v0.74.0/go.mod h1:VV1xSbzvo+9QJOxLDaJfTjx5e+MePCpCWwvftOeQmWk=
cloud.google.com/go v0.75.0/go.mod h1:VGuuCn7PG0dwsd5XPVm2Mm3wlh3EL55/79EKB6hlPTY=
cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg=
cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8=
cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0=
cloud.google.com/go v0.83.0/go.mod h1:Z7MJUsANfY0pYPdw0lbnivPx4/vhy/e2FEkSkF7vAVY=
cloud.google.com/go v0.84.0/go.mod h1:RazrYuxIK6Kb7YrzzhPoLmCVzl7Sup4NrbKPg8KHSUM=
cloud.google.com/go v0.87.0/go.mod h1:TpDYlFy7vuLzZMMZ+B6iRiELaY7z/gJPaqbMx6mlWcY=
cloud.google.com/go v0.90.0/go.mod h1:kRX0mNRHe0e2rC6oNakvwQqzyDmg57xJ+SZU1eT2aDQ=
cloud.google.com/go v0.93.3/go.mod h1:8utlLll2EF5XMAV15woO4lSbWQlk8rer9aLOfLh7+YI=
cloud.google.com/go v0.94.1/go.mod h1:qAlAugsXlC+JWO+Bke5vCtc9ONxjQT3drlTTnAplMW4=
cloud.google.com/go v0.97.0/go.mod h1:GF7l59pYBVlXQIBLx3a761cZ41F9bBH3JUlihCt2Udc=
cloud.google.com/go v0.99.0/go.mod h1:w0Xx2nLzqWJPuozYQX+hFfCSI8WioryfRDzkoI/Y2ZA=
cloud.google.com/go v0.100.1/go.mod h1:fs4QogzfH5n2pBXBP9vRiU+eCny7lD2vmFZy79Iuw1U=
cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A=
cloud.google.com/go v0.102.0/go.mod h1:oWcCzKlqJ5zgHQt9YsaeTY9KzIvjyy0ArmiBUgpQ+nc=
cloud.google.com/go v0.102.1/go.mod h1:XZ77E9qnTEnrgEOvr4xzfdX5TRo7fB4T2F4O6+34hIU=
cloud.google.com/go v0.104.0/go.mod h1:OO6xxXdJyvuJPcEPBLN9BJPD+jep5G1+2U5B5gkRYtA=
cloud.google.com/go v0.105.0/go.mod h1:PrLgOJNe5nfE9UMxKxgXj4mD3voiP+YQ6gdt6KMFOKM=
cloud.google.com/go v0.107.0/go.mod h1:wpc2eNrD7hXUTy8EKS10jkxpZBjASrORK7goS+3YX2I=
cloud.google.com/go v0.110.0/go.mod h1:SJnCLqQ0FCFGSZMUNUf84MV3Aia54kn7pi8st7tMzaY=
cloud.google.com/go v0.121.6 h1:waZiuajrI28iAf40cWgycWNgaXPO06dupuS+sgibK6c=
cloud.google.com/go v0.121.6/go.mod h1:coChdst4Ea5vUpiALcYKXEpR1S9ZgXbhEzzMcMR66vI=
cloud.google.com/go/accessapproval v1.4.0/go.mod h1:zybIuC3KpDOvotz59lFe5qxRZx6C75OtwbisN56xYB4=
cloud.google.com/go/accessapproval v1.5.0/go.mod h1:HFy3tuiGvMdcd/u+Cu5b9NkO1pEICJ46IR82PoUdplw=
cloud.google.com/go/accessapproval v1.6.0/go.mod h1:R0EiYnwV5fsRFiKZkPHr6mwyk2wxUJ30nL4j2pcFY2E=
cloud.google.com/go/accesscontextmanager v1.3.0/go.mod h1:TgCBehyr5gNMz7ZaH9xubp+CE8dkrszb4oK9CWyvD4o=
cloud.google.com/go/accesscontextmanager v1.4.0/go.mod h1:/Kjh7BBu/Gh83sv+K60vN9QE5NJcd80sU33vIe2IFPE=
cloud.google.com/go/accesscontextmanager v1.6.0/go.mod h1:8XCvZWfYw3K/ji0iVnp+6pu7huxoQTLmxAbVjbloTtM=
cloud.google.com/go/accesscontextmanager v1.7.0/go.mod h1:CEGLewx8dwa33aDAZQujl7Dx+uYhS0eay198wB/VumQ=
cloud.google.com/go/aiplatform v1.22.0/go.mod h1:ig5Nct50bZlzV6NvKaTwmplLLddFx0YReh9WfTO5jKw=
cloud.google.com/go/aiplatform v1.24.0/go.mod h1:67UUvRBKG6GTayHKV8DBv2RtR1t93YRu5B1P3x99mYY=
cloud.google.com/go/aiplatform v1.27.0/go.mod h1:Bvxqtl40l0WImSb04d0hXFU7gDOiq9jQmorivIiWcKg=
cloud.google.com/go/aiplatform v1.35.0/go.mod h1:7MFT/vCaOyZT/4IIFfxH4ErVg/4ku6lKv3w0+tFTgXQ=
cloud.google.com/go/aiplatform v1.36.1/go.mod h1:WTm12vJRPARNvJ+v6P52RDHCNe4AhvjcIZ/9/RRHy/k=
cloud.google.com/go/aiplatform v1.37.0/go.mod h1:IU2Cv29Lv9oCn/9LkFiiuKfwrRTq+QQMbW+hPCxJGZw=
cloud.google.com/go/analytics v0.11.0/go.mod h1:DjEWCu41bVbYcKyvlws9Er60YE4a//bK6mnhWvQeFNI=
cloud.google.com/go/analytics v0.12.0/go.mod h1:gkfj9h6XRf9+TS4bmuhPEShsh3hH8PAZzm/41OOhQd4=
cloud.google.com/go/analytics v0.17.0/go.mod h1:WXFa3WSym4IZ+JiKmavYdJwGG/CvpqiqczmL59bTD9M=
cloud.google.com/go/analytics v0.18.0/go.mod h1:ZkeHGQlcIPkw0R/GW+boWHhCOR43xz9RN/jn7WcqfIE=
cloud.google.com/go/analytics v0.19.0/go.mod h1:k8liqf5/HCnOUkbawNtrWWc+UAzyDlW89doe8TtoDsE=
cloud.google.com/go/apigateway v1.3.0/go.mod h1:89Z8Bhpmxu6AmUxuVRg/ECRGReEdiP3vQtk4Z1J9rJk=
cloud.google.com/go/apigateway v1.4.0/go.mod h1:pHVY9MKGaH9PQ3pJ4YLzoj6U5FUDeDFBllIz7WmzJoc=
cloud.google.com/go/apigateway v1.5.0/go.mod h1:GpnZR3Q4rR7LVu5951qfXPJCHquZt02jf7xQx7kpqN8=
cloud.google.com/go/apigeeconnect v1.3.0/go.mod h1:G/AwXFAKo0gIXkPTVfZDd2qA1TxBXJ3MgMRBQkIi9jc=
cloud.google.com/go/apigeeconnect v1.4.0/go.mod h1:kV4NwOKqjvt2JYR0AoIWo2QGfoRtn/pkS3QlHp0Ni04=
cloud.google.com/go/apigeeconnect v1.5.0/go.mod h1:KFaCqvBRU6idyhSNyn3vlHXc8VMDJdRmwDF6JyFRqZ8=
cloud.google.com/go/apigeeregistry v0.4.0/go.mod h1:EUG4PGcsZvxOXAdyEghIdXwAEi/4MEaoqLMLDMIwKXY=
cloud.google.com/go/apigeeregistry v0.5.0/go.mod h1:YR5+s0BVNZfVOUkMa5pAR2xGd0A473vA5M7j247o1wM=
cloud.google.com/go/apigeeregistry v0.6.0/go.mod h1:BFNzW7yQVLZ3yj0TKcwzb8n25CFBri51GVGOEUcgQsc=
cloud.google.com/go/apikeys v0.4.0/go.mod h1:XATS/yqZbaBK0HOssf+ALHp8jAlNHUgyfprvNcBIszU=
cloud.google.com/go/apikeys v0.5.0/go.mod h1:5aQfwY4D+ewMMWScd3hm2en3hCj+BROlyrt3ytS7KLI=
cloud.google.com/go/apikeys v0.6.0/go.mod h1:kbpXu5upyiAlGkKrJgQl8A0rKNNJ7dQ377pdroRSSi8=
cloud.google.com/go/appengine v1.4.0/go.mod h1:CS2NhuBuDXM9f+qscZ6V86m1MIIqPj3WC/UoEuR1Sno=
cloud.google.com/go/appengine v1.5.0/go.mod h1:TfasSozdkFI0zeoxW3PTBLiNqRmzraodCWatWI9Dmak=
cloud.google.com/go/appengine v1.6.0/go.mod h1:hg6i0J/BD2cKmDJbaFSYHFyZkgBEfQrDg/X0V5fJn84=
cloud.google.com/go/appengine v1.7.0/go.mod h1:eZqpbHFCqRGa2aCdope7eC0SWLV1j0neb/QnMJVWx6A=
cloud.google.com/go/appengine v1.7.1/go.mod h1:IHLToyb/3fKutRysUlFO0BPt5j7RiQ45nrzEJmKTo6E=
cloud.google.com/go/area120 v0.5.0/go.mod h1:DE/n4mp+iqVyvxHN41Vf1CR602GiHQjFPusMFW6bGR4=
cloud.google.com/go/area120 v0.6.0/go.mod h1:39yFJqWVgm0UZqWTOdqkLhjoC7uFfgXRC8g/ZegeAh0=
cloud.google.com/go/area120 v0.7.0/go.mod h1:a3+8EUD1SX5RUcCs3MY5YasiO1z6yLiNLRiFrykbynY=
cloud.google.com/go/area120 v0.7.1/go.mod h1:j84i4E1RboTWjKtZVWXPqvK5VHQFJRF2c1Nm69pWm9k=
cloud.google.com/go/artifactregistry v1.6.0/go.mod h1:IYt0oBPSAGYj/kprzsBjZ/4LnG/zOcHyFHjWPCi6SAQ=
cloud.google.com/go/artifactregistry v1.7.0/go.mod h1:mqTOFOnGZx8EtSqK/ZWcsm/4U8B77rbcLP6ruDU2Ixk=
cloud.google.com/go/artifactregistry v1.8.0/go.mod h1:w3GQXkJX8hiKN0v+at4b0qotwijQbYUqF2GWkZzAhC0=
cloud.google.com/go/artifactregistry v1.9.0/go.mod h1:2K2RqvA2CYvAeARHRkLDhMDJ3OXy26h3XW+3/Jh2uYc=
cloud.google.com/go/artifactregistry v1.11.1/go.mod h1:lLYghw+Itq9SONbCa1YWBoWs1nOucMH0pwXN1rOBZFI=
cloud.google.com/go/artifactregistry v1.11.2/go.mod h1:nLZns771ZGAwVLzTX/7Al6R9ehma4WUEhZGWV6CeQNQ=
cloud.google.com/go/artifactregistry v1.12.0/go.mod h1:o6P3MIvtzTOnmvGagO9v/rOjjA0HmhJ+/6KAXrmYDCI=
cloud.google.com/go/artifactregistry v1.13.0/go.mod h1:uy/LNfoOIivepGhooAUpL1i30Hgee3Cu0l4VTWHUC08=
cloud.google.com/go/asset v1.5.0/go.mod h1:5mfs8UvcM5wHhqtSv8J1CtxxaQq3AdBxxQi2jGW/K4o=
cloud.google.com/go/asset v1.7.0/go.mod h1:YbENsRK4+xTiL+Ofoj5Ckf+O17kJtgp3Y3nn4uzZz5s=
cloud.google.com/go/asset v1.8.0/go.mod h1:mUNGKhiqIdbr8X7KNayoYvyc4HbbFO9URsjbytpUaW0=
cloud.google.com/go/asset v1.9.0/go.mod h1:83MOE6jEJBMqFKadM9NLRcs80Gdw76qGuHn8m3h8oHQ=
cloud.google.com/go/asset v1.10.0/go.mod h1:pLz7uokL80qKhzKr4xXGvBQXnzHn5evJAEAtZiIb0wY=
cloud.google.com/go/asset v1.11.1/go.mod h1:fSwLhbRvC9p9CXQHJ3BgFeQNM4c9x10lqlrdEUYXlJo=
cloud.google.com/go/asset v1.12.0/go.mod h1:h9/sFOa4eDIyKmH6QMpm4eUK3pDojWnUhTgJlk762Hg=
cloud.google.com/go/asset v1.13.0/go.mod h1:WQAMyYek/b7NBpYq/K4KJWcRqzoalEsxz/t/dTk4THw=
cloud.google.com/go/assuredworkloads v1.5.0/go.mod h1:n8HOZ6pff6re5KYfBXcFvSViQjDwxFkAkmUFffJRbbY=
cloud.google.com/go/assuredworkloads v1.6.0/go.mod h1:yo2YOk37Yc89Rsd5QMVECvjaMKymF9OP+QXWlKXUkXw=
cloud.google.com/go/assuredworkloads v1.7.0/go.mod h1:z/736/oNmtGAyU47reJgGN+KVoYoxeLBoj4XkKYscNI=
cloud.google.com/go/assuredworkloads v1.8.0/go.mod h1:AsX2cqyNCOvEQC8RMPnoc0yEarXQk6WEKkxYfL6kGIo=
cloud.google.com/go/assuredworkloads v1.9.0/go.mod h1:kFuI1P78bplYtT77Tb1hi0FMxM0vVpRC7VVoJC3ZoT0=
cloud.google.com/go/assuredworkloads v1.10.0/go.mod h1:kwdUQuXcedVdsIaKgKTp9t0UJkE5+PAVNhdQm4ZVq2E=
cloud.google.com/go/auth v0.16.5 h1:mFWNQ2FEVWAliEQWpAdH80omXFokmrnbDhUS9cBywsI=
cloud.google.com/go/auth v0.16.5/go.mod h1:utzRfHMP+Vv0mpOkTRQoWD2q3BatTOoWbA7gCc2dUhQ=
cloud.google.com/go/auth/oauth2adapt v0.2.8 h1:keo8NaayQZ6wimpNSmW5OPc283g65QNIiLpZnkHRbnc=
cloud.google.com/go/auth/oauth2adapt v0.2.8/go.mod h1:XQ9y31RkqZCcwJWNSx2Xvric3RrU88hAYYbjDWYDL+c=
cloud.google.com/go/automl v1.5.0/go.mod h1:34EjfoFGMZ5sgJ9EoLsRtdPSNZLcfflJR39VbVNS2M0=
cloud.google.com/go/automl v1.6.0/go.mod h1:ugf8a6Fx+zP0D59WLhqgTDsQI9w07o64uf/Is3Nh5p8=
cloud.google.com/go/automl v1.7.0/go.mod h1:RL9MYCCsJEOmt0Wf3z9uzG0a7adTT1fe+aObgSpkCt8=
cloud.google.com/go/automl v1.8.0/go.mod h1:xWx7G/aPEe/NP+qzYXktoBSDfjO+vnKMGgsApGJJquM=
cloud.google.com/go/automl v1.12.0/go.mod h1:tWDcHDp86aMIuHmyvjuKeeHEGq76lD7ZqfGLN6B0NuU=
cloud.google.com/go/baremetalsolution v0.3.0/go.mod h1:XOrocE+pvK1xFfleEnShBlNAXf+j5blPPxrhjKgnIFc=
cloud.google.com/go/baremetalsolution v0.4.0/go.mod h1:BymplhAadOO/eBa7KewQ0Ppg4A4Wplbn+PsFKRLo0uI=
cloud.google.com/go/baremetalsolution v0.5.0/go.mod h1:dXGxEkmR9BMwxhzBhV0AioD0ULBmuLZI8CdwalUxuss=
cloud.google.com/go/batch v0.3.0/go.mod h1:TR18ZoAekj1GuirsUsR1ZTKN3FC/4UDnScjT8NXImFE=
cloud.google.com/go/batch v0.4.0/go.mod h1:WZkHnP43R/QCGQsZ+0JyG4i79ranE2u8xvjq/9+STPE=
cloud.google.com/go/batch v0.7.0/go.mod h1:vLZN95s6teRUqRQ4s3RLDsH8PvboqBK+rn1oevL159g=
cloud.google.com/go/beyondcorp v0.2.0/go.mod h1:TB7Bd+EEtcw9PCPQhCJtJGjk/7TC6ckmnSFS+xwTfm4=
cloud.google.com/go/beyondcorp v0.3.0/go.mod h1:E5U5lcrcXMsCuoDNyGrpyTm/hn7ne941Jz2vmksAxW8=
cloud.google.com/go/beyondcorp v0.4.0/go.mod h1:3ApA0mbhHx6YImmuubf5pyW8srKnCEPON32/5hj+RmM=
cloud.google.com/go/beyondcorp v0.5.0/go.mod h1:uFqj9X+dSfrheVp7ssLTaRHd2EHqSL4QZmH4e8WXGGU=
cloud.google.com/go/bigquery v1.0.1/go.mod h1:i/xbL2UlR5RvWAURpBYZTtm/cXjCha9lbfbpx4poX+o=
cloud.google.com/go/bigquery v1.3.0/go.mod h1:PjpwJnslEMmckchkHFfq+HTD2DmtT67aNFKH1/VBDHE=
cloud.google.com/go/bigquery v1.4.0/go.mod h1:S8dzgnTigyfTmLBfrtrhyYhwRxG72rYxvftPBK2Dvzc=
cloud.google.com/go/bigquery v1.5.0/go.mod h1:snEHRnqQbz117VIFhE8bmtwIDY80NLUZUMb4Nv6dBIg=
cloud.google.com/go/bigquery v1.7.0/go.mod h1://okPTzCYNXSlb24MZs83e2Do+h+VXtc4gLoIoXIAPc=
cloud.google.com/go/bigquery v1.8.0/go.mod h1:J5hqkt3O0uAFnINi6JXValWIb1v0goeZM77hZzJN/fQ=
cloud.google.com/go/bigquery v1.42.0/go.mod h1:8dRTJxhtG+vwBKzE5OseQn/hiydoQN3EedCaOdYmxRA=
cloud.google.com/go/bigquery v1.43.0/go.mod h1:ZMQcXHsl+xmU1z36G2jNGZmKp9zNY5BUua5wDgmNCfw=
cloud.google.com/go/bigquery v1.44.0/go.mod h1:0Y33VqXTEsbamHJvJHdFmtqHvMIY28aK1+dFsvaChGc=
cloud.google.com/go/bigquery v1.47.0/go.mod h1:sA9XOgy0A8vQK9+MWhEQTY6Tix87M/ZurWFIxmF9I/E=
cloud.google.com/go/bigquery v1.48.0/go.mod h1:QAwSz+ipNgfL5jxiaK7weyOhzdoAy1zFm0Nf1fysJac=
cloud.google.com/go/bigquery v1.49.0/go.mod h1:Sv8hMmTFFYBlt/ftw2uN6dFdQPzBlREY9yBh7Oy7/4Q=
cloud.google.com/go/bigquery v1.50.0/go.mod h1:YrleYEh2pSEbgTBZYMJ5SuSr0ML3ypjRB1zgf7pvQLU=
cloud.google.com/go/billing v1.4.0/go.mod h1:g9IdKBEFlItS8bTtlrZdVLWSSdSyFUZKXNS02zKMOZY=
cloud.google.com/go/billing v1.5.0/go.mod h1:mztb1tBc3QekhjSgmpf/CV4LzWXLzCArwpLmP2Gm88s=
cloud.google.com/go/billing v1.6.0/go.mod h1:WoXzguj+BeHXPbKfNWkqVtDdzORazmCjraY+vrxcyvI=
cloud.google.com/go/billing v1.7.0/go.mod h1:q457N3Hbj9lYwwRbnlD7vUpyjq6u5U1RAOArInEiD5Y=
cloud.google.com/go/billing v1.12.0/go.mod h1:yKrZio/eu+okO/2McZEbch17O5CB5NpZhhXG6Z766ss=
cloud.google.com/go/billing v1.13.0/go.mod h1:7kB2W9Xf98hP9Sr12KfECgfGclsH3CQR0R08tnRlRbc=
cloud.google.com/go/binaryauthorization v1.1.0/go.mod h1:xwnoWu3Y84jbuHa0zd526MJYmtnVXn0syOjaJgy4+dM=
cloud.google.com/go/binaryauthorization v1.2.0/go.mod h1:86WKkJHtRcv5ViNABtYMhhNWRrD1Vpi//uKEy7aYEfI=
cloud.google.com/go/binaryauthorization v1.3.0/go.mod h1:lRZbKgjDIIQvzYQS1p99A7/U1JqvqeZg0wiI5tp6tg0=
cloud.google.com/go/binaryauthorization v1.4.0/go.mod h1:tsSPQrBd77VLplV70GUhBf/Zm3FsKmgSqgm4UmiDItk=
cloud.google.com/go/binaryauthorization v1.5.0/go.mod h1:OSe4OU1nN/VswXKRBmciKpo9LulY41gch5c68htf3/Q=
cloud.google.com/go/certificatemanager v1.3.0/go.mod h1:n6twGDvcUBFu9uBgt4eYvvf3sQ6My8jADcOVwHmzadg=
cloud.google.com/go/certificatemanager v1.4.0/go.mod h1:vowpercVFyqs8ABSmrdV+GiFf2H/ch3KyudYQEMM590=
cloud.google.com/go/certificatemanager v1.6.0/go.mod h1:3Hh64rCKjRAX8dXgRAyOcY5vQ/fE1sh8o+Mdd6KPgY8=
cloud.google.com/go/channel v1.8.0/go.mod h1:W5SwCXDJsq/rg3tn3oG0LOxpAo6IMxNa09ngphpSlnk=
cloud.google.com/go/channel v1.9.0/go.mod h1:jcu05W0my9Vx4mt3/rEHpfxc9eKi9XwsdDL8yBMbKUk=
cloud.google.com/go/channel v1.11.0/go.mod h1:IdtI0uWGqhEeatSB62VOoJ8FSUhJ9/+iGkJVqp74CGE=
cloud.google.com/go/channel v1.12.0/go.mod h1:VkxCGKASi4Cq7TbXxlaBezonAYpp1GCnKMY6tnMQnLU=
cloud.google.com/go/cloudbuild v1.3.0/go.mod h1:WequR4ULxlqvMsjDEEEFnOG5ZSRSgWOywXYDb1vPE6U=
cloud.google.com/go/cloudbuild v1.4.0/go.mod h1:5Qwa40LHiOXmz3386FrjrYM93rM/hdRr7b53sySrTqA=
cloud.google.com/go/cloudbuild v1.6.0/go.mod h1:UIbc/w9QCbH12xX+ezUsgblrWv+Cv4Tw83GiSMHOn9M=
cloud.google.com/go/cloudbuild v1.7.0/go.mod h1:zb5tWh2XI6lR9zQmsm1VRA+7OCuve5d8S+zJUul8KTg=
cloud.google.com/go/cloudbuild v1.9.0/go.mod h1:qK1d7s4QlO0VwfYn5YuClDGg2hfmLZEb4wQGAbIgL1s=
cloud.google.com/go/clouddms v1.3.0/go.mod h1:oK6XsCDdW4Ib3jCCBugx+gVjevp2TMXFtgxvPSee3OM=
cloud.google.com/go/clouddms v1.4.0/go.mod h1:Eh7sUGCC+aKry14O1NRljhjyrr0NFC0G2cjwX0cByRk=
cloud.google.com/go/clouddms v1.5.0/go.mod h1:QSxQnhikCLUw13iAbffF2CZxAER3xDGNHjsTAkQJcQA=
cloud.google.com/go/cloudtasks v1.5.0/go.mod h1:fD92REy1x5woxkKEkLdvavGnPJGEn8Uic9nWuLzqCpY=
cloud.google.com/go/cloudtasks v1.6.0/go.mod h1:C6Io+sxuke9/KNRkbQpihnW93SWDU3uXt92nu85HkYI=
cloud.google.com/go/cloudtasks v1.7.0/go.mod h1:ImsfdYWwlWNJbdgPIIGJWC+gemEGTBK/SunNQQNCAb4=
cloud.google.com/go/cloudtasks v1.8.0/go.mod h1:gQXUIwCSOI4yPVK7DgTVFiiP0ZW/eQkydWzwVMdHxrI=
cloud.google.com/go/cloudtasks v1.9.0/go.mod h1:w+EyLsVkLWHcOaqNEyvcKAsWp9p29dL6uL9Nst1cI7Y=
cloud.google.com/go/cloudtasks v1.10.0/go.mod h1:NDSoTLkZ3+vExFEWu2UJV1arUyzVDAiZtdWcsUyNwBs=
cloud.google.com/go/compute v0.1.0/go.mod h1:GAesmwr110a34z04OlxYkATPBEfVhkymfTBXtfbBFow=
cloud.google.com/go/compute v1.3.0/go.mod h1:cCZiE1NHEtai4wiufUhW8I8S1JKkAnhnQJWM7YD99wM=
cloud.google.com/go/compute v1.5.0/go.mod h1:9SMHyhJlzhlkJqrPAc839t2BZFTSk6Jdj6mkzQJeu0M=
cloud.google.com/go/compute v1.6.0/go.mod h1:T29tfhtVbq1wvAPo0E3+7vhgmkOYeXjhFvz/FMzPu0s=
cloud.google.com/go/compute v1.6.1/go.mod h1:g85FgpzFvNULZ+S8AYq87axRKuf2Kh7deLqV/jJ3thU=
cloud.google.com/go/compute v1.7.0/go.mod h1:435lt8av5oL9P3fv1OEzSbSUe+ybHXGMPQHHZWZxy9U=
cloud.google.com/go/compute v1.10.0/go.mod h1:ER5CLbMxl90o2jtNbGSbtfOpQKR0t15FOtRsugnLrlU=
cloud.google.com/go/compute v1.12.0/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
cloud.google.com/go/compute v1.12.1/go.mod h1:e8yNOBcBONZU1vJKCvCoDw/4JQsA0dpM4x/6PIIOocU=
cloud.google.com/go/compute v1.13.0/go.mod h1:5aPTS0cUNMIc1CE546K+Th6weJUNQErARyZtRXDJ8GE=
cloud.google.com/go/compute v1.14.0/go.mod h1:YfLtxrj9sU4Yxv+sXzZkyPjEyPBZfXHUvjxega5vAdo=
cloud.google.com/go/compute v1.15.1/go.mod h1:bjjoF/NtFUrkD/urWfdHaKuOPDR5nWIs63rR+SXhcpA=
cloud.google.com/go/compute v1.18.0/go.mod h1:1X7yHxec2Ga+Ss6jPyjxRxpu2uu7PLgsOVXvgU0yacs=
cloud.google.com/go/compute v1.19.0/go.mod h1:rikpw2y+UMidAe9tISo04EHNOIf42RLYF/q8Bs93scU=
cloud.google.com/go/compute v1.19.1/go.mod h1:6ylj3a05WF8leseCdIf77NK0g1ey+nj5IKd5/kvShxE=
cloud.google.com/go/compute/metadata v0.1.0/go.mod h1:Z1VN+bulIf6bt4P/C37K4DyZYZEXYonfTBHHFPO/4UU=
cloud.google.com/go/compute/metadata v0.2.0/go.mod h1:zFmK7XCadkQkj6TtorcaGlCW1hT1fIilQDwofLpJ20k=
cloud.google.com/go/compute/metadata v0.2.1/go.mod h1:jgHgmJd2RKBGzXqF5LR2EZMGxBkeanZ9wwa75XHJgOM=
cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA=
cloud.google.com/go/compute/metadata v0.9.0 h1:pDUj4QMoPejqq20dK0Pg2N4yG9zIkYGdBtwLoEkH9Zs=
cloud.google.com/go/compute/metadata v0.9.0/go.mod h1:E0bWwX5wTnLPedCKqk3pJmVgCBSM6qQI1yTBdEb3C10=
cloud.google.com/go/contactcenterinsights v1.3.0/go.mod h1:Eu2oemoePuEFc/xKFPjbTuPSj0fYJcPls9TFlPNnHHY=
cloud.google.com/go/contactcenterinsights v1.4.0/go.mod h1:L2YzkGbPsv+vMQMCADxJoT9YiTTnSEd6fEvCeHTYVck=
cloud.google.com/go/contactcenterinsights v1.6.0/go.mod h1:IIDlT6CLcDoyv79kDv8iWxMSTZhLxSCofVV5W6YFM/w=
cloud.google.com/go/container v1.6.0/go.mod h1:Xazp7GjJSeUYo688S+6J5V+n/t+G5sKBTFkKNudGRxg=
cloud.google.com/go/container v1.7.0/go.mod h1:Dp5AHtmothHGX3DwwIHPgq45Y8KmNsgN3amoYfxVkLo=
cloud.google.com/go/container v1.13.1/go.mod h1:6wgbMPeQRw9rSnKBCAJXnds3Pzj03C4JHamr8asWKy4=
cloud.google.com/go/container v1.14.0/go.mod h1:3AoJMPhHfLDxLvrlVWaK57IXzaPnLaZq63WX59aQBfM=
cloud.google.com/go/container v1.15.0/go.mod h1:ft+9S0WGjAyjDggg5S06DXj+fHJICWg8L7isCQe9pQA=
cloud.google.com/go/containeranalysis v0.5.1/go.mod h1:1D92jd8gRR/c0fGMlymRgxWD3Qw9C1ff6/T7mLgVL8I=
cloud.google.com/go/containeranalysis v0.6.0/go.mod h1:HEJoiEIu+lEXM+k7+qLCci0h33lX3ZqoYFdmPcoO7s4=
cloud.google.com/go/containeranalysis v0.7.0/go.mod h1:9aUL+/vZ55P2CXfuZjS4UjQ9AgXoSw8Ts6lemfmxBxI=
cloud.google.com/go/containeranalysis v0.9.0/go.mod h1:orbOANbwk5Ejoom+s+DUCTTJ7IBdBQJDcSylAx/on9s=
cloud.google.com/go/datacatalog v1.3.0/go.mod h1:g9svFY6tuR+j+hrTw3J2dNcmI0dzmSiyOzm8kpLq0a0=
cloud.google.com/go/datacatalog v1.5.0/go.mod h1:M7GPLNQeLfWqeIm3iuiruhPzkt65+Bx8dAKvScX8jvs=
cloud.google.com/go/datacatalog v1.6.0/go.mod h1:+aEyF8JKg+uXcIdAmmaMUmZ3q1b/lKLtXCmXdnc0lbc=
cloud.google.com/go/datacatalog v1.7.0/go.mod h1:9mEl4AuDYWw81UGc41HonIHH7/sn52H0/tc8f8ZbZIE=
cloud.google.com/go/datacatalog v1.8.0/go.mod h1:KYuoVOv9BM8EYz/4eMFxrr4DUKhGIOXxZoKYF5wdISM=
cloud.google.com/go/datacatalog v1.8.1/go.mod h1:RJ58z4rMp3gvETA465Vg+ag8BGgBdnRPEMMSTr5Uv+M=
cloud.google.com/go/datacatalog v1.12.0/go.mod h1:CWae8rFkfp6LzLumKOnmVh4+Zle4A3NXLzVJ1d1mRm0=
cloud.google.com/go/datacatalog v1.13.0/go.mod h1:E4Rj9a5ZtAxcQJlEBTLgMTphfP11/lNaAshpoBgemX8=
cloud.google.com/go/dataflow v0.6.0/go.mod h1:9QwV89cGoxjjSR9/r7eFDqqjtvbKxAK2BaYU6PVk9UM=
cloud.google.com/go/dataflow v0.7.0/go.mod h1:PX526vb4ijFMesO1o202EaUmouZKBpjHsTlCtB4parQ=
cloud.google.com/go/dataflow v0.8.0/go.mod h1:Rcf5YgTKPtQyYz8bLYhFoIV/vP39eL7fWNcSOyFfLJE=
cloud.google.com/go/dataform v0.3.0/go.mod h1:cj8uNliRlHpa6L3yVhDOBrUXH+BPAO1+KFMQQNSThKo=
cloud.google.com/go/dataform v0.4.0/go.mod h1:fwV6Y4Ty2yIFL89huYlEkwUPtS7YZinZbzzj5S9FzCE=
cloud.google.com/go/dataform v0.5.0/go.mod h1:GFUYRe8IBa2hcomWplodVmUx/iTL0FrsauObOM3Ipr0=
cloud.google.com/go/dataform v0.6.0/go.mod h1:QPflImQy33e29VuapFdf19oPbE4aYTJxr31OAPV+ulA=
cloud.google.com/go/dataform v0.7.0/go.mod h1:7NulqnVozfHvWUBpMDfKMUESr+85aJsC/2O0o3jWPDE=
cloud.google.com/go/datafusion v1.4.0/go.mod h1:1Zb6VN+W6ALo85cXnM1IKiPw+yQMKMhB9TsTSRDo/38=
cloud.google.com/go/datafusion v1.5.0/go.mod h1:Kz+l1FGHB0J+4XF2fud96WMmRiq/wj8N9u007vyXZ2w=
cloud.google.com/go/datafusion v1.6.0/go.mod h1:WBsMF8F1RhSXvVM8rCV3AeyWVxcC2xY6vith3iw3S+8=
cloud.google.com/go/datalabeling v0.5.0/go.mod h1:TGcJ0G2NzcsXSE/97yWjIZO0bXj0KbVlINXMG9ud42I=
cloud.google.com/go/datalabeling v0.6.0/go.mod h1:WqdISuk/+WIGeMkpw/1q7bK/tFEZxsrFJOJdY2bXvTQ=
cloud.google.com/go/datalabeling v0.7.0/go.mod h1:WPQb1y08RJbmpM3ww0CSUAGweL0SxByuW2E+FU+wXcM=
cloud.google.com/go/dataplex v1.3.0/go.mod h1:hQuRtDg+fCiFgC8j0zV222HvzFQdRd+SVX8gdmFcZzA=
cloud.google.com/go/dataplex v1.4.0/go.mod h1:X51GfLXEMVJ6UN47ESVqvlsRplbLhcsAt0kZCCKsU0A=
cloud.google.com/go/dataplex v1.5.2/go.mod h1:cVMgQHsmfRoI5KFYq4JtIBEUbYwc3c7tXmIDhRmNNVQ=
cloud.google.com/go/dataplex v1.6.0/go.mod h1:bMsomC/aEJOSpHXdFKFGQ1b0TDPIeL28nJObeO1ppRs=
cloud.google.com/go/dataproc v1.7.0/go.mod h1:CKAlMjII9H90RXaMpSxQ8EU6dQx6iAYNPcYPOkSbi8s=
cloud.google.com/go/dataproc v1.8.0/go.mod h1:5OW+zNAH0pMpw14JVrPONsxMQYMBqJuzORhIBfBn9uI=
cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4=
cloud.google.com/go/dataqna v0.5.0/go.mod h1:90Hyk596ft3zUQ8NkFfvICSIfHFh1Bc7C4cK3vbhkeo=
cloud.google.com/go/dataqna v0.6.0/go.mod h1:1lqNpM7rqNLVgWBJyk5NF6Uen2PHym0jtVJonplVsDA=
cloud.google.com/go/dataqna v0.7.0/go.mod h1:Lx9OcIIeqCrw1a6KdO3/5KMP1wAmTc0slZWwP12Qq3c=
cloud.google.com/go/datastore v1.0.0/go.mod h1:LXYbyblFSglQ5pkeyhO+Qmw7ukd3C+pD7TKLgZqpHYE=
cloud.google.com/go/datastore v1.1.0/go.mod h1:umbIZjpQpHh4hmRpGhH4tLFup+FVzqBi1b3c64qFpCk=
cloud.google.com/go/datastore v1.10.0/go.mod h1:PC5UzAmDEkAmkfaknstTYbNpgE49HAgW2J1gcgUfmdM=
cloud.google.com/go/datastore v1.11.0/go.mod h1:TvGxBIHCS50u8jzG+AW/ppf87v1of8nwzFNgEZU1D3c=
cloud.google.com/go/datastream v1.2.0/go.mod h1:i/uTP8/fZwgATHS/XFu0TcNUhuA0twZxxQ3EyCUQMwo=
cloud.google.com/go/datastream v1.3.0/go.mod h1:cqlOX8xlyYF/uxhiKn6Hbv6WjwPPuI9W2M9SAXwaLLQ=
cloud.google.com/go/datastream v1.4.0/go.mod h1:h9dpzScPhDTs5noEMQVWP8Wx8AFBRyS0s8KWPx/9r0g=
cloud.google.com/go/datastream v1.5.0/go.mod h1:6TZMMNPwjUqZHBKPQ1wwXpb0d5VDVPl2/XoS5yi88q4=
cloud.google.com/go/datastream v1.6.0/go.mod h1:6LQSuswqLa7S4rPAOZFVjHIG3wJIjZcZrw8JDEDJuIs=
cloud.google.com/go/datastream v1.7.0/go.mod h1:uxVRMm2elUSPuh65IbZpzJNMbuzkcvu5CjMqVIUHrww=
cloud.google.com/go/deploy v1.4.0/go.mod h1:5Xghikd4VrmMLNaF6FiRFDlHb59VM59YoDQnOUdsH/c=
cloud.google.com/go/deploy v1.5.0/go.mod h1:ffgdD0B89tToyW/U/D2eL0jN2+IEV/3EMuXHA0l4r+s=
cloud.google.com/go/deploy v1.6.0/go.mod h1:f9PTHehG/DjCom3QH0cntOVRm93uGBDt2vKzAPwpXQI=
cloud.google.com/go/deploy v1.8.0/go.mod h1:z3myEJnA/2wnB4sgjqdMfgxCA0EqC3RBTNcVPs93mtQ=
cloud.google.com/go/dialogflow v1.15.0/go.mod h1:HbHDWs33WOGJgn6rfzBW1Kv807BE3O1+xGbn59zZWI4=
cloud.google.com/go/dialogflow v1.16.1/go.mod h1:po6LlzGfK+smoSmTBnbkIZY2w8ffjz/RcGSS+sh1el0=
cloud.google.com/go/dialogflow v1.17.0/go.mod h1:YNP09C/kXA1aZdBgC/VtXX74G/TKn7XVCcVumTflA+8=
cloud.google.com/go/dialogflow v1.18.0/go.mod h1:trO7Zu5YdyEuR+BhSNOqJezyFQ3aUzz0njv7sMx/iek=
cloud.google.com/go/dialogflow v1.19.0/go.mod h1:JVmlG1TwykZDtxtTXujec4tQ+D8SBFMoosgy+6Gn0s0=
cloud.google.com/go/dialogflow v1.29.0/go.mod h1:b+2bzMe+k1s9V+F2jbJwpHPzrnIyHihAdRFMtn2WXuM=
cloud.google.com/go/dialogflow v1.31.0/go.mod h1:cuoUccuL1Z+HADhyIA7dci3N5zUssgpBJmCzI6fNRB4=
cloud.google.com/go/dialogflow v1.32.0/go.mod h1:jG9TRJl8CKrDhMEcvfcfFkkpp8ZhgPz3sBGmAUYJ2qE=
cloud.google.com/go/dlp v1.6.0/go.mod h1:9eyB2xIhpU0sVwUixfBubDoRwP+GjeUoxxeueZmqvmM=
cloud.google.com/go/dlp v1.7.0/go.mod h1:68ak9vCiMBjbasxeVD17hVPxDEck+ExiHavX8kiHG+Q=
cloud.google.com/go/dlp v1.9.0/go.mod h1:qdgmqgTyReTz5/YNSSuueR8pl7hO0o9bQ39ZhtgkWp4=
cloud.google.com/go/documentai v1.7.0/go.mod h1:lJvftZB5NRiFSX4moiye1SMxHx0Bc3x1+p9e/RfXYiU=
cloud.google.com/go/documentai v1.8.0/go.mod h1:xGHNEB7CtsnySCNrCFdCyyMz44RhFEEX2Q7UD0c5IhU=
cloud.google.com/go/documentai v1.9.0/go.mod h1:FS5485S8R00U10GhgBC0aNGrJxBP8ZVpEeJ7PQDZd6k=
cloud.google.com/go/documentai v1.10.0/go.mod h1:vod47hKQIPeCfN2QS/jULIvQTugbmdc0ZvxxfQY1bg4=
cloud.google.com/go/documentai v1.16.0/go.mod h1:o0o0DLTEZ+YnJZ+J4wNfTxmDVyrkzFvttBXXtYRMHkM=
cloud.google.com/go/documentai v1.18.0/go.mod h1:F6CK6iUH8J81FehpskRmhLq/3VlwQvb7TvwOceQ2tbs=
cloud.google.com/go/domains v0.6.0/go.mod h1:T9Rz3GasrpYk6mEGHh4rymIhjlnIuB4ofT1wTxDeT4Y=
cloud.google.com/go/domains v0.7.0/go.mod h1:PtZeqS1xjnXuRPKE/88Iru/LdfoRyEHYA9nFQf4UKpg=
cloud.google.com/go/domains v0.8.0/go.mod h1:M9i3MMDzGFXsydri9/vW+EWz9sWb4I6WyHqdlAk0idE=
cloud.google.com/go/edgecontainer v0.1.0/go.mod h1:WgkZ9tp10bFxqO8BLPqv2LlfmQF1X8lZqwW4r1BTajk=
cloud.google.com/go/edgecontainer v0.2.0/go.mod h1:RTmLijy+lGpQ7BXuTDa4C4ssxyXT34NIuHIgKuP4s5w=
cloud.google.com/go/edgecontainer v0.3.0/go.mod h1:FLDpP4nykgwwIfcLt6zInhprzw0lEi2P1fjO6Ie0qbc=
cloud.google.com/go/edgecontainer v1.0.0/go.mod h1:cttArqZpBB2q58W/upSG++ooo6EsblxDIolxa3jSjbY=
cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU=
cloud.google.com/go/essentialcontacts v1.3.0/go.mod h1:r+OnHa5jfj90qIfZDO/VztSFqbQan7HV75p8sA+mdGI=
cloud.google.com/go/essentialcontacts v1.4.0/go.mod h1:8tRldvHYsmnBCHdFpvU+GL75oWiBKl80BiqlFh9tp+8=
cloud.google.com/go/essentialcontacts v1.5.0/go.mod h1:ay29Z4zODTuwliK7SnX8E86aUF2CTzdNtvv42niCX0M=
cloud.google.com/go/eventarc v1.7.0/go.mod h1:6ctpF3zTnaQCxUjHUdcfgcA1A2T309+omHZth7gDfmc=
cloud.google.com/go/eventarc v1.8.0/go.mod h1:imbzxkyAU4ubfsaKYdQg04WS1NvncblHEup4kvF+4gw=
cloud.google.com/go/eventarc v1.10.0/go.mod h1:u3R35tmZ9HvswGRBnF48IlYgYeBcPUCjkr4BTdem2Kw=
cloud.google.com/go/eventarc v1.11.0/go.mod h1:PyUjsUKPWoRBCHeOxZd/lbOOjahV41icXyUY5kSTvVY=
cloud.google.com/go/filestore v1.3.0/go.mod h1:+qbvHGvXU1HaKX2nD0WEPo92TP/8AQuCVEBXNY9z0+w=
cloud.google.com/go/filestore v1.4.0/go.mod h1:PaG5oDfo9r224f8OYXURtAsY+Fbyq/bLYoINEK8XQAI=
cloud.google.com/go/filestore v1.5.0/go.mod h1:FqBXDWBp4YLHqRnVGveOkHDf8svj9r5+mUDLupOWEDs=
cloud.google.com/go/filestore v1.6.0/go.mod h1:di5unNuss/qfZTw2U9nhFqo8/ZDSc466dre85Kydllg=
cloud.google.com/go/firestore v1.9.0/go.mod h1:HMkjKHNTtRyZNiMzu7YAsLr9K3X2udY2AMwDaMEQiiE=
cloud.google.com/go/functions v1.6.0/go.mod h1:3H1UA3qiIPRWD7PeZKLvHZ9SaQhR26XIJcC0A5GbvAk=
cloud.google.com/go/functions v1.7.0/go.mod h1:+d+QBcWM+RsrgZfV9xo6KfA1GlzJfxcfZcRPEhDDfzg=
cloud.google.com/go/functions v1.8.0/go.mod h1:RTZ4/HsQjIqIYP9a9YPbU+QFoQsAlYgrwOXJWHn1POY=
cloud.google.com/go/functions v1.9.0/go.mod h1:Y+Dz8yGguzO3PpIjhLTbnqV1CWmgQ5UwtlpzoyquQ08=
cloud.google.com/go/functions v1.10.0/go.mod h1:0D3hEOe3DbEvCXtYOZHQZmD+SzYsi1YbI7dGvHfldXw=
cloud.google.com/go/functions v1.12.0/go.mod h1:AXWGrF3e2C/5ehvwYo/GH6O5s09tOPksiKhz+hH8WkA=
cloud.google.com/go/functions v1.13.0/go.mod h1:EU4O007sQm6Ef/PwRsI8N2umygGqPBS/IZQKBQBcJ3c=
cloud.google.com/go/gaming v1.5.0/go.mod h1:ol7rGcxP/qHTRQE/RO4bxkXq+Fix0j6D4LFPzYTIrDM=
cloud.google.com/go/gaming v1.6.0/go.mod h1:YMU1GEvA39Qt3zWGyAVA9bpYz/yAhTvaQ1t2sK4KPUA=
cloud.google.com/go/gaming v1.7.0/go.mod h1:LrB8U7MHdGgFG851iHAfqUdLcKBdQ55hzXy9xBJz0+w=
cloud.google.com/go/gaming v1.8.0/go.mod h1:xAqjS8b7jAVW0KFYeRUxngo9My3f33kFmua++Pi+ggM=
cloud.google.com/go/gaming v1.9.0/go.mod h1:Fc7kEmCObylSWLO334NcO+O9QMDyz+TKC4v1D7X+Bc0=
cloud.google.com/go/gkebackup v0.2.0/go.mod h1:XKvv/4LfG829/B8B7xRkk8zRrOEbKtEam6yNfuQNH60=
cloud.google.com/go/gkebackup v0.3.0/go.mod h1:n/E671i1aOQvUxT541aTkCwExO/bTer2HDlj4TsBRAo=
cloud.google.com/go/gkebackup v0.4.0/go.mod h1:byAyBGUwYGEEww7xsbnUTBHIYcOPy/PgUWUtOeRm9Vg=
cloud.google.com/go/gkeconnect v0.5.0/go.mod h1:c5lsNAg5EwAy7fkqX/+goqFsU1Da/jQFqArp+wGNr/o=
cloud.google.com/go/gkeconnect v0.6.0/go.mod h1:Mln67KyU/sHJEBY8kFZ0xTeyPtzbq9StAVvEULYK16A=
cloud.google.com/go/gkeconnect v0.7.0/go.mod h1:SNfmVqPkaEi3bF/B3CNZOAYPYdg7sU+obZ+QTky2Myw=
cloud.google.com/go/gkehub v0.9.0/go.mod h1:WYHN6WG8w9bXU0hqNxt8rm5uxnk8IH+lPY9J2TV7BK0=
cloud.google.com/go/gkehub v0.10.0/go.mod h1:UIPwxI0DsrpsVoWpLB0stwKCP+WFVG9+y977wO+hBH0=
cloud.google.com/go/gkehub v0.11.0/go.mod h1:JOWHlmN+GHyIbuWQPl47/C2RFhnFKH38jH9Ascu3n0E=
cloud.google.com/go/gkehub v0.12.0/go.mod h1:djiIwwzTTBrF5NaXCGv3mf7klpEMcST17VBTVVDcuaw=
cloud.google.com/go/gkemulticloud v0.3.0/go.mod h1:7orzy7O0S+5kq95e4Hpn7RysVA7dPs8W/GgfUtsPbrA=
cloud.google.com/go/gkemulticloud v0.4.0/go.mod h1:E9gxVBnseLWCk24ch+P9+B2CoDFJZTyIgLKSalC7tuI=
cloud.google.com/go/gkemulticloud v0.5.0/go.mod h1:W0JDkiyi3Tqh0TJr//y19wyb1yf8llHVto2Htf2Ja3Y=
cloud.google.com/go/grafeas v0.2.0/go.mod h1:KhxgtF2hb0P191HlY5besjYm6MqTSTj3LSI+M+ByZHc=
cloud.google.com/go/gsuiteaddons v1.3.0/go.mod h1:EUNK/J1lZEZO8yPtykKxLXI6JSVN2rg9bN8SXOa0bgM=
cloud.google.com/go/gsuiteaddons v1.4.0/go.mod h1:rZK5I8hht7u7HxFQcFei0+AtfS9uSushomRlg+3ua1o=
cloud.google.com/go/gsuiteaddons v1.5.0/go.mod h1:TFCClYLd64Eaa12sFVmUyG62tk4mdIsI7pAnSXRkcFo=
cloud.google.com/go/iam v0.1.0/go.mod h1:vcUNEa0pEm0qRVpmWepWaFMIAI8/hjB9mO8rNCJtF6c=
cloud.google.com/go/iam v0.3.0/go.mod h1:XzJPvDayI+9zsASAFO68Hk07u3z+f+JrT2xXNdp4bnY=
cloud.google.com/go/iam v0.5.0/go.mod h1:wPU9Vt0P4UmCux7mqtRu6jcpPAb74cP1fh50J3QpkUc=
cloud.google.com/go/iam v0.6.0/go.mod h1:+1AH33ueBne5MzYccyMHtEKqLE4/kJOibtffMHDMFMc=
cloud.google.com/go/iam v0.7.0/go.mod h1:H5Br8wRaDGNc8XP3keLc4unfUUZeyH3Sfl9XpQEYOeg=
cloud.google.com/go/iam v0.8.0/go.mod h1:lga0/y3iH6CX7sYqypWJ33hf7kkfXJag67naqGESjkE=
cloud.google.com/go/iam v0.11.0/go.mod h1:9PiLDanza5D+oWFZiH1uG+RnRCfEGKoyl6yo4cgWZGY=
cloud.google.com/go/iam v0.12.0/go.mod h1:knyHGviacl11zrtZUoDuYpDgLjvr28sLQaG0YB2GYAY=
cloud.google.com/go/iam v0.13.0/go.mod h1:ljOg+rcNfzZ5d6f1nAUJ8ZIxOaZUVoS14bKCtaLZ/D0=
cloud.google.com/go/iam v1.5.2 h1:qgFRAGEmd8z6dJ/qyEchAuL9jpswyODjA2lS+w234g8=
cloud.google.com/go/iam v1.5.2/go.mod h1:SE1vg0N81zQqLzQEwxL2WI6yhetBdbNQuTvIKCSkUHE=
cloud.google.com/go/iap v1.4.0/go.mod h1:RGFwRJdihTINIe4wZ2iCP0zF/qu18ZwyKxrhMhygBEc=
cloud.google.com/go/iap v1.5.0/go.mod h1:UH/CGgKd4KyohZL5Pt0jSKE4m3FR51qg6FKQ/z/Ix9A=
cloud.google.com/go/iap v1.6.0/go.mod h1:NSuvI9C/j7UdjGjIde7t7HBz+QTwBcapPE07+sSRcLk=
cloud.google.com/go/iap v1.7.0/go.mod h1:beqQx56T9O1G1yNPph+spKpNibDlYIiIixiqsQXxLIo=
cloud.google.com/go/iap v1.7.1/go.mod h1:WapEwPc7ZxGt2jFGB/C/bm+hP0Y6NXzOYGjpPnmMS74=
cloud.google.com/go/ids v1.1.0/go.mod h1:WIuwCaYVOzHIj2OhN9HAwvW+DBdmUAdcWlFxRl+KubM=
cloud.google.com/go/ids v1.2.0/go.mod h1:5WXvp4n25S0rA/mQWAg1YEEBBq6/s+7ml1RDCW1IrcY=
cloud.google.com/go/ids v1.3.0/go.mod h1:JBdTYwANikFKaDP6LtW5JAi4gubs57SVNQjemdt6xV4=
cloud.google.com/go/iot v1.3.0/go.mod h1:r7RGh2B61+B8oz0AGE+J72AhA0G7tdXItODWsaA2oLs=
cloud.google.com/go/iot v1.4.0/go.mod h1:dIDxPOn0UvNDUMD8Ger7FIaTuvMkj+aGk94RPP0iV+g=
cloud.google.com/go/iot v1.5.0/go.mod h1:mpz5259PDl3XJthEmh9+ap0affn/MqNSP4My77Qql9o=
cloud.google.com/go/iot v1.6.0/go.mod h1:IqdAsmE2cTYYNO1Fvjfzo9po179rAtJeVGUvkLN3rLE=
cloud.google.com/go/kms v1.4.0/go.mod h1:fajBHndQ+6ubNw6Ss2sSd+SWvjL26RNo/dr7uxsnnOA=
cloud.google.com/go/kms v1.5.0/go.mod h1:QJS2YY0eJGBg3mnDfuaCyLauWwBJiHRboYxJ++1xJNg=
cloud.google.com/go/kms v1.6.0/go.mod h1:Jjy850yySiasBUDi6KFUwUv2n1+o7QZFyuUJg6OgjA0=
cloud.google.com/go/kms v1.8.0/go.mod h1:4xFEhYFqvW+4VMELtZyxomGSYtSQKzM178ylFW4jMAg=
cloud.google.com/go/kms v1.9.0/go.mod h1:qb1tPTgfF9RQP8e1wq4cLFErVuTJv7UsSC915J8dh3w=
cloud.google.com/go/kms v1.10.0/go.mod h1:ng3KTUtQQU9bPX3+QGLsflZIHlkbn8amFAMY63m8d24=
cloud.google.com/go/kms v1.10.1/go.mod h1:rIWk/TryCkR59GMC3YtHtXeLzd634lBbKenvyySAyYI=
cloud.google.com/go/language v1.4.0/go.mod h1:F9dRpNFQmJbkaop6g0JhSBXCNlO90e1KWx5iDdxbWic=
cloud.google.com/go/language v1.6.0/go.mod h1:6dJ8t3B+lUYfStgls25GusK04NLh3eDLQnWM3mdEbhI=
cloud.google.com/go/language v1.7.0/go.mod h1:DJ6dYN/W+SQOjF8e1hLQXMF21AkH2w9wiPzPCJa2MIE=
cloud.google.com/go/language v1.8.0/go.mod h1:qYPVHf7SPoNNiCL2Dr0FfEFNil1qi3pQEyygwpgVKB8=
cloud.google.com/go/language v1.9.0/go.mod h1:Ns15WooPM5Ad/5no/0n81yUetis74g3zrbeJBE+ptUY=
cloud.google.com/go/lifesciences v0.5.0/go.mod h1:3oIKy8ycWGPUyZDR/8RNnTOYevhaMLqh5vLUXs9zvT8=
cloud.google.com/go/lifesciences v0.6.0/go.mod h1:ddj6tSX/7BOnhxCSd3ZcETvtNr8NZ6t/iPhY2Tyfu08=
cloud.google.com/go/lifesciences v0.8.0/go.mod h1:lFxiEOMqII6XggGbOnKiyZ7IBwoIqA84ClvoezaA/bo=
cloud.google.com/go/logging v1.6.1/go.mod h1:5ZO0mHHbvm8gEmeEUHrmDlTDSu5imF6MUP9OfilNXBw=
cloud.google.com/go/logging v1.7.0/go.mod h1:3xjP2CjkM3ZkO73aj4ASA5wRPGGCRrPIAeNqVNkzY8M=
cloud.google.com/go/logging v1.13.0 h1:7j0HgAp0B94o1YRDqiqm26w4q1rDMH7XNRU34lJXHYc=
cloud.google.com/go/logging v1.13.0/go.mod h1:36CoKh6KA/M0PbhPKMq6/qety2DCAErbhXT62TuXALA=
cloud.google.com/go/longrunning v0.1.1/go.mod h1:UUFxuDWkv22EuY93jjmDMFT5GPQKeFVJBIF6QlTqdsE=
cloud.google.com/go/longrunning v0.3.0/go.mod h1:qth9Y41RRSUE69rDcOn6DdK3HfQfsUI0YSmW3iIlLJc=
cloud.google.com/go/longrunning v0.4.1/go.mod h1:4iWDqhBZ70CvZ6BfETbvam3T8FMvLK+eFj0E6AaRQTo=
cloud.google.com/go/longrunning v0.6.7 h1:IGtfDWHhQCgCjwQjV9iiLnUta9LBCo8R9QmAFsS/PrE=
cloud.google.com/go/longrunning v0.6.7/go.mod h1:EAFV3IZAKmM56TyiE6VAP3VoTzhZzySwI/YI1s/nRsY=
cloud.google.com/go/managedidentities v1.3.0/go.mod h1:UzlW3cBOiPrzucO5qWkNkh0w33KFtBJU281hacNvsdE=
cloud.google.com/go/managedidentities v1.4.0/go.mod h1:NWSBYbEMgqmbZsLIyKvxrYbtqOsxY1ZrGM+9RgDqInM=
cloud.google.com/go/managedidentities v1.5.0/go.mod h1:+dWcZ0JlUmpuxpIDfyP5pP5y0bLdRwOS4Lp7gMni/LA=
cloud.google.com/go/maps v0.1.0/go.mod h1:BQM97WGyfw9FWEmQMpZ5T6cpovXXSd1cGmFma94eubI=
cloud.google.com/go/maps v0.6.0/go.mod h1:o6DAMMfb+aINHz/p/jbcY+mYeXBoZoxTfdSQ8VAJaCw=
cloud.google.com/go/maps v0.7.0/go.mod h1:3GnvVl3cqeSvgMcpRlQidXsPYuDGQ8naBis7MVzpXsY=
cloud.google.com/go/mediatranslation v0.5.0/go.mod h1:jGPUhGTybqsPQn91pNXw0xVHfuJ3leR1wj37oU3y1f4=
cloud.google.com/go/mediatranslation v0.6.0/go.mod h1:hHdBCTYNigsBxshbznuIMFNe5QXEowAuNmmC7h8pu5w=
cloud.google.com/go/mediatranslation v0.7.0/go.mod h1:LCnB/gZr90ONOIQLgSXagp8XUW1ODs2UmUMvcgMfI2I=
cloud.google.com/go/memcache v1.4.0/go.mod h1:rTOfiGZtJX1AaFUrOgsMHX5kAzaTQ8azHiuDoTPzNsE=
cloud.google.com/go/memcache v1.5.0/go.mod h1:dk3fCK7dVo0cUU2c36jKb4VqKPS22BTkf81Xq617aWM=
cloud.google.com/go/memcache v1.6.0/go.mod h1:XS5xB0eQZdHtTuTF9Hf8eJkKtR3pVRCcvJwtm68T3rA=
cloud.google.com/go/memcache v1.7.0/go.mod h1:ywMKfjWhNtkQTxrWxCkCFkoPjLHPW6A7WOTVI8xy3LY=
cloud.google.com/go/memcache v1.9.0/go.mod h1:8oEyzXCu+zo9RzlEaEjHl4KkgjlNDaXbCQeQWlzNFJM=
cloud.google.com/go/metastore v1.5.0/go.mod h1:2ZNrDcQwghfdtCwJ33nM0+GrBGlVuh8rakL3vdPY3XY=
cloud.google.com/go/metastore v1.6.0/go.mod h1:6cyQTls8CWXzk45G55x57DVQ9gWg7RiH65+YgPsNh9s=
cloud.google.com/go/metastore v1.7.0/go.mod h1:s45D0B4IlsINu87/AsWiEVYbLaIMeUSoxlKKDqBGFS8=
cloud.google.com/go/metastore v1.8.0/go.mod h1:zHiMc4ZUpBiM7twCIFQmJ9JMEkDSyZS9U12uf7wHqSI=
cloud.google.com/go/metastore v1.10.0/go.mod h1:fPEnH3g4JJAk+gMRnrAnoqyv2lpUCqJPWOodSaf45Eo=
cloud.google.com/go/monitoring v1.7.0/go.mod h1:HpYse6kkGo//7p6sT0wsIC6IBDET0RhIsnmlA53dvEk=
cloud.google.com/go/monitoring v1.8.0/go.mod h1:E7PtoMJ1kQXWxPjB6mv2fhC5/15jInuulFdYYtlcvT4=
cloud.google.com/go/monitoring v1.12.0/go.mod h1:yx8Jj2fZNEkL/GYZyTLS4ZtZEZN8WtDEiEqG4kLK50w=
cloud.google.com/go/monitoring v1.13.0/go.mod h1:k2yMBAB1H9JT/QETjNkgdCGD9bPF712XiLTVr+cBrpw=
cloud.google.com/go/monitoring v1.24.2 h1:5OTsoJ1dXYIiMiuL+sYscLc9BumrL3CarVLL7dd7lHM=
cloud.google.com/go/monitoring v1.24.2/go.mod h1:x7yzPWcgDRnPEv3sI+jJGBkwl5qINf+6qY4eq0I9B4U=
cloud.google.com/go/networkconnectivity v1.4.0/go.mod h1:nOl7YL8odKyAOtzNX73/M5/mGZgqqMeryi6UPZTk/rA=
cloud.google.com/go/networkconnectivity v1.5.0/go.mod h1:3GzqJx7uhtlM3kln0+x5wyFvuVH1pIBJjhCpjzSt75o=
cloud.google.com/go/networkconnectivity v1.6.0/go.mod h1:OJOoEXW+0LAxHh89nXd64uGG+FbQoeH8DtxCHVOMlaM=
cloud.google.com/go/networkconnectivity v1.7.0/go.mod h1:RMuSbkdbPwNMQjB5HBWD5MpTBnNm39iAVpC3TmsExt8=
cloud.google.com/go/networkconnectivity v1.10.0/go.mod h1:UP4O4sWXJG13AqrTdQCD9TnLGEbtNRqjuaaA7bNjF5E=
cloud.google.com/go/networkconnectivity v1.11.0/go.mod h1:iWmDD4QF16VCDLXUqvyspJjIEtBR/4zq5hwnY2X3scM=
cloud.google.com/go/networkmanagement v1.4.0/go.mod h1:Q9mdLLRn60AsOrPc8rs8iNV6OHXaGcDdsIQe1ohekq8=
cloud.google.com/go/networkmanagement v1.5.0/go.mod h1:ZnOeZ/evzUdUsnvRt792H0uYEnHQEMaz+REhhzJRcf4=
cloud.google.com/go/networkmanagement v1.6.0/go.mod h1:5pKPqyXjB/sgtvB5xqOemumoQNB7y95Q7S+4rjSOPYY=
cloud.google.com/go/networksecurity v0.5.0/go.mod h1:xS6fOCoqpVC5zx15Z/MqkfDwH4+m/61A3ODiDV1xmiQ=
cloud.google.com/go/networksecurity v0.6.0/go.mod h1:Q5fjhTr9WMI5mbpRYEbiexTzROf7ZbDzvzCrNl14nyU=
cloud.google.com/go/networksecurity v0.7.0/go.mod h1:mAnzoxx/8TBSyXEeESMy9OOYwo1v+gZ5eMRnsT5bC8k=
cloud.google.com/go/networksecurity v0.8.0/go.mod h1:B78DkqsxFG5zRSVuwYFRZ9Xz8IcQ5iECsNrPn74hKHU=
cloud.google.com/go/notebooks v1.2.0/go.mod h1:9+wtppMfVPUeJ8fIWPOq1UnATHISkGXGqTkxeieQ6UY=
cloud.google.com/go/notebooks v1.3.0/go.mod h1:bFR5lj07DtCPC7YAAJ//vHskFBxA5JzYlH68kXVdk34=
cloud.google.com/go/notebooks v1.4.0/go.mod h1:4QPMngcwmgb6uw7Po99B2xv5ufVoIQ7nOGDyL4P8AgA=
cloud.google.com/go/notebooks v1.5.0/go.mod h1:q8mwhnP9aR8Hpfnrc5iN5IBhrXUy8S2vuYs+kBJ/gu0=
cloud.google.com/go/notebooks v1.7.0/go.mod h1:PVlaDGfJgj1fl1S3dUwhFMXFgfYGhYQt2164xOMONmE=
cloud.google.com/go/notebooks v1.8.0/go.mod h1:Lq6dYKOYOWUCTvw5t2q1gp1lAp0zxAxRycayS0iJcqQ=
cloud.google.com/go/optimization v1.1.0/go.mod h1:5po+wfvX5AQlPznyVEZjGJTMr4+CAkJf2XSTQOOl9l4=
cloud.google.com/go/optimization v1.2.0/go.mod h1:Lr7SOHdRDENsh+WXVmQhQTrzdu9ybg0NecjHidBq6xs=
cloud.google.com/go/optimization v1.3.1/go.mod h1:IvUSefKiwd1a5p0RgHDbWCIbDFgKuEdB+fPPuP0IDLI=
cloud.google.com/go/orchestration v1.3.0/go.mod h1:Sj5tq/JpWiB//X/q3Ngwdl5K7B7Y0KZ7bfv0wL6fqVA=
cloud.google.com/go/orchestration v1.4.0/go.mod h1:6W5NLFWs2TlniBphAViZEVhrXRSMgUGDfW7vrWKvsBk=
cloud.google.com/go/orchestration v1.6.0/go.mod h1:M62Bevp7pkxStDfFfTuCOaXgaaqRAga1yKyoMtEoWPQ=
cloud.google.com/go/orgpolicy v1.4.0/go.mod h1:xrSLIV4RePWmP9P3tBl8S93lTmlAxjm06NSm2UTmKvE=
cloud.google.com/go/orgpolicy v1.5.0/go.mod h1:hZEc5q3wzwXJaKrsx5+Ewg0u1LxJ51nNFlext7Tanwc=
cloud.google.com/go/orgpolicy v1.10.0/go.mod h1:w1fo8b7rRqlXlIJbVhOMPrwVljyuW5mqssvBtU18ONc=
cloud.google.com/go/osconfig v1.7.0/go.mod h1:oVHeCeZELfJP7XLxcBGTMBvRO+1nQ5tFG9VQTmYS2Fs=
cloud.google.com/go/osconfig v1.8.0/go.mod h1:EQqZLu5w5XA7eKizepumcvWx+m8mJUhEwiPqWiZeEdg=
cloud.google.com/go/osconfig v1.9.0/go.mod h1:Yx+IeIZJ3bdWmzbQU4fxNl8xsZ4amB+dygAwFPlvnNo=
cloud.google.com/go/osconfig v1.10.0/go.mod h1:uMhCzqC5I8zfD9zDEAfvgVhDS8oIjySWh+l4WK6GnWw=
cloud.google.com/go/osconfig v1.11.0/go.mod h1:aDICxrur2ogRd9zY5ytBLV89KEgT2MKB2L/n6x1ooPw=
cloud.google.com/go/oslogin v1.4.0/go.mod h1:YdgMXWRaElXz/lDk1Na6Fh5orF7gvmJ0FGLIs9LId4E=
cloud.google.com/go/oslogin v1.5.0/go.mod h1:D260Qj11W2qx/HVF29zBg+0fd6YCSjSqLUkY/qEenQU=
cloud.google.com/go/oslogin v1.6.0/go.mod h1:zOJ1O3+dTU8WPlGEkFSh7qeHPPSoxrcMbbK1Nm2iX70=
cloud.google.com/go/oslogin v1.7.0/go.mod h1:e04SN0xO1UNJ1M5GP0vzVBFicIe4O53FOfcixIqTyXo=
cloud.google.com/go/oslogin v1.9.0/go.mod h1:HNavntnH8nzrn8JCTT5fj18FuJLFJc4NaZJtBnQtKFs=
cloud.google.com/go/phishingprotection v0.5.0/go.mod h1:Y3HZknsK9bc9dMi+oE8Bim0lczMU6hrX0UpADuMefr0=
cloud.google.com/go/phishingprotection v0.6.0/go.mod h1:9Y3LBLgy0kDTcYET8ZH3bq/7qni15yVUoAxiFxnlSUA=
cloud.google.com/go/phishingprotection v0.7.0/go.mod h1:8qJI4QKHoda/sb/7/YmMQ2omRLSLYSu9bU0EKCNI+Lk=
cloud.google.com/go/policytroubleshooter v1.3.0/go.mod h1:qy0+VwANja+kKrjlQuOzmlvscn4RNsAc0e15GGqfMxg=
cloud.google.com/go/policytroubleshooter v1.4.0/go.mod h1:DZT4BcRw3QoO8ota9xw/LKtPa8lKeCByYeKTIf/vxdE=
cloud.google.com/go/policytroubleshooter v1.5.0/go.mod h1:Rz1WfV+1oIpPdN2VvvuboLVRsB1Hclg3CKQ53j9l8vw=
cloud.google.com/go/policytroubleshooter v1.6.0/go.mod h1:zYqaPTsmfvpjm5ULxAyD/lINQxJ0DDsnWOP/GZ7xzBc=
cloud.google.com/go/privatecatalog v0.5.0/go.mod h1:XgosMUvvPyxDjAVNDYxJ7wBW8//hLDDYmnsNcMGq1K0=
cloud.google.com/go/privatecatalog v0.6.0/go.mod h1:i/fbkZR0hLN29eEWiiwue8Pb+GforiEIBnV9yrRUOKI=
cloud.google.com/go/privatecatalog v0.7.0/go.mod h1:2s5ssIFO69F5csTXcwBP7NPFTZvps26xGzvQ2PQaBYg=
cloud.google.com/go/privatecatalog v0.8.0/go.mod h1:nQ6pfaegeDAq/Q5lrfCQzQLhubPiZhSaNhIgfJlnIXs=
cloud.google.com/go/pubsub v1.0.1/go.mod h1:R0Gpsv3s54REJCy4fxDixWD93lHJMoZTyQ2kNxGRt3I=
cloud.google.com/go/pubsub v1.1.0/go.mod h1:EwwdRX2sKPjnvnqCa270oGRyludottCI76h+R3AArQw=
cloud.google.com/go/pubsub v1.2.0/go.mod h1:jhfEVHT8odbXTkndysNHCcx0awwzvfOlguIAii9o8iA=
cloud.google.com/go/pubsub v1.3.1/go.mod h1:i+ucay31+CNRpDW4Lu78I4xXG+O1r/MAHgjpRVR+TSU=
cloud.google.com/go/pubsub v1.26.0/go.mod h1:QgBH3U/jdJy/ftjPhTkyXNj543Tin1pRYcdcPRnFIRI=
cloud.google.com/go/pubsub v1.27.1/go.mod h1:hQN39ymbV9geqBnfQq6Xf63yNhUAhv9CZhzp5O6qsW0=
cloud.google.com/go/pubsub v1.28.0/go.mod h1:vuXFpwaVoIPQMGXqRyUQigu/AX1S3IWugR9xznmcXX8=
cloud.google.com/go/pubsub v1.30.0/go.mod h1:qWi1OPS0B+b5L+Sg6Gmc9zD1Y+HaM0MdUr7LsupY1P4=
cloud.google.com/go/pubsublite v1.5.0/go.mod h1:xapqNQ1CuLfGi23Yda/9l4bBCKz/wC3KIJ5gKcxveZg=
cloud.google.com/go/pubsublite v1.6.0/go.mod h1:1eFCS0U11xlOuMFV/0iBqw3zP12kddMeCbj/F3FSj9k=
cloud.google.com/go/pubsublite v1.7.0/go.mod h1:8hVMwRXfDfvGm3fahVbtDbiLePT3gpoiJYJY+vxWxVM=
cloud.google.com/go/recaptchaenterprise v1.3.1/go.mod h1:OdD+q+y4XGeAlxRaMn1Y7/GveP6zmq76byL6tjPE7d4=
cloud.google.com/go/recaptchaenterprise/v2 v2.1.0/go.mod h1:w9yVqajwroDNTfGuhmOjPDN//rZGySaf6PtFVcSCa7o=
cloud.google.com/go/recaptchaenterprise/v2 v2.2.0/go.mod h1:/Zu5jisWGeERrd5HnlS3EUGb/D335f9k51B/FVil0jk=
cloud.google.com/go/recaptchaenterprise/v2 v2.3.0/go.mod h1:O9LwGCjrhGHBQET5CA7dd5NwwNQUErSgEDit1DLNTdo=
cloud.google.com/go/recaptchaenterprise/v2 v2.4.0/go.mod h1:Am3LHfOuBstrLrNCBrlI5sbwx9LBg3te2N6hGvHn2mE=
cloud.google.com/go/recaptchaenterprise/v2 v2.5.0/go.mod h1:O8LzcHXN3rz0j+LBC91jrwI3R+1ZSZEWrfL7XHgNo9U=
cloud.google.com/go/recaptchaenterprise/v2 v2.6.0/go.mod h1:RPauz9jeLtB3JVzg6nCbe12qNoaa8pXc4d/YukAmcnA=
cloud.google.com/go/recaptchaenterprise/v2 v2.7.0/go.mod h1:19wVj/fs5RtYtynAPJdDTb69oW0vNHYDBTbB4NvMD9c=
cloud.google.com/go/recommendationengine v0.5.0/go.mod h1:E5756pJcVFeVgaQv3WNpImkFP8a+RptV6dDLGPILjvg=
cloud.google.com/go/recommendationengine v0.6.0/go.mod h1:08mq2umu9oIqc7tDy8sx+MNJdLG0fUi3vaSVbztHgJ4=
cloud.google.com/go/recommendationengine v0.7.0/go.mod h1:1reUcE3GIu6MeBz/h5xZJqNLuuVjNg1lmWMPyjatzac=
cloud.google.com/go/recommender v1.5.0/go.mod h1:jdoeiBIVrJe9gQjwd759ecLJbxCDED4A6p+mqoqDvTg=
cloud.google.com/go/recommender v1.6.0/go.mod h1:+yETpm25mcoiECKh9DEScGzIRyDKpZ0cEhWGo+8bo+c=
cloud.google.com/go/recommender v1.7.0/go.mod h1:XLHs/W+T8olwlGOgfQenXBTbIseGclClff6lhFVe9Bs=
cloud.google.com/go/recommender v1.8.0/go.mod h1:PkjXrTT05BFKwxaUxQmtIlrtj0kph108r02ZZQ5FE70=
cloud.google.com/go/recommender v1.9.0/go.mod h1:PnSsnZY7q+VL1uax2JWkt/UegHssxjUVVCrX52CuEmQ=
cloud.google.com/go/redis v1.7.0/go.mod h1:V3x5Jq1jzUcg+UNsRvdmsfuFnit1cfe3Z/PGyq/lm4Y=
cloud.google.com/go/redis v1.8.0/go.mod h1:Fm2szCDavWzBk2cDKxrkmWBqoCiL1+Ctwq7EyqBCA/A=
cloud.google.com/go/redis v1.9.0/go.mod h1:HMYQuajvb2D0LvMgZmLDZW8V5aOC/WxstZHiy4g8OiA=
cloud.google.com/go/redis v1.10.0/go.mod h1:ThJf3mMBQtW18JzGgh41/Wld6vnDDc/F/F35UolRZPM=
cloud.google.com/go/redis v1.11.0/go.mod h1:/X6eicana+BWcUda5PpwZC48o37SiFVTFSs0fWAJ7uQ=
cloud.google.com/go/resourcemanager v1.3.0/go.mod h1:bAtrTjZQFJkiWTPDb1WBjzvc6/kifjj4QBYuKCCoqKA=
cloud.google.com/go/resourcemanager v1.4.0/go.mod h1:MwxuzkumyTX7/a3n37gmsT3py7LIXwrShilPh3P1tR0=
cloud.google.com/go/resourcemanager v1.5.0/go.mod h1:eQoXNAiAvCf5PXxWxXjhKQoTMaUSNrEfg+6qdf/wots=
cloud.google.com/go/resourcemanager v1.6.0/go.mod h1:YcpXGRs8fDzcUl1Xw8uOVmI8JEadvhRIkoXXUNVYcVo=
cloud.google.com/go/resourcemanager v1.7.0/go.mod h1:HlD3m6+bwhzj9XCouqmeiGuni95NTrExfhoSrkC/3EI=
cloud.google.com/go/resourcesettings v1.3.0/go.mod h1:lzew8VfESA5DQ8gdlHwMrqZs1S9V87v3oCnKCWoOuQU=
cloud.google.com/go/resourcesettings v1.4.0/go.mod h1:ldiH9IJpcrlC3VSuCGvjR5of/ezRrOxFtpJoJo5SmXg=
cloud.google.com/go/resourcesettings v1.5.0/go.mod h1:+xJF7QSG6undsQDfsCJyqWXyBwUoJLhetkRMDRnIoXA=
cloud.google.com/go/retail v1.8.0/go.mod h1:QblKS8waDmNUhghY2TI9O3JLlFk8jybHeV4BF19FrE4=
cloud.google.com/go/retail v1.9.0/go.mod h1:g6jb6mKuCS1QKnH/dpu7isX253absFl6iE92nHwlBUY=
cloud.google.com/go/retail v1.10.0/go.mod h1:2gDk9HsL4HMS4oZwz6daui2/jmKvqShXKQuB2RZ+cCc=
cloud.google.com/go/retail v1.11.0/go.mod h1:MBLk1NaWPmh6iVFSz9MeKG/Psyd7TAgm6y/9L2B4x9Y=
cloud.google.com/go/retail v1.12.0/go.mod h1:UMkelN/0Z8XvKymXFbD4EhFJlYKRx1FGhQkVPU5kF14=
cloud.google.com/go/run v0.2.0/go.mod h1:CNtKsTA1sDcnqqIFR3Pb5Tq0usWxJJvsWOCPldRU3Do=
cloud.google.com/go/run v0.3.0/go.mod h1:TuyY1+taHxTjrD0ZFk2iAR+xyOXEA0ztb7U3UNA0zBo=
cloud.google.com/go/run v0.8.0/go.mod h1:VniEnuBwqjigv0A7ONfQUaEItaiCRVujlMqerPPiktM=
cloud.google.com/go/run v0.9.0/go.mod h1:Wwu+/vvg8Y+JUApMwEDfVfhetv30hCG4ZwDR/IXl2Qg=
cloud.google.com/go/scheduler v1.4.0/go.mod h1:drcJBmxF3aqZJRhmkHQ9b3uSSpQoltBPGPxGAWROx6s=
cloud.google.com/go/scheduler v1.5.0/go.mod h1:ri073ym49NW3AfT6DZi21vLZrG07GXr5p3H1KxN5QlI=
cloud.google.com/go/scheduler v1.6.0/go.mod h1:SgeKVM7MIwPn3BqtcBntpLyrIJftQISRrYB5ZtT+KOk=
cloud.google.com/go/scheduler v1.7.0/go.mod h1:jyCiBqWW956uBjjPMMuX09n3x37mtyPJegEWKxRsn44=
cloud.google.com/go/scheduler v1.8.0/go.mod h1:TCET+Y5Gp1YgHT8py4nlg2Sew8nUHMqcpousDgXJVQc=
cloud.google.com/go/scheduler v1.9.0/go.mod h1:yexg5t+KSmqu+njTIh3b7oYPheFtBWGcbVUYF1GGMIc=
cloud.google.com/go/secretmanager v1.6.0/go.mod h1:awVa/OXF6IiyaU1wQ34inzQNc4ISIDIrId8qE5QGgKA=
cloud.google.com/go/secretmanager v1.8.0/go.mod h1:hnVgi/bN5MYHd3Gt0SPuTPPp5ENina1/LxM+2W9U9J4=
cloud.google.com/go/secretmanager v1.9.0/go.mod h1:b71qH2l1yHmWQHt9LC80akm86mX8AL6X1MA01dW8ht4=
cloud.google.com/go/secretmanager v1.10.0/go.mod h1:MfnrdvKMPNra9aZtQFvBcvRU54hbPD8/HayQdlUgJpU=
cloud.google.com/go/security v1.5.0/go.mod h1:lgxGdyOKKjHL4YG3/YwIL2zLqMFCKs0UbQwgyZmfJl4=
cloud.google.com/go/security v1.7.0/go.mod h1:mZklORHl6Bg7CNnnjLH//0UlAlaXqiG7Lb9PsPXLfD0=
cloud.google.com/go/security v1.8.0/go.mod h1:hAQOwgmaHhztFhiQ41CjDODdWP0+AE1B3sX4OFlq+GU=
cloud.google.com/go/security v1.9.0/go.mod h1:6Ta1bO8LXI89nZnmnsZGp9lVoVWXqsVbIq/t9dzI+2Q=
cloud.google.com/go/security v1.10.0/go.mod h1:QtOMZByJVlibUT2h9afNDWRZ1G96gVywH8T5GUSb9IA=
cloud.google.com/go/security v1.12.0/go.mod h1:rV6EhrpbNHrrxqlvW0BWAIawFWq3X90SduMJdFwtLB8=
cloud.google.com/go/security v1.13.0/go.mod h1:Q1Nvxl1PAgmeW0y3HTt54JYIvUdtcpYKVfIB8AOMZ+0=
cloud.google.com/go/securitycenter v1.13.0/go.mod h1:cv5qNAqjY84FCN6Y9z28WlkKXyWsgLO832YiWwkCWcU=
cloud.google.com/go/securitycenter v1.14.0/go.mod h1:gZLAhtyKv85n52XYWt6RmeBdydyxfPeTrpToDPw4Auc=
cloud.google.com/go/securitycenter v1.15.0/go.mod h1:PeKJ0t8MoFmmXLXWm41JidyzI3PJjd8sXWaVqg43WWk=
cloud.google.com/go/securitycenter v1.16.0/go.mod h1:Q9GMaLQFUD+5ZTabrbujNWLtSLZIZF7SAR0wWECrjdk=
cloud.google.com/go/securitycenter v1.18.1/go.mod h1:0/25gAzCM/9OL9vVx4ChPeM/+DlfGQJDwBy/UC8AKK0=
cloud.google.com/go/securitycenter v1.19.0/go.mod h1:LVLmSg8ZkkyaNy4u7HCIshAngSQ8EcIRREP3xBnyfag=
cloud.google.com/go/servicecontrol v1.4.0/go.mod h1:o0hUSJ1TXJAmi/7fLJAedOovnujSEvjKCAFNXPQ1RaU=
cloud.google.com/go/servicecontrol v1.5.0/go.mod h1:qM0CnXHhyqKVuiZnGKrIurvVImCs8gmqWsDoqe9sU1s=
cloud.google.com/go/servicecontrol v1.10.0/go.mod h1:pQvyvSRh7YzUF2efw7H87V92mxU8FnFDawMClGCNuAA=
cloud.google.com/go/servicecontrol v1.11.0/go.mod h1:kFmTzYzTUIuZs0ycVqRHNaNhgR+UMUpw9n02l/pY+mc=
cloud.google.com/go/servicecontrol v1.11.1/go.mod h1:aSnNNlwEFBY+PWGQ2DoM0JJ/QUXqV5/ZD9DOLB7SnUk=
cloud.google.com/go/servicedirectory v1.4.0/go.mod h1:gH1MUaZCgtP7qQiI+F+A+OpeKF/HQWgtAddhTbhL2bs=
cloud.google.com/go/servicedirectory v1.5.0/go.mod h1:QMKFL0NUySbpZJ1UZs3oFAmdvVxhhxB6eJ/Vlp73dfg=
cloud.google.com/go/servicedirectory v1.6.0/go.mod h1:pUlbnWsLH9c13yGkxCmfumWEPjsRs1RlmJ4pqiNjVL4=
cloud.google.com/go/servicedirectory v1.7.0/go.mod h1:5p/U5oyvgYGYejufvxhgwjL8UVXjkuw7q5XcG10wx1U=
cloud.google.com/go/servicedirectory v1.8.0/go.mod h1:srXodfhY1GFIPvltunswqXpVxFPpZjf8nkKQT7XcXaY=
cloud.google.com/go/servicedirectory v1.9.0/go.mod h1:29je5JjiygNYlmsGz8k6o+OZ8vd4f//bQLtvzkPPT/s=
cloud.google.com/go/servicemanagement v1.4.0/go.mod h1:d8t8MDbezI7Z2R1O/wu8oTggo3BI2GKYbdG4y/SJTco=
cloud.google.com/go/servicemanagement v1.5.0/go.mod h1:XGaCRe57kfqu4+lRxaFEAuqmjzF0r+gWHjWqKqBvKFo=
cloud.google.com/go/servicemanagement v1.6.0/go.mod h1:aWns7EeeCOtGEX4OvZUWCCJONRZeFKiptqKf1D0l/Jc=
cloud.google.com/go/servicemanagement v1.8.0/go.mod h1:MSS2TDlIEQD/fzsSGfCdJItQveu9NXnUniTrq/L8LK4=
cloud.google.com/go/serviceusage v1.3.0/go.mod h1:Hya1cozXM4SeSKTAgGXgj97GlqUvF5JaoXacR1JTP/E=
cloud.google.com/go/serviceusage v1.4.0/go.mod h1:SB4yxXSaYVuUBYUml6qklyONXNLt83U0Rb+CXyhjEeU=
cloud.google.com/go/serviceusage v1.5.0/go.mod h1:w8U1JvqUqwJNPEOTQjrMHkw3IaIFLoLsPLvsE3xueec=
cloud.google.com/go/serviceusage v1.6.0/go.mod h1:R5wwQcbOWsyuOfbP9tGdAnCAc6B9DRwPG1xtWMDeuPA=
cloud.google.com/go/shell v1.3.0/go.mod h1:VZ9HmRjZBsjLGXusm7K5Q5lzzByZmJHf1d0IWHEN5X4=
cloud.google.com/go/shell v1.4.0/go.mod h1:HDxPzZf3GkDdhExzD/gs8Grqk+dmYcEjGShZgYa9URw=
cloud.google.com/go/shell v1.6.0/go.mod h1:oHO8QACS90luWgxP3N9iZVuEiSF84zNyLytb+qE2f9A=
cloud.google.com/go/spanner v1.41.0/go.mod h1:MLYDBJR/dY4Wt7ZaMIQ7rXOTLjYrmxLE/5ve9vFfWos=
cloud.google.com/go/spanner v1.44.0/go.mod h1:G8XIgYdOK+Fbcpbs7p2fiprDw4CaZX63whnSMLVBxjk=
cloud.google.com/go/spanner v1.45.0/go.mod h1:FIws5LowYz8YAE1J8fOS7DJup8ff7xJeetWEo5REA2M=
cloud.google.com/go/spanner v1.85.0 h1:VVO3yW+0+Yx9tg4SQaZvJHGAnU6qCnGXQ3NX4E3+src=
cloud.google.com/go/spanner v1.85.0/go.mod h1:9zhmtOEoYV06nE4Orbin0dc/ugHzZW9yXuvaM61rpxs=
cloud.google.com/go/speech v1.6.0/go.mod h1:79tcr4FHCimOp56lwC01xnt/WPJZc4v3gzyT7FoBkCM=
cloud.google.com/go/speech v1.7.0/go.mod h1:KptqL+BAQIhMsj1kOP2la5DSEEerPDuOP/2mmkhHhZQ=
cloud.google.com/go/speech v1.8.0/go.mod h1:9bYIl1/tjsAnMgKGHKmBZzXKEkGgtU+MpdDPTE9f7y0=
cloud.google.com/go/speech v1.9.0/go.mod h1:xQ0jTcmnRFFM2RfX/U+rk6FQNUF6DQlydUSyoooSpco=
cloud.google.com/go/speech v1.14.1/go.mod h1:gEosVRPJ9waG7zqqnsHpYTOoAS4KouMRLDFMekpJ0J0=
cloud.google.com/go/speech v1.15.0/go.mod h1:y6oH7GhqCaZANH7+Oe0BhgIogsNInLlz542tg3VqeYI=
cloud.google.com/go/storage v1.0.0/go.mod h1:IhtSnM/ZTZV8YYJWCY8RULGVqBDmpoyjwiyrjsg+URw=
cloud.google.com/go/storage v1.5.0/go.mod h1:tpKbwo567HUNpVclU5sGELwQWBDZ8gh0ZeosJ0Rtdos=
cloud.google.com/go/storage v1.6.0/go.mod h1:N7U0C8pVQ/+NIKOBQyamJIeKQKkZ+mxpohlUTyfDhBk=
cloud.google.com/go/storage v1.8.0/go.mod h1:Wv1Oy7z6Yz3DshWRJFhqM/UCfaWIRTdp0RXyy7KQOVs=
cloud.google.com/go/storage v1.10.0/go.mod h1:FLPqc6j+Ki4BU591ie1oL6qBQGu2Bl/tZ9ullr3+Kg0=
cloud.google.com/go/storage v1.14.0/go.mod h1:GrKmX003DSIwi9o29oFT7YDnHYwZoctc3fOKtUw0Xmo=
cloud.google.com/go/storage v1.22.1/go.mod h1:S8N1cAStu7BOeFfE8KAQzmyyLkK8p/vmRq6kuBTW58Y=
cloud.google.com/go/storage v1.23.0/go.mod h1:vOEEDNFnciUMhBeT6hsJIn3ieU5cFRmzeLgDvXzfIXc=
cloud.google.com/go/storage v1.27.0/go.mod h1:x9DOL8TK/ygDUMieqwfhdpQryTeEkhGKMi80i/iqR2s=
cloud.google.com/go/storage v1.28.1/go.mod h1:Qnisd4CqDdo6BGs2AD5LLnEsmSQ80wQ5ogcBBKhU86Y=
cloud.google.com/go/storage v1.29.0/go.mod h1:4puEjyTKnku6gfKoTfNOU/W+a9JyuVNxjpS5GBrB8h4=
cloud.google.com/go/storage v1.56.0 h1:iixmq2Fse2tqxMbWhLWC9HfBj1qdxqAmiK8/eqtsLxI=
cloud.google.com/go/storage v1.56.0/go.mod h1:Tpuj6t4NweCLzlNbw9Z9iwxEkrSem20AetIeH/shgVU=
cloud.google.com/go/storagetransfer v1.5.0/go.mod h1:dxNzUopWy7RQevYFHewchb29POFv3/AaBgnhqzqiK0w=
cloud.google.com/go/storagetransfer v1.6.0/go.mod h1:y77xm4CQV/ZhFZH75PLEXY0ROiS7Gh6pSKrM8dJyg6I=
cloud.google.com/go/storagetransfer v1.7.0/go.mod h1:8Giuj1QNb1kfLAiWM1bN6dHzfdlDAVC9rv9abHot2W4=
cloud.google.com/go/storagetransfer v1.8.0/go.mod h1:JpegsHHU1eXg7lMHkvf+KE5XDJ7EQu0GwNJbbVGanEw=
cloud.google.com/go/talent v1.1.0/go.mod h1:Vl4pt9jiHKvOgF9KoZo6Kob9oV4lwd/ZD5Cto54zDRw=
cloud.google.com/go/talent v1.2.0/go.mod h1:MoNF9bhFQbiJ6eFD3uSsg0uBALw4n4gaCaEjBw9zo8g=
cloud.google.com/go/talent v1.3.0/go.mod h1:CmcxwJ/PKfRgd1pBjQgU6W3YBwiewmUzQYH5HHmSCmM=
cloud.google.com/go/talent v1.4.0/go.mod h1:ezFtAgVuRf8jRsvyE6EwmbTK5LKciD4KVnHuDEFmOOA=
cloud.google.com/go/talent v1.5.0/go.mod h1:G+ODMj9bsasAEJkQSzO2uHQWXHHXUomArjWQQYkqK6c=
cloud.google.com/go/texttospeech v1.4.0/go.mod h1:FX8HQHA6sEpJ7rCMSfXuzBcysDAuWusNNNvN9FELDd8=
cloud.google.com/go/texttospeech v1.5.0/go.mod h1:oKPLhR4n4ZdQqWKURdwxMy0uiTS1xU161C8W57Wkea4=
cloud.google.com/go/texttospeech v1.6.0/go.mod h1:YmwmFT8pj1aBblQOI3TfKmwibnsfvhIBzPXcW4EBovc=
cloud.google.com/go/tpu v1.3.0/go.mod h1:aJIManG0o20tfDQlRIej44FcwGGl/cD0oiRyMKG19IQ=
cloud.google.com/go/tpu v1.4.0/go.mod h1:mjZaX8p0VBgllCzF6wcU2ovUXN9TONFLd7iz227X2Xg=
cloud.google.com/go/tpu v1.5.0/go.mod h1:8zVo1rYDFuW2l4yZVY0R0fb/v44xLh3llq7RuV61fPM=
cloud.google.com/go/trace v1.3.0/go.mod h1:FFUE83d9Ca57C+K8rDl/Ih8LwOzWIV1krKgxg6N0G28=
cloud.google.com/go/trace v1.4.0/go.mod h1:UG0v8UBqzusp+z63o7FK74SdFE+AXpCLdFb1rshXG+Y=
cloud.google.com/go/trace v1.8.0/go.mod h1:zH7vcsbAhklH8hWFig58HvxcxyQbaIqMarMg9hn5ECA=
cloud.google.com/go/trace v1.9.0/go.mod h1:lOQqpE5IaWY0Ixg7/r2SjixMuc6lfTFeO4QGM4dQWOk=
cloud.google.com/go/trace v1.11.6 h1:2O2zjPzqPYAHrn3OKl029qlqG6W8ZdYaOWRyr8NgMT4=
cloud.google.com/go/trace v1.11.6/go.mod h1:GA855OeDEBiBMzcckLPE2kDunIpC72N+Pq8WFieFjnI=
cloud.google.com/go/translate v1.3.0/go.mod h1:gzMUwRjvOqj5i69y/LYLd8RrNQk+hOmIXTi9+nb3Djs=
cloud.google.com/go/translate v1.4.0/go.mod h1:06Dn/ppvLD6WvA5Rhdp029IX2Mi3Mn7fpMRLPvXT5Wg=
cloud.google.com/go/translate v1.5.0/go.mod h1:29YDSYveqqpA1CQFD7NQuP49xymq17RXNaUDdc0mNu0=
cloud.google.com/go/translate v1.6.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos=
cloud.google.com/go/translate v1.7.0/go.mod h1:lMGRudH1pu7I3n3PETiOB2507gf3HnfLV8qlkHZEyos=
cloud.google.com/go/video v1.8.0/go.mod h1:sTzKFc0bUSByE8Yoh8X0mn8bMymItVGPfTuUBUyRgxk=
cloud.google.com/go/video v1.9.0/go.mod h1:0RhNKFRF5v92f8dQt0yhaHrEuH95m068JYOvLZYnJSw=
cloud.google.com/go/video v1.12.0/go.mod h1:MLQew95eTuaNDEGriQdcYn0dTwf9oWiA4uYebxM5kdg=
cloud.google.com/go/video v1.13.0/go.mod h1:ulzkYlYgCp15N2AokzKjy7MQ9ejuynOJdf1tR5lGthk=
cloud.google.com/go/video v1.14.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ=
cloud.google.com/go/video v1.15.0/go.mod h1:SkgaXwT+lIIAKqWAJfktHT/RbgjSuY6DobxEp0C5yTQ=
cloud.google.com/go/videointelligence v1.6.0/go.mod h1:w0DIDlVRKtwPCn/C4iwZIJdvC69yInhW0cfi+p546uU=
cloud.google.com/go/videointelligence v1.7.0/go.mod h1:k8pI/1wAhjznARtVT9U1llUaFNPh7muw8QyOUpavru4=
cloud.google.com/go/videointelligence v1.8.0/go.mod h1:dIcCn4gVDdS7yte/w+koiXn5dWVplOZkE+xwG9FgK+M=
cloud.google.com/go/videointelligence v1.9.0/go.mod h1:29lVRMPDYHikk3v8EdPSaL8Ku+eMzDljjuvRs105XoU=
cloud.google.com/go/videointelligence v1.10.0/go.mod h1:LHZngX1liVtUhZvi2uNS0VQuOzNi2TkY1OakiuoUOjU=
cloud.google.com/go/vision v1.2.0/go.mod h1:SmNwgObm5DpFBme2xpyOyasvBc1aPdjvMk2bBk0tKD0=
cloud.google.com/go/vision/v2 v2.2.0/go.mod h1:uCdV4PpN1S0jyCyq8sIM42v2Y6zOLkZs+4R9LrGYwFo=
cloud.google.com/go/vision/v2 v2.3.0/go.mod h1:UO61abBx9QRMFkNBbf1D8B1LXdS2cGiiCRx0vSpZoUo=
cloud.google.com/go/vision/v2 v2.4.0/go.mod h1:VtI579ll9RpVTrdKdkMzckdnwMyX2JILb+MhPqRbPsY=
cloud.google.com/go/vision/v2 v2.5.0/go.mod h1:MmaezXOOE+IWa+cS7OhRRLK2cNv1ZL98zhqFFZaaH2E=
cloud.google.com/go/vision/v2 v2.6.0/go.mod h1:158Hes0MvOS9Z/bDMSFpjwsUrZ5fPrdwuyyvKSGAGMY=
cloud.google.com/go/vision/v2 v2.7.0/go.mod h1:H89VysHy21avemp6xcf9b9JvZHVehWbET0uT/bcuY/0=
cloud.google.com/go/vmmigration v1.2.0/go.mod h1:IRf0o7myyWFSmVR1ItrBSFLFD/rJkfDCUTO4vLlJvsE=
cloud.google.com/go/vmmigration v1.3.0/go.mod h1:oGJ6ZgGPQOFdjHuocGcLqX4lc98YQ7Ygq8YQwHh9A7g=
cloud.google.com/go/vmmigration v1.5.0/go.mod h1:E4YQ8q7/4W9gobHjQg4JJSgXXSgY21nA5r8swQV+Xxc=
cloud.google.com/go/vmmigration v1.6.0/go.mod h1:bopQ/g4z+8qXzichC7GW1w2MjbErL54rk3/C843CjfY=
cloud.google.com/go/vmwareengine v0.1.0/go.mod h1:RsdNEf/8UDvKllXhMz5J40XxDrNJNN4sagiox+OI208=
cloud.google.com/go/vmwareengine v0.2.2/go.mod h1:sKdctNJxb3KLZkE/6Oui94iw/xs9PRNC2wnNLXsHvH8=
cloud.google.com/go/vmwareengine v0.3.0/go.mod h1:wvoyMvNWdIzxMYSpH/R7y2h5h3WFkx6d+1TIsP39WGY=
cloud.google.com/go/vpcaccess v1.4.0/go.mod h1:aQHVbTWDYUR1EbTApSVvMq1EnT57ppDmQzZ3imqIk4w=
cloud.google.com/go/vpcaccess v1.5.0/go.mod h1:drmg4HLk9NkZpGfCmZ3Tz0Bwnm2+DKqViEpeEpOq0m8=
cloud.google.com/go/vpcaccess v1.6.0/go.mod h1:wX2ILaNhe7TlVa4vC5xce1bCnqE3AeH27RV31lnmZes=
cloud.google.com/go/webrisk v1.4.0/go.mod h1:Hn8X6Zr+ziE2aNd8SliSDWpEnSS1u4R9+xXZmFiHmGE=
cloud.google.com/go/webrisk v1.5.0/go.mod h1:iPG6fr52Tv7sGk0H6qUFzmL3HHZev1htXuWDEEsqMTg=
cloud.google.com/go/webrisk v1.6.0/go.mod h1:65sW9V9rOosnc9ZY7A7jsy1zoHS5W9IAXv6dGqhMQMc=
cloud.google.com/go/webrisk v1.7.0/go.mod h1:mVMHgEYH0r337nmt1JyLthzMr6YxwN1aAIEc2fTcq7A=
cloud.google.com/go/webrisk v1.8.0/go.mod h1:oJPDuamzHXgUc+b8SiHRcVInZQuybnvEW72PqTc7sSg=
cloud.google.com/go/websecurityscanner v1.3.0/go.mod h1:uImdKm2wyeXQevQJXeh8Uun/Ym1VqworNDlBXQevGMo=
cloud.google.com/go/websecurityscanner v1.4.0/go.mod h1:ebit/Fp0a+FWu5j4JOmJEV8S8CzdTkAS77oDsiSqYWQ=
cloud.google.com/go/websecurityscanner v1.5.0/go.mod h1:Y6xdCPy81yi0SQnDY1xdNTNpfY1oAgXUlcfN3B3eSng=
cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1Vwf+KmJENM0=
cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M=
cloud.google.com/go/workflows v1.8.0/go.mod h1:ysGhmEajwZxGn1OhGOGKsTXc5PyxOc0vfKf5Af+to4M=
cloud.google.com/go/workflows v1.9.0/go.mod h1:ZGkj1aFIOd9c8Gerkjjq7OW7I5+l6cSvT3ujaO/WwSA=
cloud.google.com/go/workflows v1.10.0/go.mod h1:fZ8LmRmZQWacon9UCX1r/g/DfAXx5VcPALq2CxzdePw=
codeberg.org/chavacava/garif v0.2.0 h1:F0tVjhYbuOCnvNcU3YSpO6b3Waw6Bimy4K0mM8y6MfY=
codeberg.org/chavacava/garif v0.2.0/go.mod h1:P2BPbVbT4QcvLZrORc2T29szK3xEOlnl0GiPTJmEqBQ=
codeberg.org/polyfloyd/go-errorlint v1.9.0 h1:VkdEEmA1VBpH6ecQoMR4LdphVI3fA4RrCh2an7YmodI=
codeberg.org/polyfloyd/go-errorlint v1.9.0/go.mod h1:GPRRu2LzVijNn4YkrZYJfatQIdS+TrcK8rL5Xs24qw8=
dev.gaijin.team/go/exhaustruct/v4 v4.0.0 h1:873r7aNneqoBB3IaFIzhvt2RFYTuHgmMjoKfwODoI1Y=
dev.gaijin.team/go/exhaustruct/v4 v4.0.0/go.mod h1:aZ/k2o4Y05aMJtiux15x8iXaumE88YdiB0Ai4fXOzPI=
dev.gaijin.team/go/golib v0.6.0 h1:v6nnznFTs4bppib/NyU1PQxobwDHwCXXl15P7DV5Zgo=
dev.gaijin.team/go/golib v0.6.0/go.mod h1:uY1mShx8Z/aNHWDyAkZTkX+uCi5PdX7KsG1eDQa2AVE=
dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7gZCb22OMCxBHrMx7a5I7Hp++hsVxbQ4BYO7hU=
gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zumjgTw83q2ge/PI+yyw8=
git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc=
github.com/4meepo/tagalign v1.4.3 h1:Bnu7jGWwbfpAie2vyl63Zup5KuRv21olsPIha53BJr8=
github.com/4meepo/tagalign v1.4.3/go.mod h1:00WwRjiuSbrRJnSVeGWPLp2epS5Q/l4UEy0apLLS37c=
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4 h1:/vQbFIOMbk2FiG/kXiLl8BRyzTWDw7gX/Hz7Dd5eDMs=
github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4=
github.com/99designs/keyring v1.2.1 h1:tYLp1ULvO7i3fI5vE21ReQuj99QFSs7lGm0xWyJo87o=
github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA=
github.com/Abirdcfly/dupword v0.1.7 h1:2j8sInznrje4I0CMisSL6ipEBkeJUJAmK1/lfoNGWrQ=
github.com/Abirdcfly/dupword v0.1.7/go.mod h1:K0DkBeOebJ4VyOICFdppB23Q0YMOgVafM0zYW0n9lF4=
github.com/AdminBenni/iota-mixing v1.0.0 h1:Os6lpjG2dp/AE5fYBPAA1zfa2qMdCAWwPMCgpwKq7wo=
github.com/AdminBenni/iota-mixing v1.0.0/go.mod h1:i4+tpAaB+qMVIV9OK3m4/DAynOd5bQFaOu+2AhtBCNY=
github.com/AlwxSin/noinlineerr v1.0.5 h1:RUjt63wk1AYWTXtVXbSqemlbVTb23JOSRiNsshj7TbY=
github.com/AlwxSin/noinlineerr v1.0.5/go.mod h1:+QgkkoYrMH7RHvcdxdlI7vYYEdgeoFOVjU9sUhw/rQc=
github.com/Antonboom/errname v1.1.1 h1:bllB7mlIbTVzO9jmSWVWLjxTEbGBVQ1Ff/ClQgtPw9Q=
github.com/Antonboom/errname v1.1.1/go.mod h1:gjhe24xoxXp0ScLtHzjiXp0Exi1RFLKJb0bVBtWKCWQ=
github.com/Antonboom/nilnil v1.1.1 h1:9Mdr6BYd8WHCDngQnNVV0b554xyisFioEKi30sksufQ=
github.com/Antonboom/nilnil v1.1.1/go.mod h1:yCyAmSw3doopbOWhJlVci+HuyNRuHJKIv6V2oYQa8II=
github.com/Antonboom/testifylint v1.6.4 h1:gs9fUEy+egzxkEbq9P4cpcMB6/G0DYdMeiFS87UiqmQ=
github.com/Antonboom/testifylint v1.6.4/go.mod h1:YO33FROXX2OoUfwjz8g+gUxQXio5i9qpVy7nXGbxDD4=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.0.0/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.1.2/go.mod h1:uGG2W01BaETf0Ozp+QxxKJdMBNRWPdstHG0Fmdwn1/U=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0 h1:rTnT/Jrcm+figWlYz4Ixzt0SJVR2cMC8lvZcimipiEY=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.4.0/go.mod h1:ON4tFdPTwRcgWEaVDrN3584Ef+b7GgSJaXxe5fW9t4M=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1 h1:T8quHYlUGyb/oqtSTwqlCr1ilJHrDv+ZtpSfo+hm1BU=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.2.1/go.mod h1:gLa1CL2RNE4s7M3yopJ/p0iq5DdY6Yv5ZUt9MTRZOQM=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.0.0/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2 h1:+5VZ72z0Qan5Bog5C+ZkgSqUbeVUd9wgtHOrIKuc5b8=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.1.2/go.mod h1:eWRD7oawr1Mu1sLCawqVc0CUiF43ia3qQMxLscsKQ9w=
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0 h1:u/LLAOFgsMv7HmNL4Qufg58y+qElGOt5qv0z1mURkRY=
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.0.0/go.mod h1:2e8rMJtl2+2j+HXbTBwnyGpm5Nou7KhvSfxOq8JpTag=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 h1:L/gRVlceqvL25UVaW/CKtUDjefjrs0SPonmDGUVOYP0=
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E=
github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs=
github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24=
github.com/Azure/go-autorest/autorest/adal v0.9.16 h1:P8An8Z9rH1ldbOLdFpxYorgOt2sywL9V24dAwWHPuGc=
github.com/Azure/go-autorest/autorest/adal v0.9.16/go.mod h1:tGMin8I49Yij6AQ+rvV+Xa/zwxYQB5hmsd6DkfAx2+A=
github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw=
github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74=
github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk=
github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k=
github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg=
github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8=
github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo=
github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU=
github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1 h1:oPdPEZFSbl7oSPEAIPMPBMUmiL+mqgzBJwM/9qYcwNg=
github.com/AzureAD/microsoft-authentication-library-for-go v0.8.1/go.mod h1:4qFor3D/HDsvBME35Xy9rwW9DecL+M2sNw1ybjPtwA0=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/BurntSushi/toml v1.6.0 h1:dRaEfpa2VI55EwlIW72hMRHdWouJeRF7TPYhI+AUQjk=
github.com/BurntSushi/toml v1.6.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
github.com/ClickHouse/clickhouse-go v1.4.3 h1:iAFMa2UrQdR5bHJ2/yaSLffZkxpcOYQMCUuKeNXGdqc=
github.com/ClickHouse/clickhouse-go v1.4.3/go.mod h1:EaI/sW7Azgz9UATzd5ZdZHRUhHgv5+JMS9NSr2smCJI=
github.com/Conight/go-googletrans v0.3.0 h1:d6g5nrRumqpcXQd/O7+PHvaIn5h0RTCG1QfopRIhxU8=
github.com/Conight/go-googletrans v0.3.0/go.mod h1:vl4tB0jWplJ1ZsEul86jXSMUrM+llD1qHK2XbjVBwvk=
github.com/Djarvur/go-err113 v0.1.1 h1:eHfopDqXRwAi+YmCUas75ZE0+hoBHJ2GQNLYRSxao4g=
github.com/Djarvur/go-err113 v0.1.1/go.mod h1:IaWJdYFLg76t2ihfflPZnM1LIQszWOsFDh2hhhAVF6k=
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3 h1:2afWGsMzkIcN8Qm4mgPJKZWyroE5QBszMiDMYEBrnfw=
github.com/GoogleCloudPlatform/grpc-gcp-go/grpcgcp v1.5.3/go.mod h1:dppbR7CwXD4pgtV9t3wD1812RaLDcBjtblcDF5f1vI0=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0 h1:sBEjpZlNHzK1voKq9695PJSX2o5NEXl7/OL3coiIY0c=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.30.0/go.mod h1:P4WPRUkOhJC13W//jWpyfJNDAIpvRbAUIYLX/4jtlE0=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0 h1:owcC2UnmsZycprQ5RfRgjydWhuoxg71LUfyiQdijZuM=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.53.0/go.mod h1:ZPpqegjbE99EPKsu3iUWV22A04wzGPcAY/ziSIQEEgs=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0 h1:4LP6hvB4I5ouTbGgWtixJhgED6xdf67twf9PoY96Tbg=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.53.0/go.mod h1:jUZ5LYlw40WMd07qxcQJD5M40aUxrfwqQX1g7zxYnrQ=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0 h1:Ron4zCA/yk6U7WOBXhTJcDpsUBG9npumK6xw2auFltQ=
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.53.0/go.mod h1:cSgYe11MCNYunTnRXrKiR/tHc0eoKjICUuWpNZoVCOo=
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c h1:RGWPOewvKIROun94nF7v2cua9qP+thov/7M50KEoeSU=
github.com/JohnCGriffin/overflow v0.0.0-20211019200055-46fa312c352c/go.mod h1:X0CRv0ky0k6m906ixxpzmDRLvX58TFUKS2eePweuyxk=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/Masterminds/semver/v3 v3.1.1/go.mod h1:VPu/7SZ7ePZ3QOrcuXROw5FAcLl4a0cBrbBpGY/8hQs=
github.com/Masterminds/semver/v3 v3.4.0 h1:Zog+i5UMtVoCU8oKka5P7i9q9HgrJeGzI9SA1Xbatp0=
github.com/Masterminds/semver/v3 v3.4.0/go.mod h1:4V+yj/TJE1HU9XfppCwVMZq3I84lprf4nC11bSS5beM=
github.com/Masterminds/squirrel v1.5.4 h1:uUcX/aBc8O7Fg9kaISIUsHXdKuqehiXAMQTYX8afzqM=
github.com/Masterminds/squirrel v1.5.4/go.mod h1:NNaOrjSoIDfDA40n7sr2tPNZRfjzjA400rg+riTZj10=
github.com/Microsoft/go-winio v0.6.2 h1:F2VQgta7ecxGYO8k3ZZz3RS8fVIXVxONVUPlNERoyfY=
github.com/Microsoft/go-winio v0.6.2/go.mod h1:yd8OoFMLzJbo9gZq8j5qaps8bJ9aShtEA8Ipt1oGCvU=
github.com/MirrexOne/unqueryvet v1.5.4 h1:38QOxShO7JmMWT+eCdDMbcUgGCOeJphVkzzRgyLJgsQ=
github.com/MirrexOne/unqueryvet v1.5.4/go.mod h1:fs9Zq6eh1LRIhsDIsxf9PONVUjYdFHdtkHIgZdJnyPU=
github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
github.com/OpenPeeDeeP/depguard/v2 v2.2.1 h1:vckeWVESWp6Qog7UZSARNqfu/cZqvki8zsuj3piCMx4=
github.com/OpenPeeDeeP/depguard/v2 v2.2.1/go.mod h1:q4DKzC4UcVaAvcfd41CZh0PWpGgzrVxUYBlgKNGquUo=
github.com/ajstarks/deck v0.0.0-20200831202436-30c9fc6549a9/go.mod h1:JynElWSGnm/4RlzPXRlREEwqTHAN3T56Bv2ITsFT3gY=
github.com/ajstarks/deck/generate v0.0.0-20210309230005-c3f852c02e19/go.mod h1:T13YZdzov6OU0A1+RfKZiZN9ca6VeKdBdyDV+BY97Tk=
github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw=
github.com/ajstarks/svgo v0.0.0-20211024235047-1546f124cd8b/go.mod h1:1KcenG0jGWcpt8ov532z81sp/kMMUG485J2InIOyADM=
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/chroma/v2 v2.23.1 h1:nv2AVZdTyClGbVQkIzlDm/rnhk1E9bU9nXwmZ/Vk/iY=
github.com/alecthomas/chroma/v2 v2.23.1/go.mod h1:NqVhfBR0lte5Ouh3DcthuUCTUpDC9cxBOfyMbMQPs3o=
github.com/alecthomas/go-check-sumtype v0.3.1 h1:u9aUvbGINJxLVXiFvHUlPEaD7VDULsrxJb4Aq31NLkU=
github.com/alecthomas/go-check-sumtype v0.3.1/go.mod h1:A8TSiN3UPRw3laIgWEUOHHLPa6/r9MtoigdlP5h3K/E=
github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs=
github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/alexkohler/nakedret/v2 v2.0.6 h1:ME3Qef1/KIKr3kWX3nti3hhgNxw6aqN5pZmQiFSsuzQ=
github.com/alexkohler/nakedret/v2 v2.0.6/go.mod h1:l3RKju/IzOMQHmsEvXwkqMDzHHvurNQfAgE1eVmT40Q=
github.com/alexkohler/prealloc v1.1.0 h1:cKGRBqlXw5iyQGLYhrXrDlcHxugXpTq4tQ5c91wkf8M=
github.com/alexkohler/prealloc v1.1.0/go.mod h1:fT39Jge3bQrfA7nPMDngUfvUbQGQeJyGQnR+913SCig=
github.com/alfatraining/structtag v1.0.0 h1:2qmcUqNcCoyVJ0up879K614L9PazjBSFruTB0GOFjCc=
github.com/alfatraining/structtag v1.0.0/go.mod h1:p3Xi5SwzTi+Ryj64DqjLWz7XurHxbGsq6y3ubePJPus=
github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw=
github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I=
github.com/alingse/nilnesserr v0.2.0 h1:raLem5KG7EFVb4UIDAXgrv3N2JIaffeKNtcEXkEWd/w=
github.com/alingse/nilnesserr v0.2.0/go.mod h1:1xJPrXonEtX7wyTq8Dytns5P2hNzoWymVUIaKm4HNFg=
github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig=
github.com/andybalholm/brotli v1.2.0 h1:ukwgCxwYrmACq68yiUqwIWnGY0cTPox/M94sVwToPjQ=
github.com/andybalholm/brotli v1.2.0/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
github.com/ansrivas/fiberprometheus/v2 v2.17.0 h1:p0gqs5LsSCWGoSFF44fCJkyU+XcE6TLRqEMu80b2iCo=
github.com/ansrivas/fiberprometheus/v2 v2.17.0/go.mod h1:giWBvbFSHOHG8N2wjYhQG23oc/2pF9v1mN8CdZs5Z2g=
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
github.com/apache/arrow/go/v10 v10.0.1 h1:n9dERvixoC/1JjDmBcs9FPaEryoANa2sCgVFo6ez9cI=
github.com/apache/arrow/go/v10 v10.0.1/go.mod h1:YvhnlEePVnBS4+0z3fhPfUy7W1Ikj0Ih0vcRo/gZ1M0=
github.com/apache/arrow/go/v11 v11.0.0/go.mod h1:Eg5OsL5H+e299f7u5ssuXsuHQVEGC4xei5aX110hRiI=
github.com/apache/thrift v0.16.0 h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY=
github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU=
github.com/ashanbrown/forbidigo/v2 v2.3.0 h1:OZZDOchCgsX5gvToVtEBoV2UWbFfI6RKQTir2UZzSxo=
github.com/ashanbrown/forbidigo/v2 v2.3.0/go.mod h1:5p6VmsG5/1xx3E785W9fouMxIOkvY2rRV9nMdWadd6c=
github.com/ashanbrown/makezero/v2 v2.1.0 h1:snuKYMbqosNokUKm+R6/+vOPs8yVAi46La7Ck6QYSaE=
github.com/ashanbrown/makezero/v2 v2.1.0/go.mod h1:aEGT/9q3S8DHeE57C88z2a6xydvgx8J5hgXIGWgo0MY=
github.com/aws/aws-sdk-go v1.49.6 h1:yNldzF5kzLBRvKlKz1S0bkvc2+04R1kt13KfBWQBfFA=
github.com/aws/aws-sdk-go v1.49.6/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3TjupRn3Eqk=
github.com/aws/aws-sdk-go-v2 v1.16.16 h1:M1fj4FE2lB4NzRb9Y0xdWsn2P0+2UHVxwKyOa4YJNjk=
github.com/aws/aws-sdk-go-v2 v1.16.16/go.mod h1:SwiyXi/1zTUZ6KIAmLK5V5ll8SiURNUYOqTerZPaF9k=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.8 h1:tcFliCWne+zOuUfKNRn8JdFBuWPDuISDH08wD2ULkhk=
github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.4.8/go.mod h1:JTnlBSot91steJeti4ryyu/tLd4Sk84O5W22L7O2EQU=
github.com/aws/aws-sdk-go-v2/config v1.17.7 h1:odVM52tFHhpqZBKNjVW5h+Zt1tKHbhdTQRb+0WHrNtw=
github.com/aws/aws-sdk-go-v2/config v1.17.7/go.mod h1:dN2gja/QXxFF15hQreyrqYhLBaQo1d9ZKe/v/uplQoI=
github.com/aws/aws-sdk-go-v2/credentials v1.12.20 h1:9+ZhlDY7N9dPnUmf7CDfW9In4sW5Ff3bh7oy4DzS1IE=
github.com/aws/aws-sdk-go-v2/credentials v1.12.20/go.mod h1:UKY5HyIux08bbNA7Blv4PcXQ8cTkGh7ghHMFklaviR4=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17 h1:r08j4sbZu/RVi+BNxkBJwPMUYY3P8mgSDuKkZ/ZN1lE=
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.12.17/go.mod h1:yIkQcCDYNsZfXpd5UX2Cy+sWA1jPgIhGTw9cOBzfVnQ=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.33 h1:fAoVmNGhir6BR+RU0/EI+6+D7abM+MCwWf8v4ip5jNI=
github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.11.33/go.mod h1:84XgODVR8uRhmOnUkKGUZKqIMxmjmLOR8Uyp7G/TPwc=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23 h1:s4g/wnzMf+qepSNgTvaQQHNxyMLKSawNhKCPNy++2xY=
github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.23/go.mod h1:2DFxAQ9pfIRy0imBCJv+vZ2X6RKxves6fbnEuSry6b4=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17 h1:/K482T5A3623WJgWT8w1yRAFK4RzGzEl7y39yhtn9eA=
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.17/go.mod h1:pRwaTYCJemADaqCbUAxltMoHKata7hmB5PjEXeu0kfg=
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24 h1:wj5Rwc05hvUSvKuOF29IYb9QrCLjU+rHAy/x/o0DK2c=
github.com/aws/aws-sdk-go-v2/internal/ini v1.3.24/go.mod h1:jULHjqqjDlbyTa7pfM7WICATnOv+iOhjletM3N0Xbu8=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.14 h1:ZSIPAkAsCCjYrhqfw2+lNzWDzxzHXEckFkTePL5RSWQ=
github.com/aws/aws-sdk-go-v2/internal/v4a v1.0.14/go.mod h1:AyGgqiKv9ECM6IZeNQtdT8NnMvUb3/2wokeq2Fgryto=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.9 h1:Lh1AShsuIJTwMkoxVCAYPJgNG5H+eN6SmoUn8nOZ5wE=
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.9.9/go.mod h1:a9j48l6yL5XINLHLcOKInjdvknN+vWqPBxqeIDw7ktw=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.18 h1:BBYoNQt2kUZUUK4bIPsKrCcjVPUMNsgQpNAwhznK/zo=
github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.1.18/go.mod h1:NS55eQ4YixUJPTC+INxi2/jCqe1y2Uw3rnh9wEOVJxY=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17 h1:Jrd/oMh0PKQc6+BowB+pLEwLIgaQF29eYbe7E1Av9Ug=
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.9.17/go.mod h1:4nYOrY41Lrbk2170/BGkcJKBhws9Pfn8MG3aGqjjeFI=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.17 h1:HfVVR1vItaG6le+Bpw6P4midjBDMKnjMyZnw9MXYUcE=
github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.13.17/go.mod h1:YqMdV+gEKCQ59NrB7rzrJdALeBIsYiVi8Inj3+KcqHI=
github.com/aws/aws-sdk-go-v2/service/s3 v1.27.11 h1:3/gm/JTX9bX8CpzTgIlrtYpB3EVBDxyg/GY/QdcIEZw=
github.com/aws/aws-sdk-go-v2/service/s3 v1.27.11/go.mod h1:fmgDANqTUCxciViKl9hb/zD5LFbvPINFRgWhDbR+vZo=
github.com/aws/aws-sdk-go-v2/service/sso v1.11.23 h1:pwvCchFUEnlceKIgPUouBJwK81aCkQ8UDMORfeFtW10=
github.com/aws/aws-sdk-go-v2/service/sso v1.11.23/go.mod h1:/w0eg9IhFGjGyyncHIQrXtU8wvNsTJOP0R6PPj0wf80=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.5 h1:GUnZ62TevLqIoDyHeiWj2P7EqaosgakBKVvWriIdLQY=
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.13.5/go.mod h1:csZuQY65DAdFBt1oIjO5hhBR49kQqop4+lcuCjf2arA=
github.com/aws/aws-sdk-go-v2/service/sts v1.16.19 h1:9pPi0PsFNAGILFfPCk8Y0iyEBGc6lu6OQ97U7hmdesg=
github.com/aws/aws-sdk-go-v2/service/sts v1.16.19/go.mod h1:h4J3oPZQbxLhzGnk+j9dfYHi5qIOVJ5kczZd658/ydM=
github.com/aws/smithy-go v1.13.3 h1:l7LYxGuzK6/K+NzJ2mC+VvLUbae0sL3bXU//04MkmnA=
github.com/aws/smithy-go v1.13.3/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA=
github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k=
github.com/aymanbagabas/go-osc52/v2 v2.0.1/go.mod h1:uYgXzlJ7ZpABp8OJ+exZzJJhRNQ2ASbcXHWsFqH8hp8=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932 h1:mXoPYz/Ul5HYEDvkta6I8/rnYM5gSdSV2tJ6XbZuEtY=
github.com/bitly/go-hostpool v0.0.0-20171023180738-a3a6125de932/go.mod h1:NOuUCSz6Q9T7+igc/hlvDOUdtWKryOrtFyIVABv/p7k=
github.com/bkaradzic/go-lz4 v1.0.0 h1:RXc4wYsyz985CkXXeX04y4VnZFGG8Rd43pRaHsOXAKk=
github.com/bkaradzic/go-lz4 v1.0.0/go.mod h1:0YdlkowM3VswSROI7qDxhRvJ3sLhlFrRRwjwegp5jy4=
github.com/bkielbasa/cyclop v1.2.3 h1:faIVMIGDIANuGPWH031CZJTi2ymOQBULs9H21HSMa5w=
github.com/bkielbasa/cyclop v1.2.3/go.mod h1:kHTwA9Q0uZqOADdupvcFJQtp/ksSnytRMe8ztxG8Fuo=
github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M=
github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869 h1:DDGfHa7BWjL4YnC6+E63dPcxHo2sUxDIu8g3QgEJdRY=
github.com/bmizerany/assert v0.0.0-20160611221934-b7ed37b82869/go.mod h1:Ekp36dRnpXw/yCqJaO+ZrUyxD+3VXMFFr56k5XYrpB4=
github.com/bombsimon/wsl/v4 v4.7.0 h1:1Ilm9JBPRczjyUs6hvOPKvd7VL1Q++PL8M0SXBDf+jQ=
github.com/bombsimon/wsl/v4 v4.7.0/go.mod h1:uV/+6BkffuzSAVYD+yGyld1AChO7/EuLrCF/8xTiapg=
github.com/bombsimon/wsl/v5 v5.6.0 h1:4z+/sBqC5vUmSp1O0mS+czxwH9+LKXtCWtHH9rZGQL8=
github.com/bombsimon/wsl/v5 v5.6.0/go.mod h1:Uqt2EfrMj2NV8UGoN1f1Y3m0NpUVCsUdrNCdet+8LvU=
github.com/boombuler/barcode v1.0.0/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/boombuler/barcode v1.0.1/go.mod h1:paBWMcWSl3LHKBqUq+rly7CNSldXjb2rDl3JlRe0mD8=
github.com/breml/bidichk v0.3.3 h1:WSM67ztRusf1sMoqH6/c4OBCUlRVTKq+CbSeo0R17sE=
github.com/breml/bidichk v0.3.3/go.mod h1:ISbsut8OnjB367j5NseXEGGgO/th206dVa427kR8YTE=
github.com/breml/errchkjson v0.4.1 h1:keFSS8D7A2T0haP9kzZTi7o26r7kE3vymjZNeNDRDwg=
github.com/breml/errchkjson v0.4.1/go.mod h1:a23OvR6Qvcl7DG/Z4o0el6BRAjKnaReoPQFciAl9U3s=
github.com/butuzov/ireturn v0.4.0 h1:+s76bF/PfeKEdbG8b54aCocxXmi0wvYdOVsWxVO7n8E=
github.com/butuzov/ireturn v0.4.0/go.mod h1:ghI0FrCmap8pDWZwfPisFD1vEc56VKH4NpQUxDHta70=
github.com/butuzov/mirror v1.3.0 h1:HdWCXzmwlQHdVhwvsfBb2Au0r3HyINry3bDWLYXiKoc=
github.com/butuzov/mirror v1.3.0/go.mod h1:AEij0Z8YMALaq4yQj9CPPVYOyJQyiexpQEQgihajRfI=
github.com/caarlos0/env/v11 v11.4.0 h1:Kcb6t5kIIr4XkoQC9AF2j+8E1Jsrl3Wz/hhm1LtoGAc=
github.com/caarlos0/env/v11 v11.4.0/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U=
github.com/catenacyber/perfsprint v0.10.1 h1:u7Riei30bk46XsG8nknMhKLXG9BcXz3+3tl/WpKm0PQ=
github.com/catenacyber/perfsprint v0.10.1/go.mod h1:DJTGsi/Zufpuus6XPGJyKOTMELe347o6akPvWG9Zcsc=
github.com/ccojocar/zxcvbn-go v1.0.4 h1:FWnCIRMXPj43ukfX000kvBZvV6raSxakYr1nzyNrUcc=
github.com/ccojocar/zxcvbn-go v1.0.4/go.mod h1:3GxGX+rHmueTUMvm5ium7irpyjmm7ikxYFOSJB21Das=
github.com/cenkalti/backoff/v4 v4.1.2 h1:6Yo7N8UP2K6LWZnW94DLVSSrbobcWdVzAYOisuDPIFo=
github.com/cenkalti/backoff/v4 v4.1.2/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw=
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.3.0/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw=
github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/cespare/xxhash/v2 v2.3.0 h1:UL815xU9SqsFlibzuggzjXhog7bL6oX9BbNZnL2UFvs=
github.com/cespare/xxhash/v2 v2.3.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
github.com/charithe/durationcheck v0.0.11 h1:g1/EX1eIiKS57NTWsYtHDZ/APfeXKhye1DidBcABctk=
github.com/charithe/durationcheck v0.0.11/go.mod h1:x5iZaixRNl8ctbM+3B2RrPG5t856TxRyVQEnbIEM2X4=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc h1:4pZI35227imm7yK2bGPcfpFEmuY1gc2YSTShr4iJBfs=
github.com/charmbracelet/colorprofile v0.2.3-0.20250311203215-f60798e515dc/go.mod h1:X4/0JoqgTIPSFcRA/P6INZzIuyqdFY5rm8tb41s9okk=
github.com/charmbracelet/lipgloss v1.1.0 h1:vYXsiLHVkK7fp74RkV7b2kq9+zDLoEU4MZoFqR/noCY=
github.com/charmbracelet/lipgloss v1.1.0/go.mod h1:/6Q8FR2o+kj8rz4Dq0zQc3vYf7X+B0binUUBwA0aL30=
github.com/charmbracelet/x/ansi v0.10.1 h1:rL3Koar5XvX0pHGfovN03f5cxLbCF2YvLeyz7D2jVDQ=
github.com/charmbracelet/x/ansi v0.10.1/go.mod h1:3RQDQ6lDnROptfpWuUVIUG64bD2g2BgntdxH0Ya5TeE=
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd h1:vy0GVL4jeHEwG5YOXDmi86oYw2yuYUGqz6a8sLwg0X8=
github.com/charmbracelet/x/cellbuf v0.0.13-0.20250311204145-2c3ea96c31dd/go.mod h1:xe0nKWGd3eJgtqZRaN9RjMtK7xUYchjzPr7q6kcvCCs=
github.com/charmbracelet/x/term v0.2.1 h1:AQeHeLZ1OqSXhrAWpYUtZyX1T3zVxfpZuEQMIQaGIAQ=
github.com/charmbracelet/x/term v0.2.1/go.mod h1:oQ4enTYFV7QN4m0i9mzHrViD7TQKvNEEkHUMCmsxdUg=
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
github.com/ckaznocha/intrange v0.3.1 h1:j1onQyXvHUsPWujDH6WIjhyH26gkRt/txNlV7LspvJs=
github.com/ckaznocha/intrange v0.3.1/go.mod h1:QVepyz1AkUoFQkpEqksSYpNpUo3c5W7nWh/s6SHIJJk=
github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
github.com/clipperhouse/uax29/v2 v2.7.0 h1:+gs4oBZ2gPfVrKPthwbMzWZDaAFPGYK72F0NJv2v7Vk=
github.com/clipperhouse/uax29/v2 v2.7.0/go.mod h1:EFJ2TJMRUaplDxHKj1qAEhCtQPW2tJSwu5BF98AuoVM=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58 h1:F1EaeKL/ta07PY/k9Os/UFtwERei2/XzGemhpGnBKNg=
github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80=
github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGXZJjfX53e64911xZQV5JYwmTeXPW+k8Sc=
github.com/cncf/udpa/go v0.0.0-20200629203442-efcf912fb354/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20201120205902-5459f2c99403/go.mod h1:WmhPx2Nbnhtbo57+VJT5O0JRkEi1Wbu0z5j0R8u5Hbk=
github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI=
github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211001041855-01bcc9b48dfe/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20220314180256-7f1daf1720fc/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20230105202645-06c439db220b/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20230607035331-e9ce68804cb4/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs=
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5 h1:6xNmx7iTtyBRev0+D/Tv1FZd4SCg8axKApyNyRsAt/w=
github.com/cncf/xds/go v0.0.0-20251210132809-ee656c7534f5/go.mod h1:KdCmV+x/BuvyMxRnYBlmVaq4OLiKW6iRQfvC62cvdkI=
github.com/cockroachdb/apd v1.1.0 h1:3LFP3629v+1aKXU5Q37mxmRxX/pIu1nijXydLShEq5I=
github.com/cockroachdb/apd v1.1.0/go.mod h1:8Sl8LxpKi29FqWXR16WEFZRNSz3SoPzUzeMeY4+DwBQ=
github.com/cockroachdb/cockroach-go/v2 v2.1.1 h1:3XzfSMuUT0wBe1a3o5C0eOTcArhmmFAg2Jzh/7hhKqo=
github.com/cockroachdb/cockroach-go/v2 v2.1.1/go.mod h1:7NtUnP6eK+l6k483WSYNrq3Kb23bWV10IRV1TyeSpwM=
github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI=
github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M=
github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE=
github.com/containerd/errdefs/pkg v0.3.0/go.mod h1:NJw6s9HwNuRhnjJhM7pylWwMyAkmCQvQ4GpJHEqRLVk=
github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd v0.0.0-20190719114852-fd7a80b32e1f/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/cpuguy83/go-md2man/v2 v2.0.0-20190314233015-f79a8a8ca69d/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
github.com/cpuguy83/go-md2man/v2 v2.0.6 h1:XJtiaUW6dEEqVuZiMTn1ldk455QWwEIsMIJlo5vtkx0=
github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g=
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
github.com/curioswitch/go-reassign v0.3.0 h1:dh3kpQHuADL3cobV/sSGETA8DOv457dwl+fbBAhrQPs=
github.com/curioswitch/go-reassign v0.3.0/go.mod h1:nApPCCTtqLJN/s8HfItCcKV0jIPwluBOvZP+dsJGA88=
github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369 h1:XNT/Zf5l++1Pyg08/HV04ppB0gKxAqtZQBRYiYrUuYk=
github.com/cznic/mathutil v0.0.0-20180504122225-ca4c9f2c1369/go.mod h1:e6NPNENfs9mPDVNRekM7lKScauxd5kXTr1Mfyig6TDM=
github.com/daixiang0/gci v0.14.0 h1:h6AcLqmjIOBgojhtzY2CvBnA6RawPTkBHgtMvYD5YZ8=
github.com/daixiang0/gci v0.14.0/go.mod h1:w9E+SWQ4aPQ+xYPUdqitGDoXpT4mayqOfk7Szz2U6wQ=
github.com/danieljoos/wincred v1.1.2 h1:QLdCxFs1/Yl4zduvBdcHB8goaYk9RARS2SgLLRuAyr0=
github.com/danieljoos/wincred v1.1.2/go.mod h1:GijpziifJoIBfYh+S7BbkdUTU4LfM+QnGqR5Vl2tAx0=
github.com/dave/dst v0.27.3 h1:P1HPoMza3cMEquVf9kKy8yXsFirry4zEnWOdYPOoIzY=
github.com/dave/dst v0.27.3/go.mod h1:jHh6EOibnHgcUW3WjKHisiooEkYwqpHLBSX1iOBhEyc=
github.com/dave/jennifer v1.7.1 h1:B4jJJDHelWcDhlRQxWeo0Npa/pYKBLrirAQoTN45txo=
github.com/dave/jennifer v1.7.1/go.mod h1:nXbxhEmQfOZhWml3D1cDK5M1FLnMSozpbFN/m3RmGZc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/denis-tingaikin/go-header v0.5.0 h1:SRdnP5ZKvcO9KKRP1KJrhFR3RrlGuD+42t4429eC9k8=
github.com/denis-tingaikin/go-header v0.5.0/go.mod h1:mMenU5bWrok6Wl2UsZjy+1okegmwQ3UgWl4V1D8gjlY=
github.com/dhui/dktest v0.4.6 h1:+DPKyScKSEp3VLtbMDHcUq6V5Lm5zfZZVb0Sk7Ahom4=
github.com/dhui/dktest v0.4.6/go.mod h1:JHTSYDtKkvFNFHJKqCzVzqXecyv+tKt8EzceOmQOgbU=
github.com/distribution/reference v0.6.0 h1:0IXCQ5g4/QMHHkarYzh5l+u8T3t73zM5QvfrDyIgxBk=
github.com/distribution/reference v0.6.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E=
github.com/dlclark/regexp2 v1.11.5 h1:Q/sSnsKerHeCkc/jSTNq1oCm7KiVgUMZRDUoRu0JQZQ=
github.com/dlclark/regexp2 v1.11.5/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/dnaeon/go-vcr v1.1.0/go.mod h1:M7tiix8f0r6mKKJ3Yq/kqU1OYf3MnfmBWVbPx/yU9ko=
github.com/dnaeon/go-vcr v1.2.0 h1:zHCHvJYTMh1N7xnV7zf1m1GPBF9Ad0Jk/whtQ1663qI=
github.com/dnaeon/go-vcr v1.2.0/go.mod h1:R4UdLID7HZT3taECzJs4YgbbH6PIGXB6W/sc5OLb6RQ=
github.com/docker/docker v28.3.3+incompatible h1:Dypm25kh4rmk49v1eiVbsAtpAsYURjYkaKubwuBdxEI=
github.com/docker/docker v28.3.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk=
github.com/docker/go-connections v0.5.0 h1:USnMq7hx7gwdVZq1L49hLXaFtUdTADjXGp+uj1Br63c=
github.com/docker/go-connections v0.5.0/go.mod h1:ov60Kzw0kKElRwhNs9UlUHAE/F9Fe6GLaXnqyDdmEXc=
github.com/docker/go-units v0.5.0 h1:69rxXcBk27SvSaaxTtLh/8llcHD8vYHT7WSdRZ/jvr4=
github.com/docker/go-units v0.5.0/go.mod h1:fgPhTUdO+D/Jk86RDLlptpiXQzgHJF7gydDDbaIK4Dk=
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE=
github.com/dustin/go-humanize v1.0.0 h1:VSnTsYCnlFHaM2/igO1h6X3HA71jcobQuxemgkq4zYo=
github.com/dustin/go-humanize v1.0.0/go.mod h1:HtrtbFcZ19U5GC7JDqmcUSB87Iq5E25KnS6fMYU6eOk=
github.com/dvsekhvalnov/jose2go v1.7.0 h1:bnQc8+GMnidJZA8zc6lLEAb4xNrIqHwO+9TzqvtQZPo=
github.com/dvsekhvalnov/jose2go v1.7.0/go.mod h1:QsHjhyTlD/lAVqn/NSbVZmSCGeDehTB/mPZadG+mhXU=
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712 h1:aaQcKT9WumO6JEJcRyTqFVq4XUZiUcKR2/GI31TOcz8=
github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M=
github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4=
github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98=
github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5ynNVH9qI8YYLbd1fK2po=
github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk=
github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ=
github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0=
github.com/envoyproxy/go-control-plane v0.10.2-0.20220325020618-49ff273808a1/go.mod h1:KJwIaB5Mv44NWtYuAOFCVOjcI94vtpEz2JU/D2v6IjE=
github.com/envoyproxy/go-control-plane v0.10.3/go.mod h1:fJJn/j26vwOu972OllsvAgJJM//w9BV6Fxbg2LuVd34=
github.com/envoyproxy/go-control-plane v0.11.1-0.20230524094728-9239064ad72f/go.mod h1:sfYdkwUW4BA3PbKjySwjJy+O4Pu0h62rlqCMHNk+K+Q=
github.com/envoyproxy/go-control-plane v0.14.0 h1:hbG2kr4RuFj222B6+7T83thSPqLjwBIfQawTkC++2HA=
github.com/envoyproxy/go-control-plane v0.14.0/go.mod h1:NcS5X47pLl/hfqxU70yPwL9ZMkUlwlKxtAohpi2wBEU=
github.com/envoyproxy/go-control-plane/envoy v1.36.0 h1:yg/JjO5E7ubRyKX3m07GF3reDNEnfOboJ0QySbH736g=
github.com/envoyproxy/go-control-plane/envoy v1.36.0/go.mod h1:ty89S1YCCVruQAm9OtKeEkQLTb+Lkz0k8v9W0Oxsv98=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0 h1:/G9QYbddjL25KvtKTv3an9lx6VBE2cnb8wp1vEGNYGI=
github.com/envoyproxy/go-control-plane/ratelimit v0.1.0/go.mod h1:Wk+tMFAFbCXaJPzVVHnPgRKdUdwW/KdbRt94AzgRee4=
github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c=
github.com/envoyproxy/protoc-gen-validate v0.6.7/go.mod h1:dyJXwwfPK2VSqiB9Klm1J6romD608Ba7Hij42vrOBCo=
github.com/envoyproxy/protoc-gen-validate v0.9.1/go.mod h1:OKNgG7TCp5pF4d6XftA0++PMirau2/yoOwVac3AbF2w=
github.com/envoyproxy/protoc-gen-validate v0.10.1/go.mod h1:DRjgyB0I43LtJapqN6NiRwroiAU2PaFuvk/vjgh61ss=
github.com/envoyproxy/protoc-gen-validate v1.3.0 h1:TvGH1wof4H33rezVKWSpqKz5NXWg5VPuZ0uONDT6eb4=
github.com/envoyproxy/protoc-gen-validate v1.3.0/go.mod h1:HvYl7zwPa5mffgyeTUHA9zHIH36nmrm7oCbo4YKoSWA=
github.com/ettle/strcase v0.2.0 h1:fGNiVF21fHXpX1niBgk0aROov1LagYsOwV/xqKDKR/Q=
github.com/ettle/strcase v0.2.0/go.mod h1:DajmHElDSaX76ITe3/VHVyMin4LWSJN5Z909Wp+ED1A=
github.com/fatih/color v1.18.0 h1:S8gINlzdQ840/4pfAwic/ZE0djQEH3wM94VfqLTZcOM=
github.com/fatih/color v1.18.0/go.mod h1:4FelSpRwEGDpQ12mAdzqdOukCy4u8WUtOY6lkT/6HfU=
github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4=
github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94=
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/firefart/nonamedreturns v1.0.6 h1:vmiBcKV/3EqKY3ZiPxCINmpS431OcE1S47AQUwhrg8E=
github.com/firefart/nonamedreturns v1.0.6/go.mod h1:R8NisJnSIpvPWheCq0mNRXJok6D8h7fagJTF8EMEwCo=
github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/fogleman/gg v1.3.0/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k=
github.com/form3tech-oss/jwt-go v3.2.5+incompatible h1:/l4kBbb4/vGSsdtB5nUe8L7B9mImVMaBPw9L/0TBHU8=
github.com/form3tech-oss/jwt-go v3.2.5+incompatible/go.mod h1:pbq4aXjuKjdthFRnoDwaVPLA+WlJuPGy+QneDUgJi2k=
github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE=
github.com/frankban/quicktest v1.14.3/go.mod h1:mgiwOwqx65TmIk1wJ6Q7wvnVMocbUorkibMOrVTHZps=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY=
github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw=
github.com/fsouza/fake-gcs-server v1.17.0 h1:OeH75kBZcZa3ZE+zz/mFdJ2btt9FgqfjI7gIh9+5fvk=
github.com/fsouza/fake-gcs-server v1.17.0/go.mod h1:D1rTE4YCyHFNa99oyJJ5HyclvN/0uQR+pM/VdlL83bw=
github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo=
github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA=
github.com/gabriel-vasile/mimetype v1.4.13 h1:46nXokslUBsAJE/wMsp5gtO500a4F3Nkz9Ufpk2AcUM=
github.com/gabriel-vasile/mimetype v1.4.13/go.mod h1:d+9Oxyo1wTzWdyVUPMmXFvp4F9tea18J8ufA774AB3s=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/ghostiam/protogetter v0.3.20 h1:oW7OPFit2FxZOpmMRPP9FffU4uUpfeE/rEdE1f+MzD0=
github.com/ghostiam/protogetter v0.3.20/g
gitextract_7prstv14/
├── .dockerignore
├── .github/
│ ├── dependabot.yml
│ └── workflows/
│ └── ci.yml
├── .gitignore
├── .golangci.yml
├── Dockerfile
├── LICENSE
├── Makefile
├── README.md
├── README_CN.md
├── README_RU.md
├── cmd/
│ └── app/
│ └── main.go
├── config/
│ └── config.go
├── docker-compose-integration-test.yml
├── docker-compose.yml
├── docs/
│ ├── docs.go
│ ├── proto/
│ │ └── v1/
│ │ ├── translation.history.pb.go
│ │ ├── translation.history.proto
│ │ └── translation.history_grpc.pb.go
│ ├── swagger.json
│ └── swagger.yaml
├── go.mod
├── go.sum
├── integration-test/
│ ├── Dockerfile
│ └── integration_test.go
├── internal/
│ ├── app/
│ │ ├── app.go
│ │ └── migrate.go
│ ├── controller/
│ │ ├── amqp_rpc/
│ │ │ ├── router.go
│ │ │ └── v1/
│ │ │ ├── controller.go
│ │ │ ├── router.go
│ │ │ └── translation.go
│ │ ├── grpc/
│ │ │ ├── router.go
│ │ │ └── v1/
│ │ │ ├── controller.go
│ │ │ ├── response/
│ │ │ │ └── translation.history.go
│ │ │ ├── router.go
│ │ │ └── translation.go
│ │ ├── nats_rpc/
│ │ │ ├── router.go
│ │ │ └── v1/
│ │ │ ├── controller.go
│ │ │ ├── router.go
│ │ │ └── translation.go
│ │ └── restapi/
│ │ ├── middleware/
│ │ │ ├── logger.go
│ │ │ └── recovery.go
│ │ ├── router.go
│ │ └── v1/
│ │ ├── controller.go
│ │ ├── error.go
│ │ ├── request/
│ │ │ └── translate.go
│ │ ├── response/
│ │ │ └── error.go
│ │ ├── router.go
│ │ └── translation.go
│ ├── entity/
│ │ ├── translation.go
│ │ └── translation.history.go
│ ├── repo/
│ │ ├── contracts.go
│ │ ├── persistent/
│ │ │ └── translation_postgres.go
│ │ └── webapi/
│ │ └── translation_google.go
│ └── usecase/
│ ├── contracts.go
│ ├── mocks_repo_test.go
│ ├── mocks_usecase_test.go
│ ├── translation/
│ │ └── translation.go
│ └── translation_test.go
├── migrations/
│ ├── 20210221023242_migrate_name.down.sql
│ └── 20210221023242_migrate_name.up.sql
├── nginx/
│ └── nginx.conf
└── pkg/
├── grpcserver/
│ ├── options.go
│ └── server.go
├── httpserver/
│ ├── options.go
│ └── server.go
├── logger/
│ ├── logger.go
│ └── logger_test.go
├── nats/
│ └── nats_rpc/
│ ├── client/
│ │ ├── client.go
│ │ └── options.go
│ ├── errors.go
│ └── server/
│ ├── options.go
│ └── server.go
├── postgres/
│ ├── options.go
│ └── postgres.go
└── rabbitmq/
└── rmq_rpc/
├── client/
│ ├── client.go
│ └── options.go
├── connection.go
├── errors.go
└── server/
├── options.go
└── server.go
SYMBOL INDEX (275 symbols across 60 files)
FILE: cmd/app/main.go
function main (line 10) | func main() {
FILE: config/config.go
type Config (line 11) | type Config struct
type App (line 24) | type App struct
type HTTP (line 30) | type HTTP struct
type Log (line 36) | type Log struct
type PG (line 41) | type PG struct
type GRPC (line 47) | type GRPC struct
type RMQ (line 52) | type RMQ struct
type NATS (line 59) | type NATS struct
type Metrics (line 65) | type Metrics struct
type Swagger (line 70) | type Swagger struct
function NewConfig (line 76) | func NewConfig() (*Config, error) {
FILE: docs/docs.go
constant docTemplate (line 6) | docTemplate = `{
function init (line 177) | func init() {
FILE: docs/proto/v1/translation.history.pb.go
constant _ (line 19) | _ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
constant _ (line 21) | _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
type GetHistoryRequest (line 25) | type GetHistoryRequest struct
method Reset (line 31) | func (x *GetHistoryRequest) Reset() {
method String (line 38) | func (x *GetHistoryRequest) String() string {
method ProtoMessage (line 42) | func (*GetHistoryRequest) ProtoMessage() {}
method ProtoReflect (line 44) | func (x *GetHistoryRequest) ProtoReflect() protoreflect.Message {
method Descriptor (line 57) | func (*GetHistoryRequest) Descriptor() ([]byte, []int) {
type GetHistoryResponse (line 62) | type GetHistoryResponse struct
method Reset (line 69) | func (x *GetHistoryResponse) Reset() {
method String (line 76) | func (x *GetHistoryResponse) String() string {
method ProtoMessage (line 80) | func (*GetHistoryResponse) ProtoMessage() {}
method ProtoReflect (line 82) | func (x *GetHistoryResponse) ProtoReflect() protoreflect.Message {
method Descriptor (line 95) | func (*GetHistoryResponse) Descriptor() ([]byte, []int) {
method GetHistory (line 99) | func (x *GetHistoryResponse) GetHistory() []*TranslationHistory {
type TranslationHistory (line 107) | type TranslationHistory struct
method Reset (line 117) | func (x *TranslationHistory) Reset() {
method String (line 124) | func (x *TranslationHistory) String() string {
method ProtoMessage (line 128) | func (*TranslationHistory) ProtoMessage() {}
method ProtoReflect (line 130) | func (x *TranslationHistory) ProtoReflect() protoreflect.Message {
method Descriptor (line 143) | func (*TranslationHistory) Descriptor() ([]byte, []int) {
method GetSource (line 147) | func (x *TranslationHistory) GetSource() string {
method GetDestination (line 154) | func (x *TranslationHistory) GetDestination() string {
method GetOriginal (line 161) | func (x *TranslationHistory) GetOriginal() string {
method GetTranslation (line 168) | func (x *TranslationHistory) GetTranslation() string {
constant file_docs_proto_v1_translation_history_proto_rawDesc (line 177) | file_docs_proto_v1_translation_history_proto_rawDesc = "" +
function file_docs_proto_v1_translation_history_proto_rawDescGZIP (line 197) | func file_docs_proto_v1_translation_history_proto_rawDescGZIP() []byte {
function init (line 221) | func init() { file_docs_proto_v1_translation_history_proto_init() }
function file_docs_proto_v1_translation_history_proto_init (line 222) | func file_docs_proto_v1_translation_history_proto_init() {
FILE: docs/proto/v1/translation.history_grpc.pb.go
constant _ (line 19) | _ = grpc.SupportPackageIsVersion9
constant Translation_GetHistory_FullMethodName (line 22) | Translation_GetHistory_FullMethodName = "/grpc.v1.Translation/GetHistory"
type TranslationClient (line 30) | type TranslationClient interface
type translationClient (line 35) | type translationClient struct
method GetHistory (line 43) | func (c *translationClient) GetHistory(ctx context.Context, in *GetHis...
function NewTranslationClient (line 39) | func NewTranslationClient(cc grpc.ClientConnInterface) TranslationClient {
type TranslationServer (line 58) | type TranslationServer interface
type UnimplementedTranslationServer (line 69) | type UnimplementedTranslationServer struct
method GetHistory (line 71) | func (UnimplementedTranslationServer) GetHistory(context.Context, *Get...
method mustEmbedUnimplementedTranslationServer (line 74) | func (UnimplementedTranslationServer) mustEmbedUnimplementedTranslatio...
method testEmbeddedByValue (line 75) | func (UnimplementedTranslationServer) testEmbeddedByValue() ...
type UnsafeTranslationServer (line 80) | type UnsafeTranslationServer interface
function RegisterTranslationServer (line 84) | func RegisterTranslationServer(s grpc.ServiceRegistrar, srv TranslationS...
function _Translation_GetHistory_Handler (line 95) | func _Translation_GetHistory_Handler(srv interface{}, ctx context.Contex...
FILE: integration-test/integration_test.go
constant host (line 24) | host = "app"
constant attempts (line 25) | attempts = 20
constant httpURL (line 28) | httpURL = "http://" + host + ":8080"
constant healthPath (line 29) | healthPath = httpURL + "/healthz"
constant requestTimeout (line 30) | requestTimeout = 5 * time.Second
constant basePathV1 (line 33) | basePathV1 = httpURL + "/v1"
constant grpcURL (line 36) | grpcURL = host + ":8081"
constant rpcServerExchange (line 39) | rpcServerExchange = "rpc_server"
constant rpcClientExchange (line 40) | rpcClientExchange = "rpc_client"
constant requests (line 41) | requests = 10
constant rmqURL (line 44) | rmqURL = "amqp://guest:guest@rabbitmq:5672/"
constant natsURL (line 47) | natsURL = "nats://guest:guest@nats:4222/"
constant expectedOriginal (line 50) | expectedOriginal = "текст для перевода"
function doWebRequestWithTimeout (line 55) | func doWebRequestWithTimeout(ctx context.Context, method, url string, bo...
function getHealthCheck (line 66) | func getHealthCheck(url string) (int, error) {
function healthCheck (line 81) | func healthCheck(attempts int) error {
function TestMain (line 102) | func TestMain(m *testing.M) {
function TestHTTPDoTranslateV1 (line 115) | func TestHTTPDoTranslateV1(t *testing.T) {
function TestHTTPHistoryV1 (line 171) | func TestHTTPHistoryV1(t *testing.T) {
function TestClientGRPCV1 (line 207) | func TestClientGRPCV1(t *testing.T) {
function TestClientRMQRPCV1 (line 239) | func TestClientRMQRPCV1(t *testing.T) { //nolint: dupl,gocritic,nolintlint
function TestClientNATSRPCV1 (line 282) | func TestClientNATSRPCV1(t *testing.T) { //nolint: dupl,gocritic,nolintlint
FILE: internal/app/app.go
function Run (line 27) | func Run(cfg *config.Config) { //nolint: gocyclo,cyclop,funlen,gocritic,...
FILE: internal/app/migrate.go
constant _defaultAttempts (line 18) | _defaultAttempts = 20
constant _defaultTimeout (line 19) | _defaultTimeout = time.Second
function init (line 22) | func init() {
FILE: internal/controller/amqp_rpc/router.go
function NewRouter (line 11) | func NewRouter(t usecase.Translation, l logger.Interface) map[string]ser...
FILE: internal/controller/amqp_rpc/v1/controller.go
type V1 (line 10) | type V1 struct
FILE: internal/controller/amqp_rpc/v1/router.go
function NewTranslationRoutes (line 11) | func NewTranslationRoutes(routes map[string]server.CallHandler, t usecas...
FILE: internal/controller/amqp_rpc/v1/translation.go
method getHistory (line 11) | func (r *V1) getHistory() server.CallHandler {
FILE: internal/controller/grpc/router.go
function NewRouter (line 12) | func NewRouter(app *pbgrpc.Server, t usecase.Translation, l logger.Inter...
FILE: internal/controller/grpc/v1/controller.go
type V1 (line 11) | type V1 struct
FILE: internal/controller/grpc/v1/response/translation.history.go
function NewTranslationHistory (line 9) | func NewTranslationHistory(translationHistory entity.TranslationHistory)...
FILE: internal/controller/grpc/v1/router.go
function NewTranslationRoutes (line 12) | func NewTranslationRoutes(app *pbgrpc.Server, t usecase.Translation, l l...
FILE: internal/controller/grpc/v1/translation.go
method GetHistory (line 11) | func (r *V1) GetHistory(ctx context.Context, _ *v1.GetHistoryRequest) (*...
FILE: internal/controller/nats_rpc/router.go
function NewRouter (line 11) | func NewRouter(t usecase.Translation, l logger.Interface) map[string]ser...
FILE: internal/controller/nats_rpc/v1/controller.go
type V1 (line 10) | type V1 struct
FILE: internal/controller/nats_rpc/v1/router.go
function NewTranslationRoutes (line 11) | func NewTranslationRoutes(routes map[string]server.CallHandler, t usecas...
FILE: internal/controller/nats_rpc/v1/translation.go
method getHistory (line 11) | func (r *V1) getHistory() server.CallHandler {
FILE: internal/controller/restapi/middleware/logger.go
function buildRequestMessage (line 11) | func buildRequestMessage(ctx *fiber.Ctx) string {
function Logger (line 27) | func Logger(l logger.Interface) func(c *fiber.Ctx) error {
FILE: internal/controller/restapi/middleware/recovery.go
function buildPanicMessage (line 13) | func buildPanicMessage(ctx *fiber.Ctx, err any) string {
function logPanic (line 27) | func logPanic(l logger.Interface) func(c *fiber.Ctx, err any) {
function Recovery (line 33) | func Recovery(l logger.Interface) func(c *fiber.Ctx) error {
FILE: internal/controller/restapi/router.go
function NewRouter (line 25) | func NewRouter(app *fiber.App, cfg *config.Config, t usecase.Translation...
FILE: internal/controller/restapi/v1/controller.go
type V1 (line 10) | type V1 struct
FILE: internal/controller/restapi/v1/error.go
function errorResponse (line 8) | func errorResponse(ctx *fiber.Ctx, code int, msg string) error {
FILE: internal/controller/restapi/v1/request/translate.go
type Translate (line 3) | type Translate struct
FILE: internal/controller/restapi/v1/response/error.go
type Error (line 3) | type Error struct
FILE: internal/controller/restapi/v1/router.go
function NewTranslationRoutes (line 11) | func NewTranslationRoutes(apiV1Group fiber.Router, t usecase.Translation...
FILE: internal/controller/restapi/v1/translation.go
method history (line 20) | func (r *V1) history(ctx *fiber.Ctx) error {
method doTranslate (line 42) | func (r *V1) doTranslate(ctx *fiber.Ctx) error {
FILE: internal/entity/translation.go
type Translation (line 6) | type Translation struct
FILE: internal/entity/translation.history.go
type TranslationHistory (line 6) | type TranslationHistory struct
FILE: internal/repo/contracts.go
type TranslationRepo (line 14) | type TranslationRepo interface
type TranslationWebAPI (line 20) | type TranslationWebAPI interface
FILE: internal/repo/persistent/translation_postgres.go
constant _defaultEntityCap (line 11) | _defaultEntityCap = 64
type TranslationRepo (line 14) | type TranslationRepo struct
method GetHistory (line 24) | func (r *TranslationRepo) GetHistory(ctx context.Context) ([]entity.Tr...
method Store (line 56) | func (r *TranslationRepo) Store(ctx context.Context, t entity.Translat...
function New (line 19) | func New(pg *postgres.Postgres) *TranslationRepo {
FILE: internal/repo/webapi/translation_google.go
type TranslationWebAPI (line 11) | type TranslationWebAPI struct
method Translate (line 28) | func (t *TranslationWebAPI) Translate(translation entity.Translation) ...
function New (line 16) | func New() *TranslationWebAPI {
FILE: internal/usecase/contracts.go
type Translation (line 14) | type Translation interface
FILE: internal/usecase/mocks_repo_test.go
type MockTranslationRepo (line 21) | type MockTranslationRepo struct
method EXPECT (line 40) | func (m *MockTranslationRepo) EXPECT() *MockTranslationRepoMockRecorder {
method GetHistory (line 45) | func (m *MockTranslationRepo) GetHistory(arg0 context.Context) ([]enti...
method Store (line 60) | func (m *MockTranslationRepo) Store(arg0 context.Context, arg1 entity....
type MockTranslationRepoMockRecorder (line 28) | type MockTranslationRepoMockRecorder struct
method GetHistory (line 54) | func (mr *MockTranslationRepoMockRecorder) GetHistory(arg0 any) *gomoc...
method Store (line 68) | func (mr *MockTranslationRepoMockRecorder) Store(arg0, arg1 any) *gomo...
function NewMockTranslationRepo (line 33) | func NewMockTranslationRepo(ctrl *gomock.Controller) *MockTranslationRepo {
type MockTranslationWebAPI (line 74) | type MockTranslationWebAPI struct
method EXPECT (line 93) | func (m *MockTranslationWebAPI) EXPECT() *MockTranslationWebAPIMockRec...
method Translate (line 98) | func (m *MockTranslationWebAPI) Translate(arg0 entity.Translation) (en...
type MockTranslationWebAPIMockRecorder (line 81) | type MockTranslationWebAPIMockRecorder struct
method Translate (line 107) | func (mr *MockTranslationWebAPIMockRecorder) Translate(arg0 any) *gomo...
function NewMockTranslationWebAPI (line 86) | func NewMockTranslationWebAPI(ctrl *gomock.Controller) *MockTranslationW...
FILE: internal/usecase/mocks_usecase_test.go
type MockTranslation (line 21) | type MockTranslation struct
method EXPECT (line 40) | func (m *MockTranslation) EXPECT() *MockTranslationMockRecorder {
method History (line 45) | func (m *MockTranslation) History(arg0 context.Context) (entity.Transl...
method Translate (line 60) | func (m *MockTranslation) Translate(arg0 context.Context, arg1 entity....
type MockTranslationMockRecorder (line 28) | type MockTranslationMockRecorder struct
method History (line 54) | func (mr *MockTranslationMockRecorder) History(arg0 any) *gomock.Call {
method Translate (line 69) | func (mr *MockTranslationMockRecorder) Translate(arg0, arg1 any) *gomo...
function NewMockTranslation (line 33) | func NewMockTranslation(ctrl *gomock.Controller) *MockTranslation {
FILE: internal/usecase/translation/translation.go
type UseCase (line 12) | type UseCase struct
method History (line 26) | func (uc *UseCase) History(ctx context.Context) (entity.TranslationHis...
method Translate (line 36) | func (uc *UseCase) Translate(ctx context.Context, t entity.Translation...
function New (line 18) | func New(r repo.TranslationRepo, w repo.TranslationWebAPI) *UseCase {
FILE: internal/usecase/translation_test.go
type test (line 16) | type test struct
function translationUseCase (line 23) | func translationUseCase(t *testing.T) (*translation.UseCase, *MockTransl...
function TestHistory (line 37) | func TestHistory(t *testing.T) { //nolint:tparallel // data races here
function TestTranslate (line 75) | func TestTranslate(t *testing.T) { //nolint:tparallel // data races here
FILE: migrations/20210221023242_migrate_name.up.sql
type history (line 1) | CREATE TABLE IF NOT EXISTS history(
FILE: pkg/grpcserver/options.go
type Option (line 8) | type Option
function Port (line 11) | func Port(port string) Option {
FILE: pkg/grpcserver/server.go
constant _defaultAddr (line 15) | _defaultAddr = ":80"
type Server (line 19) | type Server struct
method Start (line 53) | func (s *Server) Start() {
method Notify (line 82) | func (s *Server) Notify() <-chan error {
method Shutdown (line 87) | func (s *Server) Shutdown() error {
function New (line 31) | func New(l logger.Interface, opts ...Option) *Server {
FILE: pkg/httpserver/options.go
type Option (line 9) | type Option
function Port (line 12) | func Port(port string) Option {
function Prefork (line 19) | func Prefork(prefork bool) Option {
function ReadTimeout (line 26) | func ReadTimeout(timeout time.Duration) Option {
function WriteTimeout (line 33) | func WriteTimeout(timeout time.Duration) Option {
function ShutdownTimeout (line 40) | func ShutdownTimeout(timeout time.Duration) Option {
FILE: pkg/httpserver/server.go
constant _defaultAddr (line 16) | _defaultAddr = ":80"
constant _defaultReadTimeout (line 17) | _defaultReadTimeout = 5 * time.Second
constant _defaultWriteTimeout (line 18) | _defaultWriteTimeout = 5 * time.Second
constant _defaultShutdownTimeout (line 19) | _defaultShutdownTimeout = 3 * time.Second
type Server (line 23) | type Server struct
method Start (line 75) | func (s *Server) Start() {
method Notify (line 93) | func (s *Server) Notify() <-chan error {
method Shutdown (line 98) | func (s *Server) Shutdown() error {
function New (line 40) | func New(l logger.Interface, opts ...Option) *Server {
FILE: pkg/logger/logger.go
type Interface (line 12) | type Interface interface
type Logger (line 21) | type Logger struct
method Debug (line 60) | func (l *Logger) Debug(message any, args ...any) {
method Info (line 65) | func (l *Logger) Info(message string, args ...any) {
method Warn (line 70) | func (l *Logger) Warn(message string, args ...any) {
method Error (line 75) | func (l *Logger) Error(message any, args ...any) {
method Fatal (line 84) | func (l *Logger) Fatal(message any, args ...any) {
method log (line 90) | func (l *Logger) log(level zerolog.Level, message string, args ...any) {
method msg (line 98) | func (l *Logger) msg(level zerolog.Level, message any, args ...any) {
function New (line 28) | func New(level string) *Logger {
FILE: pkg/logger/logger_test.go
function newBufferedLogger (line 18) | func newBufferedLogger(level string) (*Logger, *bytes.Buffer) {
function TestNewSetsGlobalLevel (line 29) | func TestNewSetsGlobalLevel(t *testing.T) {
function TestInfoAndWarn_LogMessageWithAndWithoutArgs (line 56) | func TestInfoAndWarn_LogMessageWithAndWithoutArgs(t *testing.T) {
function TestDebug_RespectsLevel (line 81) | func TestDebug_RespectsLevel(t *testing.T) {
function TestError_LogsErrorAndDebugWhenDebugLevel (line 106) | func TestError_LogsErrorAndDebugWhenDebugLevel(t *testing.T) {
function TestMsg_TypeSwitch (line 138) | func TestMsg_TypeSwitch(t *testing.T) {
function TestFatal_ExitsAndLogs (line 170) | func TestFatal_ExitsAndLogs(t *testing.T) {
FILE: pkg/nats/nats_rpc/client/client.go
constant _defaultWaitTime (line 15) | _defaultWaitTime = 5 * time.Second
constant _defaultAttempts (line 16) | _defaultAttempts = 10
constant _defaultTimeout (line 17) | _defaultTimeout = 2 * time.Second
type Client (line 21) | type Client struct
method Shutdown (line 61) | func (c *Client) Shutdown() error {
method RemoteCall (line 68) | func (c *Client) RemoteCall(handler string, request, response any) err...
function New (line 29) | func New(
FILE: pkg/nats/nats_rpc/client/options.go
type Option (line 6) | type Option
function Timeout (line 9) | func Timeout(timeout time.Duration) Option {
FILE: pkg/nats/nats_rpc/errors.go
constant Success (line 15) | Success = "success"
FILE: pkg/nats/nats_rpc/server/options.go
type Option (line 6) | type Option
function Timeout (line 9) | func Timeout(timeout time.Duration) Option {
FILE: pkg/nats/nats_rpc/server/server.go
constant _defaultWaitTime (line 18) | _defaultWaitTime = 5 * time.Second
constant _defaultAttempts (line 19) | _defaultAttempts = 10
constant _defaultTimeout (line 20) | _defaultTimeout = 2 * time.Second
type CallHandler (line 24) | type CallHandler
type Server (line 27) | type Server struct
method Start (line 85) | func (s *Server) Start() {
method Notify (line 106) | func (s *Server) Notify() <-chan error {
method Shutdown (line 111) | func (s *Server) Shutdown() error {
method subscribe (line 142) | func (s *Server) subscribe() error {
method handleMessage (line 153) | func (s *Server) handleMessage(msg *nats.Msg) {
method publish (line 184) | func (s *Server) publish(msg *nats.Msg, body []byte, status string) {
function New (line 44) | func New(
FILE: pkg/postgres/options.go
type Option (line 6) | type Option
function MaxPoolSize (line 9) | func MaxPoolSize(size int) Option {
function ConnAttempts (line 16) | func ConnAttempts(attempts int) Option {
function ConnTimeout (line 23) | func ConnTimeout(timeout time.Duration) Option {
FILE: pkg/postgres/postgres.go
constant _defaultMaxPoolSize (line 15) | _defaultMaxPoolSize = 1
constant _defaultConnAttempts (line 16) | _defaultConnAttempts = 10
constant _defaultConnTimeout (line 17) | _defaultConnTimeout = time.Second
type Postgres (line 21) | type Postgres struct
method Close (line 73) | func (p *Postgres) Close() {
function New (line 31) | func New(url string, opts ...Option) (*Postgres, error) {
FILE: pkg/rabbitmq/rmq_rpc/client/client.go
constant _defaultWaitTime (line 21) | _defaultWaitTime = 5 * time.Second
constant _defaultAttempts (line 22) | _defaultAttempts = 10
constant _defaultTimeout (line 23) | _defaultTimeout = 2 * time.Second
type Message (line 27) | type Message struct
type pendingCall (line 36) | type pendingCall struct
type Client (line 43) | type Client struct
method Shutdown (line 96) | func (c *Client) Shutdown() error {
method RemoteCall (line 118) | func (c *Client) RemoteCall(handler string, request, response any) err...
method preRemoteCallWait (line 158) | func (c *Client) preRemoteCallWait() error {
method remoteCallWait (line 172) | func (c *Client) remoteCallWait(call *pendingCall) error {
method start (line 191) | func (c *Client) start() {
method handleMessages (line 206) | func (c *Client) handleMessages() error {
method reconnect (line 228) | func (c *Client) reconnect() error {
method serveCall (line 232) | func (c *Client) serveCall(d *amqp.Delivery) {
method getCall (line 245) | func (c *Client) getCall(corrID string) (*pendingCall, bool) {
method addCall (line 254) | func (c *Client) addCall(corrID string, call *pendingCall) {
method deleteCall (line 261) | func (c *Client) deleteCall(corrID string) {
method ack (line 268) | func (c *Client) ack(d *amqp.Delivery, multiple bool) {
method publish (line 272) | func (c *Client) publish(corrID, handler string, request any) error {
function New (line 59) | func New(url, serverExchange, clientExchange string, opts ...Option) (*C...
FILE: pkg/rabbitmq/rmq_rpc/client/options.go
type Option (line 6) | type Option
function Timeout (line 9) | func Timeout(timeout time.Duration) Option {
function ConnWaitTime (line 16) | func ConnWaitTime(timeout time.Duration) Option {
function ConnAttempts (line 23) | func ConnAttempts(attempts int) Option {
FILE: pkg/rabbitmq/rmq_rpc/connection.go
type Config (line 12) | type Config struct
type Connection (line 19) | type Connection struct
method AttemptConnect (line 38) | func (c *Connection) AttemptConnect() error {
method connect (line 56) | func (c *Connection) connect() error {
function New (line 28) | func New(consumerExchange string, cfg Config) *Connection {
FILE: pkg/rabbitmq/rmq_rpc/errors.go
constant Success (line 15) | Success = "success"
FILE: pkg/rabbitmq/rmq_rpc/server/options.go
type Option (line 6) | type Option
function Timeout (line 9) | func Timeout(timeout time.Duration) Option {
function ConnWaitTime (line 16) | func ConnWaitTime(timeout time.Duration) Option {
function ConnAttempts (line 23) | func ConnAttempts(attempts int) Option {
FILE: pkg/rabbitmq/rmq_rpc/server/server.go
constant _defaultWaitTime (line 18) | _defaultWaitTime = 5 * time.Second
constant _defaultAttempts (line 19) | _defaultAttempts = 10
constant _defaultTimeout (line 20) | _defaultTimeout = 2 * time.Second
type CallHandler (line 24) | type CallHandler
type Server (line 27) | type Server struct
method Start (line 77) | func (s *Server) Start() {
method Notify (line 95) | func (s *Server) Notify() <-chan error {
method Shutdown (line 100) | func (s *Server) Shutdown() error {
method handleMessages (line 127) | func (s *Server) handleMessages() error {
method reconnect (line 149) | func (s *Server) reconnect() error {
method serveCall (line 153) | func (s *Server) serveCall(d *amqp.Delivery) {
method ack (line 180) | func (s *Server) ack(d *amqp.Delivery, multiple bool) {
method publish (line 187) | func (s *Server) publish(d *amqp.Delivery, body []byte, status string) {
function New (line 42) | func New(url, serverExchange string, router map[string]CallHandler, l lo...
Condensed preview — 81 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (464K chars).
[
{
"path": ".dockerignore",
"chars": 143,
"preview": ".idea\n.git\n.github\nnginx\n\n.dockerignore\n.env\n.env.example\n.golangci.yml\n.gitignore\n\ncoverage.txt\n\ndocker-compose.yml\n\nLI"
},
{
"path": ".github/dependabot.yml",
"chars": 589,
"preview": "version: 2\n\n\nupdates:\n - package-ecosystem: gomod\n directory: \"/\"\n schedule:\n interval: daily\n time: \"0"
},
{
"path": ".github/workflows/ci.yml",
"chars": 2153,
"preview": "name: CI\non: pull_request\n\njobs:\n golangci-lint:\n name: runner / golangci-lint\n runs-on: ubuntu-latest\n steps:"
},
{
"path": ".gitignore",
"chars": 322,
"preview": "# IDE\n.idea\n.vscode\n\n# Config\n.env\n\n# Binaries for programs and plugins\n*.exe\n*.exe~\n*.dll\n*.so\n*.dylib\nbin/\n\n# Test bin"
},
{
"path": ".golangci.yml",
"chars": 2233,
"preview": "version: \"2\"\n\nlinters:\n default: none\n enable:\n - wsl_v5\n - asciicheck\n - bodyclose\n - copyloopvar\n - c"
},
{
"path": "Dockerfile",
"chars": 587,
"preview": "# Step 1: Modules caching\nFROM golang:1.26-alpine3.23 AS modules\n\nCOPY go.mod go.sum /modules/\n\nWORKDIR /modules\n\nRUN go"
},
{
"path": "LICENSE",
"chars": 1080,
"preview": "MIT License\n\nCopyright (c) 2021 Evrone <mail@evrone.com>\n\nPermission is hereby granted, free of charge, to any person ob"
},
{
"path": "Makefile",
"chars": 3648,
"preview": "ifneq ($(wildcard .env),)\ninclude .env\nexport\nelse\n$(warning WARNING: .env file not found! Using .env.example)\ninclude ."
},
{
"path": "README.md",
"chars": 15279,
"preview": "\n\n# Go Clean template\n\n[🇨🇳 中文](README_CN.md)\n[🇷🇺 RU](README_RU.md)\n\nClean Archite"
},
{
"path": "README_CN.md",
"chars": 9440,
"preview": "\n\n# Go 整洁模板\n\ngolang服务的整洁架构模板\n\n[\n\n# Go Чистая Архитектура\n\nШаблон Чистой Архитектуры для приложений на Golang\n\n[!"
},
{
"path": "cmd/app/main.go",
"chars": 279,
"preview": "package main\n\nimport (\n\t\"log\"\n\n\t\"github.com/evrone/go-clean-template/config\"\n\t\"github.com/evrone/go-clean-template/inter"
},
{
"path": "config/config.go",
"chars": 1494,
"preview": "package config\n\nimport (\n\t\"fmt\"\n\n\t\"github.com/caarlos0/env/v11\"\n)\n\ntype (\n\t// Config -.\n\tConfig struct {\n\t\tApp App\n\t"
},
{
"path": "docker-compose-integration-test.yml",
"chars": 349,
"preview": "version: \"3.9\"\n\n\nservices:\n integration-test:\n container_name: integration-test\n platform: linux/amd64\n pid: \""
},
{
"path": "docker-compose.yml",
"chars": 2720,
"preview": "version: \"3.9\"\n\n\nx-db-environment: &x-db-environment\n POSTGRES_SSL_MODE: \"disable\"\n POSTGRES_HOST: \"db\"\n POSTGRES_POR"
},
{
"path": "docs/docs.go",
"chars": 5465,
"preview": "// Package docs Code generated by swaggo/swag. DO NOT EDIT\npackage docs\n\nimport \"github.com/swaggo/swag\"\n\nconst docTempl"
},
{
"path": "docs/proto/v1/translation.history.pb.go",
"chars": 8205,
"preview": "// Code generated by protoc-gen-go. DO NOT EDIT.\n// versions:\n// \tprotoc-gen-go v1.36.11\n// \tprotoc v6.33.0\n// so"
},
{
"path": "docs/proto/v1/translation.history.proto",
"chars": 629,
"preview": "syntax = \"proto3\";\n\npackage grpc.v1;\n\noption go_package = \"docs/proto/v1\";\n\n// The Translation service definition.\nservi"
},
{
"path": "docs/proto/v1/translation.history_grpc.pb.go",
"chars": 4684,
"preview": "// Code generated by protoc-gen-go-grpc. DO NOT EDIT.\n// versions:\n// - protoc-gen-go-grpc v1.6.1\n// - protoc "
},
{
"path": "docs/swagger.json",
"chars": 4798,
"preview": "{\n \"swagger\": \"2.0\",\n \"info\": {\n \"description\": \"Using a translation service as an example\",\n \"title"
},
{
"path": "docs/swagger.yaml",
"chars": 2413,
"preview": "basePath: /v1\ndefinitions:\n entity.Translation:\n properties:\n destination:\n example: en\n type: st"
},
{
"path": "go.mod",
"chars": 22586,
"preview": "module github.com/evrone/go-clean-template\n\ngo 1.26\n\ntool (\n\tgithub.com/daixiang0/gci\n\tgithub.com/golang-migrate/migrate"
},
{
"path": "go.sum",
"chars": 263135,
"preview": "4d63.com/gocheckcompilerdirectives v1.3.0 h1:Ew5y5CtcAAQeTVKUVFrE7EwHMrTO6BggtEj8BZSjZ3A=\n4d63.com/gocheckcompilerdirect"
},
{
"path": "integration-test/Dockerfile",
"chars": 386,
"preview": "# Step 1: Modules caching\nFROM golang:1.26-alpine3.23 AS modules\n\nCOPY go.mod go.sum /modules/\n\nWORKDIR /modules\n\nRUN go"
},
{
"path": "integration-test/integration_test.go",
"chars": 7854,
"preview": "package integration_test\n\nimport (\n\t\"bytes\"\n\t\"context\"\n\t\"fmt\"\n\t\"io\"\n\t\"log\"\n\t\"net/http\"\n\t\"os\"\n\t\"testing\"\n\t\"time\"\n\n\tprotov"
},
{
"path": "internal/app/app.go",
"chars": 3452,
"preview": "// Package app configures and runs application.\npackage app\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"os/signal\"\n\t\"syscall\"\n\n\t\"github.com"
},
{
"path": "internal/app/migrate.go",
"chars": 1180,
"preview": "//go:build migrate\n\npackage app\n\nimport (\n\t\"errors\"\n\t\"log\"\n\t\"os\"\n\t\"time\"\n\n\t\"github.com/golang-migrate/migrate/v4\"\n\t// mi"
},
{
"path": "internal/controller/amqp_rpc/router.go",
"chars": 489,
"preview": "package v1\n\nimport (\n\tv1 \"github.com/evrone/go-clean-template/internal/controller/amqp_rpc/v1\"\n\t\"github.com/evrone/go-cl"
},
{
"path": "internal/controller/amqp_rpc/v1/controller.go",
"chars": 266,
"preview": "package v1\n\nimport (\n\t\"github.com/evrone/go-clean-template/internal/usecase\"\n\t\"github.com/evrone/go-clean-template/pkg/l"
},
{
"path": "internal/controller/amqp_rpc/v1/router.go",
"chars": 506,
"preview": "package v1\n\nimport (\n\t\"github.com/evrone/go-clean-template/internal/usecase\"\n\t\"github.com/evrone/go-clean-template/pkg/l"
},
{
"path": "internal/controller/amqp_rpc/v1/translation.go",
"chars": 480,
"preview": "package v1\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/evrone/go-clean-template/pkg/rabbitmq/rmq_rpc/server\"\n\tamqp \"github"
},
{
"path": "internal/controller/grpc/router.go",
"chars": 440,
"preview": "package grpc\n\nimport (\n\tv1 \"github.com/evrone/go-clean-template/internal/controller/grpc/v1\"\n\t\"github.com/evrone/go-clea"
},
{
"path": "internal/controller/grpc/v1/controller.go",
"chars": 345,
"preview": "package v1\n\nimport (\n\tv1 \"github.com/evrone/go-clean-template/docs/proto/v1\"\n\t\"github.com/evrone/go-clean-template/inter"
},
{
"path": "internal/controller/grpc/v1/response/translation.history.go",
"chars": 606,
"preview": "package response\n\nimport (\n\tv1 \"github.com/evrone/go-clean-template/docs/proto/v1\"\n\t\"github.com/evrone/go-clean-template"
},
{
"path": "internal/controller/grpc/v1/router.go",
"chars": 506,
"preview": "package v1\n\nimport (\n\tv1 \"github.com/evrone/go-clean-template/docs/proto/v1\"\n\t\"github.com/evrone/go-clean-template/inter"
},
{
"path": "internal/controller/grpc/v1/translation.go",
"chars": 515,
"preview": "package v1\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\tv1 \"github.com/evrone/go-clean-template/docs/proto/v1\"\n\t\"github.com/evrone/go-c"
},
{
"path": "internal/controller/nats_rpc/router.go",
"chars": 486,
"preview": "package v1\n\nimport (\n\tv1 \"github.com/evrone/go-clean-template/internal/controller/nats_rpc/v1\"\n\t\"github.com/evrone/go-cl"
},
{
"path": "internal/controller/nats_rpc/v1/controller.go",
"chars": 266,
"preview": "package v1\n\nimport (\n\t\"github.com/evrone/go-clean-template/internal/usecase\"\n\t\"github.com/evrone/go-clean-template/pkg/l"
},
{
"path": "internal/controller/nats_rpc/v1/router.go",
"chars": 503,
"preview": "package v1\n\nimport (\n\t\"github.com/evrone/go-clean-template/internal/usecase\"\n\t\"github.com/evrone/go-clean-template/pkg/l"
},
{
"path": "internal/controller/nats_rpc/v1/translation.go",
"chars": 463,
"preview": "package v1\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/evrone/go-clean-template/pkg/nats/nats_rpc/server\"\n\t\"github.com/nat"
},
{
"path": "internal/controller/restapi/middleware/logger.go",
"chars": 752,
"preview": "package middleware\n\nimport (\n\t\"strconv\"\n\t\"strings\"\n\n\t\"github.com/evrone/go-clean-template/pkg/logger\"\n\t\"github.com/gofib"
},
{
"path": "internal/controller/restapi/middleware/recovery.go",
"chars": 964,
"preview": "package middleware\n\nimport (\n\t\"fmt\"\n\t\"runtime/debug\"\n\t\"strings\"\n\n\t\"github.com/evrone/go-clean-template/pkg/logger\"\n\t\"git"
},
{
"path": "internal/controller/restapi/router.go",
"chars": 1424,
"preview": "// Package v1 implements routing paths. Each services in own file.\npackage restapi\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/a"
},
{
"path": "internal/controller/restapi/v1/controller.go",
"chars": 266,
"preview": "package v1\n\nimport (\n\t\"github.com/evrone/go-clean-template/internal/usecase\"\n\t\"github.com/evrone/go-clean-template/pkg/l"
},
{
"path": "internal/controller/restapi/v1/error.go",
"chars": 259,
"preview": "package v1\n\nimport (\n\t\"github.com/evrone/go-clean-template/internal/controller/restapi/v1/response\"\n\t\"github.com/gofiber"
},
{
"path": "internal/controller/restapi/v1/request/translate.go",
"chars": 289,
"preview": "package request\n\ntype Translate struct {\n\tSource string `json:\"source\" validate:\"required\" example:\"auto\"`\n\t"
},
{
"path": "internal/controller/restapi/v1/response/error.go",
"chars": 87,
"preview": "package response\n\ntype Error struct {\n\tError string `json:\"error\" example:\"message\"`\n}\n"
},
{
"path": "internal/controller/restapi/v1/router.go",
"chars": 571,
"preview": "package v1\n\nimport (\n\t\"github.com/evrone/go-clean-template/internal/usecase\"\n\t\"github.com/evrone/go-clean-template/pkg/l"
},
{
"path": "internal/controller/restapi/v1/translation.go",
"chars": 2054,
"preview": "package v1\n\nimport (\n\t\"net/http\"\n\n\t\"github.com/evrone/go-clean-template/internal/controller/restapi/v1/request\"\n\t\"github"
},
{
"path": "internal/entity/translation.go",
"chars": 488,
"preview": "// Package entity defines main entities for business logic (services), data base mapping and\n// HTTP response objects if"
},
{
"path": "internal/entity/translation.history.go",
"chars": 286,
"preview": "// Package entity defines main entities for business logic (services), data base mapping and\n// HTTP response objects if"
},
{
"path": "internal/repo/contracts.go",
"chars": 585,
"preview": "// Package repo implements application outer layer logic. Each logic group in own file.\npackage repo\n\nimport (\n\t\"context"
},
{
"path": "internal/repo/persistent/translation_postgres.go",
"chars": 1692,
"preview": "package persistent\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/evrone/go-clean-template/internal/entity\"\n\t\"github.com/evro"
},
{
"path": "internal/repo/webapi/translation_google.go",
"chars": 939,
"preview": "package webapi\n\nimport (\n\t\"fmt\"\n\n\ttranslator \"github.com/Conight/go-googletrans\"\n\t\"github.com/evrone/go-clean-template/i"
},
{
"path": "internal/usecase/contracts.go",
"chars": 483,
"preview": "// Package usecase implements application business logic. Each logic group in own file.\npackage usecase\n\nimport (\n\t\"cont"
},
{
"path": "internal/usecase/mocks_repo_test.go",
"chars": 3631,
"preview": "// Code generated by MockGen. DO NOT EDIT.\n// Source: ./internal/repo/contracts.go\n//\n// Generated by this command:\n//\n/"
},
{
"path": "internal/usecase/mocks_usecase_test.go",
"chars": 2271,
"preview": "// Code generated by MockGen. DO NOT EDIT.\n// Source: ./internal/usecase/contracts.go\n//\n// Generated by this command:\n/"
},
{
"path": "internal/usecase/translation/translation.go",
"chars": 1243,
"preview": "package translation\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\n\t\"github.com/evrone/go-clean-template/internal/entity\"\n\t\"github.com/evr"
},
{
"path": "internal/usecase/translation_test.go",
"chars": 2867,
"preview": "package usecase_test\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"testing\"\n\n\t\"github.com/evrone/go-clean-template/internal/entity\"\n\t"
},
{
"path": "migrations/20210221023242_migrate_name.down.sql",
"chars": 29,
"preview": "DROP TABLE IF EXISTS history;"
},
{
"path": "migrations/20210221023242_migrate_name.up.sql",
"chars": 176,
"preview": "CREATE TABLE IF NOT EXISTS history(\n id serial PRIMARY KEY,\n source VARCHAR(255),\n destination VARCHAR(255),\n "
},
{
"path": "nginx/nginx.conf",
"chars": 2116,
"preview": "http\n{\n map $http_upgrade $connection_upgrade\n {\n default upgrade;\n '' close;\n }\n\n upstream ap"
},
{
"path": "pkg/grpcserver/options.go",
"chars": 194,
"preview": "package grpcserver\n\nimport (\n\t\"net\"\n)\n\n// Option -.\ntype Option func(*Server)\n\n// Port -.\nfunc Port(port string) Option "
},
{
"path": "pkg/grpcserver/server.go",
"chars": 1759,
"preview": "// Package grpcserver implements HTTP server.\npackage grpcserver\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"net\"\n\n\t\"github.com/evr"
},
{
"path": "pkg/httpserver/options.go",
"chars": 696,
"preview": "package httpserver\n\nimport (\n\t\"net\"\n\t\"time\"\n)\n\n// Option -.\ntype Option func(*Server)\n\n// Port -.\nfunc Port(port string)"
},
{
"path": "pkg/httpserver/server.go",
"chars": 2457,
"preview": "// Package httpserver implements HTTP server.\npackage httpserver\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"time\"\n\n\t\"github.com/ev"
},
{
"path": "pkg/logger/logger.go",
"chars": 2080,
"preview": "package logger\n\nimport (\n\t\"fmt\"\n\t\"os\"\n\t\"strings\"\n\n\t\"github.com/rs/zerolog\"\n)\n\n// Interface -.\ntype Interface interface {"
},
{
"path": "pkg/logger/logger_test.go",
"chars": 5333,
"preview": "package logger\n\nimport (\n\t\"bytes\"\n\t\"errors\"\n\t\"os\"\n\t\"os/exec\"\n\t\"regexp\"\n\t\"strings\"\n\t\"testing\"\n\n\t\"github.com/rs/zerolog\"\n)"
},
{
"path": "pkg/nats/nats_rpc/client/client.go",
"chars": 2084,
"preview": "package client\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\tnatsrpc \"github.com/evrone/go-clean-template/pkg/nats/nat"
},
{
"path": "pkg/nats/nats_rpc/client/options.go",
"chars": 183,
"preview": "package client\n\nimport \"time\"\n\n// Option -.\ntype Option func(*Client)\n\n// Timeout -.\nfunc Timeout(timeout time.Duration)"
},
{
"path": "pkg/nats/nats_rpc/errors.go",
"chars": 292,
"preview": "package natsrpc\n\nimport \"errors\"\n\nvar (\n\t// ErrTimeout -.\n\tErrTimeout = errors.New(\"timeout\")\n\t// ErrInternalServer -.\n\t"
},
{
"path": "pkg/nats/nats_rpc/server/options.go",
"chars": 183,
"preview": "package server\n\nimport \"time\"\n\n// Option -.\ntype Option func(*Server)\n\n// Timeout -.\nfunc Timeout(timeout time.Duration)"
},
{
"path": "pkg/nats/nats_rpc/server/server.go",
"chars": 3944,
"preview": "// Package server implements NATS RPC server.\npackage server\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github.com"
},
{
"path": "pkg/postgres/options.go",
"chars": 434,
"preview": "package postgres\n\nimport \"time\"\n\n// Option -.\ntype Option func(*Postgres)\n\n// MaxPoolSize -.\nfunc MaxPoolSize(size int) "
},
{
"path": "pkg/postgres/postgres.go",
"chars": 1523,
"preview": "// Package postgres implements postgres connection.\npackage postgres\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"githu"
},
{
"path": "pkg/rabbitmq/rmq_rpc/client/client.go",
"chars": 5845,
"preview": "package client\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"sync\"\n\t\"time\"\n\n\trmqrpc \"github.com/evrone/go-clean-template/pkg/r"
},
{
"path": "pkg/rabbitmq/rmq_rpc/client/options.go",
"chars": 433,
"preview": "package client\n\nimport \"time\"\n\n// Option -.\ntype Option func(*Client)\n\n// Timeout -.\nfunc Timeout(timeout time.Duration)"
},
{
"path": "pkg/rabbitmq/rmq_rpc/connection.go",
"chars": 1869,
"preview": "package rmqrpc\n\nimport (\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\tamqp \"github.com/rabbitmq/amqp091-go\"\n)\n\n// Config -.\ntype Config struc"
},
{
"path": "pkg/rabbitmq/rmq_rpc/errors.go",
"chars": 291,
"preview": "package rmqrpc\n\nimport \"errors\"\n\nvar (\n\t// ErrTimeout -.\n\tErrTimeout = errors.New(\"timeout\")\n\t// ErrInternalServer -.\n\tE"
},
{
"path": "pkg/rabbitmq/rmq_rpc/server/options.go",
"chars": 433,
"preview": "package server\n\nimport \"time\"\n\n// Option -.\ntype Option func(*Server)\n\n// Timeout -.\nfunc Timeout(timeout time.Duration)"
},
{
"path": "pkg/rabbitmq/rmq_rpc/server/server.go",
"chars": 3971,
"preview": "// Package server implements RabbitMQ RPC server.\npackage server\n\nimport (\n\t\"context\"\n\t\"errors\"\n\t\"fmt\"\n\t\"time\"\n\n\t\"github"
}
]
About this extraction
This page contains the full source code of the evrone/go-clean-template GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 81 files (433.4 KB), approximately 194.5k tokens, and a symbol index with 275 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.