Repository: swaggest/rest
Pull request #88 (2022-10-07 12:38:06)

Update CI and deps

github-actions[bot]: ### Lines Of Code

| Language  | Files |   Lines   |   Code    | Comments | Blanks  | Complexity |     Bytes     |
|-----------|-------|-----------|-----------|----------|---------|------------|---------------|
| Go        | 100   | 6896 (+5) | 5003      | 463 (+5) | 1430    | 836        | 166.6K (-13B) |
| Go (test) | 44    | 4750      | 3658      | 146      | 946     | 169        | 132.1K (-1B)  |
| YAML      | 10    | 722 (+15) | 626 (+14) | 46       | 50 (+1) | 0          | 22.6K (+452B) |
<!-- Sticky Pull Request CommentLOC -->
github-actions[bot]: ### Go API Changes

<pre>
# summary
Inferred base version: v0.2.30
Suggested version: v0.3.0
</pre>
<!-- Sticky Pull Request Commentgorelease -->
github-actions[bot]: ### Benchmark Result
<details><summary>Benchmark diff with base branch</summary>

```
name                                    old time/op    new time/op    delta
pkg:github.com/swaggest/rest/jsonschema goos:linux goarch:amd64
RequestValidator_ValidateRequestData-2    1.75µs ± 2%    1.71µs ± 3%   ~     (p=0.095 n=5+5)
pkg:github.com/swaggest/rest/request goos:linux goarch:amd64
Decoder_Decode-2                           934ns ±11%     887ns ± 5%   ~     (p=0.151 n=5+5)
DecoderFunc_Decode-2                      2.48µs ± 5%    2.56µs ± 3%   ~     (p=0.222 n=5+5)
Decoder_Decode_json-2                     27.7µs ± 3%    27.7µs ± 3%   ~     (p=0.841 n=5+5)
Decoder_Decode_queryObject-2              5.79µs ± 5%    5.71µs ± 5%   ~     (p=0.651 n=5+5)
Decoder_Decode_jsonParam-2                2.20µs ± 4%    2.20µs ± 4%   ~     (p=1.000 n=5+5)
DecoderFactory_SetDecoderFunc-2           2.04µs ± 7%    2.06µs ± 4%   ~     (p=0.841 n=5+5)
pkg:github.com/swaggest/rest/response/gzip goos:linux goarch:amd64
Middleware-2                              13.4µs ± 5%    13.3µs ± 3%   ~     (p=1.000 n=5+5)
Middleware_control-2                      4.52µs ± 5%    4.50µs ± 8%   ~     (p=0.841 n=5+5)

name                                    old alloc/op   new alloc/op   delta
pkg:github.com/swaggest/rest/jsonschema goos:linux goarch:amd64
RequestValidator_ValidateRequestData-2    2.46kB ± 0%    2.46kB ± 0%   ~     (all equal)
pkg:github.com/swaggest/rest/request goos:linux goarch:amd64
Decoder_Decode-2                            440B ± 0%      440B ± 0%   ~     (all equal)
DecoderFunc_Decode-2                      1.51kB ± 0%    1.51kB ± 0%   ~     (all equal)
Decoder_Decode_json-2                     12.2kB ± 0%    12.2kB ± 0%   ~     (all equal)
Decoder_Decode_queryObject-2              2.00kB ± 0%    2.00kB ± 0%   ~     (all equal)
Decoder_Decode_jsonParam-2                  736B ± 0%      736B ± 0%   ~     (all equal)
DecoderFactory_SetDecoderFunc-2           1.02kB ± 0%    1.02kB ± 0%   ~     (all equal)
pkg:github.com/swaggest/rest/response/gzip goos:linux goarch:amd64
Middleware-2                              1.16kB ± 3%    1.15kB ± 1%   ~     (p=0.595 n=5+5)
Middleware_control-2                      11.2kB ± 0%    11.2kB ± 0%   ~     (all equal)

name                                    old allocs/op  new allocs/op  delta
pkg:github.com/swaggest/rest/jsonschema goos:linux goarch:amd64
RequestValidator_ValidateRequestData-2      8.00 ± 0%      8.00 ± 0%   ~     (all equal)
pkg:github.com/swaggest/rest/request goos:linux goarch:amd64
Decoder_Decode-2                            4.00 ± 0%      4.00 ± 0%   ~     (all equal)
DecoderFunc_Decode-2                        12.0 ± 0%      12.0 ± 0%   ~     (all equal)
Decoder_Decode_json-2                        177 ± 0%       177 ± 0%   ~     (all equal)
Decoder_Decode_queryObject-2                36.0 ± 0%      36.0 ± 0%   ~     (all equal)
Decoder_Decode_jsonParam-2                  13.0 ± 0%      13.0 ± 0%   ~     (all equal)
DecoderFactory_SetDecoderFunc-2             16.0 ± 0%      16.0 ± 0%   ~     (all equal)
pkg:github.com/swaggest/rest/response/gzip goos:linux goarch:amd64
Middleware-2                                11.0 ± 0%      11.0 ± 0%   ~     (all equal)
Middleware_control-2                        9.00 ± 0%      9.00 ± 0%   ~     (all equal)
```
</details>

<details><summary>Benchmark result</summary>

```
name                                    time/op
pkg:github.com/swaggest/rest/jsonschema goos:linux goarch:amd64
RequestValidator_ValidateRequestData-2  1.71µs ± 3%
pkg:github.com/swaggest/rest/request goos:linux goarch:amd64
Decoder_Decode-2                         887ns ± 5%
DecoderFunc_Decode-2                    2.56µs ± 3%
Decoder_Decode_json-2                   27.7µs ± 3%
Decoder_Decode_queryObject-2            5.71µs ± 5%
Decoder_Decode_jsonParam-2              2.20µs ± 4%
DecoderFactory_SetDecoderFunc-2         2.06µs ± 4%
pkg:github.com/swaggest/rest/response/gzip goos:linux goarch:amd64
Middleware-2                            13.3µs ± 3%
Middleware_control-2                    4.50µs ± 8%

name                                    alloc/op
pkg:github.com/swaggest/rest/jsonschema goos:linux goarch:amd64
RequestValidator_ValidateRequestData-2  2.46kB ± 0%
pkg:github.com/swaggest/rest/request goos:linux goarch:amd64
Decoder_Decode-2                          440B ± 0%
DecoderFunc_Decode-2                    1.51kB ± 0%
Decoder_Decode_json-2                   12.2kB ± 0%
Decoder_Decode_queryObject-2            2.00kB ± 0%
Decoder_Decode_jsonParam-2                736B ± 0%
DecoderFactory_SetDecoderFunc-2         1.02kB ± 0%
pkg:github.com/swaggest/rest/response/gzip goos:linux goarch:amd64
Middleware-2                            1.15kB ± 1%
Middleware_control-2                    11.2kB ± 0%

name                                    allocs/op
pkg:github.com/swaggest/rest/jsonschema goos:linux goarch:amd64
RequestValidator_ValidateRequestData-2    8.00 ± 0%
pkg:github.com/swaggest/rest/request goos:linux goarch:amd64
Decoder_Decode-2                          4.00 ± 0%
DecoderFunc_Decode-2                      12.0 ± 0%
Decoder_Decode_json-2                      177 ± 0%
Decoder_Decode_queryObject-2              36.0 ± 0%
Decoder_Decode_jsonParam-2                13.0 ± 0%
DecoderFactory_SetDecoderFunc-2           16.0 ± 0%
pkg:github.com/swaggest/rest/response/gzip goos:linux goarch:amd64
Middleware-2                              11.0 ± 0%
Middleware_control-2                      9.00 ± 0%
```
</details>
<!-- Sticky Pull Request Commentbench -->
github-actions[bot]: ### Examples Benchmark Result
<details><summary>Benchmark diff with base branch</summary>

