chore: actually something working

This commit is contained in:
Tine 2024-02-01 23:09:09 +01:00
parent 839dea933b
commit 568f001ede
Signed by: mentos1386
SSH key fingerprint: SHA256:MNtTsLbihYaWF8j1fkOHfkKNlnN1JQfxEU/rBU8nCGw
32 changed files with 756 additions and 415 deletions

46
.air.toml Normal file
View file

@ -0,0 +1,46 @@
root = "."
testdata_dir = "testdata"
tmp_dir = "/tmp"
[build]
args_bin = []
bin = "/tmp/main"
cmd = "go build -o /tmp/main cmd/server.go"
delay = 1000
exclude_dir = ["assets", "tmp", "vendor", "testdata"]
exclude_file = []
exclude_regex = ["_test.go"]
exclude_unchanged = false
follow_symlink = false
full_bin = ""
include_dir = []
include_ext = ["go", "tpl", "tmpl", "html"]
include_file = []
kill_delay = "0s"
log = "build-errors.log"
poll = false
poll_interval = 0
post_cmd = []
pre_cmd = []
rerun = false
rerun_delay = 500
send_interrupt = false
stop_on_error = false
[color]
app = ""
build = "yellow"
main = "magenta"
runner = "green"
watcher = "cyan"
[log]
main_only = false
time = false
[misc]
clean_on_exit = false
[screen]
clear_on_rebuild = false
keep_scroll = true

View file

@ -1 +0,0 @@
extends: ["spectral:oas", "spectral:asyncapi"]

20
Dockerfile Normal file
View file

@ -0,0 +1,20 @@
# Base
ARG GO_VERSION=1.21
FROM golang:${GO_VERSION} as base
WORKDIR /app
COPY . .
RUN go mod download
# Development
FROM base as dev
RUN curl -sSfL https://raw.githubusercontent.com/cosmtrek/air/master/install.sh | sh -s -- -b $(go env GOPATH)/bin
CMD ["air"]
# Build
FROM base as build
RUN go build cmd/server.go
# Production
FROM gcr.io/distroless/static-debian12 as prod
COPY --from=build /app/server /
ENTRYPOINT ["/server"]

13
README.md Normal file
View file

@ -0,0 +1,13 @@
# `mentos1386/golang-rest-example`
### Development
Tools required:
* Justfile
* Docker and Docker Compose
```sh
just run
curl -v localhost:1234/healthz
```

View file

@ -289,12 +289,17 @@ components:
schemas:
Ok:
type: object
required:
- message
properties:
message:
type: string
example: OK
Error:
type: object
required:
- message
- code
properties:
message:
type: string
@ -308,6 +313,11 @@ components:
example: 1
User:
type: object
required:
- id
- name
- email
- group
properties:
id:
$ref: '#/components/schemas/Id'
@ -321,6 +331,9 @@ components:
$ref: '#/components/schemas/Group'
UserUpdate:
type: object
required:
- name
- email
properties:
name:
type: string
@ -330,6 +343,10 @@ components:
example: john@example.com
Group:
type: object
required:
- id
- name
- users
properties:
id:
$ref: '#/components/schemas/Id'
@ -342,6 +359,8 @@ components:
$ref: '#/components/schemas/User'
GroupUpdate:
type: object
required:
- name
properties:
name:
type: string

View file

