Repository: swaggest/openapi-go
Pull request #2 (2020-04-11 23:32:02)

Improve API usability 


Patch:
diff --git a/README.md b/README.md
index 73b397f..c339293 100644
--- a/README.md
+++ b/README.md
@@ -118,7 +118,7 @@ fmt.Println(string(schema))
 //     ],
 //     "responses": {
 //      "200": {
-//       "description": "",
+//       "description": "OK",
 //       "content": {
 //        "application/json": {
 //         "schema": {
@@ -160,7 +160,7 @@ fmt.Println(string(schema))
 //     },
 //     "responses": {
 //      "200": {
-//       "description": "",
+//       "description": "OK",
 //       "content": {
 //        "application/json": {
 //         "schema": {
@@ -170,7 +170,7 @@ fmt.Println(string(schema))
 //       }
 //      },
 //      "409": {
-//       "description": "",
+//       "description": "Conflict",
 //       "content": {
 //        "application/json": {
 //         "schema": {
@@ -214,8 +214,7 @@ fmt.Println(string(schema))
 //      "string": {
 //       "type": "string"
 //      }
-//     },
-//     "nullable": true
+//     }
 //    },
 //    "Openapi3TestResp": {
 //     "type": "object",
@@ -247,8 +246,7 @@ fmt.Println(string(schema))
 //       "type": "string",
 //       "format": "date-time"
 //      }
-//     },
-//     "nullable": true
+//     }
 //    }
 //   }
 //  }
diff --git a/go.mod b/go.mod
index b144943..6d333d9 100644
--- a/go.mod
+++ b/go.mod
@@ -5,8 +5,7 @@ go 1.13
 require (
 	github.com/stretchr/testify v1.5.1
 	github.com/swaggest/assertjson v1.0.0
-	github.com/swaggest/jsonschema-go v0.2.1
+	github.com/swaggest/jsonschema-go v0.2.3
 	github.com/swaggest/refl v0.1.2
 	github.com/swaggest/swgen v0.6.20
-	github.com/swaggest/swgui v1.0.6
 )
diff --git a/go.sum b/go.sum
index 83b6556..0db886b 100644
--- a/go.sum
+++ b/go.sum
@@ -1,90 +1,394 @@
+cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw=
+github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
+github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU=
+github.com/OpenPeeDeeP/depguard v1.0.1/go.mod h1:xsIw86fROiiwelg+jB2uM9PiKihMMmUx/1V+TNhjQvM=
+github.com/StackExchange/wmi v0.0.0-20180116203802-5d049714c4a6/go.mod h1:3eOhrUMpNV+6aFIbp5/iudMxNCF27Vw2OZgy4xEx0Fg=
+github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc=
+github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
+github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
+github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
+github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8=
+github.com/bombsimon/wsl/v2 v2.0.0/go.mod h1:mf25kr/SqFEPhhcxW1+7pxzGlW+hIl/hYTKY95VwV8U=
+github.com/bombsimon/wsl/v2 v2.2.0/go.mod h1:Azh8c3XGEJl9LyX0/sFC+CKMc7Ssgua0g+6abzXN4Pg=
+github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc=
+github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw=
+github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
+github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/etcd v3.3.13+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
+github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
+github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
+github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4=
+github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA=
+github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
+github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU=
+github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
 github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
 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/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ=
+github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no=
+github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4=
+github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU=
 github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I=
 github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
+github.com/fsnotify/fsnotify v1.4.9 h1:hsms1Qyu0jgnwNXIxa+/V/PDsU6CfLf6CNO8H7IWoS4=
+github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
+github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04=
+github.com/go-critic/go-critic v0.4.1/go.mod h1:7/14rZGnZbY6E38VEGk2kVhoq6itzc1E68facVDK23g=
+github.com/go-critic/go-critic v0.4.3/go.mod h1:j4O3D4RoIwRqlZw5jJpx0BNfXWWbpcJoKu5cYSe4YmQ=
+github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as=
+github.com/go-lintpack/lintpack v0.5.2/go.mod h1:NwZuYi2nUHho8XEIZ6SIxihrnPoqBTDqfpXvXAN0sXM=
+github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE=
+github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk=
+github.com/go-ole/go-ole v1.2.1/go.mod h1:7FAglXiTm7HKlQRDeOQ6ZNUHidzCWXuZWq/1dTyBNF8=
+github.com/go-sql-driver/mysql v1.4.0/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w=
+github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY=
+github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4=
+github.com/go-toolsmith/astcopy v1.0.0/go.mod h1:vrgyG+5Bxrnz4MZWPF+pI4R8h3qKRjjyvV/DSez4WVQ=
+github.com/go-toolsmith/astequal v0.0.0-20180903214952-dcb477bfacd6/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
+github.com/go-toolsmith/astequal v1.0.0/go.mod h1:H+xSiq0+LtiDC11+h1G32h7Of5O3CYFJ99GVbS5lDKY=
+github.com/go-toolsmith/astfmt v0.0.0-20180903215011-8f8ee99c3086/go.mod h1:mP93XdblcopXwlyN4X4uodxXQhldPGZbcEJIimQHrkg=
+github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw=
+github.com/go-toolsmith/astinfo v0.0.0-20180906194353-9809ff7efb21/go.mod h1:dDStQCHtmZpYOmjRP/8gHHnCCch3Zz3oEgCdZVdtweU=
+github.com/go-toolsmith/astp v0.0.0-20180903215135-0af7e3c24f30/go.mod h1:SV2ur98SGypH1UjcPpCatrV5hPazG6+IfNHbkDXBRrk=
+github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI=
+github.com/go-toolsmith/pkgload v0.0.0-20181119091011-e9e65178eee8/go.mod h1:WoMrjiy4zvdS+Bg6z9jZH82QXwkcgCBX6nOfnmdaHks=
+github.com/go-toolsmith/pkgload v1.0.0/go.mod h1:5eFArkbO80v7Z0kdngIxsRXRMTaX4Ilcwuh3clNrQJc=
+github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8=
+github.com/go-toolsmith/typep v1.0.0/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU=
+github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8=
+github.com/gofrs/flock v0.0.0-20190320160742-5135e617513b/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU=
+github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ=
+github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4=
+github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o=
+github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q=
+github.com/golang/groupcache v0.0.0-20190129154638-5b532d6fd5ef/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc=
+github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A=
 github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
 github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg=
 github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
+github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
+github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4=
+github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk=
+github.com/golangci/errcheck v0.0.0-20181223084120-ef45e06d44b6/go.mod h1:DbHgvLiFKX1Sh2T1w8Q/h4NAI8MHIpzCdnBUDTXU3I0=
+github.com/golangci/go-misc v0.0.0-20180628070357-927a3d87b613/go.mod h1:SyvUF2NxV+sN8upjjeVYr5W7tyxaT1JVtvhKhOn2ii8=
+github.com/golangci/goconst v0.0.0-20180610141641-041c5f2b40f3/go.mod h1:JXrF4TWy4tXYn62/9x8Wm/K/dm06p8tCKwFRDPZG/1o=
+github.com/golangci/gocyclo v0.0.0-20180528134321-2becd97e67ee/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
+github.com/golangci/gocyclo v0.0.0-20180528144436-0a533e8fa43d/go.mod h1:ozx7R9SIwqmqf5pRP90DhR2Oay2UIjGuKheCBCNwAYU=
+github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU=
+github.com/golangci/golangci-lint v1.24.0/go.mod h1:yIqiAZ2SSQqg+1JeFlAdvEWjGVz4uu5jr4lrciqA1gE=
+github.com/golangci/ineffassign v0.0.0-20190609212857-42439a7714cc/go.mod h1:e5tpTHCfVze+7EpLEozzMB3eafxo2KT5veNg1k6byQU=
+github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg=
+github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o=
+github.com/golangci/misspell v0.0.0-20180809174111-950f5d19e770/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA=
+github.com/golangci/prealloc v0.0.0-20180630174525-215b22d4de21/go.mod h1:tf5+bzsHdTM0bsB7+8mt0GUMvjCgwLpTapNZHU8AajI=
+github.com/golangci/revgrep v0.0.0-20180526074752-d9c87f5ffaf0/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
+github.com/golangci/revgrep v0.0.0-20180812185044-276a5c0a1039/go.mod h1:qOQCunEYvmd/TLamH+7LlVccLvUH5kZNhbCgTHoBbp4=
+github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ=
+github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ=
+github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
+github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
+github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
+github.com/google/uuid v1.0.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
+github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY=
+github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ=
+github.com/gostaticanalysis/analysisutil v0.0.0-20190318220348-4088753ea4d3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
+github.com/gostaticanalysis/analysisutil v0.0.3/go.mod h1:eEOZF4jCKGi+aprrirO9e7WKB3beBRtWgqGunKl6pKE=
+github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs=
+github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk=
+github.com/grpc-ecosystem/grpc-gateway v1.9.0/go.mod h1:vNeuVxBJEsws4ogUvrchl83t/GYV9WGTSLVdBhOQFDY=
+github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
 github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI=
 github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
+github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
+github.com/jingyugao/rowserrcheck v0.0.0-20191204022205-72ab7603b68a/go.mod h1:xRskid8CManxVta/ALEhJha/pweKBaVG6fWgc0yH25s=
+github.com/jirfag/go-printf-func-name v0.0.0-20191110105641-45db9963cdd3/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
+github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0=
+github.com/jmoiron/sqlx v1.2.1-0.20190826204134-d7d95172beb5/go.mod h1:1FEQNm3xlJgrMD+FBdI9+xvCksHtbpVBBw5dYhBSsks=
+github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo=
+github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4=
+github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU=
+github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w=
 github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88 h1:uC1QfSlInpQF+M0ao65imhwqKnz3Q2z/d8PWZRMQvDM=
 github.com/k0kubun/colorstring v0.0.0-20150214042306-9440f1994b88/go.mod h1:3w7q1U84EfirKl04SVQ/s7nPm1ZPhiXd34z40TNz36k=
+github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q=
+github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00=
+github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
+github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/compress v1.4.1/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A=
+github.com/klauspost/cpuid v0.0.0-20180405133222-e7e905edc00e/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/klauspost/cpuid v1.2.0/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek=
+github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
+github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc=
 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/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs=
+github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI=
 github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
+github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
 github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
 github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
+github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/lib/pq v1.2.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo=
+github.com/logrusorgru/aurora v0.0.0-20181002194514-a7b3b318ed4e/go.mod h1:7rIyQOR62GCctdiQpZ/zOJlFyk6y+94wXzv6RNZgaR4=
+github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
+github.com/matoous/godox v0.0.0-20190911065817-5d6d842e92eb/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s=
 github.com/mattn/go-colorable v0.1.1 h1:G1f5SKeVxmagw/IyvzvtZE4Gybcc4Tr1tf7I8z0XgOg=
 github.com/mattn/go-colorable v0.1.1/go.mod h1:FuOcm+DKB9mbwrcAfNl7/TZVBZ6rcnceauSikq3lYCQ=
+github.com/mattn/go-colorable v0.1.4/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE=
+github.com/mattn/go-colorable v0.1.6 h1:6Su7aK7lXmJ/U79bYtBjLNaha4Fs1Rg9plHpcH+vvnE=
+github.com/mattn/go-colorable v0.1.6/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc=
 github.com/mattn/go-isatty v0.0.5 h1:tHXDdz1cpzGaovsTB+TVB8q90WEokoVmfMqoVcrLUgw=
 github.com/mattn/go-isatty v0.0.5/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s=
+github.com/mattn/go-isatty v0.0.11/go.mod h1:PhnuNfih5lzO57/f3n+odYbM4JtupLOxQOAqxQCu2WE=
+github.com/mattn/go-isatty v0.0.12 h1:wuysRhFDzyxgEmMf5xjvJ2M9dZoWAXNNr5LSBS7uHXY=
+github.com/mattn/go-isatty v0.0.12/go.mod h1:cbi8OIDigv2wuxKPP5vlRcQ1OAZbq2CE4Kysco4FUpU=
+github.com/mattn/go-sqlite3 v1.9.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc=
+github.com/mattn/goveralls v0.0.2/go.mod h1:8d1ZMHsd7fW6IRPKQh46F2WRpyib5/X4FOpevwGNQEw=
+github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0=
+github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
+github.com/mitchellh/go-ps v0.0.0-20190716172923-621e5597135b/go.mod h1:r1VsdOzOPt1ZSrGZWFoNhsAedKnEd6r9Np1+5blZCWk=
+github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
+github.com/mitchellh/mapstructure v1.2.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo=
+github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
+github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0=
+github.com/mozilla/tls-observatory v0.0.0-20190404164649-a3c1b6cfecfd/go.mod h1:SrKMQvPiws7F7iqYp8/TX+IhxCYhzr6N/1yb8cwHsGk=
+github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U=
+github.com/nbutton23/zxcvbn-go v0.0.0-20180912185939-ae427f1e4c1d/go.mod h1:o96djdrsSGy3AWPyBgZMAGfxZNfgntdJG+11KU4QvbU=
+github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U=
 github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/ginkgo v1.8.0 h1:VkHVNpR4iVnU8XQR6DBm8BqYjN7CRzw+xKUbVVbbW9w=
 github.com/onsi/ginkgo v1.8.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