```
name                       old time/op    new time/op    delta
pkg:github.com/swaggest/rest/_examples/advanced goos:linux goarch:amd64
_directGzip-2                24.1µs ±12%    23.2µs ± 1%    ~     (p=0.111 n=5+4)
_directGzipHead-2            23.4µs ± 3%    23.1µs ± 1%    ~     (p=0.421 n=5+5)
_noDirectGzip-2               134µs ± 2%     133µs ± 1%    ~     (p=0.548 n=5+5)
_directGzip_decode-2          447µs ± 2%     446µs ± 1%    ~     (p=0.841 n=5+5)
_noDirectGzip_decode-2        133µs ± 1%     133µs ± 1%    ~     (p=0.222 n=5+5)
_jsonBody-2                  42.2µs ± 1%    42.5µs ± 1%    ~     (p=0.238 n=5+5)
_jsonBodyValidation-2        48.4µs ± 1%    50.3µs ± 2%  +3.76%  (p=0.008 n=5+5)
_outputHeaders-2             23.0µs ± 2%    23.3µs ± 1%    ~     (p=0.056 n=5+5)
_requestResponseMapping-2    42.4µs ± 2%    43.2µs ± 1%  +1.86%  (p=0.032 n=5+5)
_validation-2                45.8µs ± 2%    45.5µs ± 3%    ~     (p=0.841 n=5+5)
_noValidation-2              34.1µs ± 2%    33.0µs ± 1%  -3.33%  (p=0.008 n=5+5)
pkg:github.com/swaggest/rest/_examples/advanced-generic goos:linux goarch:amd64
_directGzip-2                23.6µs ± 1%    24.6µs ±12%    ~     (p=0.190 n=4+5)
_directGzipHead-2            23.7µs ± 0%    23.8µs ± 5%    ~     (p=0.548 n=5+5)
_noDirectGzip-2               133µs ± 1%     133µs ± 1%    ~     (p=0.548 n=5+5)
_directGzip_decode-2          445µs ± 1%     451µs ± 1%  +1.19%  (p=0.016 n=5+5)
_noDirectGzip_decode-2        133µs ± 1%     133µs ± 1%    ~     (p=0.151 n=5+5)
_jsonBodyManual-2            26.4µs ± 0%    27.7µs ± 3%  +4.98%  (p=0.008 n=5+5)
_jsonBody-2                  39.3µs ± 0%    39.4µs ± 2%    ~     (p=0.730 n=4+5)
_jsonBodyValidation-2        48.9µs ± 2%    50.6µs ± 2%  +3.36%  (p=0.016 n=5+5)
_outputHeaders-2             22.7µs ± 1%    23.1µs ± 1%  +1.94%  (p=0.008 n=5+5)
_requestResponseMapping-2    44.8µs ± 7%    43.2µs ± 2%    ~     (p=0.310 n=5+5)
_validation-2                45.8µs ± 3%    45.9µs ± 2%    ~     (p=0.341 n=5+5)
_noValidation-2              33.2µs ± 3%    33.3µs ± 1%    ~     (p=0.548 n=5+5)
pkg:github.com/swaggest/rest/_examples/task-api/internal/infra/nethttp goos:linux goarch:amd64
_notFoundSrv-2               26.2µs ± 0%    26.0µs ± 1%    ~     (p=0.057 n=4+4)
_ok-2                        26.8µs ± 1%    26.2µs ± 1%  -2.39%  (p=0.008 n=5+5)
_invalidBody-2               37.9µs ± 2%    36.9µs ± 1%  -2.83%  (p=0.008 n=5+5)

name                       old B:rcvd/op  new B:rcvd/op  delta
pkg:github.com/swaggest/rest/_examples/advanced goos:linux goarch:amd64
_directGzip-2                   639 ± 0%       639 ± 0%    ~     (all equal)
_directGzipHead-2               183 ± 0%       183 ± 0%    ~     (all equal)
_noDirectGzip-2               1.04k ± 0%     1.04k ± 0%    ~     (all equal)
_directGzip_decode-2            639 ± 0%       639 ± 0%    ~     (all equal)
_noDirectGzip_decode-2        1.04k ± 0%     1.04k ± 0%    ~     (all equal)
_jsonBody-2                     208 ± 0%       208 ± 0%    ~     (all equal)
_jsonBodyValidation-2           194 ± 0%       194 ± 0%    ~     (all equal)
_outputHeaders-2                155 ± 0%       155 ± 0%    ~     (all equal)
_requestResponseMapping-2      94.0 ± 0%      94.0 ± 0%    ~     (all equal)
_validation-2                   177 ± 0%       177 ± 0%    ~     (all equal)
_noValidation-2                 177 ± 0%       177 ± 0%    ~     (all equal)
pkg:github.com/swaggest/rest/_examples/advanced-generic goos:linux goarch:amd64
_directGzip-2                   653 ± 0%       653 ± 0%    ~     (all equal)
_directGzipHead-2               197 ± 0%       197 ± 0%    ~     (all equal)
_noDirectGzip-2               1.06k ± 0%     1.06k ± 0%    ~     (all equal)
_directGzip_decode-2            653 ± 0%       653 ± 0%    ~     (all equal)
_noDirectGzip_decode-2        1.06k ± 0%     1.06k ± 0%    ~     (all equal)
_jsonBodyManual-2               222 ± 0%       222 ± 0%    ~     (all equal)
_jsonBody-2                     222 ± 0%       222 ± 0%    ~     (all equal)
_jsonBodyValidation-2           208 ± 0%       208 ± 0%    ~     (all equal)
_outputHeaders-2                169 ± 0%       169 ± 0%    ~     (all equal)
_requestResponseMapping-2       108 ± 0%       108 ± 0%    ~     (all equal)
_validation-2                   191 ± 0%       191 ± 0%    ~     (all equal)
_noValidation-2                 191 ± 0%       191 ± 0%    ~     (all equal)
pkg:github.com/swaggest/rest/_examples/task-api/internal/infra/nethttp goos:linux goarch:amd64
_notFoundSrv-2                  337 ± 0%       337 ± 0%    ~     (all equal)
_ok-2                           359 ± 0%       359 ± 0%    ~     (all equal)
_invalidBody-2                  435 ± 0%       435 ± 0%    ~     (all equal)

name                       old B:sent/op  new B:sent/op  delta
pkg:github.com/swaggest/rest/_examples/advanced goos:linux goarch:amd64
_directGzip-2                   103 ± 0%       103 ± 0%    ~     (all equal)
_directGzipHead-2               104 ± 0%       104 ± 0%    ~     (all equal)
_noDirectGzip-2                 117 ± 0%       117 ± 0%    ~     (all equal)
_directGzip_decode-2            116 ± 0%       116 ± 0%    ~     (all equal)
_noDirectGzip_decode-2          130 ± 0%       130 ± 0%    ~     (all equal)
_jsonBody-2                     188 ± 0%       188 ± 0%    ~     (all equal)
_jsonBodyValidation-2           192 ± 0%       192 ± 0%    ~     (all equal)
_outputHeaders-2               77.0 ± 0%      77.0 ± 0%    ~     (all equal)
_requestResponseMapping-2       169 ± 0%       169 ± 0%    ~     (all equal)
_validation-2                   170 ± 0%       170 ± 0%    ~     (all equal)
_noValidation-2                 173 ± 0%       173 ± 0%    ~     (all equal)
pkg:github.com/swaggest/rest/_examples/advanced-generic goos:linux goarch:amd64
_directGzip-2                   103 ± 0%       103 ± 0%    ~     (all equal)
_directGzipHead-2               104 ± 0%       104 ± 0%    ~     (all equal)
_noDirectGzip-2                 117 ± 0%       117 ± 0%    ~     (all equal)
_directGzip_decode-2            116 ± 0%       116 ± 0%    ~     (all equal)
_noDirectGzip_decode-2          130 ± 0%       130 ± 0%    ~     (all equal)
_jsonBodyManual-2               195 ± 0%       195 ± 0%    ~     (all equal)
_jsonBody-2                     188 ± 0%       188 ± 0%    ~     (all equal)
_jsonBodyValidation-2           192 ± 0%       192 ± 0%    ~     (all equal)
_outputHeaders-2               77.0 ± 0%      77.0 ± 0%    ~     (all equal)
_requestResponseMapping-2       169 ± 0%       169 ± 0%    ~     (all equal)
_validation-2                   170 ± 0%       170 ± 0%    ~     (all equal)
_noValidation-2                 173 ± 0%       173 ± 0%    ~     (all equal)
pkg:github.com/swaggest/rest/_examples/task-api/internal/infra/nethttp goos:linux goarch:amd64
_notFoundSrv-2                 74.0 ± 0%      74.0 ± 0%    ~     (all equal)
_ok-2                          74.0 ± 0%      74.0 ± 0%    ~     (all equal)
_invalidBody-2                  137 ± 0%       137 ± 0%    ~     (all equal)

name                       old rps        new rps        delta
pkg:github.com/swaggest/rest/_examples/advanced goos:linux goarch:amd64
_directGzip-2                 41.5k ±11%     43.2k ± 1%    ~     (p=0.111 n=5+4)
_directGzipHead-2             42.8k ± 3%     43.3k ± 1%    ~     (p=0.421 n=5+5)
_noDirectGzip-2               7.49k ± 2%     7.54k ± 1%    ~     (p=0.548 n=5+5)
_directGzip_decode-2          2.24k ± 2%     2.24k ± 1%    ~     (p=0.841 n=5+5)
_noDirectGzip_decode-2        7.54k ± 1%     7.51k ± 1%    ~     (p=0.222 n=5+5)
_jsonBody-2                   23.7k ± 1%     23.5k ± 1%    ~     (p=0.238 n=5+5)
_jsonBodyValidation-2         20.6k ± 1%     19.9k ± 2%  -3.61%  (p=0.008 n=5+5)
_outputHeaders-2              43.5k ± 2%     42.9k ± 1%    ~     (p=0.056 n=5+5)
_requestResponseMapping-2     23.6k ± 2%     23.1k ± 1%  -1.83%  (p=0.032 n=5+5)
_validation-2                 21.8k ± 2%     22.0k ± 3%    ~     (p=0.841 n=5+5)
_noValidation-2               29.3k ± 2%     30.3k ± 1%  +3.44%  (p=0.008 n=5+5)
pkg:github.com/swaggest/rest/_examples/advanced-generic goos:linux goarch:amd64
_directGzip-2                 42.3k ± 1%     40.7k ±11%    ~     (p=0.190 n=4+5)
_directGzipHead-2             42.2k ± 0%     42.0k ± 4%    ~     (p=0.690 n=5+5)
_noDirectGzip-2               7.51k ± 1%     7.49k ± 1%    ~     (p=0.548 n=5+5)
_directGzip_decode-2          2.24k ± 1%     2.22k ± 1%  -1.18%  (p=0.016 n=5+5)
_noDirectGzip_decode-2        7.53k ± 1%     7.49k ± 1%    ~     (p=0.151 n=5+5)
_jsonBodyManual-2             37.9k ± 0%     36.1k ± 3%  -4.72%  (p=0.008 n=5+5)
_jsonBody-2                   25.5k ± 0%     25.4k ± 2%    ~     (p=0.730 n=4+5)
_jsonBodyValidation-2         20.4k ± 2%     19.8k ± 2%  -3.25%  (p=0.016 n=5+5)
_outputHeaders-2              44.1k ± 1%     43.2k ± 1%  -1.91%  (p=0.008 n=5+5)
_requestResponseMapping-2     22.4k ± 7%     23.2k ± 2%    ~     (p=0.310 n=5+5)
_validation-2                 21.9k ± 3%     21.8k ± 2%    ~     (p=0.310 n=5+5)
_noValidation-2               30.1k ± 3%     30.0k ± 1%    ~     (p=0.548 n=5+5)
pkg:github.com/swaggest/rest/_examples/task-api/internal/infra/nethttp goos:linux goarch:amd64
_notFoundSrv-2                38.2k ± 0%     38.5k ± 1%    ~     (p=0.057 n=4+4)
_ok-2                         37.3k ± 1%     38.2k ± 1%  +2.45%  (p=0.008 n=5+5)
_invalidBody-2                26.4k ± 2%     27.1k ± 1%  +2.90%  (p=0.008 n=5+5)

name                       old alloc/op   new alloc/op   delta
pkg:github.com/swaggest/rest/_examples/advanced goos:linux goarch:amd64
_directGzip-2                3.92kB ± 0%    3.92kB ± 0%    ~     (p=1.000 n=5+4)
_directGzipHead-2            3.92kB ± 0%    3.92kB ± 0%    ~     (p=0.476 n=5+5)
_noDirectGzip-2              6.43kB ±21%    6.58kB ±16%    ~     (p=1.000 n=5+5)
_directGzip_decode-2          403kB ± 0%     403kB ± 0%    ~     (p=1.000 n=5+5)
_noDirectGzip_decode-2       5.67kB ± 9%    5.61kB ±10%    ~     (p=0.841 n=5+5)
_jsonBody-2                  13.2kB ± 0%    13.2kB ± 0%    ~     (p=0.595 n=5+5)
_jsonBodyValidation-2        19.0kB ± 0%    19.0kB ± 0%    ~     (p=0.063 n=5+5)
_outputHeaders-2             3.71kB ± 0%    3.71kB ± 0%    ~     (p=0.714 n=5+5)
_requestResponseMapping-2    16.7kB ± 0%    16.7kB ± 0%    ~     (p=0.468 n=5+5)
_validation-2                16.6kB ± 0%    16.6kB ± 0%    ~     (p=0.683 n=5+5)
_noValidation-2              7.88kB ± 0%    7.88kB ± 0%    ~     (p=0.087 n=5+5)
pkg:github.com/swaggest/rest/_examples/advanced-generic goos:linux goarch:amd64
_directGzip-2                3.97kB ± 0%    3.97kB ± 0%    ~     (p=0.881 n=5+5)
_directGzipHead-2            3.97kB ± 0%    3.97kB ± 0%    ~     (p=0.389 n=5+5)
_noDirectGzip-2              6.93kB ±14%    6.47kB ±20%    ~     (p=0.548 n=5+5)
_directGzip_decode-2          403kB ± 0%     403kB ± 0%    ~     (p=0.841 n=5+5)
_noDirectGzip_decode-2       5.84kB ±12%    5.51kB ± 6%    ~     (p=0.421 n=5+5)
_jsonBodyManual-2            4.64kB ± 0%    4.64kB ± 0%    ~     (p=0.071 n=5+5)
_jsonBody-2                  10.4kB ± 0%    10.4kB ± 0%    ~     (p=0.905 n=5+5)
_jsonBodyValidation-2        19.1kB ± 0%    19.1kB ± 0%    ~     (p=0.460 n=5+5)
_outputHeaders-2             3.74kB ± 0%    3.74kB ± 0%    ~     (p=0.238 n=5+4)
_requestResponseMapping-2    16.7kB ± 0%    16.7kB ± 0%    ~     (p=0.738 n=5+5)
_validation-2                16.7kB ± 0%    16.7kB ± 0%    ~     (p=0.659 n=5+5)
_noValidation-2              7.94kB ± 0%    7.94kB ± 0%    ~     (p=0.952 n=5+5)
pkg:github.com/swaggest/rest/_examples/task-api/internal/infra/nethttp goos:linux goarch:amd64
_notFoundSrv-2               4.88kB ± 0%    4.88kB ± 0%    ~     (p=0.071 n=5+5)
_ok-2                        4.78kB ± 0%    4.78kB ± 0%    ~     (p=1.000 n=4+4)
_invalidBody-2               8.62kB ± 0%    8.62kB ± 0%    ~     (p=0.857 n=4+4)

name                       old allocs/op  new allocs/op  delta
pkg:github.com/swaggest/rest/_examples/advanced goos:linux goarch:amd64
_directGzip-2                  42.0 ± 0%      42.0 ± 0%    ~     (all equal)
_directGzipHead-2              42.0 ± 0%      42.0 ± 0%    ~     (all equal)
_noDirectGzip-2                49.4 ± 3%      49.6 ± 3%    ~     (p=1.000 n=5+5)
_directGzip_decode-2            501 ± 0%       501 ± 0%    ~     (p=1.000 n=5+5)
_noDirectGzip_decode-2         50.0 ± 0%      50.0 ± 0%    ~     (all equal)
_jsonBody-2                     130 ± 0%       130 ± 0%    ~     (all equal)
_jsonBodyValidation-2           186 ± 0%       186 ± 0%    ~     (all equal)
_outputHeaders-2               37.0 ± 0%      37.0 ± 0%    ~     (all equal)
_requestResponseMapping-2       126 ± 0%       126 ± 0%    ~     (all equal)
_validation-2                   155 ± 0%       155 ± 0%    ~     (all equal)
_noValidation-2                92.0 ± 0%      92.0 ± 0%    ~     (all equal)
pkg:github.com/swaggest/rest/_examples/advanced-generic goos:linux goarch:amd64
_directGzip-2                  44.0 ± 0%      44.0 ± 0%    ~     (all equal)
_directGzipHead-2              44.0 ± 0%      44.0 ± 0%    ~     (all equal)
_noDirectGzip-2                51.6 ± 3%      51.6 ± 3%    ~     (p=1.000 n=5+5)
_directGzip_decode-2            503 ± 0%       503 ± 0%    ~     (p=0.556 n=5+4)
_noDirectGzip_decode-2         52.0 ± 0%      52.0 ± 0%    ~     (all equal)
_jsonBodyManual-2              51.0 ± 0%      51.0 ± 0%    ~     (all equal)
_jsonBody-2                     102 ± 0%       102 ± 0%    ~     (all equal)
_jsonBodyValidation-2           188 ± 0%       188 ± 0%    ~     (all equal)
_outputHeaders-2               38.0 ± 0%      38.0 ± 0%    ~     (all equal)
_requestResponseMapping-2       128 ± 0%       128 ± 0%    ~     (all equal)
_validation-2                   157 ± 0%       157 ± 0%    ~     (all equal)
_noValidation-2                94.0 ± 0%      94.0 ± 0%    ~     (all equal)
pkg:github.com/swaggest/rest/_examples/task-api/internal/infra/nethttp goos:linux goarch:amd64
_notFoundSrv-2                 54.0 ± 0%      54.0 ± 0%    ~     (all equal)
_ok-2                          50.0 ± 0%      50.0 ± 0%    ~     (all equal)
_invalidBody-2                 99.0 ± 0%      99.0 ± 0%    ~     (all equal)
```
</details>
<!-- Sticky Pull Request Commentbench-examples -->
github-actions[bot]: ### Unit Test Coverage
total:								(statements)			83.5%
changed lines: (statements) 100.0%
<details><summary>Coverage of changed lines</summary>