@ -5,16 +5,19 @@ import (
"net/http"
"github.com/mentos1386/golang-rest-example/pkg/api"
"github.com/mentos1386/golang-rest-example/pkg/openapi"
)
func main() {
service := &api.ApiService{}
srv, err := api.NewServer()
srv, err := openapi.NewServer(service)
if err != nil {
log.Fatal(err)
}
if err := http.ListenAndServe(":8080", srv); err != nil {
log.Println("Starting server on :1234")
if err := http.ListenAndServe(":1234", srv); err != nil {
log.Fatal(err)
}
}

21
docker-compose.yaml Normal file
View file

@ -0,0 +1,21 @@
version: "3.9"
services:
db:
image: postgres
restart: always
environment:
POSTGRES_PASSWORD: example
app:
build:
dockerfile: Dockerfile
context: .
target: dev
args:
- GO_VERSION=${GO_VERSION}
ports:
- 1234:1234
volumes:
- .:/app
environment:
- DATABASE_URL=postgresql://postgres:example@db:5432/postgres

31
go.mod
View file

@ -3,14 +3,31 @@ module github.com/mentos1386/golang-rest-example
go 1.21.6
require (
github.com/labstack/echo/v4 v4.11.4 // indirect
github.com/labstack/gommon v0.4.2 // indirect
github.com/go-faster/errors v0.7.1
github.com/go-faster/jx v1.1.0
github.com/ogen-go/ogen v0.81.2
go.opentelemetry.io/otel v1.22.0
go.opentelemetry.io/otel/metric v1.22.0
go.opentelemetry.io/otel/trace v1.22.0
go.uber.org/multierr v1.11.0
)
require (
github.com/dlclark/regexp2 v1.10.0 // indirect
github.com/fatih/color v1.16.0 // indirect
github.com/ghodss/yaml v1.0.0 // indirect
github.com/go-faster/yaml v0.4.6 // indirect
github.com/go-logr/logr v1.4.1 // indirect
github.com/go-logr/stdr v1.2.2 // indirect
github.com/google/uuid v1.5.0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/valyala/bytebufferpool v1.0.0 // indirect
github.com/valyala/fasttemplate v1.2.2 // indirect
golang.org/x/crypto v0.17.0 // indirect
golang.org/x/net v0.19.0 // indirect
golang.org/x/sys v0.15.0 // indirect
github.com/segmentio/asm v1.2.0 // indirect
go.uber.org/zap v1.26.0 // indirect
golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 // indirect
golang.org/x/net v0.20.0 // indirect
golang.org/x/sync v0.6.0 // indirect
golang.org/x/sys v0.16.0 // indirect
golang.org/x/text v0.14.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
)

78
go.sum
View file

@ -1,23 +1,73 @@
github.com/labstack/echo/v4 v4.11.4 h1:vDZmA+qNeh1pd/cCkEicDMrjtrnMGQ1QFI9gWN1zGq8=
github.com/labstack/echo/v4 v4.11.4/go.mod h1:noh7EvLwqDsmh/X/HWKPUl1AjzJrhyptRyEbQJfxen8=
github.com/labstack/gommon v0.4.2 h1:F8qTUNXgG1+6WQmqoUWnz8WiEU60mXVVw0P4ht1WRA0=
github.com/labstack/gommon v0.4.2/go.mod h1:QlUFxVM+SNXhDL/Z7YhocGIBYOiwB0mXm1+1bAPHPyU=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dlclark/regexp2 v1.10.0 h1:+/GIL799phkJqYW+3YbOd8LCcbHzT0Pbo8zl70MHsq0=
github.com/dlclark/regexp2 v1.10.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8=
github.com/fatih/color v1.16.0 h1:zmkK9Ngbjj+K0yRhTVONQh1p/HknKYSlNT+vZCzyokM=
github.com/fatih/color v1.16.0/go.mod h1:fL2Sau1YI5c0pdGEVCbKQbLXB6edEj1ZgiY4NijnWvE=
github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk=
github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
github.com/go-faster/errors v0.7.1 h1:MkJTnDoEdi9pDabt1dpWf7AA8/BaSYZqibYyhZ20AYg=
github.com/go-faster/errors v0.7.1/go.mod h1:5ySTjWFiphBs07IKuiL69nxdfd5+fzh1u7FPGZP2quo=
github.com/go-faster/jx v1.1.0 h1:ZsW3wD+snOdmTDy9eIVgQdjUpXRRV4rqW8NS3t+20bg=
github.com/go-faster/jx v1.1.0/go.mod h1:vKDNikrKoyUmpzaJ0OkIkRQClNHFX/nF3dnTJZb3skg=
github.com/go-faster/yaml v0.4.6 h1:lOK/EhI04gCpPgPhgt0bChS6bvw7G3WwI8xxVe0sw9I=
github.com/go-faster/yaml v0.4.6/go.mod h1:390dRIvV4zbnO7qC9FGo6YYutc+wyyUSHBgbXL52eXk=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.4.1 h1:pKouT5E8xu9zeFC39JXRDukb6JFQPXM5p5I91188VAQ=
github.com/go-logr/logr v1.4.1/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.5.0 h1:1p67kYwdtXjb0gL0BPiP1Av9wiZPo5A8z2cWkTZ+eyU=
github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE=
github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk=
github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
github.com/valyala/fasttemplate v1.2.2 h1:lxLXG0uE3Qnshl9QyaK6XJxMXlQZELvChBOCmQD0Loo=
github.com/valyala/fasttemplate v1.2.2/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/net v0.19.0 h1:zTwKpTd2XuCqf8huc7Fo2iSy+4RHPd10s4KzeTnVr1c=
golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U=
github.com/ogen-go/ogen v0.81.2 h1:Dj5vSgC/1oqLE5t0T5qd4ARgsKTupJWsh3rW9/C7Lvk=
github.com/ogen-go/ogen v0.81.2/go.mod h1:10Ch7SIzBMSLB8TVEt8KclMKkRyJ5qCh4Cfs0pdeoh8=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rogpeppe/go-internal v1.10.0 h1:TMyTOH3F/DB16zRVcYyreMH6GnZZrwQVAoYjRBZyWFQ=
github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog=
github.com/segmentio/asm v1.2.0 h1:9BQrFxC+YOHJlTlHGkTrFWf59nbL3XnCoFLTwDCI7ys=
github.com/segmentio/asm v1.2.0/go.mod h1:BqMnlJP91P8d+4ibuonYZw9mfnzI9HfxselHZr5aAcs=
github.com/stretchr/testify v1.8.4 h1:CcVxjf3Q8PM0mHUKJCdn+eZZtm5yQwehR5yeSVQQcUk=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
go.opentelemetry.io/otel v1.22.0 h1:xS7Ku+7yTFvDfDraDIJVpw7XPyuHlB9MCiqqX5mcJ6Y=
go.opentelemetry.io/otel v1.22.0/go.mod h1:eoV4iAi3Ea8LkAEI9+GFT44O6T/D0GWAVFyZVCC6pMI=
go.opentelemetry.io/otel/metric v1.22.0 h1:lypMQnGyJYeuYPhOM/bgjbFM6WE44W1/T45er4d8Hhg=
go.opentelemetry.io/otel/metric v1.22.0/go.mod h1:evJGjVpZv0mQ5QBRJoBF64yMuOf4xCWdXjK8pzFvliY=
go.opentelemetry.io/otel/trace v1.22.0 h1:Hg6pPujv0XG9QaVbGOBVHunyuLcCC3jN7WEhPx83XD0=
go.opentelemetry.io/otel/trace v1.22.0/go.mod h1:RbbHXVqKES9QhzZq/fE5UnOSILqRt40a21sPw2He1xo=
go.uber.org/goleak v1.2.1 h1:NBol2c7O1ZokfZ0LEU9K6Whx/KnwvepVetCUhtKja4A=
go.uber.org/goleak v1.2.1/go.mod h1:qlT2yGI9QafXHhZZLxlSuNsMw3FFLxBr+tBRlmO1xH4=
go.uber.org/multierr v1.11.0 h1:blXXJkSxSSfBVBlC76pxqeO+LN3aDfLQo+309xJstO0=
go.uber.org/multierr v1.11.0/go.mod h1:20+QtiLqy0Nd6FdQB9TLXag12DsQkrbs3htMFfDN80Y=
go.uber.org/zap v1.26.0 h1:sI7k6L95XOKS281NhVKOFCUNIvv9e0w4BF8N3u+tCRo=
go.uber.org/zap v1.26.0/go.mod h1:dtElttAiwGvoJ/vj4IwHBS/gXsEu/pZ50mUIRWuG0so=
golang.org/x/exp v0.0.0-20230725093048-515e97ebf090 h1:Di6/M8l0O2lCLc6VVRWhgCiApHV8MnQurBnFSHsQtNY=
golang.org/x/exp v0.0.0-20230725093048-515e97ebf090/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc=
golang.org/x/net v0.20.0 h1:aCL9BSgETF1k+blQaYUBx9hJ9LOGP3gAVemcZlf1Kpo=
golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY=
gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

View file

@ -1,5 +1,20 @@
run:
go run cmd/server.go
export GO_VERSION := "1.21"
_default:
@just --list
# Run the app in development mode
run:
docker compose up --build app
# Generate OpenAPI files
gen:
go generate ./...
docker compose run --rm app \
go generate ./...
# Build production image
build:
docker build \
--build-arg GO_VERSION=$(GO_VERSION) \
-t golang-rest-example \
.

11
pkg/api/api.go Normal file
View file

@ -0,0 +1,11 @@
package api
import (
"github.com/mentos1386/golang-rest-example/pkg/openapi"
)
type ApiService struct {
groups []*openapi.Group
openapi.UnimplementedHandler
}

15
pkg/api/groups.go Normal file
View file

@ -0,0 +1,15 @@
package api
import (
"context"
"github.com/mentos1386/golang-rest-example/pkg/openapi"
)
func (u *ApiService) GroupsGet(ctx context.Context) ([]openapi.Group, error) {
var groups []openapi.Group
for _, group := range u.groups {
groups = append(groups, *group)
}
groups = append(groups, openapi.Group{ID: openapi.ID(1), Name: "Admins"})
return groups, nil
}

3
pkg/api/users.go Normal file
View file

@ -0,0 +1,3 @@
package api
type UserServer struct{}

View file

@ -1,18 +0,0 @@
package groups
import (
"context"
"github.com/mentos1386/golang-rest-example/pkg/api"
)
type groupServer struct {
groups map[int64]*api.Group
}
func (u *groupServer) groupsGet(ctx context.Context) ([]api.Group, error) {
var groups []api.Group
for _, group := range u.groups {
groups = append(groups, *group)
}
return groups, nil
}

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"net/http"

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"context"

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"context"

View file

@ -1,5 +1,5 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
type GroupsIDDeleteRes interface {
groupsIDDeleteRes()

View file

@ -1,10 +1,15 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"math/bits"
"strconv"
"github.com/go-faster/errors"
"github.com/go-faster/jx"
"github.com/ogen-go/ogen/validate"
)
// Encode implements json.Marshaler.
@ -17,16 +22,12 @@ func (s *Error) Encode(e *jx.Encoder) {
// encodeFields encodes fields.
func (s *Error) encodeFields(e *jx.Encoder) {
{
if s.Message.Set {
e.FieldStart("message")
s.Message.Encode(e)
}
e.FieldStart("message")
e.Str(s.Message)
}
{
if s.Code.Set {
e.FieldStart("code")
s.Code.Encode(e)
}
e.FieldStart("code")
e.Int(s.Code)
}
}
@ -40,13 +41,16 @@ func (s *Error) Decode(d *jx.Decoder) error {
if s == nil {
return errors.New("invalid: unable to decode Error to nil")
}
var requiredBitSet [1]uint8
if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error {
switch string(k) {
case "message":
requiredBitSet[0] |= 1 << 0
if err := func() error {
s.Message.Reset()
if err := s.Message.Decode(d); err != nil {
v, err := d.Str()
s.Message = string(v)
if err != nil {
return err
}
return nil
@ -54,9 +58,11 @@ func (s *Error) Decode(d *jx.Decoder) error {
return errors.Wrap(err, "decode field \"message\"")
}
case "code":
requiredBitSet[0] |= 1 << 1
if err := func() error {
s.Code.Reset()
if err := s.Code.Decode(d); err != nil {
v, err := d.Int()
s.Code = int(v)
if err != nil {
return err
}
return nil
@ -70,6 +76,38 @@ func (s *Error) Decode(d *jx.Decoder) error {
}); err != nil {
return errors.Wrap(err, "decode Error")
}
// Validate required fields.
var failures []validate.FieldError
for i, mask := range [1]uint8{
0b00000011,
} {
if result := (requiredBitSet[i] & mask) ^ mask; result != 0 {
// Mask only required fields and check equality to mask using XOR.
//
// If XOR result is not zero, result is not equal to expected, so some fields are missed.
// Bits of fields which would be set are actually bits of missed fields.
missed := bits.OnesCount8(result)
for bitN := 0; bitN < missed; bitN++ {
bitIdx := bits.TrailingZeros8(result)
fieldIdx := i*8 + bitIdx
var name string
if fieldIdx < len(jsonFieldsNameOfError) {
name = jsonFieldsNameOfError[fieldIdx]
} else {
name = strconv.Itoa(fieldIdx)
}
failures = append(failures, validate.FieldError{
Name: name,
Error: validate.ErrFieldRequired,
})
// Reset bit.
result &^= 1 << bitIdx
}
}
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}
@ -97,26 +135,20 @@ func (s *Group) Encode(e *jx.Encoder) {
// encodeFields encodes fields.
func (s *Group) encodeFields(e *jx.Encoder) {
{
if s.ID.Set {
e.FieldStart("id")
s.ID.Encode(e)
}
e.FieldStart("id")
s.ID.Encode(e)
}
{
if s.Name.Set {
e.FieldStart("name")
s.Name.Encode(e)
}
e.FieldStart("name")
e.Str(s.Name)
}
{
if s.Users != nil {
e.FieldStart("users")
e.ArrStart()
for _, elem := range s.Users {
elem.Encode(e)
}
e.ArrEnd()
e.FieldStart("users")
e.ArrStart()
for _, elem := range s.Users {
elem.Encode(e)
}
e.ArrEnd()
}
}
@ -131,12 +163,13 @@ func (s *Group) Decode(d *jx.Decoder) error {
if s == nil {
return errors.New("invalid: unable to decode Group to nil")
}
var requiredBitSet [1]uint8
if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error {
switch string(k) {
case "id":
requiredBitSet[0] |= 1 << 0
if err := func() error {
s.ID.Reset()
if err := s.ID.Decode(d); err != nil {
return err
}
@ -145,9 +178,11 @@ func (s *Group) Decode(d *jx.Decoder) error {
return errors.Wrap(err, "decode field \"id\"")
}
case "name":
requiredBitSet[0] |= 1 << 1
if err := func() error {
s.Name.Reset()
if err := s.Name.Decode(d); err != nil {
v, err := d.Str()
s.Name = string(v)
if err != nil {
return err
}
return nil
@ -155,6 +190,7 @@ func (s *Group) Decode(d *jx.Decoder) error {
return errors.Wrap(err, "decode field \"name\"")
}
case "users":
requiredBitSet[0] |= 1 << 2
if err := func() error {
s.Users = make([]User, 0)
if err := d.Arr(func(d *jx.Decoder) error {
@ -178,6 +214,38 @@ func (s *Group) Decode(d *jx.Decoder) error {
}); err != nil {
return errors.Wrap(err, "decode Group")
}
// Validate required fields.
var failures []validate.FieldError
for i, mask := range [1]uint8{
0b00000111,
} {
if result := (requiredBitSet[i] & mask) ^ mask; result != 0 {
// Mask only required fields and check equality to mask using XOR.
//
// If XOR result is not zero, result is not equal to expected, so some fields are missed.
// Bits of fields which would be set are actually bits of missed fields.
missed := bits.OnesCount8(result)
for bitN := 0; bitN < missed; bitN++ {
bitIdx := bits.TrailingZeros8(result)
fieldIdx := i*8 + bitIdx
var name string
if fieldIdx < len(jsonFieldsNameOfGroup) {
name = jsonFieldsNameOfGroup[fieldIdx]
} else {
name = strconv.Itoa(fieldIdx)
}
failures = append(failures, validate.FieldError{
Name: name,
Error: validate.ErrFieldRequired,
})
// Reset bit.
result &^= 1 << bitIdx
}
}
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}
@ -205,10 +273,8 @@ func (s *GroupUpdate) Encode(e *jx.Encoder) {
// encodeFields encodes fields.
func (s *GroupUpdate) encodeFields(e *jx.Encoder) {
{
if s.Name.Set {
e.FieldStart("name")
s.Name.Encode(e)
}
e.FieldStart("name")
e.Str(s.Name)
}
}
@ -221,13 +287,16 @@ func (s *GroupUpdate) Decode(d *jx.Decoder) error {
if s == nil {
return errors.New("invalid: unable to decode GroupUpdate to nil")
}
var requiredBitSet [1]uint8
if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error {
switch string(k) {
case "name":
requiredBitSet[0] |= 1 << 0
if err := func() error {
s.Name.Reset()
if err := s.Name.Decode(d); err != nil {
v, err := d.Str()
s.Name = string(v)
if err != nil {
return err
}
return nil
@ -241,6 +310,38 @@ func (s *GroupUpdate) Decode(d *jx.Decoder) error {
}); err != nil {
return errors.Wrap(err, "decode GroupUpdate")
}
// Validate required fields.
var failures []validate.FieldError
for i, mask := range [1]uint8{
0b00000001,
} {
if result := (requiredBitSet[i] & mask) ^ mask; result != 0 {
// Mask only required fields and check equality to mask using XOR.
//
// If XOR result is not zero, result is not equal to expected, so some fields are missed.
// Bits of fields which would be set are actually bits of missed fields.
missed := bits.OnesCount8(result)
for bitN := 0; bitN < missed; bitN++ {
bitIdx := bits.TrailingZeros8(result)
fieldIdx := i*8 + bitIdx
var name string
if fieldIdx < len(jsonFieldsNameOfGroupUpdate) {
name = jsonFieldsNameOfGroupUpdate[fieldIdx]
} else {
name = strconv.Itoa(fieldIdx)
}
failures = append(failures, validate.FieldError{
Name: name,
Error: validate.ErrFieldRequired,
})
// Reset bit.
result &^= 1 << bitIdx
}
}
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}
@ -308,10 +409,8 @@ func (s *Ok) Encode(e *jx.Encoder) {
// encodeFields encodes fields.
func (s *Ok) encodeFields(e *jx.Encoder) {
{
if s.Message.Set {
e.FieldStart("message")
s.Message.Encode(e)
}
e.FieldStart("message")
e.Str(s.Message)
}
}
@ -324,13 +423,16 @@ func (s *Ok) Decode(d *jx.Decoder) error {
if s == nil {
return errors.New("invalid: unable to decode Ok to nil")
}
var requiredBitSet [1]uint8
if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error {
switch string(k) {
case "message":
requiredBitSet[0] |= 1 << 0
if err := func() error {
s.Message.Reset()
if err := s.Message.Decode(d); err != nil {
v, err := d.Str()
s.Message = string(v)
if err != nil {
return err
}
return nil
@ -344,6 +446,38 @@ func (s *Ok) Decode(d *jx.Decoder) error {
}); err != nil {
return errors.Wrap(err, "decode Ok")
}
// Validate required fields.
var failures []validate.FieldError
for i, mask := range [1]uint8{
0b00000001,
} {
if result := (requiredBitSet[i] & mask) ^ mask; result != 0 {
// Mask only required fields and check equality to mask using XOR.
//
// If XOR result is not zero, result is not equal to expected, so some fields are missed.
// Bits of fields which would be set are actually bits of missed fields.
missed := bits.OnesCount8(result)
for bitN := 0; bitN < missed; bitN++ {
bitIdx := bits.TrailingZeros8(result)
fieldIdx := i*8 + bitIdx
var name string
if fieldIdx < len(jsonFieldsNameOfOk) {
name = jsonFieldsNameOfOk[fieldIdx]
} else {
name = strconv.Itoa(fieldIdx)
}
failures = append(failures, validate.FieldError{
Name: name,
Error: validate.ErrFieldRequired,
})
// Reset bit.
result &^= 1 << bitIdx
}
}
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}
@ -361,39 +495,6 @@ func (s *Ok) UnmarshalJSON(data []byte) error {
return s.Decode(d)
}
// Encode encodes Group as json.
func (o OptGroup) Encode(e *jx.Encoder) {
if !o.Set {
return
}
o.Value.Encode(e)
}
// Decode decodes Group from json.
func (o *OptGroup) Decode(d *jx.Decoder) error {
if o == nil {
return errors.New("invalid: unable to decode OptGroup to nil")
}
o.Set = true
if err := o.Value.Decode(d); err != nil {
return err
}
return nil
}
// MarshalJSON implements stdjson.Marshaler.
func (s OptGroup) MarshalJSON() ([]byte, error) {
e := jx.Encoder{}
s.Encode(&e)
return e.Bytes(), nil
}
// UnmarshalJSON implements stdjson.Unmarshaler.
func (s *OptGroup) UnmarshalJSON(data []byte) error {
d := jx.DecodeBytes(data)
return s.Decode(d)
}
// Encode encodes ID as json.
func (o OptID) Encode(e *jx.Encoder) {
if !o.Set {
@ -427,76 +528,6 @@ func (s *OptID) UnmarshalJSON(data []byte) error {
return s.Decode(d)
}
// Encode encodes int as json.
func (o OptInt) Encode(e *jx.Encoder) {
if !o.Set {
return
}
e.Int(int(o.Value))
}
// Decode decodes int from json.
func (o *OptInt) Decode(d *jx.Decoder) error {
if o == nil {
return errors.New("invalid: unable to decode OptInt to nil")
}
o.Set = true
v, err := d.Int()
if err != nil {
return err
}
o.Value = int(v)
return nil
}
// MarshalJSON implements stdjson.Marshaler.
func (s OptInt) MarshalJSON() ([]byte, error) {
e := jx.Encoder{}
s.Encode(&e)
return e.Bytes(), nil
}
// UnmarshalJSON implements stdjson.Unmarshaler.
func (s *OptInt) UnmarshalJSON(data []byte) error {
d := jx.DecodeBytes(data)
return s.Decode(d)
}
// Encode encodes string as json.
func (o OptString) Encode(e *jx.Encoder) {
if !o.Set {
return
}
e.Str(string(o.Value))
}
// Decode decodes string from json.
func (o *OptString) Decode(d *jx.Decoder) error {
if o == nil {
return errors.New("invalid: unable to decode OptString to nil")
}
o.Set = true
v, err := d.Str()
if err != nil {
return err
}
o.Value = string(v)
return nil
}
// MarshalJSON implements stdjson.Marshaler.
func (s OptString) MarshalJSON() ([]byte, error) {
e := jx.Encoder{}
s.Encode(&e)
return e.Bytes(), nil
}
// UnmarshalJSON implements stdjson.Unmarshaler.
func (s *OptString) UnmarshalJSON(data []byte) error {
d := jx.DecodeBytes(data)
return s.Decode(d)
}
// Encode implements json.Marshaler.
func (s *User) Encode(e *jx.Encoder) {
e.ObjStart()
@ -507,28 +538,20 @@ func (s *User) Encode(e *jx.Encoder) {
// encodeFields encodes fields.
func (s *User) encodeFields(e *jx.Encoder) {
{
if s.ID.Set {
e.FieldStart("id")
s.ID.Encode(e)
}
e.FieldStart("id")
s.ID.Encode(e)
}
{
if s.Name.Set {
e.FieldStart("name")
s.Name.Encode(e)
}
e.FieldStart("name")
e.Str(s.Name)
}
{
if s.Email.Set {
e.FieldStart("email")
s.Email.Encode(e)
}
e.FieldStart("email")
e.Str(s.Email)
}
{
if s.Group.Set {
e.FieldStart("group")
s.Group.Encode(e)
}
e.FieldStart("group")
s.Group.Encode(e)
}
}
@ -544,12 +567,13 @@ func (s *User) Decode(d *jx.Decoder) error {
if s == nil {
return errors.New("invalid: unable to decode User to nil")
}
var requiredBitSet [1]uint8
if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error {
switch string(k) {
case "id":
requiredBitSet[0] |= 1 << 0
if err := func() error {
s.ID.Reset()
if err := s.ID.Decode(d); err != nil {
return err
}
@ -558,9 +582,11 @@ func (s *User) Decode(d *jx.Decoder) error {
return errors.Wrap(err, "decode field \"id\"")
}
case "name":
requiredBitSet[0] |= 1 << 1
if err := func() error {
s.Name.Reset()
if err := s.Name.Decode(d); err != nil {
v, err := d.Str()
s.Name = string(v)
if err != nil {
return err
}
return nil
@ -568,9 +594,11 @@ func (s *User) Decode(d *jx.Decoder) error {
return errors.Wrap(err, "decode field \"name\"")
}
case "email":
requiredBitSet[0] |= 1 << 2
if err := func() error {
s.Email.Reset()
if err := s.Email.Decode(d); err != nil {
v, err := d.Str()
s.Email = string(v)
if err != nil {
return err
}
return nil
@ -578,8 +606,8 @@ func (s *User) Decode(d *jx.Decoder) error {
return errors.Wrap(err, "decode field \"email\"")
}
case "group":
requiredBitSet[0] |= 1 << 3
if err := func() error {
s.Group.Reset()
if err := s.Group.Decode(d); err != nil {
return err
}
@ -594,6 +622,38 @@ func (s *User) Decode(d *jx.Decoder) error {
}); err != nil {
return errors.Wrap(err, "decode User")
}
// Validate required fields.
var failures []validate.FieldError
for i, mask := range [1]uint8{
0b00001111,
} {
if result := (requiredBitSet[i] & mask) ^ mask; result != 0 {
// Mask only required fields and check equality to mask using XOR.
//
// If XOR result is not zero, result is not equal to expected, so some fields are missed.
// Bits of fields which would be set are actually bits of missed fields.
missed := bits.OnesCount8(result)
for bitN := 0; bitN < missed; bitN++ {
bitIdx := bits.TrailingZeros8(result)
fieldIdx := i*8 + bitIdx
var name string
if fieldIdx < len(jsonFieldsNameOfUser) {
name = jsonFieldsNameOfUser[fieldIdx]
} else {
name = strconv.Itoa(fieldIdx)
}
failures = append(failures, validate.FieldError{
Name: name,
Error: validate.ErrFieldRequired,
})
// Reset bit.
result &^= 1 << bitIdx
}
}
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}
@ -621,16 +681,12 @@ func (s *UserUpdate) Encode(e *jx.Encoder) {
// encodeFields encodes fields.
func (s *UserUpdate) encodeFields(e *jx.Encoder) {
{
if s.Name.Set {
e.FieldStart("name")
s.Name.Encode(e)
}
e.FieldStart("name")
e.Str(s.Name)
}
{
if s.Email.Set {
e.FieldStart("email")
s.Email.Encode(e)
}
e.FieldStart("email")
e.Str(s.Email)
}
}
@ -644,13 +700,16 @@ func (s *UserUpdate) Decode(d *jx.Decoder) error {
if s == nil {
return errors.New("invalid: unable to decode UserUpdate to nil")
}
var requiredBitSet [1]uint8
if err := d.ObjBytes(func(d *jx.Decoder, k []byte) error {
switch string(k) {
case "name":
requiredBitSet[0] |= 1 << 0
if err := func() error {
s.Name.Reset()
if err := s.Name.Decode(d); err != nil {
v, err := d.Str()
s.Name = string(v)
if err != nil {
return err
}
return nil
@ -658,9 +717,11 @@ func (s *UserUpdate) Decode(d *jx.Decoder) error {
return errors.Wrap(err, "decode field \"name\"")
}
case "email":
requiredBitSet[0] |= 1 << 1
if err := func() error {
s.Email.Reset()
if err := s.Email.Decode(d); err != nil {
v, err := d.Str()
s.Email = string(v)
if err != nil {
return err
}
return nil
@ -674,6 +735,38 @@ func (s *UserUpdate) Decode(d *jx.Decoder) error {
}); err != nil {
return errors.Wrap(err, "decode UserUpdate")
}
// Validate required fields.
var failures []validate.FieldError
for i, mask := range [1]uint8{
0b00000011,
} {
if result := (requiredBitSet[i] & mask) ^ mask; result != 0 {
// Mask only required fields and check equality to mask using XOR.
//
// If XOR result is not zero, result is not equal to expected, so some fields are missed.
// Bits of fields which would be set are actually bits of missed fields.
missed := bits.OnesCount8(result)
for bitN := 0; bitN < missed; bitN++ {
bitIdx := bits.TrailingZeros8(result)
fieldIdx := i*8 + bitIdx
var name string
if fieldIdx < len(jsonFieldsNameOfUserUpdate) {
name = jsonFieldsNameOfUserUpdate[fieldIdx]
} else {
name = strconv.Itoa(fieldIdx)
}
failures = append(failures, validate.FieldError{
Name: name,
Error: validate.ErrFieldRequired,
})
// Reset bit.
result &^= 1 << bitIdx
}
}
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"github.com/ogen-go/ogen/middleware"

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"net/http"

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"io"

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"bytes"

View file

@ -1,8 +1,9 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"fmt"
"io"
"mime"
"net/http"
@ -60,6 +61,23 @@ func decodeGroupsGetResponse(resp *http.Response) (res []Group, _ error) {
if response == nil {
return errors.New("nil is invalid value")
}
var failures []validate.FieldError
for i, elem := range response {
if err := func() error {
if err := elem.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
failures = append(failures, validate.FieldError{
Name: fmt.Sprintf("[%d]", i),
Error: err,
})
}
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}(); err != nil {
return res, errors.Wrap(err, "validate")
@ -265,6 +283,15 @@ func decodeGroupsIDGetResponse(resp *http.Response) (res GroupsIDGetRes, _ error
}
return res, err
}
// Validate response.
if err := func() error {
if err := response.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return res, errors.Wrap(err, "validate")
}
return &response, nil
default:
return res, validate.InvalidContentType(ct)
@ -383,6 +410,15 @@ func decodeGroupsIDPutResponse(resp *http.Response) (res GroupsIDPutRes, _ error
}
return res, err
}
// Validate response.
if err := func() error {
if err := response.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return res, errors.Wrap(err, "validate")
}
return &response, nil
default:
return res, validate.InvalidContentType(ct)
@ -501,6 +537,15 @@ func decodeGroupsPostResponse(resp *http.Response) (res *Group, _ error) {
}
return res, err
}
// Validate response.
if err := func() error {
if err := response.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return res, errors.Wrap(err, "validate")
}
return &response, nil
default:
return res, validate.InvalidContentType(ct)
@ -680,6 +725,23 @@ func decodeUsersGetResponse(resp *http.Response) (res []User, _ error) {
if response == nil {
return errors.New("nil is invalid value")
}
var failures []validate.FieldError
for i, elem := range response {
if err := func() error {
if err := elem.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
failures = append(failures, validate.FieldError{
Name: fmt.Sprintf("[%d]", i),
Error: err,
})
}
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}(); err != nil {
return res, errors.Wrap(err, "validate")
@ -885,6 +947,15 @@ func decodeUsersIDGetResponse(resp *http.Response) (res UsersIDGetRes, _ error)
}
return res, err
}
// Validate response.
if err := func() error {
if err := response.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return res, errors.Wrap(err, "validate")
}
return &response, nil
default:
return res, validate.InvalidContentType(ct)
@ -1003,6 +1074,15 @@ func decodeUsersIDGroupPutResponse(resp *http.Response) (res UsersIDGroupPutRes,
}
return res, err
}
// Validate response.
if err := func() error {
if err := response.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return res, errors.Wrap(err, "validate")
}
return &response, nil
default:
return res, validate.InvalidContentType(ct)
@ -1121,6 +1201,15 @@ func decodeUsersIDPutResponse(resp *http.Response) (res UsersIDPutRes, _ error)
}
return res, err
}
// Validate response.
if err := func() error {
if err := response.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return res, errors.Wrap(err, "validate")
}
return &response, nil
default:
return res, validate.InvalidContentType(ct)
@ -1239,6 +1328,15 @@ func decodeUsersPostResponse(resp *http.Response) (res *User, _ error) {
}
return res, err
}
// Validate response.
if err := func() error {
if err := response.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
return res, errors.Wrap(err, "validate")
}
return &response, nil
default:
return res, validate.InvalidContentType(ct)

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"net/http"

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"net/http"

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"fmt"
@ -12,27 +12,27 @@ func (s *ErrorStatusCode) Error() string {
// Ref: #/components/schemas/Error
type Error struct {
Message OptString `json:"message"`
Code OptInt `json:"code"`
Message string `json:"message"`
Code int `json:"code"`
}
// GetMessage returns the value of Message.
func (s *Error) GetMessage() OptString {
func (s *Error) GetMessage() string {
return s.Message
}
// GetCode returns the value of Code.
func (s *Error) GetCode() OptInt {
func (s *Error) GetCode() int {
return s.Code
}
// SetMessage sets the value of Message.
func (s *Error) SetMessage(val OptString) {
func (s *Error) SetMessage(val string) {
s.Message = val
}
// SetCode sets the value of Code.
func (s *Error) SetCode(val OptInt) {
func (s *Error) SetCode(val int) {
s.Code = val
}
@ -72,18 +72,18 @@ func (s *ErrorStatusCode) SetResponse(val Error) {
// Ref: #/components/schemas/Group
type Group struct {
ID OptID `json:"id"`
Name OptString `json:"name"`
Users []User `json:"users"`
ID ID `json:"id"`
Name string `json:"name"`
Users []User `json:"users"`
}
// GetID returns the value of ID.
func (s *Group) GetID() OptID {
func (s *Group) GetID() ID {
return s.ID
}
// GetName returns the value of Name.
func (s *Group) GetName() OptString {
func (s *Group) GetName() string {
return s.Name
}
@ -93,12 +93,12 @@ func (s *Group) GetUsers() []User {
}
// SetID sets the value of ID.
func (s *Group) SetID(val OptID) {
func (s *Group) SetID(val ID) {
s.ID = val
}
// SetName sets the value of Name.
func (s *Group) SetName(val OptString) {
func (s *Group) SetName(val string) {
s.Name = val
}
@ -112,16 +112,16 @@ func (*Group) groupsIDPutRes() {}
// Ref: #/components/schemas/GroupUpdate
type GroupUpdate struct {
Name OptString `json:"name"`
Name string `json:"name"`
}
// GetName returns the value of Name.
func (s *GroupUpdate) GetName() OptString {
func (s *GroupUpdate) GetName() string {
return s.Name
}
// SetName sets the value of Name.
func (s *GroupUpdate) SetName(val OptString) {
func (s *GroupUpdate) SetName(val string) {
s.Name = val
}
@ -129,68 +129,22 @@ type ID int64
// Ref: #/components/schemas/Ok
type Ok struct {
Message OptString `json:"message"`
Message string `json:"message"`
}
// GetMessage returns the value of Message.
func (s *Ok) GetMessage() OptString {
func (s *Ok) GetMessage() string {
return s.Message
}
// SetMessage sets the value of Message.
func (s *Ok) SetMessage(val OptString) {
func (s *Ok) SetMessage(val string) {
s.Message = val
}
func (*Ok) groupsIDDeleteRes() {}
func (*Ok) usersIDDeleteRes() {}
// NewOptGroup returns new OptGroup with value set to v.
func NewOptGroup(v Group) OptGroup {
return OptGroup{
Value: v,
Set: true,
}
}
// OptGroup is optional Group.
type OptGroup struct {
Value Group
Set bool
}
// IsSet returns true if OptGroup was set.
func (o OptGroup) IsSet() bool { return o.Set }
// Reset unsets value.
func (o *OptGroup) Reset() {
var v Group
o.Value = v
o.Set = false
}
// SetTo sets value to v.
func (o *OptGroup) SetTo(v Group) {
o.Set = true
o.Value = v
}
// Get returns value and boolean that denotes whether value was set.
func (o OptGroup) Get() (v Group, ok bool) {
if !o.Set {
return v, false
}
return o.Value, true
}
// Or returns value if set, or given parameter if does not.
func (o OptGroup) Or(d Group) Group {
if v, ok := o.Get(); ok {
return v
}
return d
}
// NewOptID returns new OptID with value set to v.
func NewOptID(v ID) OptID {
return OptID{
@ -237,143 +191,51 @@ func (o OptID) Or(d ID) ID {
return d
}
// NewOptInt returns new OptInt with value set to v.
func NewOptInt(v int) OptInt {
return OptInt{
Value: v,
Set: true,
}
}
// OptInt is optional int.
type OptInt struct {
Value int
Set bool
}
// IsSet returns true if OptInt was set.
func (o OptInt) IsSet() bool { return o.Set }
// Reset unsets value.
func (o *OptInt) Reset() {
var v int
o.Value = v
o.Set = false
}
// SetTo sets value to v.
func (o *OptInt) SetTo(v int) {
o.Set = true
o.Value = v
}
// Get returns value and boolean that denotes whether value was set.
func (o OptInt) Get() (v int, ok bool) {
if !o.Set {
return v, false
}
return o.Value, true
}
// Or returns value if set, or given parameter if does not.
func (o OptInt) Or(d int) int {
if v, ok := o.Get(); ok {
return v
}
return d
}
// NewOptString returns new OptString with value set to v.
func NewOptString(v string) OptString {
return OptString{
Value: v,
Set: true,
}
}
// OptString is optional string.
type OptString struct {
Value string
Set bool
}
// IsSet returns true if OptString was set.
func (o OptString) IsSet() bool { return o.Set }
// Reset unsets value.
func (o *OptString) Reset() {
var v string
o.Value = v
o.Set = false
}
// SetTo sets value to v.
func (o *OptString) SetTo(v string) {
o.Set = true
o.Value = v
}
// Get returns value and boolean that denotes whether value was set.
func (o OptString) Get() (v string, ok bool) {
if !o.Set {
return v, false
}
return o.Value, true
}
// Or returns value if set, or given parameter if does not.
func (o OptString) Or(d string) string {
if v, ok := o.Get(); ok {
return v
}
return d
}
// Ref: #/components/schemas/User
type User struct {
ID OptID `json:"id"`
Name OptString `json:"name"`
Email OptString `json:"email"`
Group OptGroup `json:"group"`
ID ID `json:"id"`
Name string `json:"name"`
Email string `json:"email"`
Group Group `json:"group"`
}
// GetID returns the value of ID.
func (s *User) GetID() OptID {
func (s *User) GetID() ID {
return s.ID
}
// GetName returns the value of Name.
func (s *User) GetName() OptString {
func (s *User) GetName() string {
return s.Name
}
// GetEmail returns the value of Email.
func (s *User) GetEmail() OptString {
func (s *User) GetEmail() string {
return s.Email
}
// GetGroup returns the value of Group.
func (s *User) GetGroup() OptGroup {
func (s *User) GetGroup() Group {
return s.Group
}
// SetID sets the value of ID.
func (s *User) SetID(val OptID) {
func (s *User) SetID(val ID) {
s.ID = val
}
// SetName sets the value of Name.
func (s *User) SetName(val OptString) {
func (s *User) SetName(val string) {
s.Name = val
}
// SetEmail sets the value of Email.
func (s *User) SetEmail(val OptString) {
func (s *User) SetEmail(val string) {
s.Email = val
}
// SetGroup sets the value of Group.
func (s *User) SetGroup(val OptGroup) {
func (s *User) SetGroup(val Group) {
s.Group = val
}
@ -383,27 +245,27 @@ func (*User) usersIDPutRes() {}
// Ref: #/components/schemas/UserUpdate
type UserUpdate struct {
Name OptString `json:"name"`
Email OptString `json:"email"`
Name string `json:"name"`
Email string `json:"email"`
}
// GetName returns the value of Name.
func (s *UserUpdate) GetName() OptString {
func (s *UserUpdate) GetName() string {
return s.Name
}
// GetEmail returns the value of Email.
func (s *UserUpdate) GetEmail() OptString {
func (s *UserUpdate) GetEmail() string {
return s.Email
}
// SetName sets the value of Name.
func (s *UserUpdate) SetName(val OptString) {
func (s *UserUpdate) SetName(val string) {
s.Name = val
}
// SetEmail sets the value of Email.
func (s *UserUpdate) SetEmail(val OptString) {
func (s *UserUpdate) SetEmail(val string) {
s.Email = val
}

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"context"

View file

@ -1,6 +1,6 @@
// Code generated by ogen, DO NOT EDIT.
package api
package openapi
import (
"context"

View file

@ -0,0 +1,74 @@
// Code generated by ogen, DO NOT EDIT.
package openapi
import (
"fmt"
"github.com/go-faster/errors"
"github.com/ogen-go/ogen/validate"
)
func (s *Group) Validate() error {
if s == nil {
return validate.ErrNilPointer
}
var failures []validate.FieldError
if err := func() error {
if s.Users == nil {
return errors.New("nil is invalid value")
}
var failures []validate.FieldError
for i, elem := range s.Users {
if err := func() error {
if err := elem.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
failures = append(failures, validate.FieldError{
Name: fmt.Sprintf("[%d]", i),
Error: err,
})
}
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}(); err != nil {
failures = append(failures, validate.FieldError{
Name: "users",
Error: err,
})
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}
func (s *User) Validate() error {
if s == nil {
return validate.ErrNilPointer
}
var failures []validate.FieldError
if err := func() error {
if err := s.Group.Validate(); err != nil {
return err
}
return nil
}(); err != nil {
failures = append(failures, validate.FieldError{
Name: "group",
Error: err,
})
}
if len(failures) > 0 {
return &validate.Error{Fields: failures}
}
return nil
}

View file

View file

@ -1,3 +1,3 @@
package tools
//go:generate go run github.com/ogen-go/ogen/cmd/ogen@latest --target ../pkg/api -package api --clean ../api/openapi.yaml
//go:generate go run github.com/ogen-go/ogen/cmd/ogen@latest --target ../pkg/openapi -package openapi --clean ../api/openapi.yaml