+github.com/onsi/ginkgo v1.11.0 h1:JAKSXpt1YjtLA7YpPiqO9ss6sNXEsPfSGdwN0UHqzrw=
+github.com/onsi/ginkgo v1.11.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE=
 github.com/onsi/gomega v1.5.0 h1:izbySO9zDPmjJ8rDjLvkA2zJHIo+HkYXHnf7eN7SSyo=
 github.com/onsi/gomega v1.5.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY=
+github.com/onsi/gomega v1.8.1 h1:C5Dqfs/LeauYDX0jJXIe2SWmwCbGzx9yF8C8xy3Lh34=
+github.com/onsi/gomega v1.8.1/go.mod h1:Ho0h+IUsWyvy1OpqCwxlQ/21gkhVunqlU8fDGcoTdcA=
+github.com/pborman/uuid v1.2.0/go.mod h1:X/NO0urCmaxf9VXbdlT7C2Yzkj2IKimNn4k+gtPdI/k=
+github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
+github.com/pelletier/go-toml v1.7.0/go.mod h1:vwGMzjaWMwyfHwgIBhI2YUM4fB6nL6lVAvS1LBMMhTE=
+github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
+github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
 github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
 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/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
+github.com/prometheus/client_golang v0.9.3/go.mod h1:/TN21ttK/J9q6uSwhBd54HahCDft0ttaMvbicHlPoso=
+github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
+github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
+github.com/prometheus/common v0.0.0-20181113130724-41aa239b4cce/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
+github.com/prometheus/common v0.4.0/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
+github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
+github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
+github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU=
+github.com/quasilyte/go-consistent v0.0.0-20190521200055-c6f3937de18c/go.mod h1:5STLWrekHfjyYwxBRVRXNOSewLJ3PWfDJd1VyTS21fI=
+github.com/quasilyte/go-ruleguard v0.1.2-0.20200318202121-b00d7a75d3d8/go.mod h1:CGFX09Ci3pq9QZdj86B+VGIdNj4VyCo2iPOGS9esB/k=
+github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg=
+github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
+github.com/rogpeppe/go-internal v1.5.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
+github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
+github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
+github.com/securego/gosec v0.0.0-20200103095621-79fbf3af8d83/go.mod h1:vvbZ2Ae7AzSq3/kywjUDxSNq2SJ27RxCz2un0H3ePqE=
 github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ=
 github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo=
-github.com/shurcooL/httpfs v0.0.0-20181222201310-74dc9339e414/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg=
-github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0 h1:mj/nMDAwTBiaCqMEs4cYCqF7pO6Np7vhy1D1wcQGz+E=
-github.com/shurcooL/httpgzip v0.0.0-20190720172056-320755c1c1b0/go.mod h1:919LwcH0M7/W4fcZ0/jy0qGght1GIhqyS/EgWGH2j5Q=
-github.com/shurcooL/vfsgen v0.0.0-20181202132449-6a9ea43bcacd/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw=
+github.com/shirou/gopsutil v0.0.0-20190901111213-e4ec7b275ada/go.mod h1:WWnYX4lzhCH5h/3YBfyVA3VbLYjlMZZAQcW9ojMexNc=
+github.com/shirou/w32 v0.0.0-20160930032740-bb4de0191aa4/go.mod h1:qsXQc7+bwAM3Q1u/4XEfrquwF8Lw7D7y5cD8CuHnfIc=
+github.com/shurcooL/go v0.0.0-20180423040247-9e1955d9fb6e/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk=
+github.com/shurcooL/go-goon v0.0.0-20170922171312-37c2f522c041/go.mod h1:N5mDOmsrJOB+vfqUK+7DmDyjhSLIIBnXo9lvZJj3MWQ=
+github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc=
+github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo=
+github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
+github.com/sirupsen/logrus v1.5.0/go.mod h1:+F7Ogzej0PZc/94MaYx/nvG9jOFMD2osvC3s+Squfpo=
+github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc=
+github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA=
+github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM=
+github.com/sourcegraph/go-diff v0.5.1/go.mod h1:j2dHj3m8aZgQO8lMTcTnBcXkRRRqi34cd2MNlA9u1mE=
+github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA=
+github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
+github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk=
+github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
+github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
+github.com/spf13/cobra v1.0.0/go.mod h1:/6GTrnGXV9HjY+aR4k0oJ5tcvakLuG6EuKReYlHNrgE=
+github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
+github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo=
+github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
+github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An2Bg=
+github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
+github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE=
+github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k=
+github.com/spf13/viper v1.6.3/go.mod h1:jUMtyi0/lB5yZH/FjyGAoH7IMNrIhlBf6pXZmbMDvzw=
 github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
+github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
+github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
+github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
 github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
 github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
 github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
 github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
+github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw=
 github.com/swaggest/assertjson v1.0.0 h1:Dyc+uF7h9nkS6+jHHIERRakQe9V7KyufKHmkUl6czNM=
 github.com/swaggest/assertjson v1.0.0/go.mod h1:mE5ltBbrB+Ya8Xar5OMITxya76vwLZMoPG8aXF7sVQc=
 github.com/swaggest/jsonschema-go v0.2.1 h1:SVg+zXQ46w6ewR7jZDRVbpKKC+V7Y6Xn/teC2pRS2bM=
 github.com/swaggest/jsonschema-go v0.2.1/go.mod h1:QFauBdPTrU1UltwocM5FzOWnVjVVtcWkJWG3NlK9sV0=
+github.com/swaggest/jsonschema-go v0.2.3 h1:wo46ySt4FCCd5VKDEh0wS68hJNxsWQRXJkG4T/BbM6A=
+github.com/swaggest/jsonschema-go v0.2.3/go.mod h1:AH6iAUgQnaiLtgpyRO6waHhtA+oY0h2jrnX3cV1I5yA=
 github.com/swaggest/refl v0.1.0 h1:mz3skba8ewcPmxDryM9rETv4fSuAX4GqNxTuDfPyUM0=
 github.com/swaggest/refl v0.1.0/go.mod h1:kmYWhxNEvjfRDdMRqpaR/vLULk/SotJs9HFUCIVMK8o=
 github.com/swaggest/refl v0.1.2 h1:BfxmzI4FabeaSHijDEObFB1qaDPevcDsRetAYxg30yw=
 github.com/swaggest/refl v0.1.2/go.mod h1:kmYWhxNEvjfRDdMRqpaR/vLULk/SotJs9HFUCIVMK8o=
 github.com/swaggest/swgen v0.6.20 h1:mGg20AJQu18lkx5NfqCJ9rRpAZjMc4QlXVOIS3JB1Ck=
 github.com/swaggest/swgen v0.6.20/go.mod h1:ipkZNfwztgRfbOWUllLZawfmxXprT8flqNJO9XhoMwM=
-github.com/swaggest/swgui v1.0.6 h1:xyh8JuFXHxYcJNAUO7oKK3926iAGSVir8gP/C/cH1Dw=
-github.com/swaggest/swgui v1.0.6/go.mod h1:9HImNtute5BauL/1I62WdHu/xRMb2BoX2MbCaneMU94=
+github.com/timakin/bodyclose v0.0.0-20190930140734-f7f2e9bca95e/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk=
+github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
+github.com/tommy-muehle/go-mnd v1.3.1-0.20200224220436-e6f9a994e8fa/go.mod h1:dSUh0FtTP8VhvkL1S+gUR1OKd9ZnSaozuI6r3m6wOig=
+github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc=
+github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
+github.com/ultraware/funlen v0.0.2/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA=
+github.com/ultraware/whitespace v0.0.4/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA=
+github.com/uudashr/gocognit v1.0.1/go.mod h1:j44Ayx2KW4+oB6SWMv8KsmHzZrOInQav7D3cQMJ5JUM=
+github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc=
+github.com/valyala/fasthttp v1.2.0/go.mod h1:4vX61m6KN+xDduDNwXrhIAVZaZaZiQ1luJk8LWSxF3s=
+github.com/valyala/quicktemplate v1.2.0/go.mod h1:EH+4AkTd43SvgIbQHYu59/cJyxDoOVRUAfrukLPuGJ4=
+github.com/valyala/tcplisten v0.0.0-20161114210144-ceec8f93295a/go.mod h1:v3UYOV9WzVtRmSR+PDvWpU/qWl4Wa5LApYYX4ZtKbio=
+github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU=
+github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
 github.com/yudai/gojsondiff v1.0.0 h1:27cbfqXLVEJ1o8I6v3y9lg8Ydm53EKqHXAOMxEGlCOA=
 github.com/yudai/gojsondiff v1.0.0/go.mod h1:AY32+k2cwILAkW1fbgxQ5mUmMiZFgLIV+FBNExI05xg=
 github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82 h1:BHyfKlQyqbsFN5p3IfnEUduWvb9is428/nNb5L3U01M=
 github.com/yudai/golcs v0.0.0-20170316035057-ecda9a501e82/go.mod h1:lgjkn3NuSvDfVJdfcVVdX+jpBxNmX4rDAzaS45IcYoM=
 github.com/yudai/pp v2.0.1+incompatible h1:Q4//iY4pNF6yPLZIigmvcl7k/bPgrcTPIFIcmawg5bI=
 github.com/yudai/pp v2.0.1+incompatible/go.mod h1:PuxR/8QJ7cyCkFp/aUDS+JY727OFEZkTdatxwunjIkc=
+github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
+go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU=
+go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE=
+go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0=
+go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q=
+golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
+golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
+golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
+golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
+golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
+golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
+golang.org/x/mod v0.1.1-0.20191105210325-c90efee705ee/go.mod h1:QqPTAvyqsEbceGzBzNggFXnrqF1CaUcvgkdR5Ot7KZg=
+golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
+golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
 golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20180911220305-26e67e76b6c3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20181220203305-927f97764cc3/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
+golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
+golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks=
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20190628185345-da137c7871d7 h1:rTIdg5QFRR7XCaK4LCjBiPbx8j4DQRpdYMnGn/bJUEU=
 golang.org/x/net v0.0.0-20190628185345-da137c7871d7/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
 golang.org/x/net v0.0.0-20200320220750-118fecf932d8 h1:1+zQlQqEEhUeStBTi653GZAnAuivZq/2hz+Iz+OP7rg=
 golang.org/x/net v0.0.0-20200320220750-118fecf932d8/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
+golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/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-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
+golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
+golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb h1:fgwFCsaw9buMuxNd6+DQfAuSFqbNiQZpcgJQAgJsK6k=
 golang.org/x/sys v0.0.0-20190626221950-04f50cda93cb/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
+golang.org/x/sys v0.0.0-20200409092240-59c9f1ba88fa h1:mQTN3ECqfsViCNBgq+A40vdwhkGykrrQlYe3mPj6BoU=
+golang.org/x/sys v0.0.0-20200409092240-59c9f1ba88fa/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.2 h1:tW2bmiBqwgJj/UpqtC8EpXEZVYOwU0yG4iWbprSVAcs=
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
+golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
+golang.org/x/tools v0.0.0-20180221164845-07fd8470d635/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
-golang.org/x/tools v0.0.0-20190830172400-56125e7d709e h1:jlbOw43fjYcUlLDKNNmKTeCQFyjkKEW/iUK7w7017XE=
-golang.org/x/tools v0.0.0-20190830172400-56125e7d709e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20181117154741-2ddaf7f79a09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190110163146-51295c7ec13a/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
+golang.org/x/tools v0.0.0-20190221204921-83362c3779f5/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
+golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190311215038-5c2858a9cfe5/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190322203728-c1a832b0ad89/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
+golang.org/x/tools v0.0.0-20190521203540-521d6ed310dd/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q=
+golang.org/x/tools v0.0.0-20190719005602-e377ae9d6386/go.mod h1:jcCCGcm9btYwXyDqrUWc6MKQKKGJCWEQ3AfLSRIbEuI=
+golang.org/x/tools v0.0.0-20190910044552-dd2b5c81c578/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191108193012-7d206e10da11/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191113232020-e2727e816f5a/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20191130070609-6e064ea0cf2d/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
+golang.org/x/tools v0.0.0-20200102140908-9497f49d5709/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200204192400-7124308813f3/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28=
+golang.org/x/tools v0.0.0-20200313205530-4303120df7d8/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8=
+golang.org/x/tools v0.0.0-20200410194907-79a7a3126eef/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543 h1:E7g+9GITq07hpfrRu66IVDexMakfv52eLZ2CXBWiKr4=
+golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
+google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
+google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
+google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
+google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
+google.golang.org/grpc v1.21.0/go.mod h1:oYelfM1adQP15Ek0mdvEgi9Df8B9CZIaU1084ijfRaM=
+gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
 gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo=
+gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
+gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
 gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4=
 gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys=
+gopkg.in/ini.v1 v1.51.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/ini.v1 v1.55.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k=
+gopkg.in/resty.v1 v1.12.0/go.mod h1:mDo4pnntr5jdWRML875a/NmxYqAlA73dVijT2AXvQQo=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ=
 gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw=
+gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bli9HhUf9+ttbYbLASfIpnQbh74=
 gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
 gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
 gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.7/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
+gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
+honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4=
+honnef.co/go/tools v0.0.1-2020.1.3/go.mod h1:X/FiERA/W4tHapMX5mGpAtMSVEeEUOyHaw9vFzvIQ3k=
+mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc=
+mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4=
+mvdan.cc/unparam v0.0.0-20190720180237-d51796306d8f/go.mod h1:4G1h5nDURzA3bwVMZIVpwbkw+04kSxk3rAtzlimaUJw=
+mvdan.cc/unparam v0.0.0-20200314162735-0ac8026f7d06/go.mod h1:A9jtdiT4gKMLUlAQjDEVC18O9SOJ8ZAiqWfq9g3rlj8=
+sourcegraph.com/sqs/pbtypes v0.0.0-20180604144634-d3ebe8f20ae4/go.mod h1:ketZ/q3QxT9HOBeFhu6RdvsftgpsbFHBF5Cas6cDKZ0=
+sourcegraph.com/sqs/pbtypes v1.0.0/go.mod h1:3AciMUv4qUuRHRHhOG4TZOB+72GdPVz5k+c648qsFS4=
diff --git a/openapi3/entities.go b/openapi3/entities.go
index 4e089ae..f1380e7 100644
--- a/openapi3/entities.go
+++ b/openapi3/entities.go
@@ -1,4 +1,4 @@
-// Code generated by github.com/swaggest/json-cli v1.7.5, DO NOT EDIT.
+// Code generated by github.com/swaggest/json-cli v1.7.7, DO NOT EDIT.
 
 // Package openapi3 contains JSON mapping structures.
 package openapi3
@@ -46,6 +46,15 @@ func (s *Spec) WithExternalDocs(val ExternalDocumentation) *Spec {
 	return s
 }
 