|             File             |       Function       | Coverage |
|------------------------------|----------------------|----------|
| Total                        |                      | 100.0%   |
| chirouter/path_decoder.go    |                      | 100.0%   |
| chirouter/path_decoder.go:11 | PathToURLValues      | 100.0%   |
| gzip/container.go            |                      | 100.0%   |
| gzip/container.go:28         | WriteCompressedBytes | 100.0%   |
| jsonschema/validator.go      |                      | 100.0%   |
| jsonschema/validator.go:161  | ValidateJSONBody     | 100.0%   |
| jsonschema/validator.go:192  | ValidateData         | 100.0%   |
| request/decoder.go           |                      | 100.0%   |
| request/decoder.go:76        | Decode               | 100.0%   |
| request/jsonbody.go          |                      | 100.0%   |
| request/jsonbody.go:26       | decodeJSONBody       | 100.0%   |
| response/encoder.go          |                      | 100.0%   |
| response/encoder.go:128      | writeJSONResponse    | 100.0%   |
| response/encoder.go:190      | WriteErrResponse     | 100.0%   |

</details>

<details><summary>Coverage diff with base branch</summary>

No changes in coverage.

</details>
<!-- Sticky Pull Request Commentunit-test -->
codecov[bot]: # [Codecov](https://codecov.io/gh/swaggest/rest/pull/88?src=pr&el=h1&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest) Report
> Merging [#88](https://codecov.io/gh/swaggest/rest/pull/88?src=pr&el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest) (f87816f) into [master](https://codecov.io/gh/swaggest/rest/commit/0f5ebfc3b8ffd53b8d7df3c6caae8c8d45b7feea?el=desc&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest) (0f5ebfc) will **not change** coverage.
> The diff coverage is `100.00%`.

```diff
@@           Coverage Diff           @@
##           master      #88   +/-   ##
=======================================
  Coverage   77.52%   77.52%           
=======================================
  Files          27       27           
  Lines        1428     1428           
=======================================
  Hits         1107     1107           
  Misses        206      206           
  Partials      115      115           
```

| Flag | Coverage Δ | |
|---|---|---|
| unittests | `77.52% <100.00%> (ø)` | |

Flags with carried forward coverage won't be shown. [Click here](https://docs.codecov.io/docs/carryforward-flags?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest#carryforward-flags-in-the-pull-request-comment) to find out more.

| [Impacted Files](https://codecov.io/gh/swaggest/rest/pull/88?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest) | Coverage Δ | |
|---|---|---|
| [error.go](https://codecov.io/gh/swaggest/rest/pull/88/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest#diff-ZXJyb3IuZ28=) | `95.38% <ø> (ø)` | |
| [jsonschema/validator.go](https://codecov.io/gh/swaggest/rest/pull/88/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest#diff-anNvbnNjaGVtYS92YWxpZGF0b3IuZ28=) | `79.79% <ø> (ø)` | |
| [request.go](https://codecov.io/gh/swaggest/rest/pull/88/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest#diff-cmVxdWVzdC5nbw==) | `100.00% <ø> (ø)` | |
| [request/decoder.go](https://codecov.io/gh/swaggest/rest/pull/88/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest#diff-cmVxdWVzdC9kZWNvZGVyLmdv) | `70.21% <ø> (ø)` | |
| [response/gzip/middleware.go](https://codecov.io/gh/swaggest/rest/pull/88/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest#diff-cmVzcG9uc2UvZ3ppcC9taWRkbGV3YXJlLmdv) | `78.16% <ø> (ø)` | |
| [web/service.go](https://codecov.io/gh/swaggest/rest/pull/88/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest#diff-d2ViL3NlcnZpY2UuZ28=) | `100.00% <ø> (ø)` | |
| [chirouter/path\_decoder.go](https://codecov.io/gh/swaggest/rest/pull/88/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest#diff-Y2hpcm91dGVyL3BhdGhfZGVjb2Rlci5nbw==) | `85.71% <100.00%> (ø)` | |
| [gzip/container.go](https://codecov.io/gh/swaggest/rest/pull/88/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest#diff-Z3ppcC9jb250YWluZXIuZ28=) | `67.34% <100.00%> (ø)` | |
| [request/jsonbody.go](https://codecov.io/gh/swaggest/rest/pull/88/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest#diff-cmVxdWVzdC9qc29uYm9keS5nbw==) | `100.00% <100.00%> (ø)` | |
| [response/encoder.go](https://codecov.io/gh/swaggest/rest/pull/88/diff?src=pr&el=tree&utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest#diff-cmVzcG9uc2UvZW5jb2Rlci5nbw==) | `64.88% <100.00%> (ø)` | |

:mega: We’re building smart automated test selection to slash your CI/CD build times. [Learn more](https://about.codecov.io/iterative-testing/?utm_medium=referral&utm_source=github&utm_content=comment&utm_campaign=pr+comments&utm_term=swaggest)


Patch:
diff --git a/.github/workflows/bench.yml b/.github/workflows/bench.yml
index 0e6bddc..d750b9d 100644
--- a/.github/workflows/bench.yml
+++ b/.github/workflows/bench.yml
@@ -21,7 +21,7 @@ env:
   GO111MODULE: "on"
   CACHE_BENCHMARK: "off"    # Enables benchmark result reuse between runs, may skew latency results.
   RUN_BASE_BENCHMARK: "on"  # Runs benchmark for PR base in case benchmark result is missing.
-  GO_VERSION: 1.18.x
+  GO_VERSION: 1.19.x
 jobs:
   bench:
     runs-on: ubuntu-latest
diff --git a/.github/workflows/cloc.yml b/.github/workflows/cloc.yml
index 4592bb4..619ca74 100644
--- a/.github/workflows/cloc.yml
+++ b/.github/workflows/cloc.yml
@@ -24,7 +24,9 @@ jobs:
       - name: Count Lines Of Code
         id: loc
         run: |
-          curl -sLO https://github.com/vearutop/sccdiff/releases/download/v1.0.2/linux_amd64.tar.gz && tar xf linux_amd64.tar.gz && echo "b17e76bede22af0206b4918d3b3c4e7357f2a21b57f8de9e7c9dc0eb56b676c0  sccdiff" | shasum -c
+          curl -sLO https://github.com/vearutop/sccdiff/releases/download/v1.0.3/linux_amd64.tar.gz && tar xf linux_amd64.tar.gz
+          sccdiff_hash=$(git hash-object ./sccdiff)
+          [ "$sccdiff_hash" == "ae8a07b687bd3dba60861584efe724351aa7ff63" ] || (echo "::error::unexpected hash for sccdiff, possible tampering: $sccdiff_hash" && exit 1)
           OUTPUT=$(cd pr && ../sccdiff -basedir ../base)
           echo "${OUTPUT}"
           OUTPUT="${OUTPUT//$'\n'/%0A}"
diff --git a/.github/workflows/golangci-lint.yml b/.github/workflows/golangci-lint.yml
index 48207f9..bf0bcdb 100644
--- a/.github/workflows/golangci-lint.yml
+++ b/.github/workflows/golangci-lint.yml
@@ -21,13 +21,13 @@ jobs:
     steps:
       - uses: actions/setup-go@v3
         with:
-          go-version: 1.18.x
+          go-version: 1.19.x
       - uses: actions/checkout@v2
       - name: golangci-lint
-        uses: golangci/golangci-lint-action@v3.1.0
+        uses: golangci/golangci-lint-action@v3.2.0
         with:
           # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version.
-          version: v1.46.2
+          version: v1.50.0
 
           # Optional: working directory, useful for monorepos
           # working-directory: somedir
diff --git a/.github/workflows/gorelease.yml b/.github/workflows/gorelease.yml
index f1c678a..6267500 100644
--- a/.github/workflows/gorelease.yml
+++ b/.github/workflows/gorelease.yml
@@ -9,7 +9,7 @@ concurrency:
   cancel-in-progress: true
 
 env:
-  GO_VERSION: 1.18.x
+  GO_VERSION: 1.19.x
 jobs:
   gorelease:
     runs-on: ubuntu-latest
diff --git a/.golangci.yml b/.golangci.yml
index 2a24543..3be2189 100644
--- a/.golangci.yml
+++ b/.golangci.yml
@@ -41,10 +41,20 @@ linters:
     - ireturn
     - exhaustruct
     - nonamedreturns
+    - nosnakecase
+    - structcheck
+    - varcheck
+    - deadcode
+    - testableexamples
+    - dupword
 
 issues:
   exclude-use-default: false
   exclude-rules:
+    - linters:
+        - staticcheck
+      path: ".go"
+      text: "\"io/ioutil\" has been deprecated since Go 1.16" # Keeping backwards compatibility with go1.13.
     - linters:
         - gomnd
         - goconst
@@ -54,8 +64,11 @@ issues:
         - dupl
         - structcheck
         - unused
+        - unparam
+        - nosnakecase
       path: "_test.go"
     - linters:
-        - staticcheck
-      path: ".go"
-      text: "package io/ioutil is deprecated"
+        - errcheck # Error checking omitted for brevity.
+        - gosec
+      path: "example_"
+
diff --git a/Makefile b/Makefile
index 228cbc3..a874af3 100644
--- a/Makefile
+++ b/Makefile
@@ -1,4 +1,4 @@
-#GOLANGCI_LINT_VERSION := "v1.46.2" # Optional configuration to pinpoint golangci-lint version.
+#GOLANGCI_LINT_VERSION := "v1.50.0" # Optional configuration to pinpoint golangci-lint version.
 
 # The head of Makefile determines location of dev-go to include standard targets.
 GO ?= go
diff --git a/_examples/go.mod b/_examples/go.mod
index 3e0451e..ee983bf 100644
--- a/_examples/go.mod
+++ b/_examples/go.mod
@@ -6,7 +6,7 @@ replace github.com/swaggest/rest => ../
 
 require (
 	github.com/bool64/ctxd v1.1.2
-	github.com/bool64/dev v0.2.18
+	github.com/bool64/dev v0.2.22
 	github.com/bool64/httpmock v0.1.6
 	github.com/bool64/httptestbench v0.1.3
 	github.com/go-chi/chi/v5 v5.0.7
@@ -14,10 +14,10 @@ require (
 	github.com/rs/cors v1.8.2
 	github.com/stretchr/testify v1.8.0
 	github.com/swaggest/assertjson v1.7.0
-	github.com/swaggest/jsonschema-go v0.3.35
-	github.com/swaggest/openapi-go v0.2.18
+	github.com/swaggest/jsonschema-go v0.3.40
+	github.com/swaggest/openapi-go v0.2.22
 	github.com/swaggest/swgui v1.4.5
-	github.com/swaggest/usecase v1.1.3
+	github.com/swaggest/usecase v1.2.0
 	github.com/valyala/fasthttp v1.35.0
 )
 
diff --git a/_examples/go.sum b/_examples/go.sum
index 8148e6c..1145ef5 100644
--- a/_examples/go.sum
+++ b/_examples/go.sum
@@ -5,8 +5,8 @@ github.com/bool64/ctxd v1.1.2 h1:6J05q1vTG0op2O0kP+LosCd9wJ0qJybcvdE+bPjUJZE=
 github.com/bool64/ctxd v1.1.2/go.mod h1:5rwLykeZBJHK27q5sSfhfKig6076270V+3iiXbP+HFY=
 github.com/bool64/dev v0.1.35/go.mod h1:cTHiTDNc8EewrQPy3p1obNilpMpdmlUesDkFTF2zRWU=
 github.com/bool64/dev v0.1.41/go.mod h1:cTHiTDNc8EewrQPy3p1obNilpMpdmlUesDkFTF2zRWU=
-github.com/bool64/dev v0.2.18 h1:FPXZxR4+bgNgBKtORwCr7W/s46bY/LkKFwVy8f63cqI=
-github.com/bool64/dev v0.2.18/go.mod h1:iJbh1y/HkunEPhgebWRNcs8wfGq7sjvJ6W5iabL8ACg=
+github.com/bool64/dev v0.2.22 h1:YJFKBRKplkt+0Emq/5Xk1Z5QRmMNzc1UOJkR3rxJksA=
+github.com/bool64/dev v0.2.22/go.mod h1:iJbh1y/HkunEPhgebWRNcs8wfGq7sjvJ6W5iabL8ACg=
 github.com/bool64/httpmock v0.1.6 h1:v9+AmoSabaHuR7abjnhGwGxsaNljtFAYtluF0p4Q3ng=
 github.com/bool64/httpmock v0.1.6/go.mod h1:pQukYUfoG9gW4fRAv+xHuvA2BlRoauEXK/XG5mKD04I=
 github.com/bool64/httptestbench v0.1.3 h1:bPDM3YPtE3o2sqIwjhdTC55wiqwfHsqps2RGcWBesuo=
@@ -57,16 +57,16 @@ github.com/swaggest/assertjson v1.7.0 h1:SKw5Rn0LQs6UvmGrIdaKQbMR1R3ncXm5KNon+QJ
 github.com/swaggest/assertjson v1.7.0/go.mod h1:vxMJMehbSVJd+dDWFCKv3QRZKNTpy/ktZKTz9LOEDng=
 github.com/swaggest/form/v5 v5.0.1 h1:YQH0REX7iMKhtoVPWXREZgbt50VYXNCKK61psnD8Fgo=
 github.com/swaggest/form/v5 v5.0.1/go.mod h1:vdnaSTze7cxVKhWiCabrfm1YeLwWLpb9P941Gxv4FnA=
-github.com/swaggest/jsonschema-go v0.3.35 h1:LW5DC0WgR5YdQXyTRc5e8gLdKT0wkACg4aVJyaseU+4=
-github.com/swaggest/jsonschema-go v0.3.35/go.mod h1:JAF1nm+uIaMOXktuQepmkiRcgQ5yJk4Ccwx9HVt2cXw=
-github.com/swaggest/openapi-go v0.2.18 h1:9dTzNe91MoepI5PtHNUgby3R0ZNgTQte+pDh3X5XcDw=
-github.com/swaggest/openapi-go v0.2.18/go.mod h1:xUrd0cNiIfhkSIFwxmMmiw3FLegY/MQzSek3Byp4YjU=
+github.com/swaggest/jsonschema-go v0.3.40 h1:9EqQ9RvtdW69xfYODmyEKWOSZ12x5eiK+wGD2EVh/L4=
+github.com/swaggest/jsonschema-go v0.3.40/go.mod h1:ipIOmoFP64QyRUgyPyU/P9tayq2m2TlvUhyZHrhe3S4=
+github.com/swaggest/openapi-go v0.2.22 h1:uKZwAXo/LSNOSqkIUF81wS0fZujraRab79GYNc/79bc=
+github.com/swaggest/openapi-go v0.2.22/go.mod h1:kgzt+q28wgd4A3iRDY7xL7k0Q9JXxHlR9U/lFI1AQ7w=
 github.com/swaggest/refl v1.1.0 h1:a+9a75Kv6ciMozPjVbOfcVTEQe81t2R3emvaD9oGQGc=
 github.com/swaggest/refl v1.1.0/go.mod h1:g3Qa6ki0A/L2yxiuUpT+cuBURuRaltF5SDQpg1kMZSY=
 github.com/swaggest/swgui v1.4.5 h1:9kw3Lt+4qNdDwnRgpNSsx3s3BjoW/Inhbn7/38DX6Qk=
 github.com/swaggest/swgui v1.4.5/go.mod h1:qfAwdL49ikzxahZrLrPJYAruNuL1Nt6do8jtC9luAlI=
-github.com/swaggest/usecase v1.1.3 h1:SGnmV07jyDhdg+gqEAv/NNc8R18JQqJUs4wVq+LWa5g=
-github.com/swaggest/usecase v1.1.3/go.mod h1:gLSjsqHiDmHOIf081asqys7UUndFrTWrfNa2opxEt7k=
+github.com/swaggest/usecase v1.2.0 h1:cHVFqxIbHfyTXp02JmWXk+ZADaSa87UZP+b3qL5Nz90=
+github.com/swaggest/usecase v1.2.0/go.mod h1:oc5+QoAxG3Et5Gl9lRXgEOm00l4VN9gdVQSMIa5EeLY=
 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/fasthttp v1.35.0 h1:wwkR8mZn2NbigFsaw2Zj5r+xkmzjbrA/lyTmiSlal/Y=
@@ -84,14 +84,14 @@ github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcm
 golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4=
 golang.org/x/net v0.0.0-20211112202133-69e39bad7dc2/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
 golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
-golang.org/x/net v0.0.0-20220630215102-69896b714898 h1:K7wO6V1IrczY9QOQ2WkVpw4JQSwCd52UsxVEirZUfiw=
+golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48 h1:N9Vc/rorQUDes6B9CNdIxAn5jODGj2wzfrei2x4wNj4=
 golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220702020025-31831981b65f h1:xdsejrW/0Wf2diT5CPp3XmKUNbr7Xvw8kYilQ+6qjRY=
+golang.org/x/sys v0.0.0-20220804214406-8e32c043e418 h1:9vYwv7OjYaky/tlAeD7C4oC9EsPTlaFl1H2jS++V+ME=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
diff --git a/_examples/task-api/internal/infra/repository/task.go b/_examples/task-api/internal/infra/repository/task.go
index 8eef296..a58bcb3 100644
--- a/_examples/task-api/internal/infra/repository/task.go
+++ b/_examples/task-api/internal/infra/repository/task.go
@@ -154,7 +154,8 @@ func (tr *Task) Create(ctx context.Context, value task.Value) (task.Entity, erro
 }
 
 // FinishExpired closes expired tasks.
-//   nolint:unused // False positive.
+//
+//	nolint:unused // False positive.
 func (tr *Task) FinishExpired(_ context.Context) error {
 	tr.mu.Lock()
 	defer tr.mu.Unlock()
diff --git a/chirouter/path_decoder.go b/chirouter/path_decoder.go
index 258213c..812b686 100644
--- a/chirouter/path_decoder.go
+++ b/chirouter/path_decoder.go
@@ -8,7 +8,7 @@ import (
 )
 
 // PathToURLValues is a decoder function for parameters in path.
-func PathToURLValues(r *http.Request) (url.Values, error) { // nolint:unparam // Matches request.DecoderFactory.SetDecoderFunc.
+func PathToURLValues(r *http.Request) (url.Values, error) { //nolint:unparam // Matches request.DecoderFactory.SetDecoderFunc.
 	if routeCtx := chi.RouteContext(r.Context()); routeCtx != nil {
 		params := make(url.Values, len(routeCtx.URLParams.Keys))
 
diff --git a/error.go b/error.go
index 3a91dfb..90623e0 100644
--- a/error.go
+++ b/error.go
@@ -34,7 +34,8 @@ type ErrWithCanonicalStatus interface {
 // Err creates HTTP status code and ErrResponse for error.
 //
 // You can use it with use case status code:
-//   rest.Err(status.NotFound)
+//
+//	rest.Err(status.NotFound)
 func Err(err error) (int, ErrResponse) {
 	if err == nil {
 		panic("nil error received")
diff --git a/go.mod b/go.mod
index c791cd6..6080d25 100644
--- a/go.mod
+++ b/go.mod
@@ -3,7 +3,7 @@ module github.com/swaggest/rest
 go 1.17
 
 require (
-	github.com/bool64/dev v0.2.18
+	github.com/bool64/dev v0.2.22
 	github.com/bool64/httpmock v0.1.6
 	github.com/bool64/shared v0.1.5
 	github.com/cespare/xxhash/v2 v2.1.2
@@ -12,23 +12,20 @@ require (
 	github.com/stretchr/testify v1.8.0
 	github.com/swaggest/assertjson v1.7.0
 	github.com/swaggest/form/v5 v5.0.1
-	github.com/swaggest/jsonschema-go v0.3.35
-	github.com/swaggest/openapi-go v0.2.18
+	github.com/swaggest/jsonschema-go v0.3.40
+	github.com/swaggest/openapi-go v0.2.22
 	github.com/swaggest/refl v1.1.0
-	github.com/swaggest/usecase v1.1.3
+	github.com/swaggest/usecase v1.2.0
 )
 
 require (
 	github.com/davecgh/go-spew v1.1.1 // indirect
-	github.com/fsnotify/fsnotify v1.4.9 // indirect
 	github.com/iancoleman/orderedmap v0.2.0 // indirect
 	github.com/pmezard/go-difflib v1.0.0 // indirect
 	github.com/sergi/go-diff v1.2.0 // indirect
 	github.com/yosuke-furukawa/json5 v0.1.2-0.20201207051438-cf7bb3f354ff // indirect
 	github.com/yudai/gojsondiff v1.0.0 // indirect
 	github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 // indirect
-	golang.org/x/text v0.3.7 // indirect
-	gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 // indirect
 	gopkg.in/yaml.v2 v2.4.0 // indirect
 	gopkg.in/yaml.v3 v3.0.1 // indirect
 )
diff --git a/go.sum b/go.sum
index 6c06770..64d33a0 100644
--- a/go.sum
+++ b/go.sum
@@ -1,16 +1,14 @@
-github.com/bool64/dev v0.1.25/go.mod h1:cTHiTDNc8EewrQPy3p1obNilpMpdmlUesDkFTF2zRWU=
 github.com/bool64/dev v0.1.35/go.mod h1:cTHiTDNc8EewrQPy3p1obNilpMpdmlUesDkFTF2zRWU=
-github.com/bool64/dev v0.1.41/go.mod h1:cTHiTDNc8EewrQPy3p1obNilpMpdmlUesDkFTF2zRWU=
 github.com/bool64/dev v0.2.5/go.mod h1:cTHiTDNc8EewrQPy3p1obNilpMpdmlUesDkFTF2zRWU=
 github.com/bool64/dev v0.2.10/go.mod h1:/csLrm+4oDSsKJRIVS0mrywAonLnYKFG8RvGT7Jh9b8=
-github.com/bool64/dev v0.2.12/go.mod h1:/csLrm+4oDSsKJRIVS0mrywAonLnYKFG8RvGT7Jh9b8=
 github.com/bool64/dev v0.2.16/go.mod h1:/csLrm+4oDSsKJRIVS0mrywAonLnYKFG8RvGT7Jh9b8=
 github.com/bool64/dev v0.2.17/go.mod h1:iJbh1y/HkunEPhgebWRNcs8wfGq7sjvJ6W5iabL8ACg=
-github.com/bool64/dev v0.2.18 h1:FPXZxR4+bgNgBKtORwCr7W/s46bY/LkKFwVy8f63cqI=
-github.com/bool64/dev v0.2.18/go.mod h1:iJbh1y/HkunEPhgebWRNcs8wfGq7sjvJ6W5iabL8ACg=
+github.com/bool64/dev v0.2.19/go.mod h1:iJbh1y/HkunEPhgebWRNcs8wfGq7sjvJ6W5iabL8ACg=
+github.com/bool64/dev v0.2.20/go.mod h1:iJbh1y/HkunEPhgebWRNcs8wfGq7sjvJ6W5iabL8ACg=
+github.com/bool64/dev v0.2.22 h1:YJFKBRKplkt+0Emq/5Xk1Z5QRmMNzc1UOJkR3rxJksA=
+github.com/bool64/dev v0.2.22/go.mod h1:iJbh1y/HkunEPhgebWRNcs8wfGq7sjvJ6W5iabL8ACg=
 github.com/bool64/httpmock v0.1.6 h1:v9+AmoSabaHuR7abjnhGwGxsaNljtFAYtluF0p4Q3ng=
 github.com/bool64/httpmock v0.1.6/go.mod h1:pQukYUfoG9gW4fRAv+xHuvA2BlRoauEXK/XG5mKD04I=
-github.com/bool64/shared v0.1.3/go.mod h1:RF1p1Oi29ofgOvinBpetbF5mceOUP3kpMkvLbWOmtm0=
 github.com/bool64/shared v0.1.4/go.mod h1:ryGjsnQFh6BnEXClfVlEJrzjwzat7CmA8PNS5E+jPp0=
 github.com/bool64/shared v0.1.5 h1:fp3eUhBsrSjNCQPcSdQqZxxh9bBwrYiZ+zOKFkM0/2E=
 github.com/bool64/shared v0.1.5/go.mod h1:081yz68YC9jeFB3+Bbmno2RFWvGKv1lPKkMP6MHJlPs=
@@ -38,7 +36,6 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
 github.com/iancoleman/orderedmap v0.2.0 h1:sq1N/TFpYH++aViPcaKjys3bDClUEU7s5B+z6jq8pNA=
 github.com/iancoleman/orderedmap v0.2.0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=
-github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
 github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
 github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -73,21 +70,18 @@ github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81P
 github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
 github.com/stretchr/testify v1.8.0 h1:pSgiaMZlXftHpm5L7V1+rVB+AZJydKsMxsQBIJw4PKk=
 github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
-github.com/swaggest/assertjson v1.6.8/go.mod h1:Euf0upn9Vlaf1/llYHTs+Kx5K3vVbpMbsZhth7zlN7M=
 github.com/swaggest/assertjson v1.7.0 h1:SKw5Rn0LQs6UvmGrIdaKQbMR1R3ncXm5KNon+QJ7jtw=
 github.com/swaggest/assertjson v1.7.0/go.mod h1:vxMJMehbSVJd+dDWFCKv3QRZKNTpy/ktZKTz9LOEDng=
 github.com/swaggest/form/v5 v5.0.1 h1:YQH0REX7iMKhtoVPWXREZgbt50VYXNCKK61psnD8Fgo=
 github.com/swaggest/form/v5 v5.0.1/go.mod h1:vdnaSTze7cxVKhWiCabrfm1YeLwWLpb9P941Gxv4FnA=
-github.com/swaggest/jsonschema-go v0.3.34/go.mod h1:JAF1nm+uIaMOXktuQepmkiRcgQ5yJk4Ccwx9HVt2cXw=
-github.com/swaggest/jsonschema-go v0.3.35 h1:LW5DC0WgR5YdQXyTRc5e8gLdKT0wkACg4aVJyaseU+4=
-github.com/swaggest/jsonschema-go v0.3.35/go.mod h1:JAF1nm+uIaMOXktuQepmkiRcgQ5yJk4Ccwx9HVt2cXw=
-github.com/swaggest/openapi-go v0.2.18 h1:9dTzNe91MoepI5PtHNUgby3R0ZNgTQte+pDh3X5XcDw=
-github.com/swaggest/openapi-go v0.2.18/go.mod h1:xUrd0cNiIfhkSIFwxmMmiw3FLegY/MQzSek3Byp4YjU=
-github.com/swaggest/refl v1.0.2/go.mod h1:DoiPoBJPYHU6Z9fIA6zXQ9uI6VRL6M8BFX5YFT+ym9g=
+github.com/swaggest/jsonschema-go v0.3.40 h1:9EqQ9RvtdW69xfYODmyEKWOSZ12x5eiK+wGD2EVh/L4=
+github.com/swaggest/jsonschema-go v0.3.40/go.mod h1:ipIOmoFP64QyRUgyPyU/P9tayq2m2TlvUhyZHrhe3S4=
+github.com/swaggest/openapi-go v0.2.22 h1:uKZwAXo/LSNOSqkIUF81wS0fZujraRab79GYNc/79bc=
+github.com/swaggest/openapi-go v0.2.22/go.mod h1:kgzt+q28wgd4A3iRDY7xL7k0Q9JXxHlR9U/lFI1AQ7w=
 github.com/swaggest/refl v1.1.0 h1:a+9a75Kv6ciMozPjVbOfcVTEQe81t2R3emvaD9oGQGc=
 github.com/swaggest/refl v1.1.0/go.mod h1:g3Qa6ki0A/L2yxiuUpT+cuBURuRaltF5SDQpg1kMZSY=
-github.com/swaggest/usecase v1.1.3 h1:SGnmV07jyDhdg+gqEAv/NNc8R18JQqJUs4wVq+LWa5g=
-github.com/swaggest/usecase v1.1.3/go.mod h1:gLSjsqHiDmHOIf081asqys7UUndFrTWrfNa2opxEt7k=
+github.com/swaggest/usecase v1.2.0 h1:cHVFqxIbHfyTXp02JmWXk+ZADaSa87UZP+b3qL5Nz90=
+github.com/swaggest/usecase v1.2.0/go.mod h1:oc5+QoAxG3Et5Gl9lRXgEOm00l4VN9gdVQSMIa5EeLY=
 github.com/yosuke-furukawa/json5 v0.1.2-0.20201207051438-cf7bb3f354ff h1:7YqG491bE4vstXRz1lD38rbSgbXnirvROz1lZiOnPO8=
 github.com/yosuke-furukawa/json5 v0.1.2-0.20201207051438-cf7bb3f354ff/go.mod h1:sw49aWDqNdRJ6DYUtIQiaA3xyj2IL9tjeNYmX2ixwcU=
 github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA=
@@ -107,8 +101,9 @@ golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLL
 golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
 golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
 golang.org/x/net v0.0.0-20201202161906-c7110b5ffcbb/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
-golang.org/x/net v0.0.0-20220630215102-69896b714898 h1:K7wO6V1IrczY9QOQ2WkVpw4JQSwCd52UsxVEirZUfiw=
 golang.org/x/net v0.0.0-20220630215102-69896b714898/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
+golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48 h1:N9Vc/rorQUDes6B9CNdIxAn5jODGj2wzfrei2x4wNj4=
+golang.org/x/net v0.0.0-20220805013720-a33c5aa5df48/go.mod h1:YDH+HFinaLZZlnHAfSS6ZXJJ9M9t4Dl22yv3iI2vPwk=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -126,8 +121,10 @@ golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7w
 golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.0.0-20220702020025-31831981b65f h1:xdsejrW/0Wf2diT5CPp3XmKUNbr7Xvw8kYilQ+6qjRY=
 golang.org/x/sys v0.0.0-20220702020025-31831981b65f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220728004956-3c1f35247d10/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
+golang.org/x/sys v0.0.0-20220804214406-8e32c043e418 h1:9vYwv7OjYaky/tlAeD7C4oC9EsPTlaFl1H2jS++V+ME=
+golang.org/x/sys v0.0.0-20220804214406-8e32c043e418/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
@@ -158,7 +155,5 @@ gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 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.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
-gopkg.in/yaml.v3 v3.0.0/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
 gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
 gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
diff --git a/gzip/container.go b/gzip/container.go
index 36186c7..7369bd1 100644
--- a/gzip/container.go
+++ b/gzip/container.go
@@ -39,7 +39,7 @@ func WriteCompressedBytes(compressed []byte, w io.Writer) (int, error) {
 		return 0, err
 	}
 
-	n, err := io.Copy(w, gr) // nolint:gosec // The origin of compressed data supposed to be app itself, safe to copy.
+	n, err := io.Copy(w, gr) //nolint:gosec // The origin of compressed data supposed to be app itself, safe to copy.
 
 	return int(n), err
 }
diff --git a/jsonschema/validator.go b/jsonschema/validator.go
index c9ea684..e9a0d9b 100644
--- a/jsonschema/validator.go
+++ b/jsonschema/validator.go
@@ -173,7 +173,7 @@ func (v *Validator) ValidateJSONBody(jsonBody []byte) error {
 
 	errs := make(rest.ValidationErrors, 1)
 
-	// nolint:errorlint // Error is not wrapped, type assertion is more performant.
+	//nolint:errorlint // Error is not wrapped, type assertion is more performant.
 	if ve, ok := err.(*jsonschema.ValidationError); ok {
 		errs[name] = appendError(errs[name], ve)
 	} else {
@@ -235,7 +235,7 @@ func (v *Validator) ValidateData(in rest.ParamIn, namedData map[string]interface
 
 		errKey := string(in) + ":" + name
 
-		// nolint:errorlint // Error is not wrapped, type assertion is more performant.
+		//nolint:errorlint // Error is not wrapped, type assertion is more performant.
 		if ve, ok := err.(*jsonschema.ValidationError); ok {
 			errs[errKey] = appendError(errs[errKey], ve)
 		} else {
diff --git a/request.go b/request.go
index d296477..da6de43 100644
--- a/request.go
+++ b/request.go
@@ -30,7 +30,8 @@ const (
 // Each item is a map with struct field name as key and decoded field name as value.
 //
 // Example:
-//   map[rest.ParamIn]map[string]string{rest.ParamInQuery:map[string]string{"ID": "id", "FirstName": "first-name"}}
+//
+//	map[rest.ParamIn]map[string]string{rest.ParamInQuery:map[string]string{"ID": "id", "FirstName": "first-name"}}
 type RequestMapping map[ParamIn]map[string]string
 
 // RequestErrors is a list of validation or decoding errors.
diff --git a/request/decoder.go b/request/decoder.go
index 0494aed..1c3cfa0 100644
--- a/request/decoder.go
+++ b/request/decoder.go
@@ -81,7 +81,7 @@ func (d *decoder) Decode(r *http.Request, input interface{}, validator rest.Vali
 	for i, decode := range d.decoders {
 		err := decode(r, input, validator)
 		if err != nil {
-			// nolint:errorlint // Error is not wrapped, type assertion is more performant.
+			//nolint:errorlint // Error is not wrapped, type assertion is more performant.
 			if de, ok := err.(form.DecodeErrors); ok {
 				errs := make(rest.RequestErrors, len(de))
 				for name, e := range de {
diff --git a/request/jsonbody.go b/request/jsonbody.go
index d17d5b4..2669ea5 100644
--- a/request/jsonbody.go
+++ b/request/jsonbody.go
@@ -44,7 +44,7 @@ func decodeJSONBody(readJSON func(rd io.Reader, v interface{}) error) valueDecod
 		validate := validator != nil && validator.HasConstraints(rest.ParamInBody)
 
 		if validate {
-			b = bufPool.Get().(*bytes.Buffer) // nolint:errcheck // bufPool is configured to provide *bytes.Buffer.
+			b = bufPool.Get().(*bytes.Buffer) //nolint:errcheck // bufPool is configured to provide *bytes.Buffer.
 			defer bufPool.Put(b)
 
 			b.Reset()
diff --git a/response/encoder.go b/response/encoder.go
index 0b16e4f..2285d76 100644
--- a/response/encoder.go
+++ b/response/encoder.go
@@ -148,7 +148,7 @@ func (h *Encoder) writeJSONResponse(
 		return
 	}
 
-	e := jsonEncoderPool.Get().(*jsonEncoder) // nolint:errcheck
+	e := jsonEncoderPool.Get().(*jsonEncoder) //nolint:errcheck
 
 	e.buf.Reset()
 	defer jsonEncoderPool.Put(e)
@@ -190,7 +190,7 @@ func (h *Encoder) writeJSONResponse(
 func (h *Encoder) WriteErrResponse(w http.ResponseWriter, r *http.Request, statusCode int, response interface{}) {
 	contentType := "application/json; charset=utf-8"
 
-	e := jsonEncoderPool.Get().(*jsonEncoder) // nolint:errcheck
+	e := jsonEncoderPool.Get().(*jsonEncoder) //nolint:errcheck
 
 	e.buf.Reset()
 	defer jsonEncoderPool.Put(e)
diff --git a/response/gzip/middleware.go b/response/gzip/middleware.go
index 5ddd621..76b66bd 100644
--- a/response/gzip/middleware.go
+++ b/response/gzip/middleware.go
@@ -55,7 +55,7 @@ func getGzipWriter(w io.Writer) *gzip.Writer {
 		return zw
 	}
 
-	// nolint:errcheck // OK to panic here.
+	//nolint:errcheck // OK to panic here.
 	zw := v.(*gzip.Writer)
 
 	zw.Reset(w)
@@ -69,7 +69,7 @@ func getBufWriter(w io.Writer) *bufio.Writer {
 		return bufio.NewWriterSize(w, defaultBufferSize)
 	}
 
-	// nolint:errcheck // OK to panic here.
+	//nolint:errcheck // OK to panic here.
 	bw := v.(*bufio.Writer)
 
 	bw.Reset(w)
diff --git a/web/service.go b/web/service.go
index 45c0406..fce060e 100644
--- a/web/service.go
+++ b/web/service.go
@@ -131,12 +131,14 @@ func (s *Service) Trace(pattern string, uc usecase.Interactor, options ...func(h
 // Docs adds the route `pattern` that serves API documentation with Swagger UI.
 //
 // Swagger UI should be provided by `swgui` handler constructor, you can use one of these functions
-//   github.com/swaggest/swgui/v4emb.New
-//   github.com/swaggest/swgui/v4cdn.New
-//   github.com/swaggest/swgui/v4.New
-//   github.com/swaggest/swgui/v3emb.New
-//   github.com/swaggest/swgui/v3cdn.New
-//   github.com/swaggest/swgui/v3.New
+//
+//	github.com/swaggest/swgui/v4emb.New
+//	github.com/swaggest/swgui/v4cdn.New
+//	github.com/swaggest/swgui/v4.New
+//	github.com/swaggest/swgui/v3emb.New
+//	github.com/swaggest/swgui/v3cdn.New
+//	github.com/swaggest/swgui/v3.New
+//
 // or create your own.
 func (s *Service) Docs(pattern string, swgui func(title, schemaURL, basePath string) http.Handler) {
 	pattern = strings.TrimRight(pattern, "/")


Test patch:
diff --git a/.github/workflows/test-examples.yml b/.github/workflows/test-examples.yml
index 12e8551..d44ef73 100644
--- a/.github/workflows/test-examples.yml
+++ b/.github/workflows/test-examples.yml
@@ -11,7 +11,7 @@ jobs:
   test:
     strategy:
       matrix:
-        go-version: [1.18.x ]
+        go-version: [1.19.x ]
     runs-on: ubuntu-latest
     steps:
       - name: Install Go stable
diff --git a/.github/workflows/test-unit.yml b/.github/workflows/test-unit.yml
index fd1dd93..ed31598 100644
--- a/.github/workflows/test-unit.yml
+++ b/.github/workflows/test-unit.yml
@@ -21,7 +21,7 @@ jobs:
   test:
     strategy:
       matrix:
-        go-version: [ 1.13.x, 1.14.x, 1.15.x, 1.16.x, 1.17.x, 1.18.x ]
+        go-version: [ 1.13.x, 1.14.x, 1.15.x, 1.16.x, 1.17.x, 1.18.x, 1.19.x ]
     runs-on: ubuntu-latest
     steps:
       - name: Install Go stable
diff --git a/_examples/advanced-generic/_testdata/openapi.json b/_examples/advanced-generic/_testdata/openapi.json
index 3a15b91..2541daf 100644
--- a/_examples/advanced-generic/_testdata/openapi.json
+++ b/_examples/advanced-generic/_testdata/openapi.json
@@ -318,7 +318,7 @@
                 "schema":{"type":"string","description":"Sample response header."}
               }
             },
-            "content":{"text/csv":{"schema":{}}}
+            "content":{"text/csv":{"schema":{"type":"string"}}}
           },
           "500":{
             "description":"Internal Server Error",
diff --git a/_examples/advanced-generic/router_test.go b/_examples/advanced-generic/router_test.go
index 55ae603..a581145 100644
--- a/_examples/advanced-generic/router_test.go
+++ b/_examples/advanced-generic/router_test.go
@@ -4,9 +4,9 @@ package main
 
 import (
 	"encoding/json"
-	"io/ioutil"
 	"net/http"
 	"net/http/httptest"
+	"os"
 	"testing"
 
 	"github.com/stretchr/testify/assert"
@@ -28,10 +28,10 @@ func TestNewRouter(t *testing.T) {
 	actualSchema, err := assertjson.MarshalIndentCompact(json.RawMessage(rw.Body.Bytes()), "", "  ", 120)
 	require.NoError(t, err)
 
-	expectedSchema, err := ioutil.ReadFile("_testdata/openapi.json")
+	expectedSchema, err := os.ReadFile("_testdata/openapi.json")
 	require.NoError(t, err)
 
 	if !assertjson.Equal(t, expectedSchema, rw.Body.Bytes(), string(actualSchema)) {
-		require.NoError(t, ioutil.WriteFile("_testdata/openapi_last_run.json", actualSchema, 0o600))
+		require.NoError(t, os.WriteFile("_testdata/openapi_last_run.json", actualSchema, 0o600))
 	}
 }
diff --git a/_examples/advanced/_testdata/openapi.json b/_examples/advanced/_testdata/openapi.json
index 2d5222d..942285a 100644
--- a/_examples/advanced/_testdata/openapi.json
+++ b/_examples/advanced/_testdata/openapi.json
@@ -286,7 +286,7 @@
                 "schema":{"type":"string","description":"Sample response header."}
               }
             },
-            "content":{"text/csv":{"schema":{}}}
+            "content":{"text/csv":{"schema":{"type":"string"}}}
           },
           "500":{
             "description":"Internal Server Error",
diff --git a/_examples/advanced/router_test.go b/_examples/advanced/router_test.go
index 94c334f..339ce34 100644
--- a/_examples/advanced/router_test.go
+++ b/_examples/advanced/router_test.go
@@ -2,9 +2,9 @@ package main
 
 import (
 	"encoding/json"
-	"io/ioutil"
 	"net/http"
 	"net/http/httptest"
+	"os"
 	"testing"
 
 	"github.com/stretchr/testify/assert"
@@ -26,10 +26,10 @@ func TestNewRouter(t *testing.T) {
 	actualSchema, err := assertjson.MarshalIndentCompact(json.RawMessage(rw.Body.Bytes()), "", "  ", 120)
 	require.NoError(t, err)
 
-	expectedSchema, err := ioutil.ReadFile("_testdata/openapi.json")
+	expectedSchema, err := os.ReadFile("_testdata/openapi.json")
 	require.NoError(t, err)
 
 	if !assertjson.Equal(t, expectedSchema, rw.Body.Bytes(), string(actualSchema)) {
-		require.NoError(t, ioutil.WriteFile("_testdata/openapi_last_run.json", actualSchema, 0o600))
+		require.NoError(t, os.WriteFile("_testdata/openapi_last_run.json", actualSchema, 0o600))
 	}
 }
diff --git a/openapi/collector_test.go b/openapi/collector_test.go
index ae38929..7d5ff3b 100644
--- a/openapi/collector_test.go
+++ b/openapi/collector_test.go
@@ -164,7 +164,7 @@ func TestCollector_Collect_requestMapping(t *testing.T) {
 			  },
 			  {
 				"name":"in_cookie","in":"cookie",
-				"schema":{"type":"string","format":"date-time"}
+				"schema":{"type":"string","format":"date-time","nullable":true}
 			  },
 			  {
 				"name":"X-In-Header","in":"header",
@@ -193,7 +193,7 @@ func TestCollector_Collect_requestMapping(t *testing.T) {
 			  },
 			  {
 				"name":"in_cookie","in":"cookie",
-				"schema":{"type":"string","format":"date-time"}
+				"schema":{"type":"string","format":"date-time","nullable":true}
 			  },
 			  {
 				"name":"X-In-Header","in":"header",
diff --git a/request/jsonbody_test.go b/request/jsonbody_test.go
index 14db399..a293e61 100644
--- a/request/jsonbody_test.go
+++ b/request/jsonbody_test.go
@@ -1,4 +1,4 @@
-package request // nolint:testpackage
+package request //nolint:testpackage
 
 import (
 	"bytes"