+// ExternalDocsEns ensures returned ExternalDocs is not nil.
+func (s *Spec) ExternalDocsEns() *ExternalDocumentation {
+	if s.ExternalDocs == nil {
+		s.ExternalDocs = new(ExternalDocumentation)
+	}
+
+	return s.ExternalDocs
+}
+
 // WithServers sets Servers value.
 func (s *Spec) WithServers(val ...Server) *Spec {
 	s.Servers = val
@@ -76,6 +85,15 @@ func (s *Spec) WithComponents(val Components) *Spec {
 	return s
 }
 
+// ComponentsEns ensures returned Components is not nil.
+func (s *Spec) ComponentsEns() *Components {
+	if s.Components == nil {
+		s.Components = new(Components)
+	}
+
+	return s.Components
+}
+
 // WithMapOfAnything sets MapOfAnything value.
 func (s *Spec) WithMapOfAnything(val map[string]interface{}) *Spec {
 	s.MapOfAnything = val
@@ -220,12 +238,30 @@ func (i *Info) WithContact(val Contact) *Info {
 	return i
 }
 
+// ContactEns ensures returned Contact is not nil.
+func (i *Info) ContactEns() *Contact {
+	if i.Contact == nil {
+		i.Contact = new(Contact)
+	}
+
+	return i.Contact
+}
+
 // WithLicense sets License value.
 func (i *Info) WithLicense(val License) *Info {
 	i.License = &val
 	return i
 }
 
+// LicenseEns ensures returned License is not nil.
+func (i *Info) LicenseEns() *License {
+	if i.License == nil {
+		i.License = new(License)
+	}
+
+	return i.License
+}
+
 // WithVersion sets Version value.
 func (i *Info) WithVersion(val string) *Info {
 	i.Version = val
@@ -991,6 +1027,15 @@ func (t *Tag) WithExternalDocs(val ExternalDocumentation) *Tag {
 	return t
 }
 
+// ExternalDocsEns ensures returned ExternalDocs is not nil.
+func (t *Tag) ExternalDocsEns() *ExternalDocumentation {
+	if t.ExternalDocs == nil {
+		t.ExternalDocs = new(ExternalDocumentation)
+	}
+
+	return t.ExternalDocs
+}
+
 // WithMapOfAnything sets MapOfAnything value.
 func (t *Tag) WithMapOfAnything(val map[string]interface{}) *Tag {
 	t.MapOfAnything = val
@@ -1413,6 +1458,15 @@ func (p *Parameter) WithSchema(val SchemaOrRef) *Parameter {
 	return p
 }
 
+// SchemaEns ensures returned Schema is not nil.
+func (p *Parameter) SchemaEns() *SchemaOrRef {
+	if p.Schema == nil {
+		p.Schema = new(SchemaOrRef)
+	}
+
+	return p.Schema
+}
+
 // WithContent sets Content value.
 func (p *Parameter) WithContent(val map[string]MediaType) *Parameter {
 	p.Content = val
@@ -1459,12 +1513,30 @@ func (p *Parameter) WithSchemaXORContent(val HasContent) *Parameter {
 	return p
 }
 
+// SchemaXORContentEns ensures returned SchemaXORContent is not nil.
+func (p *Parameter) SchemaXORContentEns() *HasContent {
+	if p.SchemaXORContent == nil {
+		p.SchemaXORContent = new(HasContent)
+	}
+
+	return p.SchemaXORContent
+}
+
 // WithLocation sets Location value.
 func (p *Parameter) WithLocation(val ParameterLocation) *Parameter {
 	p.Location = &val
 	return p
 }
 
+// LocationEns ensures returned Location is not nil.
+func (p *Parameter) LocationEns() *ParameterLocation {
+	if p.Location == nil {
+		p.Location = new(ParameterLocation)
+	}
+
+	return p.Location
+}
+
 // WithMapOfAnything sets MapOfAnything value.
 func (p *Parameter) WithMapOfAnything(val map[string]interface{}) *Parameter {
 	p.MapOfAnything = val
@@ -1743,6 +1815,15 @@ func (s *Schema) WithNot(val SchemaOrRef) *Schema {
 	return s
 }
 
+// NotEns ensures returned Not is not nil.
+func (s *Schema) NotEns() *SchemaOrRef {
+	if s.Not == nil {
+		s.Not = new(SchemaOrRef)
+	}
+
+	return s.Not
+}
+
 // WithAllOf sets AllOf value.
 func (s *Schema) WithAllOf(val ...SchemaOrRef) *Schema {
 	s.AllOf = val
@@ -1767,6 +1848,15 @@ func (s *Schema) WithItems(val SchemaOrRef) *Schema {
 	return s
 }
 
+// ItemsEns ensures returned Items is not nil.
+func (s *Schema) ItemsEns() *SchemaOrRef {
+	if s.Items == nil {
+		s.Items = new(SchemaOrRef)
+	}
+
+	return s.Items
+}
+
 // WithProperties sets Properties value.
 func (s *Schema) WithProperties(val map[string]SchemaOrRef) *Schema {
 	s.Properties = val
@@ -1790,6 +1880,15 @@ func (s *Schema) WithAdditionalProperties(val SchemaAdditionalProperties) *Schem
 	return s
 }
 
+// AdditionalPropertiesEns ensures returned AdditionalProperties is not nil.
+func (s *Schema) AdditionalPropertiesEns() *SchemaAdditionalProperties {
+	if s.AdditionalProperties == nil {
+		s.AdditionalProperties = new(SchemaAdditionalProperties)
+	}
+
+	return s.AdditionalProperties
+}
+
 // WithDescription sets Description value.
 func (s *Schema) WithDescription(val string) *Schema {
 	s.Description = &val
@@ -1820,6 +1919,15 @@ func (s *Schema) WithDiscriminator(val Discriminator) *Schema {
 	return s
 }
 
+// DiscriminatorEns ensures returned Discriminator is not nil.
+func (s *Schema) DiscriminatorEns() *Discriminator {
+	if s.Discriminator == nil {
+		s.Discriminator = new(Discriminator)
+	}
+
+	return s.Discriminator
+}
+
 // WithReadOnly sets ReadOnly value.
 func (s *Schema) WithReadOnly(val bool) *Schema {
 	s.ReadOnly = &val
@@ -1844,6 +1952,15 @@ func (s *Schema) WithExternalDocs(val ExternalDocumentation) *Schema {
 	return s
 }
 
+// ExternalDocsEns ensures returned ExternalDocs is not nil.
+func (s *Schema) ExternalDocsEns() *ExternalDocumentation {
+	if s.ExternalDocs == nil {
+		s.ExternalDocs = new(ExternalDocumentation)
+	}
+
+	return s.ExternalDocs
+}
+
 // WithDeprecated sets Deprecated value.
 func (s *Schema) WithDeprecated(val bool) *Schema {
 	s.Deprecated = &val
@@ -1856,6 +1973,15 @@ func (s *Schema) WithXML(val XML) *Schema {
 	return s
 }
 
+// XMLEns ensures returned XML is not nil.
+func (s *Schema) XMLEns() *XML {
+	if s.XML == nil {
+		s.XML = new(XML)
+	}
+
+	return s.XML
+}
+
 // WithMapOfAnything sets MapOfAnything value.
 func (s *Schema) WithMapOfAnything(val map[string]interface{}) *Schema {
 	s.MapOfAnything = val
@@ -2077,12 +2203,30 @@ func (s *SchemaOrRef) WithSchema(val Schema) *SchemaOrRef {
 	return s
 }
 
+// SchemaEns ensures returned Schema is not nil.
+func (s *SchemaOrRef) SchemaEns() *Schema {
+	if s.Schema == nil {
+		s.Schema = new(Schema)
+	}
+
+	return s.Schema
+}
+
 // WithSchemaReference sets SchemaReference value.
 func (s *SchemaOrRef) WithSchemaReference(val SchemaReference) *SchemaOrRef {
 	s.SchemaReference = &val
 	return s
 }
 
+// SchemaReferenceEns ensures returned SchemaReference is not nil.
+func (s *SchemaOrRef) SchemaReferenceEns() *SchemaReference {
+	if s.SchemaReference == nil {
+		s.SchemaReference = new(SchemaReference)
+	}
+
+	return s.SchemaReference
+}
+
 // UnmarshalJSON decodes JSON.
 func (s *SchemaOrRef) UnmarshalJSON(data []byte) error {
 	var err error
@@ -2130,6 +2274,15 @@ func (s *SchemaAdditionalProperties) WithSchemaOrRef(val SchemaOrRef) *SchemaAdd
 	return s
 }
 
+// SchemaOrRefEns ensures returned SchemaOrRef is not nil.
+func (s *SchemaAdditionalProperties) SchemaOrRefEns() *SchemaOrRef {
+	if s.SchemaOrRef == nil {
+		s.SchemaOrRef = new(SchemaOrRef)
+	}
+
+	return s.SchemaOrRef
+}
+
 // WithBool sets Bool value.
 func (s *SchemaAdditionalProperties) WithBool(val bool) *SchemaAdditionalProperties {
 	s.Bool = &val
@@ -2389,6 +2542,15 @@ func (m *MediaType) WithSchema(val SchemaOrRef) *MediaType {
 	return m
 }
 
+// SchemaEns ensures returned Schema is not nil.
+func (m *MediaType) SchemaEns() *SchemaOrRef {
+	if m.Schema == nil {
+		m.Schema = new(SchemaOrRef)
+	}
+
+	return m.Schema
+}
+
 // WithExample sets Example value.
 func (m *MediaType) WithExample(val interface{}) *MediaType {
 	m.Example = &val
@@ -2745,12 +2907,30 @@ func (e *ExampleOrRef) WithExampleReference(val ExampleReference) *ExampleOrRef
 	return e
 }
 
+// ExampleReferenceEns ensures returned ExampleReference is not nil.
+func (e *ExampleOrRef) ExampleReferenceEns() *ExampleReference {
+	if e.ExampleReference == nil {
+		e.ExampleReference = new(ExampleReference)
+	}
+
+	return e.ExampleReference
+}
+
 // WithExample sets Example value.
 func (e *ExampleOrRef) WithExample(val Example) *ExampleOrRef {
 	e.Example = &val
 	return e
 }
 
+// ExampleEns ensures returned Example is not nil.
+func (e *ExampleOrRef) ExampleEns() *Example {
+	if e.Example == nil {
+		e.Example = new(Example)
+	}
+
+	return e.Example
+}
+
 // UnmarshalJSON decodes JSON.
 func (e *ExampleOrRef) UnmarshalJSON(data []byte) error {
 	var err error
@@ -2945,6 +3125,15 @@ func (h *Header) WithSchema(val SchemaOrRef) *Header {
 	return h
 }
 
+// SchemaEns ensures returned Schema is not nil.
+func (h *Header) SchemaEns() *SchemaOrRef {
+	if h.Schema == nil {
+		h.Schema = new(SchemaOrRef)
+	}
+
+	return h.Schema
+}
+
 // WithContent sets Content value.
 func (h *Header) WithContent(val map[string]MediaType) *Header {
 	h.Content = val
@@ -3093,10 +3282,8 @@ func (h *Header) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-var (
-	// constHeader is unconditionally added to JSON.
-	constHeader = json.RawMessage(`{"style":"simple"}`)
-)
+// constHeader is unconditionally added to JSON.
+var constHeader = json.RawMessage(`{"style":"simple"}`)
 
 // MarshalJSON encodes JSON.
 func (h Header) MarshalJSON() ([]byte, error) {
@@ -3202,10 +3389,8 @@ func (p *PathParameter) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-var (
-	// constPathParameter is unconditionally added to JSON.
-	constPathParameter = json.RawMessage(`{"in":"path","required":true}`)
-)
+// constPathParameter is unconditionally added to JSON.
+var constPathParameter = json.RawMessage(`{"in":"path","required":true}`)
 
 // MarshalJSON encodes JSON.
 func (p PathParameter) MarshalJSON() ([]byte, error) {
@@ -3258,10 +3443,8 @@ func (q *QueryParameter) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-var (
-	// constQueryParameter is unconditionally added to JSON.
-	constQueryParameter = json.RawMessage(`{"in":"query"}`)
-)
+// constQueryParameter is unconditionally added to JSON.
+var constQueryParameter = json.RawMessage(`{"in":"query"}`)
 
 // MarshalJSON encodes JSON.
 func (q QueryParameter) MarshalJSON() ([]byte, error) {
@@ -3302,10 +3485,8 @@ func (h *HeaderParameter) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-var (
-	// constHeaderParameter is unconditionally added to JSON.
-	constHeaderParameter = json.RawMessage(`{"in":"header","style":"simple"}`)
-)
+// constHeaderParameter is unconditionally added to JSON.
+var constHeaderParameter = json.RawMessage(`{"in":"header","style":"simple"}`)
 
 // MarshalJSON encodes JSON.
 func (h HeaderParameter) MarshalJSON() ([]byte, error) {
@@ -3346,10 +3527,8 @@ func (c *CookieParameter) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-var (
-	// constCookieParameter is unconditionally added to JSON.
-	constCookieParameter = json.RawMessage(`{"in":"cookie","style":"form"}`)
-)
+// constCookieParameter is unconditionally added to JSON.
+var constCookieParameter = json.RawMessage(`{"in":"cookie","style":"form"}`)
 
 // MarshalJSON encodes JSON.
 func (c CookieParameter) MarshalJSON() ([]byte, error) {
@@ -3372,24 +3551,60 @@ func (p *ParameterLocation) WithPathParameter(val PathParameter) *ParameterLocat
 	return p
 }
 
+// PathParameterEns ensures returned PathParameter is not nil.
+func (p *ParameterLocation) PathParameterEns() *PathParameter {
+	if p.PathParameter == nil {
+		p.PathParameter = new(PathParameter)
+	}
+
+	return p.PathParameter
+}
+
 // WithQueryParameter sets QueryParameter value.
 func (p *ParameterLocation) WithQueryParameter(val QueryParameter) *ParameterLocation {
 	p.QueryParameter = &val
 	return p
 }
 
+// QueryParameterEns ensures returned QueryParameter is not nil.
+func (p *ParameterLocation) QueryParameterEns() *QueryParameter {
+	if p.QueryParameter == nil {
+		p.QueryParameter = new(QueryParameter)
+	}
+
+	return p.QueryParameter
+}
+
 // WithHeaderParameter sets HeaderParameter value.
 func (p *ParameterLocation) WithHeaderParameter(val HeaderParameter) *ParameterLocation {
 	p.HeaderParameter = &val
 	return p
 }
 
+// HeaderParameterEns ensures returned HeaderParameter is not nil.
+func (p *ParameterLocation) HeaderParameterEns() *HeaderParameter {
+	if p.HeaderParameter == nil {
+		p.HeaderParameter = new(HeaderParameter)
+	}
+
+	return p.HeaderParameter
+}
+
 // WithCookieParameter sets CookieParameter value.
 func (p *ParameterLocation) WithCookieParameter(val CookieParameter) *ParameterLocation {
 	p.CookieParameter = &val
 	return p
 }
 
+// CookieParameterEns ensures returned CookieParameter is not nil.
+func (p *ParameterLocation) CookieParameterEns() *CookieParameter {
+	if p.CookieParameter == nil {
+		p.CookieParameter = new(CookieParameter)
+	}
+
+	return p.CookieParameter
+}
+
 // UnmarshalJSON decodes JSON.
 func (p *ParameterLocation) UnmarshalJSON(data []byte) error {
 	var err error
@@ -3453,12 +3668,30 @@ func (p *ParameterOrRef) WithParameterReference(val ParameterReference) *Paramet
 	return p
 }
 
+// ParameterReferenceEns ensures returned ParameterReference is not nil.
+func (p *ParameterOrRef) ParameterReferenceEns() *ParameterReference {
+	if p.ParameterReference == nil {
+		p.ParameterReference = new(ParameterReference)
+	}
+
+	return p.ParameterReference
+}
+
 // WithParameter sets Parameter value.
 func (p *ParameterOrRef) WithParameter(val Parameter) *ParameterOrRef {
 	p.Parameter = &val
 	return p
 }
 
+// ParameterEns ensures returned Parameter is not nil.
+func (p *ParameterOrRef) ParameterEns() *Parameter {
+	if p.Parameter == nil {
+		p.Parameter = new(Parameter)
+	}
+
+	return p.Parameter
+}
+
 // UnmarshalJSON decodes JSON.
 func (p *ParameterOrRef) UnmarshalJSON(data []byte) error {
 	var err error
@@ -3535,6 +3768,15 @@ func (o *Operation) WithExternalDocs(val ExternalDocumentation) *Operation {
 	return o
 }
 
+// ExternalDocsEns ensures returned ExternalDocs is not nil.
+func (o *Operation) ExternalDocsEns() *ExternalDocumentation {
+	if o.ExternalDocs == nil {
+		o.ExternalDocs = new(ExternalDocumentation)
+	}
+
+	return o.ExternalDocs
+}
+
 // WithID sets ID value.
 func (o *Operation) WithID(val string) *Operation {
 	o.ID = &val
@@ -3553,6 +3795,15 @@ func (o *Operation) WithRequestBody(val RequestBodyOrRef) *Operation {
 	return o
 }
 
+// RequestBodyEns ensures returned RequestBody is not nil.
+func (o *Operation) RequestBodyEns() *RequestBodyOrRef {
+	if o.RequestBody == nil {
+		o.RequestBody = new(RequestBodyOrRef)
+	}
+
+	return o.RequestBody
+}
+
 // WithResponses sets Responses value.
 func (o *Operation) WithResponses(val Responses) *Operation {
 	o.Responses = val
@@ -3927,12 +4178,30 @@ func (r *RequestBodyOrRef) WithRequestBodyReference(val RequestBodyReference) *R
 	return r
 }
 
+// RequestBodyReferenceEns ensures returned RequestBodyReference is not nil.
+func (r *RequestBodyOrRef) RequestBodyReferenceEns() *RequestBodyReference {
+	if r.RequestBodyReference == nil {
+		r.RequestBodyReference = new(RequestBodyReference)
+	}
+
+	return r.RequestBodyReference
+}
+
 // WithRequestBody sets RequestBody value.
 func (r *RequestBodyOrRef) WithRequestBody(val RequestBody) *RequestBodyOrRef {
 	r.RequestBody = &val
 	return r
 }
 
+// RequestBodyEns ensures returned RequestBody is not nil.
+func (r *RequestBodyOrRef) RequestBodyEns() *RequestBody {
+	if r.RequestBody == nil {
+		r.RequestBody = new(RequestBody)
+	}
+
+	return r.RequestBody
+}
+
 // UnmarshalJSON decodes JSON.
 func (r *RequestBodyOrRef) UnmarshalJSON(data []byte) error {
 	var err error
@@ -3981,6 +4250,15 @@ func (r *Responses) WithDefault(val ResponseOrRef) *Responses {
 	return r
 }
 
+// DefaultEns ensures returned Default is not nil.
+func (r *Responses) DefaultEns() *ResponseOrRef {
+	if r.Default == nil {
+		r.Default = new(ResponseOrRef)
+	}
+
+	return r.Default
+}
+
 // WithMapOfResponseOrRefValues sets MapOfResponseOrRefValues value.
 func (r *Responses) WithMapOfResponseOrRefValues(val map[string]ResponseOrRef) *Responses {
 	r.MapOfResponseOrRefValues = val
@@ -4428,12 +4706,30 @@ func (h *HeaderOrRef) WithHeaderReference(val HeaderReference) *HeaderOrRef {
 	return h
 }
 
+// HeaderReferenceEns ensures returned HeaderReference is not nil.
+func (h *HeaderOrRef) HeaderReferenceEns() *HeaderReference {
+	if h.HeaderReference == nil {
+		h.HeaderReference = new(HeaderReference)
+	}
+
+	return h.HeaderReference
+}
+
 // WithHeader sets Header value.
 func (h *HeaderOrRef) WithHeader(val Header) *HeaderOrRef {
 	h.Header = &val
 	return h
 }
 
+// HeaderEns ensures returned Header is not nil.
+func (h *HeaderOrRef) HeaderEns() *Header {
+	if h.Header == nil {
+		h.Header = new(Header)
+	}
+
+	return h.Header
+}
+
 // UnmarshalJSON decodes JSON.
 func (h *HeaderOrRef) UnmarshalJSON(data []byte) error {
 	var err error
@@ -4598,6 +4894,15 @@ func (l *Link) WithServer(val Server) *Link {
 	return l
 }
 
+// ServerEns ensures returned Server is not nil.
+func (l *Link) ServerEns() *Server {
+	if l.Server == nil {
+		l.Server = new(Server)
+	}
+
+	return l.Server
+}
+
 // WithMapOfAnything sets MapOfAnything value.
 func (l *Link) WithMapOfAnything(val map[string]interface{}) *Link {
 	l.MapOfAnything = val
@@ -4718,12 +5023,30 @@ func (l *LinkOrRef) WithLinkReference(val LinkReference) *LinkOrRef {
 	return l
 }
 
+// LinkReferenceEns ensures returned LinkReference is not nil.
+func (l *LinkOrRef) LinkReferenceEns() *LinkReference {
+	if l.LinkReference == nil {
+		l.LinkReference = new(LinkReference)
+	}
+
+	return l.LinkReference
+}
+
 // WithLink sets Link value.
 func (l *LinkOrRef) WithLink(val Link) *LinkOrRef {
 	l.Link = &val
 	return l
 }
 
+// LinkEns ensures returned Link is not nil.
+func (l *LinkOrRef) LinkEns() *Link {
+	if l.Link == nil {
+		l.Link = new(Link)
+	}
+
+	return l.Link
+}
+
 // UnmarshalJSON decodes JSON.
 func (l *LinkOrRef) UnmarshalJSON(data []byte) error {
 	var err error
@@ -4771,12 +5094,30 @@ func (r *ResponseOrRef) WithResponseReference(val ResponseReference) *ResponseOr
 	return r
 }
 
+// ResponseReferenceEns ensures returned ResponseReference is not nil.
+func (r *ResponseOrRef) ResponseReferenceEns() *ResponseReference {
+	if r.ResponseReference == nil {
+		r.ResponseReference = new(ResponseReference)
+	}
+
+	return r.ResponseReference
+}
+
 // WithResponse sets Response value.
 func (r *ResponseOrRef) WithResponse(val Response) *ResponseOrRef {
 	r.Response = &val
 	return r
 }
 
+// ResponseEns ensures returned Response is not nil.
+func (r *ResponseOrRef) ResponseEns() *Response {
+	if r.Response == nil {
+		r.Response = new(Response)
+	}
+
+	return r.Response
+}
+
 // UnmarshalJSON decodes JSON.
 func (r *ResponseOrRef) UnmarshalJSON(data []byte) error {
 	var err error
@@ -4994,12 +5335,30 @@ func (c *CallbackOrRef) WithCallbackReference(val CallbackReference) *CallbackOr
 	return c
 }
 
+// CallbackReferenceEns ensures returned CallbackReference is not nil.
+func (c *CallbackOrRef) CallbackReferenceEns() *CallbackReference {
+	if c.CallbackReference == nil {
+		c.CallbackReference = new(CallbackReference)
+	}
+
+	return c.CallbackReference
+}
+
 // WithCallback sets Callback value.
 func (c *CallbackOrRef) WithCallback(val Callback) *CallbackOrRef {
 	c.Callback = &val
 	return c
 }
 
+// CallbackEns ensures returned Callback is not nil.
+func (c *CallbackOrRef) CallbackEns() *Callback {
+	if c.Callback == nil {
+		c.Callback = new(Callback)
+	}
+
+	return c.Callback
+}
+
 // UnmarshalJSON decodes JSON.
 func (c *CallbackOrRef) UnmarshalJSON(data []byte) error {
 	var err error
@@ -5166,54 +5525,135 @@ func (c *Components) WithSchemas(val ComponentsSchemas) *Components {
 	return c
 }
 
+// SchemasEns ensures returned Schemas is not nil.
+func (c *Components) SchemasEns() *ComponentsSchemas {
+	if c.Schemas == nil {
+		c.Schemas = new(ComponentsSchemas)
+	}
+
+	return c.Schemas
+}
+
 // WithResponses sets Responses value.
 func (c *Components) WithResponses(val ComponentsResponses) *Components {
 	c.Responses = &val
 	return c
 }
 
+// ResponsesEns ensures returned Responses is not nil.
+func (c *Components) ResponsesEns() *ComponentsResponses {
+	if c.Responses == nil {
+		c.Responses = new(ComponentsResponses)
+	}
+
+	return c.Responses
+}
+
 // WithParameters sets Parameters value.
 func (c *Components) WithParameters(val ComponentsParameters) *Components {
 	c.Parameters = &val
 	return c
 }
 
+// ParametersEns ensures returned Parameters is not nil.
+func (c *Components) ParametersEns() *ComponentsParameters {
+	if c.Parameters == nil {
+		c.Parameters = new(ComponentsParameters)
+	}
+
+	return c.Parameters
+}
+
 // WithExamples sets Examples value.
 func (c *Components) WithExamples(val ComponentsExamples) *Components {
 	c.Examples = &val
 	return c
 }
 
+// ExamplesEns ensures returned Examples is not nil.
+func (c *Components) ExamplesEns() *ComponentsExamples {
+	if c.Examples == nil {
+		c.Examples = new(ComponentsExamples)
+	}
+
+	return c.Examples
+}
+
 // WithRequestBodies sets RequestBodies value.
 func (c *Components) WithRequestBodies(val ComponentsRequestBodies) *Components {
 	c.RequestBodies = &val
 	return c
 }
 
+// RequestBodiesEns ensures returned RequestBodies is not nil.
+func (c *Components) RequestBodiesEns() *ComponentsRequestBodies {
+	if c.RequestBodies == nil {
+		c.RequestBodies = new(ComponentsRequestBodies)
+	}
+
+	return c.RequestBodies
+}
+
 // WithHeaders sets Headers value.
 func (c *Components) WithHeaders(val ComponentsHeaders) *Components {
 	c.Headers = &val
 	return c
 }
 
+// HeadersEns ensures returned Headers is not nil.
+func (c *Components) HeadersEns() *ComponentsHeaders {
+	if c.Headers == nil {
+		c.Headers = new(ComponentsHeaders)
+	}
+
+	return c.Headers
+}
+
 // WithSecuritySchemes sets SecuritySchemes value.
 func (c *Components) WithSecuritySchemes(val ComponentsSecuritySchemes) *Components {
 	c.SecuritySchemes = &val
 	return c
 }
 
+// SecuritySchemesEns ensures returned SecuritySchemes is not nil.
+func (c *Components) SecuritySchemesEns() *ComponentsSecuritySchemes {
+	if c.SecuritySchemes == nil {
+		c.SecuritySchemes = new(ComponentsSecuritySchemes)
+	}
+
+	return c.SecuritySchemes
+}
+
 // WithLinks sets Links value.
 func (c *Components) WithLinks(val ComponentsLinks) *Components {
 	c.Links = &val
 	return c
 }
 
+// LinksEns ensures returned Links is not nil.
+func (c *Components) LinksEns() *ComponentsLinks {
+	if c.Links == nil {
+		c.Links = new(ComponentsLinks)
+	}
+
+	return c.Links
+}
+
 // WithCallbacks sets Callbacks value.
 func (c *Components) WithCallbacks(val ComponentsCallbacks) *Components {
 	c.Callbacks = &val
 	return c
 }
 
+// CallbacksEns ensures returned Callbacks is not nil.
+func (c *Components) CallbacksEns() *ComponentsCallbacks {
+	if c.Callbacks == nil {
+		c.Callbacks = new(ComponentsCallbacks)
+	}
+
+	return c.Callbacks
+}
+
 // WithMapOfAnything sets MapOfAnything value.
 func (c *Components) WithMapOfAnything(val map[string]interface{}) *Components {
 	c.MapOfAnything = val
@@ -5911,10 +6351,8 @@ func (a *APIKeySecurityScheme) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-var (
-	// constAPIKeySecurityScheme is unconditionally added to JSON.
-	constAPIKeySecurityScheme = json.RawMessage(`{"type":"apiKey"}`)
-)
+// constAPIKeySecurityScheme is unconditionally added to JSON.
+var constAPIKeySecurityScheme = json.RawMessage(`{"type":"apiKey"}`)
 
 // MarshalJSON encodes JSON.
 func (a APIKeySecurityScheme) MarshalJSON() ([]byte, error) {
@@ -5955,12 +6393,30 @@ func (h *HTTPSecurityScheme) WithBearer(val Bearer) *HTTPSecurityScheme {
 	return h
 }
 
+// BearerEns ensures returned Bearer is not nil.
+func (h *HTTPSecurityScheme) BearerEns() *Bearer {
+	if h.Bearer == nil {
+		h.Bearer = new(Bearer)
+	}
+
+	return h.Bearer
+}
+
 // WithNonBearer sets NonBearer value.
 func (h *HTTPSecurityScheme) WithNonBearer(val NonBearer) *HTTPSecurityScheme {
 	h.NonBearer = &val
 	return h
 }
 
+// NonBearerEns ensures returned NonBearer is not nil.
+func (h *HTTPSecurityScheme) NonBearerEns() *NonBearer {
+	if h.NonBearer == nil {
+		h.NonBearer = new(NonBearer)
+	}
+
+	return h.NonBearer
+}
+
 // WithMapOfAnything sets MapOfAnything value.
 func (h *HTTPSecurityScheme) WithMapOfAnything(val map[string]interface{}) *HTTPSecurityScheme {
 	h.MapOfAnything = val
@@ -6089,10 +6545,8 @@ func (h *HTTPSecurityScheme) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-var (
-	// constHTTPSecurityScheme is unconditionally added to JSON.
-	constHTTPSecurityScheme = json.RawMessage(`{"type":"http"}`)
-)
+// constHTTPSecurityScheme is unconditionally added to JSON.
+var constHTTPSecurityScheme = json.RawMessage(`{"type":"http"}`)
 
 // MarshalJSON encodes JSON.
 func (h HTTPSecurityScheme) MarshalJSON() ([]byte, error) {
@@ -6127,10 +6581,8 @@ func (b *Bearer) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-var (
-	// constBearer is unconditionally added to JSON.
-	constBearer = json.RawMessage(`{"scheme":"bearer"}`)
-)
+// constBearer is unconditionally added to JSON.
+var constBearer = json.RawMessage(`{"scheme":"bearer"}`)
 
 // MarshalJSON encodes JSON.
 func (b Bearer) MarshalJSON() ([]byte, error) {
@@ -6275,10 +6727,8 @@ func (o *OAuth2SecurityScheme) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-var (
-	// constOAuth2SecurityScheme is unconditionally added to JSON.
-	constOAuth2SecurityScheme = json.RawMessage(`{"type":"oauth2"}`)
-)
+// constOAuth2SecurityScheme is unconditionally added to JSON.
+var constOAuth2SecurityScheme = json.RawMessage(`{"type":"oauth2"}`)
 
 // MarshalJSON encodes JSON.
 func (o OAuth2SecurityScheme) MarshalJSON() ([]byte, error) {
@@ -6300,24 +6750,60 @@ func (o *OAuthFlows) WithImplicit(val ImplicitOAuthFlow) *OAuthFlows {
 	return o
 }
 
+// ImplicitEns ensures returned Implicit is not nil.
+func (o *OAuthFlows) ImplicitEns() *ImplicitOAuthFlow {
+	if o.Implicit == nil {
+		o.Implicit = new(ImplicitOAuthFlow)
+	}
+
+	return o.Implicit
+}
+
 // WithPassword sets Password value.
 func (o *OAuthFlows) WithPassword(val PasswordOAuthFlow) *OAuthFlows {
 	o.Password = &val
 	return o
 }
 
+// PasswordEns ensures returned Password is not nil.
+func (o *OAuthFlows) PasswordEns() *PasswordOAuthFlow {
+	if o.Password == nil {
+		o.Password = new(PasswordOAuthFlow)
+	}
+
+	return o.Password
+}
+
 // WithClientCredentials sets ClientCredentials value.
 func (o *OAuthFlows) WithClientCredentials(val ClientCredentialsFlow) *OAuthFlows {
 	o.ClientCredentials = &val
 	return o
 }
 
+// ClientCredentialsEns ensures returned ClientCredentials is not nil.
+func (o *OAuthFlows) ClientCredentialsEns() *ClientCredentialsFlow {
+	if o.ClientCredentials == nil {
+		o.ClientCredentials = new(ClientCredentialsFlow)
+	}
+
+	return o.ClientCredentials
+}
+
 // WithAuthorizationCode sets AuthorizationCode value.
 func (o *OAuthFlows) WithAuthorizationCode(val AuthorizationCodeOAuthFlow) *OAuthFlows {
 	o.AuthorizationCode = &val
 	return o
 }
 
+// AuthorizationCodeEns ensures returned AuthorizationCode is not nil.
+func (o *OAuthFlows) AuthorizationCodeEns() *AuthorizationCodeOAuthFlow {
+	if o.AuthorizationCode == nil {
+		o.AuthorizationCode = new(AuthorizationCodeOAuthFlow)
+	}
+
+	return o.AuthorizationCode
+}
+
 // WithMapOfAnything sets MapOfAnything value.
 func (o *OAuthFlows) WithMapOfAnything(val map[string]interface{}) *OAuthFlows {
 	o.MapOfAnything = val
@@ -7112,10 +7598,8 @@ func (o *OpenIDConnectSecurityScheme) UnmarshalJSON(data []byte) error {
 	return nil
 }
 
-var (
-	// constOpenIDConnectSecurityScheme is unconditionally added to JSON.
-	constOpenIDConnectSecurityScheme = json.RawMessage(`{"type":"openIdConnect"}`)
-)
+// constOpenIDConnectSecurityScheme is unconditionally added to JSON.
+var constOpenIDConnectSecurityScheme = json.RawMessage(`{"type":"openIdConnect"}`)
 
 // MarshalJSON encodes JSON.
 func (o OpenIDConnectSecurityScheme) MarshalJSON() ([]byte, error) {
@@ -7136,24 +7620,60 @@ func (s *SecurityScheme) WithAPIKeySecurityScheme(val APIKeySecurityScheme) *Sec
 	return s
 }
 
+// APIKeySecuritySchemeEns ensures returned APIKeySecurityScheme is not nil.
+func (s *SecurityScheme) APIKeySecuritySchemeEns() *APIKeySecurityScheme {
+	if s.APIKeySecurityScheme == nil {
+		s.APIKeySecurityScheme = new(APIKeySecurityScheme)
+	}
+
+	return s.APIKeySecurityScheme
+}
+
 // WithHTTPSecurityScheme sets HTTPSecurityScheme value.
 func (s *SecurityScheme) WithHTTPSecurityScheme(val HTTPSecurityScheme) *SecurityScheme {
 	s.HTTPSecurityScheme = &val
 	return s
 }
 
+// HTTPSecuritySchemeEns ensures returned HTTPSecurityScheme is not nil.
+func (s *SecurityScheme) HTTPSecuritySchemeEns() *HTTPSecurityScheme {
+	if s.HTTPSecurityScheme == nil {
+		s.HTTPSecurityScheme = new(HTTPSecurityScheme)
+	}
+
+	return s.HTTPSecurityScheme
+}
+
 // WithOAuth2SecurityScheme sets OAuth2SecurityScheme value.
 func (s *SecurityScheme) WithOAuth2SecurityScheme(val OAuth2SecurityScheme) *SecurityScheme {
 	s.OAuth2SecurityScheme = &val
 	return s
 }
 
+// OAuth2SecuritySchemeEns ensures returned OAuth2SecurityScheme is not nil.
+func (s *SecurityScheme) OAuth2SecuritySchemeEns() *OAuth2SecurityScheme {
+	if s.OAuth2SecurityScheme == nil {
+		s.OAuth2SecurityScheme = new(OAuth2SecurityScheme)
+	}
+
+	return s.OAuth2SecurityScheme
+}
+
 // WithOpenIDConnectSecurityScheme sets OpenIDConnectSecurityScheme value.
 func (s *SecurityScheme) WithOpenIDConnectSecurityScheme(val OpenIDConnectSecurityScheme) *SecurityScheme {
 	s.OpenIDConnectSecurityScheme = &val
 	return s
 }
 
+// OpenIDConnectSecuritySchemeEns ensures returned OpenIDConnectSecurityScheme is not nil.
+func (s *SecurityScheme) OpenIDConnectSecuritySchemeEns() *OpenIDConnectSecurityScheme {
+	if s.OpenIDConnectSecurityScheme == nil {
+		s.OpenIDConnectSecurityScheme = new(OpenIDConnectSecurityScheme)
+	}
+
+	return s.OpenIDConnectSecurityScheme
+}
+
 // UnmarshalJSON decodes JSON.
 func (s *SecurityScheme) UnmarshalJSON(data []byte) error {
 	var err error
@@ -7217,12 +7737,30 @@ func (s *SecuritySchemeOrRef) WithSecuritySchemeReference(val SecuritySchemeRefe
 	return s
 }
 
+// SecuritySchemeReferenceEns ensures returned SecuritySchemeReference is not nil.
+func (s *SecuritySchemeOrRef) SecuritySchemeReferenceEns() *SecuritySchemeReference {
+	if s.SecuritySchemeReference == nil {
+		s.SecuritySchemeReference = new(SecuritySchemeReference)
+	}
+
+	return s.SecuritySchemeReference
+}
+
 // WithSecurityScheme sets SecurityScheme value.
 func (s *SecuritySchemeOrRef) WithSecurityScheme(val SecurityScheme) *SecuritySchemeOrRef {
 	s.SecurityScheme = &val
 	return s
 }
 
+// SecuritySchemeEns ensures returned SecurityScheme is not nil.
+func (s *SecuritySchemeOrRef) SecuritySchemeEns() *SecurityScheme {
+	if s.SecurityScheme == nil {
+		s.SecurityScheme = new(SecurityScheme)
+	}
+
+	return s.SecurityScheme
+}
+
 // UnmarshalJSON decodes JSON.
 func (s *SecuritySchemeOrRef) UnmarshalJSON(data []byte) error {
 	var err error
diff --git a/openapi3/jsonschema.go b/openapi3/jsonschema.go
new file mode 100644
index 0000000..4c1eb7f
--- /dev/null
+++ b/openapi3/jsonschema.go
@@ -0,0 +1,350 @@
+package openapi3
+
+import (
+	"strings"
+
+	"github.com/swaggest/jsonschema-go"
+)
+
+type toJSONSchemaContext struct {
+	refsProcessed map[string]jsonschema.SchemaOrBool
+	refsCount     map[string]int
+	spec          *Spec
+}
+
+// ToJSONSchema converts OpenAPI Schema to JSON Schema.
+//
+// Local references are resolved against `#/components/schemas` in spec.
+func (s *SchemaOrRef) ToJSONSchema(spec *Spec) jsonschema.SchemaOrBool {
+	ctx := toJSONSchemaContext{
+		refsProcessed: map[string]jsonschema.SchemaOrBool{},
+		refsCount:     map[string]int{},
+		spec:          spec,
+	}
+	js := s.toJSONSchema(ctx)
+
+	// Inline root reference without recursions.
+	if s.SchemaReference != nil {
+		dstName := strings.TrimPrefix(s.SchemaReference.Ref, "#/components/schemas/")
+		if ctx.refsCount[dstName] == 1 {
+			js = ctx.refsProcessed[dstName]
+			delete(ctx.refsProcessed, dstName)
+		}
+	}
+
+	if len(ctx.refsProcessed) > 0 {
+		js.TypeObjectEns().WithExtraPropertiesItem(
+			"components",
+			map[string]interface{}{"schemas": ctx.refsProcessed},
+		)
+	}
+
+	return js
+}
+
+func (s *SchemaOrRef) toJSONSchema(ctx toJSONSchemaContext) jsonschema.SchemaOrBool {
+	js := jsonschema.SchemaOrBool{}
+	jso := js.TypeObjectEns()
+
+	if s.SchemaReference != nil {
+		jso.WithRef(s.SchemaReference.Ref)
+
+		if strings.HasPrefix(s.SchemaReference.Ref, "#/components/schemas/") {
+			dstName := strings.TrimPrefix(s.SchemaReference.Ref, "#/components/schemas/")
+
+			if _, alreadyProcessed := ctx.refsProcessed[dstName]; !alreadyProcessed {
+				ctx.refsProcessed[dstName] = jsonschema.SchemaOrBool{}
+
+				dst := ctx.spec.Components.Schemas.MapOfSchemaOrRefValues[dstName]
+				ctx.refsProcessed[dstName] = dst.toJSONSchema(ctx)
+			}
+
+			ctx.refsCount[dstName]++
+		}
+
+		return js
+	}
+
+	if s.Schema == nil {
+		return js
+	}
+
+	ss := s.Schema
+
+	jso.Description = ss.Description
+	jso.Title = ss.Title
+
+	if ss.Type != nil {
+		jso.AddType(jsonschema.SimpleType(*ss.Type))
+	}
+
+	if ss.Nullable != nil && *ss.Nullable {
+		jso.AddType(jsonschema.Null)
+	}
+
+	jso.MultipleOf = ss.MultipleOf
+	if ss.ExclusiveMaximum != nil && *ss.ExclusiveMaximum {
+		jso.ExclusiveMaximum = ss.Maximum
+	} else {
+		jso.Maximum = ss.Maximum
+	}
+
+	if ss.ExclusiveMinimum != nil && *ss.ExclusiveMinimum {
+		jso.ExclusiveMinimum = ss.Minimum
+	} else {
+		jso.Minimum = ss.Minimum
+	}
+
+	jso.MaxLength = ss.MaxLength
+
+	if ss.MinLength != nil {
+		jso.MinLength = *ss.MinLength
+	}
+
+	jso.Pattern = ss.Pattern
+	jso.MaxItems = ss.MaxItems
+
+	if ss.MinItems != nil {
+		jso.MinItems = *ss.MinItems
+	}
+
+	jso.UniqueItems = ss.UniqueItems
+	jso.MaxProperties = ss.MaxProperties
+
+	if ss.MinProperties != nil {
+		jso.MinProperties = *ss.MinProperties
+	}
+
+	jso.Required = ss.Required
+	jso.Enum = ss.Enum
+
+	if ss.Not != nil {
+		jso.WithNot(ss.Not.toJSONSchema(ctx))
+	}
+
+	if len(ss.AllOf) != 0 {
+		for _, allOf := range ss.AllOf {
+			jso.AllOf = append(jso.AllOf, allOf.toJSONSchema(ctx))
+		}
+	}
+
+	if len(ss.OneOf) != 0 {
+		for _, oneOf := range ss.OneOf {
+			jso.OneOf = append(jso.OneOf, oneOf.toJSONSchema(ctx))
+		}
+	}
+
+	if len(ss.AnyOf) != 0 {
+		for _, anyOf := range ss.AnyOf {
+			jso.AnyOf = append(jso.AnyOf, anyOf.toJSONSchema(ctx))
+		}
+	}
+
+	if ss.Items != nil {
+		jso.ItemsEns().WithSchemaOrBool(ss.Items.toJSONSchema(ctx))
+	}
+
+	if ss.Properties != nil {
+		for propName, propSchema := range ss.Properties {
+			jso.WithPropertiesItem(propName, propSchema.toJSONSchema(ctx))
+		}
+	}
+
+	if ss.AdditionalProperties != nil {
+		if ss.AdditionalProperties.Bool != nil {
+			jso.AdditionalProperties = &jsonschema.SchemaOrBool{
+				TypeBoolean: ss.AdditionalProperties.Bool,
+			}
+		} else if ss.AdditionalProperties.SchemaOrRef != nil {
+			jso.WithAdditionalProperties(ss.AdditionalProperties.SchemaOrRef.toJSONSchema(ctx))
+		}
+	}
+
+	jso.Format = ss.Format
+	jso.Default = ss.Default
+	jso.ReadOnly = ss.ReadOnly
+
+	if ss.Example != nil {
+		jso.WithExamples(*ss.Example)
+	}
+
+	for k, v := range ss.MapOfAnything {
+		jso.WithExtraPropertiesItem(k, v)
+	}
+
+	return js
+}
+
+// FromJSONSchema loads OpenAPI Schema from JSON Schema.
+func (s *SchemaOrRef) FromJSONSchema(schema jsonschema.SchemaOrBool) {
+	if schema.TypeBoolean != nil {
+		s.fromBool(*schema.TypeBoolean)
+		return
+	}
+
+	js := schema.TypeObject
+	if js.Ref != nil {
+		s.SchemaReference = &SchemaReference{Ref: *js.Ref}
+		return
+	}
+
+	if s.Schema == nil {
+		s.Schema = &Schema{}
+	}
+
+	os := s.Schema
+
+	if js.Not != nil {
+		os.Not = &SchemaOrRef{}
+		os.Not.FromJSONSchema(*js.Not)
+	}
+
+	fromSchemaArray(&os.OneOf, js.OneOf)
+	fromSchemaArray(&os.AnyOf, js.AnyOf)
+	fromSchemaArray(&os.AllOf, js.AllOf)
+
+	os.Title = js.Title
+	os.Description = js.Description
+	os.Required = js.Required
+	os.Default = js.Default
+	os.Enum = js.Enum
+
+	if len(js.Examples) > 0 {
+		os.Example = &js.Examples[0]
+	}
+
+	if deprecated, ok := js.ExtraProperties["deprecated"].(bool); ok {
+		os.Deprecated = &deprecated
+	}
+
+	if js.Type != nil {
+		if js.Type.SimpleTypes != nil {
+			if *js.Type.SimpleTypes == jsonschema.Null {
+				os.WithNullable(true)
+			} else {
+				os.WithType(SchemaType(*js.Type.SimpleTypes))
+			}
+		} else if len(js.Type.SliceOfSimpleTypeValues) > 0 {
+			for _, t := range js.Type.SliceOfSimpleTypeValues {
+				if t == jsonschema.Null {
+					os.WithNullable(true)
+				} else {
+					os.WithType(SchemaType(t))
+				}
+			}
+		}
+	}
+
+	if js.AdditionalProperties != nil {
+		os.AdditionalProperties = &SchemaAdditionalProperties{}
+		if js.AdditionalProperties.TypeBoolean != nil {
+			os.AdditionalProperties.Bool = js.AdditionalProperties.TypeBoolean
+		} else {
+			ap := SchemaOrRef{}
+			ap.FromJSONSchema(*js.AdditionalProperties)
+			os.AdditionalProperties.SchemaOrRef = &ap
+		}
+	}
+
+	if js.Items != nil && js.Items.SchemaOrBool != nil {
+		os.Items = &SchemaOrRef{}
+		os.Items.FromJSONSchema(*js.Items.SchemaOrBool)
+	}
+
+	if js.ExclusiveMaximum != nil {
+		os.WithExclusiveMaximum(true)
+		os.Maximum = js.Maximum
+	} else if js.Maximum != nil {
+		os.Maximum = js.Maximum
+	}
+
+	if js.ExclusiveMinimum != nil {
+		os.WithExclusiveMinimum(true)
+		os.Minimum = js.Minimum
+	} else if js.Minimum != nil {
+		os.Minimum = js.Minimum
+	}
+
+	os.Format = js.Format
+
+	if js.MinItems != 0 {
+		os.MinItems = &js.MinItems
+	}
+
+	os.MaxItems = js.MaxItems
+
+	if js.MinLength != 0 {
+		os.MinLength = &js.MinLength
+	}
+
+	os.MaxLength = js.MaxLength
+
+	if js.MinProperties != 0 {
+		os.MinProperties = &js.MinProperties
+	}
+
+	os.MaxProperties = js.MaxProperties
+
+	os.MultipleOf = js.MultipleOf
+
+	os.Pattern = js.Pattern
+
+	if len(js.Properties) > 0 {
+		os.Properties = make(map[string]SchemaOrRef, len(js.Properties))
+
+		for name, jsp := range js.Properties {
+			osp := SchemaOrRef{}
+			osp.FromJSONSchema(jsp)
+			os.Properties[name] = osp
+		}
+	}
+
+	os.ReadOnly = js.ReadOnly
+	os.UniqueItems = js.UniqueItems
+
+	if writeOnly, ok := js.ExtraProperties["writeOnly"].(bool); ok {
+		os.WriteOnly = &writeOnly
+	}
+
+	for name, val := range js.ExtraProperties {
+		if strings.HasPrefix(name, "x-") {
+			if os.MapOfAnything == nil {
+				os.MapOfAnything = map[string]interface{}{
+					name: val,
+				}
+			} else {
+				os.MapOfAnything[name] = val
+			}
+		}
+	}
+}
+
+func fromSchemaArray(os *[]SchemaOrRef, js []jsonschema.SchemaOrBool) {
+	if len(js) == 0 {
+		return
+	}
+
+	osa := make([]SchemaOrRef, len(js))
+
+	for i, jso := range js {
+		oso := SchemaOrRef{}
+		oso.FromJSONSchema(jso)
+		osa[i] = oso
+	}
+
+	*os = osa
+}
+
+func (s *SchemaOrRef) fromBool(val bool) {
+	if s.Schema == nil {
+		s.Schema = &Schema{}
+	}
+
+	if val {
+		return
+	}
+
+	s.Schema.Not = &SchemaOrRef{
+		Schema: &Schema{},
+	}
+}
diff --git a/openapi3/reflect.go b/openapi3/reflect.go
index cb93029..f3bed6f 100644
--- a/openapi3/reflect.go
+++ b/openapi3/reflect.go
@@ -12,6 +12,7 @@ import (
 	"github.com/swaggest/refl"
 )
 
+// Reflector builds OpenAPI Schema with reflected structures.
 type Reflector struct {
 	jsonschema.Reflector
 	Spec *Spec
@@ -34,6 +35,16 @@ func joinErrors(errs ...error) error {
 	return nil
 }
 
+// SpecEns ensures returned Spec is not nil.
+func (r *Reflector) SpecEns() *Spec {
+	if r.Spec == nil {
+		r.Spec = &Spec{Openapi: "3.0.2"}
+	}
+
+	return r.Spec
+}
+
+// SetRequest sets up operation parameters.
 func (r *Reflector) SetRequest(o *Operation, input interface{}, httpMethod string) error {
 	return joinErrors(
 		r.parseParametersIn(o, input, ParameterInQuery),
@@ -101,7 +112,6 @@ func (r *Reflector) parseRequestBody(o *Operation, input interface{}, tag, mime
 			return false, nil
 		}),
 	)
-
 	if err != nil {
 		return err
 	}
@@ -112,39 +122,26 @@ func (r *Reflector) parseRequestBody(o *Operation, input interface{}, tag, mime
 		},
 	}
 
-	for name, def := range schema.Definitions {
-		if r.Spec.Components == nil {
-			r.Spec.Components = &Components{}
-		}
-
-		if r.Spec.Components.Schemas == nil {
-			r.Spec.Components.Schemas = &ComponentsSchemas{}
-		}
+	rootDefName := strings.TrimPrefix(*schema.Ref, "#/components/schemas/")
 
+	for name, def := range schema.Definitions {
 		s := SchemaOrRef{}
 
 		s.FromJSONSchema(def)
 
-		r.Spec.Components.Schemas.WithMapOfSchemaOrRefValuesItem(definitionPefix+name, s)
-	}
-
-	if o.RequestBody == nil {
-		o.RequestBody = &RequestBodyOrRef{}
-	}
-
-	if o.RequestBody.RequestBody == nil {
-		o.RequestBody.RequestBody = &RequestBody{}
-	}
+		// Disable nullability of request bodies.
+		if s.Schema != nil && s.Schema.Nullable != nil && name == rootDefName {
+			s.Schema.Nullable = nil
+		}
 
-	if o.RequestBody.RequestBody.Content == nil {
-		o.RequestBody.RequestBody.Content = map[string]MediaType{}
+		r.SpecEns().ComponentsEns().SchemasEns().WithMapOfSchemaOrRefValuesItem(definitionPefix+name, s)
 	}
 
 	if mime == mimeFormUrlencoded && hasFileUpload {
 		mime = mimeMultipart
 	}
 
-	o.RequestBody.RequestBody.Content[mime] = mt
+	o.RequestBodyEns().RequestBodyEns().WithContentItem(mime, mt)
 
 	return nil
 }
@@ -195,7 +192,6 @@ func (r *Reflector) parseParametersIn(o *Operation, input interface{}, in Parame
 			return nil
 		}),
 	)
-
 	if err != nil {
 		return err
 	}
@@ -207,7 +203,7 @@ func (r *Reflector) parseResponseHeader(output interface{}) (map[string]HeaderOr
 	res := make(map[string]HeaderOrRef)
 
 	_, err := r.Reflect(output,
-		jsonschema.DefinitionsPrefix("#/components/headers/"),
+		jsonschema.DefinitionsPrefix("#/components/schemas/"),
 		jsonschema.PropertyNameTag("header"),
 		jsonschema.InterceptProperty(func(name string, field reflect.StructField, propertySchema *jsonschema.Schema) error {
 			s := SchemaOrRef{}
@@ -235,7 +231,6 @@ func (r *Reflector) parseResponseHeader(output interface{}) (map[string]HeaderOr
 			return nil
 		}),
 	)
-
 	if err != nil {
 		return nil, err
 	}
@@ -243,16 +238,13 @@ func (r *Reflector) parseResponseHeader(output interface{}) (map[string]HeaderOr
 	return res, nil
 }
 
+// SetJSONResponse sets up operation JSON response.
 func (r *Reflector) SetJSONResponse(o *Operation, output interface{}, httpStatus int) error {
 	schema, err := r.Reflect(output, jsonschema.RootRef, jsonschema.DefinitionsPrefix("#/components/schemas/"))
 	if err != nil {
 		return err
 	}
 
-	if o.Responses.MapOfResponseOrRefValues == nil {
-		o.Responses.MapOfResponseOrRefValues = make(map[string]ResponseOrRef, 1)
-	}
-
 	oaiSchema := SchemaOrRef{}
 	oaiSchema.FromJSONSchema(schema.ToSchemaOrBool())
 
@@ -268,29 +260,38 @@ func (r *Reflector) SetJSONResponse(o *Operation, output interface{}, httpStatus
 		},
 	}
 
-	resp.Headers, err = r.parseResponseHeader(output)
-	if err != nil {
-		return err
+	if schema.Description != nil {
+		resp.Description = *schema.Description
+	} else {
+		resp.Description = http.StatusText(httpStatus)
 	}
 
-	for name, def := range schema.Definitions {
-		if r.Spec.Components == nil {
-			r.Spec.Components = &Components{}
-		}
+	var rootDefName string
 
-		if r.Spec.Components.Schemas == nil {
-			r.Spec.Components.Schemas = &ComponentsSchemas{}
-		}
+	if oaiSchema.SchemaReference != nil {
+		rootDefName = strings.TrimPrefix(*schema.Ref, "#/components/schemas/")
+	}
 
+	for name, def := range schema.Definitions {
 		s := SchemaOrRef{}
 		s.FromJSONSchema(def)
 
-		r.Spec.Components.Schemas.WithMapOfSchemaOrRefValuesItem(name, s)
+		// Disable nullability of request bodies.
+		if s.Schema != nil && s.Schema.Nullable != nil && name == rootDefName {
+			s.Schema.Nullable = nil
+		}
+
+		r.SpecEns().ComponentsEns().SchemasEns().WithMapOfSchemaOrRefValuesItem(name, s)
 	}
 
-	o.Responses.MapOfResponseOrRefValues[strconv.Itoa(httpStatus)] = ResponseOrRef{
-		Response: &resp,
+	resp.Headers, err = r.parseResponseHeader(output)
+	if err != nil {
+		return err
 	}
 
+	o.Responses.WithMapOfResponseOrRefValuesItem(strconv.Itoa(httpStatus), ResponseOrRef{
+		Response: &resp,
+	})
+
 	return nil
 }
diff --git a/openapi3/schema.go b/openapi3/schema.go
deleted file mode 100644
index fa7234a..0000000
--- a/openapi3/schema.go
+++ /dev/null
@@ -1,180 +0,0 @@
-package openapi3
-
-import (
-	"strings"
-
-	"github.com/swaggest/jsonschema-go"
-)
-
-func (s *SchemaOrRef) FromJSONSchema(schema jsonschema.SchemaOrBool) {
-	if schema.TypeBoolean != nil {
-		s.fromBool(*schema.TypeBoolean)
-		return
-	}
-
-	js := schema.TypeObject
-	if js.Ref != nil {
-		s.SchemaReference = &SchemaReference{Ref: *js.Ref}
-		return
-	}
-
-	if s.Schema == nil {
-		s.Schema = &Schema{}
-	}
-
-	os := s.Schema
-
-	if js.Not != nil {
-		os.Not = &SchemaOrRef{}
-		os.Not.FromJSONSchema(*js.Not)
-	}
-
-	fromSchemaArray(&os.OneOf, js.OneOf)
-	fromSchemaArray(&os.AnyOf, js.AnyOf)
-	fromSchemaArray(&os.AllOf, js.AllOf)
-
-	os.Title = js.Title
-	os.Description = js.Description
-	os.Required = js.Required
-	os.Default = js.Default
-	os.Enum = js.Enum
-
-	if len(js.Examples) > 0 {
-		os.Example = &js.Examples[0]
-	}
-
-	if deprecated, ok := js.ExtraProperties["deprecated"].(bool); ok {
-		os.Deprecated = &deprecated
-	}
-
-	if js.Type != nil {
-		if js.Type.SimpleTypes != nil {
-			if *js.Type.SimpleTypes == jsonschema.Null {
-				os.WithNullable(true)
-			} else {
-				os.WithType(SchemaType(*js.Type.SimpleTypes))
-			}
-		} else if len(js.Type.SliceOfSimpleTypeValues) > 0 {
-			for _, t := range js.Type.SliceOfSimpleTypeValues {
-				if t == jsonschema.Null {
-					os.WithNullable(true)
-				} else {
-					os.WithType(SchemaType(t))
-				}
-			}
-		}
-	}
-
-	if js.AdditionalProperties != nil {
-		os.AdditionalProperties = &SchemaAdditionalProperties{}
-		if js.AdditionalProperties.TypeBoolean != nil {
-			os.AdditionalProperties.Bool = js.AdditionalProperties.TypeBoolean
-		} else {
-			ap := SchemaOrRef{}
-			ap.FromJSONSchema(*js.AdditionalProperties)
-			os.AdditionalProperties.SchemaOrRef = &ap
-		}
-	}
-
-	if js.Items != nil && js.Items.SchemaOrBool != nil {
-		os.Items = &SchemaOrRef{}
-		os.Items.FromJSONSchema(*js.Items.SchemaOrBool)
-	}
-
-	if js.ExclusiveMaximum != nil {
-		os.WithExclusiveMaximum(true)
-		os.Maximum = js.Maximum
-	} else if js.Maximum != nil {
-		os.Maximum = js.Maximum
-	}
-
-	if js.ExclusiveMinimum != nil {
-		os.WithExclusiveMinimum(true)
-		os.Minimum = js.Minimum
-	} else if js.Minimum != nil {
-		os.Minimum = js.Minimum
-	}
-
-	os.Format = js.Format
-
-	if js.MinItems != 0 {
-		os.MinItems = &js.MinItems
-	}
-
-	os.MaxItems = js.MaxItems
-
-	if js.MinLength != 0 {
-		os.MinLength = &js.MinLength
-	}
-
-	os.MaxLength = js.MaxLength
-
-	if js.MinProperties != 0 {
-		os.MinProperties = &js.MinProperties
-	}
-
-	os.MaxProperties = js.MaxProperties
-
-	os.MultipleOf = js.MultipleOf
-
-	os.Pattern = js.Pattern
-
-	if len(js.Properties) > 0 {
-		os.Properties = make(map[string]SchemaOrRef, len(js.Properties))
-
-		for name, jsp := range js.Properties {
-			osp := SchemaOrRef{}
-			osp.FromJSONSchema(jsp)
-			os.Properties[name] = osp
-		}
-	}
-
-	os.ReadOnly = js.ReadOnly
-	os.UniqueItems = js.UniqueItems
-
-	if writeOnly, ok := js.ExtraProperties["writeOnly"].(bool); ok {
-		os.WriteOnly = &writeOnly
-	}
-
-	for name, val := range js.ExtraProperties {
-		if strings.HasPrefix(name, "x-") {
-			if os.MapOfAnything == nil {
-				os.MapOfAnything = map[string]interface{}{
-					name: val,
-				}
-			} else {
-				os.MapOfAnything[name] = val
-			}
-		}
-	}
-}
-
-func fromSchemaArray(os *[]SchemaOrRef, js []jsonschema.SchemaOrBool) {
-	if len(js) == 0 {
-		return
-	}
-
-	osa := make([]SchemaOrRef, len(js))
-
-	for i, jso := range js {
-		oso := SchemaOrRef{}
-		oso.FromJSONSchema(jso)
-		osa[i] = oso
-	}
-
-	*os = osa
-}
-
-func (s *SchemaOrRef) fromBool(val bool) {
-	if s.Schema == nil {
-		s.Schema = &Schema{}
-	}
-
-	if val {
-		return
-	}
-
-	s.Schema.Not = &SchemaOrRef{
-		Schema: &Schema{},
-	}
-}


Test patch:
diff --git a/openapi3/_testdata/openapi.json b/openapi3/_testdata/openapi.json
index 0461294..c1b0e47 100644
--- a/openapi3/_testdata/openapi.json
+++ b/openapi3/_testdata/openapi.json
@@ -66,7 +66,7 @@
     ],
     "responses": {
      "200": {
-      "description": "",
+      "description": "OK",
       "headers": {
        "X-Header-Field": {
         "style": "simple",
@@ -213,7 +213,7 @@
     },
     "responses": {
      "200": {
-      "description": "",
+      "description": "OK",
       "headers": {
        "X-Header-Field": {
         "style": "simple",
@@ -233,7 +233,7 @@
       }
      },
      "409": {
-      "description": "",
+      "description": "Conflict",
       "headers": {
        "X-Header-Field": {
         "style": "simple",
@@ -305,8 +305,7 @@
      "in_body2": {
       "type": "string"
      }
-    },
-    "nullable": true
+    }
    },
    "Openapi3TestResp": {
     "title": "Sample Response",
@@ -375,7 +374,6 @@
      "whatever": {}
     },
     "description": "This is a sample response.",
-    "nullable": true,
     "x-foo": "bar"
    },
    "Openapi3TestUUID": {
diff --git a/openapi3/_testdata/req_schema.json b/openapi3/_testdata/req_schema.json
new file mode 100644
index 0000000..872d222
--- /dev/null
+++ b/openapi3/_testdata/req_schema.json
@@ -0,0 +1,11 @@
+{
+  "properties": {
+    "in_body1": {
+      "type": "integer"
+    },
+    "in_body2": {
+      "type": "string"
+    }
+  },
+  "type": "object"
+}
\ No newline at end of file
diff --git a/openapi3/_testdata/resp_schema.json b/openapi3/_testdata/resp_schema.json
new file mode 100644
index 0000000..c3f8eea
--- /dev/null
+++ b/openapi3/_testdata/resp_schema.json
@@ -0,0 +1,163 @@
+{
+  "$ref": "#/components/schemas/Openapi3TestResp",
+  "components": {
+    "schemas": {
+      "Openapi3TestISOWeek": {
+        "description": "ISO Week",
+        "examples": [
+          "2006-W43"
+        ],
+        "pattern": "^[0-9]{4}-W(0[1-9]|[1-4][0-9]|5[0-2])$",
+        "type": "string"
+      },
+      "Openapi3TestResp": {
+        "title": "Sample Response",
+        "description": "This is a sample response.",
+        "properties": {
+          "arrayOfAnything": {
+            "items": {},
+            "type": "array"
+          },
+          "customType": {
+            "$ref": "#/components/schemas/Openapi3TestISOWeek"
+          },
+          "field1": {
+            "type": "integer"
+          },
+          "field2": {
+            "type": "string"
+          },
+          "info": {
+            "required": [
+              "foo"
+            ],
+            "properties": {
+              "bar": {
+                "description": "This is Bar.",
+                "type": "number"
+              },
+              "foo": {
+                "pattern": "\\d+",
+                "type": "string"
+              }
+            },
+            "type": "object"
+          },
+          "map": {
+            "additionalProperties": {
+              "type": "integer"
+            },
+            "type": "object"
+          },
+          "mapOfAnything": {
+            "additionalProperties": {},
+            "type": "object"
+          },
+          "nullableWhatever": {
+            "type": "null"
+          },
+          "parent": {
+            "$ref": "#/components/schemas/Openapi3TestResp"
+          },
+          "recursiveArray": {
+            "items": {
+              "$ref": "#/components/schemas/Openapi3TestWeirdResp"
+            },
+            "type": "array"
+          },
+          "recursiveStructArray": {
+            "items": {
+              "$ref": "#/components/schemas/Openapi3TestResp"
+            },
+            "type": "array"
+          },
+          "uuid": {
+            "$ref": "#/components/schemas/Openapi3TestUUID"
+          },
+          "whatever": {}
+        },
+        "type": "object",
+        "x-foo": "bar"
+      },
+      "Openapi3TestUUID": {
+        "examples": [
+          "248df4b7-aa70-47b8-a036-33ac447e668d"
+        ],
+        "type": "string",
+        "format": "uuid"
+      },
+      "Openapi3TestWeirdResp": {
+        "title": "Sample Response",
+        "description": "This is a sample response.",
+        "properties": {
+          "arrayOfAnything": {
+            "items": {},
+            "type": "array"
+          },
+          "customType": {
+            "$ref": "#/components/schemas/Openapi3TestISOWeek"
+          },
+          "field1": {
+            "type": "integer"
+          },
+          "field2": {
+            "type": "string"
+          },
+          "info": {
+            "required": [
+              "foo"
+            ],
+            "properties": {
+              "bar": {
+                "description": "This is Bar.",
+                "type": "number"
+              },
+              "foo": {
+                "pattern": "\\d+",
+                "type": "string"
+              }
+            },
+            "type": "object"
+          },
+          "map": {
+            "additionalProperties": {
+              "type": "integer"
+            },
+            "type": "object"
+          },
+          "mapOfAnything": {
+            "additionalProperties": {},
+            "type": "object"
+          },
+          "nullableWhatever": {
+            "type": "null"
+          },
+          "parent": {
+            "$ref": "#/components/schemas/Openapi3TestResp"
+          },
+          "recursiveArray": {
+            "items": {
+              "$ref": "#/components/schemas/Openapi3TestWeirdResp"
+            },
+            "type": "array"
+          },
+          "recursiveStructArray": {
+            "items": {
+              "$ref": "#/components/schemas/Openapi3TestResp"
+            },
+            "type": "array"
+          },
+          "uuid": {
+            "$ref": "#/components/schemas/Openapi3TestUUID"
+          },
+          "whatever": {}
+        },
+        "type": [
+          "object",
+          "null"
+        ],
+        "x-foo": "bar"
+      }
+    }
+  }
+}
\ No newline at end of file
diff --git a/openapi3/_testdata/swgui/swgui.go b/openapi3/_testdata/swgui/swgui.go
index 7c8a592..f3c352f 100644
--- a/openapi3/_testdata/swgui/swgui.go
+++ b/openapi3/_testdata/swgui/swgui.go
@@ -9,7 +9,6 @@ import (
 )
 
 func main() {
-	//swgui.Config{}
 	h := v3.NewHandler("Foo", "/openapi.json", "/")
 	hh := http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
 		if r.URL.Path == "/openapi.json" {
diff --git a/openapi3/example_test.go b/openapi3/example_test.go
index 1c48f82..274a94e 100644
--- a/openapi3/example_test.go
+++ b/openapi3/example_test.go
@@ -118,7 +118,7 @@ func ExampleReflector_SetJSONResponse() {
 	//     ],
 	//     "responses": {
 	//      "200": {
-	//       "description": "",
+	//       "description": "OK",
 	//       "content": {
 	//        "application/json": {
 	//         "schema": {
@@ -160,7 +160,7 @@ func ExampleReflector_SetJSONResponse() {
 	//     },
 	//     "responses": {
 	//      "200": {
-	//       "description": "",
+	//       "description": "OK",
 	//       "content": {
 	//        "application/json": {
 	//         "schema": {
@@ -170,7 +170,7 @@ func ExampleReflector_SetJSONResponse() {
 	//       }
 	//      },
 	//      "409": {
-	//       "description": "",
+	//       "description": "Conflict",
 	//       "content": {
 	//        "application/json": {
 	//         "schema": {
@@ -214,8 +214,7 @@ func ExampleReflector_SetJSONResponse() {
 	//      "string": {
 	//       "type": "string"
 	//      }
-	//     },
-	//     "nullable": true
+	//     }
 	//    },
 	//    "Openapi3TestResp": {
 	//     "type": "object",
@@ -247,8 +246,7 @@ func ExampleReflector_SetJSONResponse() {
 	//       "type": "string",
 	//       "format": "date-time"
 	//      }
-	//     },
-	//     "nullable": true
+	//     }
 	//    }
 	//   }
 	//  }
diff --git a/openapi3/reflect_test.go b/openapi3/reflect_test.go
index 98db00b..583c440 100644
--- a/openapi3/reflect_test.go
+++ b/openapi3/reflect_test.go
@@ -5,6 +5,7 @@ import (
 	"io/ioutil"
 	"mime/multipart"
 	"net/http"
+	"strconv"
 	"testing"
 
 	"github.com/stretchr/testify/assert"
@@ -111,12 +112,10 @@ func TestGenerator_SetResponse(t *testing.T) {
 
 	reflector.AddTypeMapping(UUID{}, uuidDef)
 
-	s := openapi3.Spec{}
-	s.Openapi = "3.0.2"
+	s := reflector.SpecEns()
 	s.Info.Title = "SampleAPI"
 	s.Info.Version = "1.2.3"
 
-	reflector.Spec = &s
 	reflector.AddTypeMapping(new(WeirdResp), new(Resp))
 
 	op := openapi3.Operation{}
@@ -135,6 +134,13 @@ func TestGenerator_SetResponse(t *testing.T) {
 		WithSummary("Path Summary").
 		WithDescription("Path Description")
 
+	js := op.RequestBody.RequestBody.Content["application/json"].Schema.ToJSONSchema(s)
+	jsb, err := json.MarshalIndent(js, "", " ")
+	require.NoError(t, err)
+	expected, err := ioutil.ReadFile("_testdata/req_schema.json")
+	require.NoError(t, err)
+	assertjson.Equal(t, expected, jsb, string(jsb))
+
 	pathItem.WithOperation(http.MethodPost, op)
 
 	op = openapi3.Operation{}
@@ -147,6 +153,25 @@ func TestGenerator_SetResponse(t *testing.T) {
 
 	pathItem.WithOperation(http.MethodGet, op)
 
+	js = op.Responses.MapOfResponseOrRefValues[strconv.Itoa(http.StatusOK)].Response.Content["application/json"].
+		Schema.ToJSONSchema(s)
+	jsb, err = json.MarshalIndent(js, "", " ")
+	require.NoError(t, err)
+	expected, err = ioutil.ReadFile("_testdata/resp_schema.json")
+	require.NoError(t, err)
+	assertjson.Equal(t, expected, jsb, string(jsb))
+
+	js = op.Responses.MapOfResponseOrRefValues[strconv.Itoa(http.StatusOK)].Response.Headers["X-Header-Field"].Header.
+		Schema.ToJSONSchema(s)
+	jsb, err = json.Marshal(js)
+	require.NoError(t, err)
+	assertjson.Equal(t, []byte(`{"type": "string", "description": "Sample header response."}`), jsb)
+
+	js = op.Parameters[0].Parameter.Schema.ToJSONSchema(s)
+	jsb, err = json.Marshal(js)
+	require.NoError(t, err)
+	assertjson.Equal(t, []byte(`{"type": "integer", "description": "Query parameter."}`), jsb)
+
 	s.Paths.WithMapOfPathItemValuesItem(
 		"/somewhere/{in_path}",
 		pathItem,
@@ -157,7 +182,7 @@ func TestGenerator_SetResponse(t *testing.T) {
 
 	require.NoError(t, ioutil.WriteFile("_testdata/openapi_last_run.json", b, 0640))
 
-	expected, err := ioutil.ReadFile("_testdata/openapi.json")
+	expected, err = ioutil.ReadFile("_testdata/openapi.json")
 	require.NoError(t, err)
 
 	assertjson.Equal(t, expected, b)