From bf711ab5c4e357e670516b30083267f197a1e7ce Mon Sep 17 00:00:00 2001 From: richie Date: Tue, 17 Dec 2019 18:30:40 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8go=20mod=20=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E5=8C=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dockerfile | 8 +- Gopkg.lock | 681 - Gopkg.toml | 86 - Makefile | 49 + README.md | 79 - cmd/k8s-webshell.go | 22 - configs/admin.conf | 5 +- configs/config.yaml | 9 +- configs/devconfig.yaml | 11 - configs/inside_finup.crt | 131 - configs/inside_finup.key | 27 - doc/deploy/k8s/k8s-webshell-deployment.yaml | 42 - doc/deploy/k8s/k8s-webshell-svc.yaml | 16 - doc/imgs/k8s-webshell.gif | Bin 867905 -> 0 bytes docker-compose.yaml | 50 - {doc => docs}/demo/client/index.html | 2 +- {doc => docs}/demo/client/index.html-bak | 0 .../xterm/.devcontainer/devcontainer.json | 0 .../demo/client/node_modules/xterm/LICENSE | 0 .../demo/client/node_modules/xterm/README.md | 0 .../xterm/dist/addons/attach/attach.js | 0 .../xterm/dist/addons/attach/attach.js.map | 0 .../node_modules/xterm/dist/addons/fit/fit.js | 0 .../xterm/dist/addons/fit/fit.js.map | 0 .../dist/addons/fullscreen/fullscreen.css | 0 .../dist/addons/fullscreen/fullscreen.js | 0 .../dist/addons/fullscreen/fullscreen.js.map | 0 .../xterm/dist/addons/search/search.js | 0 .../xterm/dist/addons/search/search.js.map | 0 .../xterm/dist/addons/terminado/terminado.js | 0 .../dist/addons/terminado/terminado.js.map | 0 .../xterm/dist/addons/webLinks/webLinks.js | 0 .../dist/addons/webLinks/webLinks.js.map | 0 .../dist/addons/winptyCompat/winptyCompat.js | 0 .../addons/winptyCompat/winptyCompat.js.map | 0 .../xterm/dist/addons/zmodem/zmodem.js | 0 .../xterm/dist/addons/zmodem/zmodem.js.map | 0 .../client/node_modules/xterm/dist/xterm.css | 0 .../client/node_modules/xterm/dist/xterm.js | 0 .../node_modules/xterm/dist/xterm.js.map | 0 .../client/node_modules/xterm/gulpfile.js | 0 .../xterm/lib/AccessibilityManager.js | 0 .../xterm/lib/AccessibilityManager.js.map | 0 .../client/node_modules/xterm/lib/Buffer.js | 0 .../node_modules/xterm/lib/Buffer.js.map | 0 .../node_modules/xterm/lib/BufferLine.js | 0 .../node_modules/xterm/lib/BufferLine.js.map | 0 .../node_modules/xterm/lib/BufferReflow.js | 0 .../xterm/lib/BufferReflow.js.map | 0 .../node_modules/xterm/lib/BufferSet.js | 0 .../node_modules/xterm/lib/BufferSet.js.map | 0 .../node_modules/xterm/lib/CharMeasure.js | 0 .../node_modules/xterm/lib/CharMeasure.js.map | 0 .../node_modules/xterm/lib/CharWidth.js | 0 .../node_modules/xterm/lib/CharWidth.js.map | 0 .../node_modules/xterm/lib/Clipboard.js | 0 .../node_modules/xterm/lib/Clipboard.js.map | 0 .../xterm/lib/CompositionHelper.js | 0 .../xterm/lib/CompositionHelper.js.map | 0 .../xterm/lib/EscapeSequenceParser.js | 0 .../xterm/lib/EscapeSequenceParser.js.map | 0 .../xterm/lib/InputHandler.api.js | 0 .../xterm/lib/InputHandler.api.js.map | 0 .../node_modules/xterm/lib/InputHandler.js | 0 .../xterm/lib/InputHandler.js.map | 0 .../node_modules/xterm/lib/Linkifier.js | 0 .../node_modules/xterm/lib/Linkifier.js.map | 0 .../node_modules/xterm/lib/MouseHelper.js | 0 .../node_modules/xterm/lib/MouseHelper.js.map | 0 .../xterm/lib/MouseZoneManager.js | 0 .../xterm/lib/MouseZoneManager.js.map | 0 .../xterm/lib/SelectionManager.js | 0 .../xterm/lib/SelectionManager.js.map | 0 .../node_modules/xterm/lib/SelectionModel.js | 0 .../xterm/lib/SelectionModel.js.map | 0 .../node_modules/xterm/lib/SoundManager.js | 0 .../xterm/lib/SoundManager.js.map | 0 .../client/node_modules/xterm/lib/Strings.js | 0 .../node_modules/xterm/lib/Strings.js.map | 0 .../xterm/lib/Terminal.integration.js | 0 .../xterm/lib/Terminal.integration.js.map | 0 .../client/node_modules/xterm/lib/Terminal.js | 0 .../node_modules/xterm/lib/Terminal.js.map | 0 .../client/node_modules/xterm/lib/Types.js | 0 .../node_modules/xterm/lib/Types.js.map | 0 .../client/node_modules/xterm/lib/Viewport.js | 0 .../node_modules/xterm/lib/Viewport.js.map | 0 .../node_modules/xterm/lib/WindowsMode.js | 0 .../node_modules/xterm/lib/WindowsMode.js.map | 0 .../xterm/lib/addons/attach/Interfaces.d.ts | 0 .../xterm/lib/addons/attach/Interfaces.js | 0 .../xterm/lib/addons/attach/Interfaces.js.map | 0 .../xterm/lib/addons/attach/attach.d.ts | 0 .../xterm/lib/addons/attach/attach.js | 0 .../xterm/lib/addons/attach/attach.js.map | 0 .../xterm/lib/addons/fit/fit.d.ts | 0 .../node_modules/xterm/lib/addons/fit/fit.js | 0 .../xterm/lib/addons/fit/fit.js.map | 0 .../lib/addons/fullscreen/fullscreen.css | 0 .../lib/addons/fullscreen/fullscreen.d.ts | 0 .../xterm/lib/addons/fullscreen/fullscreen.js | 0 .../lib/addons/fullscreen/fullscreen.js.map | 0 .../xterm/lib/addons/search/Interfaces.d.ts | 0 .../xterm/lib/addons/search/Interfaces.js | 0 .../xterm/lib/addons/search/Interfaces.js.map | 0 .../xterm/lib/addons/search/SearchHelper.d.ts | 0 .../xterm/lib/addons/search/SearchHelper.js | 0 .../lib/addons/search/SearchHelper.js.map | 0 .../xterm/lib/addons/search/search.d.ts | 0 .../xterm/lib/addons/search/search.js | 0 .../xterm/lib/addons/search/search.js.map | 0 .../lib/addons/terminado/Interfaces.d.ts | 0 .../xterm/lib/addons/terminado/Interfaces.js | 0 .../lib/addons/terminado/Interfaces.js.map | 0 .../xterm/lib/addons/terminado/terminado.d.ts | 0 .../xterm/lib/addons/terminado/terminado.js | 0 .../lib/addons/terminado/terminado.js.map | 0 .../xterm/lib/addons/webLinks/webLinks.d.ts | 0 .../xterm/lib/addons/webLinks/webLinks.js | 0 .../xterm/lib/addons/webLinks/webLinks.js.map | 0 .../lib/addons/winptyCompat/Interfaces.d.ts | 0 .../lib/addons/winptyCompat/Interfaces.js | 0 .../lib/addons/winptyCompat/Interfaces.js.map | 0 .../lib/addons/winptyCompat/winptyCompat.d.ts | 0 .../lib/addons/winptyCompat/winptyCompat.js | 0 .../addons/winptyCompat/winptyCompat.js.map | 0 .../xterm/lib/addons/zmodem/zmodem.d.ts | 0 .../xterm/lib/addons/zmodem/zmodem.js | 0 .../xterm/lib/addons/zmodem/zmodem.js.map | 0 .../xterm/lib/common/CircularList.d.ts | 0 .../xterm/lib/common/CircularList.js | 0 .../xterm/lib/common/CircularList.js.map | 0 .../node_modules/xterm/lib/common/Clone.d.ts | 0 .../node_modules/xterm/lib/common/Clone.js | 0 .../xterm/lib/common/Clone.js.map | 0 .../xterm/lib/common/EventEmitter.d.ts | 0 .../xterm/lib/common/EventEmitter.js | 0 .../xterm/lib/common/EventEmitter.js.map | 0 .../xterm/lib/common/EventEmitter2.d.ts | 0 .../xterm/lib/common/EventEmitter2.js | 0 .../xterm/lib/common/EventEmitter2.js.map | 0 .../xterm/lib/common/Lifecycle.d.ts | 0 .../xterm/lib/common/Lifecycle.js | 0 .../xterm/lib/common/Lifecycle.js.map | 0 .../xterm/lib/common/Platform.d.ts | 0 .../node_modules/xterm/lib/common/Platform.js | 0 .../xterm/lib/common/Platform.js.map | 0 .../xterm/lib/common/TypedArrayUtils.d.ts | 0 .../xterm/lib/common/TypedArrayUtils.js | 0 .../xterm/lib/common/TypedArrayUtils.js.map | 0 .../node_modules/xterm/lib/common/Types.d.ts | 0 .../node_modules/xterm/lib/common/Types.js | 0 .../xterm/lib/common/Types.js.map | 0 .../lib/common/data/EscapeSequences.d.ts | 0 .../xterm/lib/common/data/EscapeSequences.js | 0 .../lib/common/data/EscapeSequences.js.map | 0 .../node_modules/xterm/lib/core/Platform.js | 0 .../xterm/lib/core/Platform.js.map | 0 .../node_modules/xterm/lib/core/Types.d.ts | 0 .../node_modules/xterm/lib/core/Types.js | 0 .../node_modules/xterm/lib/core/Types.js.map | 0 .../xterm/lib/core/buffer/BufferLine.d.ts | 0 .../xterm/lib/core/buffer/BufferLine.js | 0 .../xterm/lib/core/buffer/BufferLine.js.map | 0 .../xterm/lib/core/buffer/BufferReflow.d.ts | 0 .../xterm/lib/core/buffer/BufferReflow.js | 0 .../xterm/lib/core/buffer/BufferReflow.js.map | 0 .../xterm/lib/core/buffer/Marker.d.ts | 0 .../xterm/lib/core/buffer/Marker.js | 0 .../xterm/lib/core/buffer/Marker.js.map | 0 .../xterm/lib/core/data/Charsets.d.ts | 0 .../xterm/lib/core/data/Charsets.js | 0 .../xterm/lib/core/data/Charsets.js.map | 0 .../xterm/lib/core/input/Keyboard.d.ts | 0 .../xterm/lib/core/input/Keyboard.js | 0 .../xterm/lib/core/input/Keyboard.js.map | 0 .../xterm/lib/core/input/TextDecoder.d.ts | 0 .../xterm/lib/core/input/TextDecoder.js | 0 .../xterm/lib/core/input/TextDecoder.js.map | 0 .../xterm/lib/handlers/AltClickHandler.js | 0 .../xterm/lib/handlers/AltClickHandler.js.map | 0 .../xterm/lib/public/AddonManager.js | 0 .../xterm/lib/public/AddonManager.js.map | 0 .../xterm/lib/public/Terminal.api.js | 0 .../xterm/lib/public/Terminal.api.js.map | 0 .../node_modules/xterm/lib/public/Terminal.js | 0 .../xterm/lib/public/Terminal.js.map | 0 .../xterm/lib/renderer/BaseRenderLayer.js | 0 .../xterm/lib/renderer/BaseRenderLayer.js.map | 0 .../lib/renderer/CharacterJoinerRegistry.js | 0 .../renderer/CharacterJoinerRegistry.js.map | 0 .../xterm/lib/renderer/ColorManager.js | 0 .../xterm/lib/renderer/ColorManager.js.map | 0 .../xterm/lib/renderer/CursorRenderLayer.js | 0 .../lib/renderer/CursorRenderLayer.js.map | 0 .../xterm/lib/renderer/GridCache.js | 0 .../xterm/lib/renderer/GridCache.js.map | 0 .../xterm/lib/renderer/LinkRenderLayer.js | 0 .../xterm/lib/renderer/LinkRenderLayer.js.map | 0 .../xterm/lib/renderer/RenderCoordinator.js | 0 .../lib/renderer/RenderCoordinator.js.map | 0 .../xterm/lib/renderer/Renderer.js | 0 .../xterm/lib/renderer/Renderer.js.map | 0 .../lib/renderer/SelectionRenderLayer.js | 0 .../lib/renderer/SelectionRenderLayer.js.map | 0 .../xterm/lib/renderer/TextRenderLayer.js | 0 .../xterm/lib/renderer/TextRenderLayer.js.map | 0 .../node_modules/xterm/lib/renderer/Types.js | 0 .../xterm/lib/renderer/Types.js.map | 0 .../xterm/lib/renderer/atlas/BaseCharAtlas.js | 0 .../lib/renderer/atlas/BaseCharAtlas.js.map | 0 .../lib/renderer/atlas/CharAtlasCache.js | 0 .../lib/renderer/atlas/CharAtlasCache.js.map | 0 .../lib/renderer/atlas/CharAtlasGenerator.js | 0 .../renderer/atlas/CharAtlasGenerator.js.map | 0 .../lib/renderer/atlas/CharAtlasUtils.js | 0 .../lib/renderer/atlas/CharAtlasUtils.js.map | 0 .../lib/renderer/atlas/DynamicCharAtlas.js | 0 .../renderer/atlas/DynamicCharAtlas.js.map | 0 .../xterm/lib/renderer/atlas/LRUMap.js | 0 .../xterm/lib/renderer/atlas/LRUMap.js.map | 0 .../xterm/lib/renderer/atlas/NoneCharAtlas.js | 0 .../lib/renderer/atlas/NoneCharAtlas.js.map | 0 .../lib/renderer/atlas/StaticCharAtlas.js | 0 .../lib/renderer/atlas/StaticCharAtlas.js.map | 0 .../xterm/lib/renderer/atlas/Types.js | 0 .../xterm/lib/renderer/atlas/Types.js.map | 0 .../xterm/lib/renderer/dom/DomRenderer.js | 0 .../xterm/lib/renderer/dom/DomRenderer.js.map | 0 .../lib/renderer/dom/DomRendererRowFactory.js | 0 .../renderer/dom/DomRendererRowFactory.js.map | 0 .../node_modules/xterm/lib/ui/CharMeasure.js | 0 .../xterm/lib/ui/CharMeasure.js.map | 0 .../node_modules/xterm/lib/ui/Clipboard.js | 0 .../xterm/lib/ui/Clipboard.js.map | 0 .../xterm/lib/ui/ColorManager.d.ts | 0 .../node_modules/xterm/lib/ui/ColorManager.js | 0 .../xterm/lib/ui/ColorManager.js.map | 0 .../node_modules/xterm/lib/ui/Lifecycle.d.ts | 0 .../node_modules/xterm/lib/ui/Lifecycle.js | 0 .../xterm/lib/ui/Lifecycle.js.map | 0 .../node_modules/xterm/lib/ui/MouseHelper.js | 0 .../xterm/lib/ui/MouseHelper.js.map | 0 .../xterm/lib/ui/MouseZoneManager.js | 0 .../xterm/lib/ui/MouseZoneManager.js.map | 0 .../xterm/lib/ui/RenderDebouncer.d.ts | 0 .../xterm/lib/ui/RenderDebouncer.js | 0 .../xterm/lib/ui/RenderDebouncer.js.map | 0 .../xterm/lib/ui/ScreenDprMonitor.d.ts | 0 .../xterm/lib/ui/ScreenDprMonitor.js | 0 .../xterm/lib/ui/ScreenDprMonitor.js.map | 0 .../node_modules/xterm/lib/ui/Types.d.ts | 0 .../client/node_modules/xterm/lib/ui/Types.js | 0 .../node_modules/xterm/lib/ui/Types.js.map | 0 .../client/node_modules/xterm/lib/xterm.css | 0 .../client/node_modules/xterm/lib/xterm.js | 0 .../node_modules/xterm/lib/xterm.js.map | 0 .../client/node_modules/xterm/package.json | 0 .../xterm/src/AccessibilityManager.ts | 0 .../client/node_modules/xterm/src/Buffer.ts | 0 .../node_modules/xterm/src/BufferLine.ts | 0 .../node_modules/xterm/src/BufferReflow.ts | 0 .../node_modules/xterm/src/BufferSet.ts | 0 .../node_modules/xterm/src/CharMeasure.ts | 0 .../node_modules/xterm/src/CharWidth.ts | 0 .../node_modules/xterm/src/Clipboard.ts | 0 .../xterm/src/CompositionHelper.ts | 0 .../xterm/src/EscapeSequenceParser.ts | 0 .../xterm/src/InputHandler.api.ts | 0 .../node_modules/xterm/src/InputHandler.ts | 0 .../node_modules/xterm/src/Linkifier.ts | 0 .../node_modules/xterm/src/MouseHelper.ts | 0 .../xterm/src/MouseZoneManager.ts | 0 .../xterm/src/SelectionManager.ts | 0 .../node_modules/xterm/src/SelectionModel.ts | 0 .../node_modules/xterm/src/SoundManager.ts | 0 .../client/node_modules/xterm/src/Strings.ts | 0 .../xterm/src/Terminal.integration.ts | 0 .../client/node_modules/xterm/src/Terminal.ts | 0 .../client/node_modules/xterm/src/Types.ts | 0 .../client/node_modules/xterm/src/Viewport.ts | 0 .../node_modules/xterm/src/WindowsMode.ts | 0 .../xterm/src/addons/attach/Interfaces.ts | 0 .../xterm/src/addons/attach/attach.ts | 0 .../xterm/src/addons/attach/package.json | 0 .../xterm/src/addons/attach/tsconfig.json | 0 .../xterm/src/addons/fit/README.md | 0 .../node_modules/xterm/src/addons/fit/fit.ts | 0 .../xterm/src/addons/fit/package.json | 0 .../xterm/src/addons/fit/tsconfig.json | 0 .../src/addons/fullscreen/fullscreen.css | 0 .../xterm/src/addons/fullscreen/fullscreen.ts | 0 .../xterm/src/addons/fullscreen/package.json | 0 .../xterm/src/addons/fullscreen/tsconfig.json | 0 .../xterm/src/addons/search/Interfaces.ts | 0 .../xterm/src/addons/search/SearchHelper.ts | 0 .../xterm/src/addons/search/package.json | 0 .../xterm/src/addons/search/search.ts | 0 .../xterm/src/addons/search/tsconfig.json | 0 .../xterm/src/addons/terminado/Interfaces.ts | 0 .../xterm/src/addons/terminado/package.json | 0 .../xterm/src/addons/terminado/terminado.ts | 0 .../xterm/src/addons/terminado/tsconfig.json | 0 .../xterm/src/addons/webLinks/package.json | 0 .../xterm/src/addons/webLinks/tsconfig.json | 0 .../xterm/src/addons/webLinks/webLinks.ts | 0 .../src/addons/winptyCompat/Interfaces.ts | 0 .../src/addons/winptyCompat/package.json | 0 .../src/addons/winptyCompat/tsconfig.json | 0 .../src/addons/winptyCompat/winptyCompat.ts | 0 .../xterm/src/addons/zmodem/package.json | 0 .../xterm/src/addons/zmodem/tsconfig.json | 0 .../xterm/src/addons/zmodem/zmodem.ts | 0 .../xterm/src/common/CircularList.ts | 0 .../node_modules/xterm/src/common/Clone.ts | 0 .../xterm/src/common/EventEmitter.ts | 0 .../xterm/src/common/EventEmitter2.ts | 0 .../xterm/src/common/Lifecycle.ts | 0 .../node_modules/xterm/src/common/Platform.ts | 0 .../xterm/src/common/TypedArrayUtils.ts | 0 .../node_modules/xterm/src/common/Types.ts | 0 .../xterm/src/common/data/EscapeSequences.ts | 0 .../xterm/src/common/tsconfig.json | 0 .../node_modules/xterm/src/core/Platform.ts | 0 .../node_modules/xterm/src/core/Types.ts | 0 .../xterm/src/core/buffer/BufferLine.ts | 0 .../xterm/src/core/buffer/BufferReflow.ts | 0 .../xterm/src/core/buffer/Marker.ts | 0 .../xterm/src/core/data/Charsets.ts | 0 .../xterm/src/core/input/Keyboard.ts | 0 .../xterm/src/core/input/TextDecoder.ts | 0 .../node_modules/xterm/src/core/tsconfig.json | 0 .../xterm/src/handlers/AltClickHandler.ts | 0 .../xterm/src/public/AddonManager.ts | 0 .../xterm/src/public/Terminal.api.ts | 0 .../node_modules/xterm/src/public/Terminal.ts | 0 .../xterm/src/renderer/BaseRenderLayer.ts | 0 .../src/renderer/CharacterJoinerRegistry.ts | 0 .../xterm/src/renderer/ColorManager.ts | 0 .../xterm/src/renderer/CursorRenderLayer.ts | 0 .../xterm/src/renderer/GridCache.ts | 0 .../xterm/src/renderer/LinkRenderLayer.ts | 0 .../xterm/src/renderer/RenderCoordinator.ts | 0 .../xterm/src/renderer/Renderer.ts | 0 .../src/renderer/SelectionRenderLayer.ts | 0 .../xterm/src/renderer/TextRenderLayer.ts | 0 .../node_modules/xterm/src/renderer/Types.ts | 0 .../xterm/src/renderer/atlas/BaseCharAtlas.ts | 0 .../src/renderer/atlas/CharAtlasCache.ts | 0 .../src/renderer/atlas/CharAtlasGenerator.ts | 0 .../src/renderer/atlas/CharAtlasUtils.ts | 0 .../src/renderer/atlas/DynamicCharAtlas.ts | 0 .../xterm/src/renderer/atlas/LRUMap.ts | 0 .../xterm/src/renderer/atlas/NoneCharAtlas.ts | 0 .../src/renderer/atlas/StaticCharAtlas.ts | 0 .../xterm/src/renderer/atlas/Types.ts | 0 .../xterm/src/renderer/dom/DomRenderer.ts | 0 .../src/renderer/dom/DomRendererRowFactory.ts | 0 .../node_modules/xterm/src/tsconfig-base.json | 0 .../xterm/src/tsconfig-library-base.json | 0 .../node_modules/xterm/src/tsconfig.all.json | 0 .../node_modules/xterm/src/tsconfig.json | 0 .../node_modules/xterm/src/ui/CharMeasure.ts | 0 .../node_modules/xterm/src/ui/Clipboard.ts | 0 .../node_modules/xterm/src/ui/ColorManager.ts | 0 .../node_modules/xterm/src/ui/Lifecycle.ts | 0 .../node_modules/xterm/src/ui/MouseHelper.ts | 0 .../xterm/src/ui/MouseZoneManager.ts | 0 .../xterm/src/ui/RenderDebouncer.ts | 0 .../xterm/src/ui/ScreenDprMonitor.ts | 0 .../client/node_modules/xterm/src/ui/Types.ts | 0 .../node_modules/xterm/src/ui/tsconfig.json | 0 .../client/node_modules/xterm/src/xterm.css | 0 .../client/node_modules/xterm/src/xterm.ts | 0 .../client/node_modules/xterm/tsconfig.json | 0 .../client/node_modules/xterm/tslint.json | 0 .../node_modules/xterm/typings/xterm.d.ts | 0 {doc => docs}/demo/client/package-lock.json | 0 .../kubernetes}/k8s-webshell-clusterrole.yaml | 0 .../k8s-webshell-clusterrolebinding.yaml | 0 .../kubernetes/k8s-webshell-configmap.yaml | 21 + .../kubernetes/k8s-webshell-deployment.yaml | 40 + .../deploy/kubernetes}/k8s-webshell-sa.yaml | 0 .../kubernetes/k8s-webshell-secret.yaml | 11 + docs/deploy/kubernetes/k8s-webshell-svc.yaml | 16 + pkg/setting/setting.go | 89 - src/go.mod | 28 + src/go.sum | 374 + src/webshell/cmd/root.go | 145 + {pkg => src/webshell}/common/common.go | 23 +- {pkg => src/webshell/common}/e/code.go | 0 {pkg => src/webshell/common}/e/msg.go | 2 +- {pkg/utils => src/webshell/common}/jwt.go | 10 +- src/webshell/config/config.go | 55 + {pkg/api => src/webshell/controllers}/auth.go | 21 +- src/webshell/controllers/demo.go | 7 + .../webshell/controllers/ws.go | 86 +- src/webshell/main.go | 7 + .../webshell/middlewares}/jwt/jwt.go | 9 +- .../webshell/router/routers.go | 22 +- src/webshell/server/server.go | 24 + {pkg => src/webshell}/utils/logger.go | 34 +- {pkg => src/webshell}/ws/connection.go | 3 +- vendor/github.com/beorn7/perks/LICENSE | 20 - .../beorn7/perks/quantile/exampledata.txt | 2388 --- .../beorn7/perks/quantile/stream.go | 316 - vendor/github.com/dgrijalva/jwt-go/.gitignore | 4 - .../github.com/dgrijalva/jwt-go/.travis.yml | 13 - vendor/github.com/dgrijalva/jwt-go/LICENSE | 8 - .../dgrijalva/jwt-go/MIGRATION_GUIDE.md | 97 - vendor/github.com/dgrijalva/jwt-go/README.md | 100 - .../dgrijalva/jwt-go/VERSION_HISTORY.md | 118 - vendor/github.com/dgrijalva/jwt-go/claims.go | 134 - vendor/github.com/dgrijalva/jwt-go/doc.go | 4 - vendor/github.com/dgrijalva/jwt-go/ecdsa.go | 148 - .../dgrijalva/jwt-go/ecdsa_utils.go | 67 - vendor/github.com/dgrijalva/jwt-go/errors.go | 59 - vendor/github.com/dgrijalva/jwt-go/hmac.go | 95 - .../github.com/dgrijalva/jwt-go/map_claims.go | 94 - vendor/github.com/dgrijalva/jwt-go/none.go | 52 - vendor/github.com/dgrijalva/jwt-go/parser.go | 148 - vendor/github.com/dgrijalva/jwt-go/rsa.go | 101 - vendor/github.com/dgrijalva/jwt-go/rsa_pss.go | 126 - .../github.com/dgrijalva/jwt-go/rsa_utils.go | 101 - .../dgrijalva/jwt-go/signing_method.go | 35 - vendor/github.com/dgrijalva/jwt-go/token.go | 108 - .../docker/spdystream/CONTRIBUTING.md | 13 - vendor/github.com/docker/spdystream/LICENSE | 191 - .../github.com/docker/spdystream/LICENSE.docs | 425 - .../github.com/docker/spdystream/MAINTAINERS | 28 - vendor/github.com/docker/spdystream/README.md | 77 - .../docker/spdystream/connection.go | 958 -- .../github.com/docker/spdystream/handlers.go | 38 - .../github.com/docker/spdystream/priority.go | 98 - .../docker/spdystream/spdy/dictionary.go | 187 - .../github.com/docker/spdystream/spdy/read.go | 348 - .../docker/spdystream/spdy/types.go | 275 - .../docker/spdystream/spdy/write.go | 318 - vendor/github.com/docker/spdystream/stream.go | 327 - vendor/github.com/docker/spdystream/utils.go | 16 - .../fsnotify/fsnotify/.editorconfig | 5 - .../github.com/fsnotify/fsnotify/.gitignore | 6 - .../github.com/fsnotify/fsnotify/.travis.yml | 30 - vendor/github.com/fsnotify/fsnotify/AUTHORS | 52 - .../github.com/fsnotify/fsnotify/CHANGELOG.md | 317 - .../fsnotify/fsnotify/CONTRIBUTING.md | 77 - vendor/github.com/fsnotify/fsnotify/LICENSE | 28 - vendor/github.com/fsnotify/fsnotify/README.md | 79 - vendor/github.com/fsnotify/fsnotify/fen.go | 37 - .../github.com/fsnotify/fsnotify/fsnotify.go | 66 - .../github.com/fsnotify/fsnotify/inotify.go | 337 - .../fsnotify/fsnotify/inotify_poller.go | 187 - vendor/github.com/fsnotify/fsnotify/kqueue.go | 521 - .../fsnotify/fsnotify/open_mode_bsd.go | 11 - .../fsnotify/fsnotify/open_mode_darwin.go | 12 - .../github.com/fsnotify/fsnotify/windows.go | 561 - vendor/github.com/gin-contrib/sse/.travis.yml | 15 - vendor/github.com/gin-contrib/sse/LICENSE | 21 - vendor/github.com/gin-contrib/sse/README.md | 58 - .../github.com/gin-contrib/sse/sse-decoder.go | 116 - .../github.com/gin-contrib/sse/sse-encoder.go | 110 - vendor/github.com/gin-contrib/sse/writer.go | 24 - vendor/github.com/gin-gonic/gin/.gitignore | 7 - vendor/github.com/gin-gonic/gin/.travis.yml | 44 - vendor/github.com/gin-gonic/gin/AUTHORS.md | 231 - vendor/github.com/gin-gonic/gin/BENCHMARKS.md | 604 - vendor/github.com/gin-gonic/gin/CHANGELOG.md | 269 - .../gin-gonic/gin/CODE_OF_CONDUCT.md | 46 - .../github.com/gin-gonic/gin/CONTRIBUTING.md | 13 - vendor/github.com/gin-gonic/gin/LICENSE | 21 - vendor/github.com/gin-gonic/gin/Makefile | 80 - vendor/github.com/gin-gonic/gin/README.md | 2070 --- vendor/github.com/gin-gonic/gin/auth.go | 96 - .../gin-gonic/gin/binding/binding.go | 113 - .../gin/binding/default_validator.go | 51 - .../github.com/gin-gonic/gin/binding/form.go | 89 - .../gin-gonic/gin/binding/form_mapping.go | 330 - .../github.com/gin-gonic/gin/binding/json.go | 47 - .../gin-gonic/gin/binding/msgpack.go | 35 - .../gin-gonic/gin/binding/protobuf.go | 36 - .../github.com/gin-gonic/gin/binding/query.go | 21 - .../github.com/gin-gonic/gin/binding/uri.go | 18 - .../github.com/gin-gonic/gin/binding/xml.go | 33 - .../github.com/gin-gonic/gin/binding/yaml.go | 35 - vendor/github.com/gin-gonic/gin/codecov.yml | 5 - vendor/github.com/gin-gonic/gin/context.go | 1023 -- .../gin-gonic/gin/context_appengine.go | 11 - vendor/github.com/gin-gonic/gin/debug.go | 103 - vendor/github.com/gin-gonic/gin/deprecated.go | 21 - vendor/github.com/gin-gonic/gin/doc.go | 6 - vendor/github.com/gin-gonic/gin/errors.go | 169 - vendor/github.com/gin-gonic/gin/fs.go | 45 - vendor/github.com/gin-gonic/gin/gin.go | 477 - vendor/github.com/gin-gonic/gin/go.mod | 18 - vendor/github.com/gin-gonic/gin/go.sum | 36 - .../gin-gonic/gin/internal/json/json.go | 22 - .../gin-gonic/gin/internal/json/jsoniter.go | 23 - vendor/github.com/gin-gonic/gin/logger.go | 270 - vendor/github.com/gin-gonic/gin/mode.go | 83 - vendor/github.com/gin-gonic/gin/path.go | 123 - vendor/github.com/gin-gonic/gin/recovery.go | 151 - .../github.com/gin-gonic/gin/render/data.go | 25 - .../github.com/gin-gonic/gin/render/html.go | 92 - .../github.com/gin-gonic/gin/render/json.go | 194 - .../gin-gonic/gin/render/msgpack.go | 35 - .../gin-gonic/gin/render/protobuf.go | 36 - .../github.com/gin-gonic/gin/render/reader.go | 43 - .../gin-gonic/gin/render/redirect.go | 29 - .../github.com/gin-gonic/gin/render/render.go | 41 - .../github.com/gin-gonic/gin/render/text.go | 40 - vendor/github.com/gin-gonic/gin/render/xml.go | 28 - .../github.com/gin-gonic/gin/render/yaml.go | 36 - .../gin-gonic/gin/response_writer.go | 126 - .../github.com/gin-gonic/gin/routergroup.go | 228 - .../github.com/gin-gonic/gin/test_helpers.go | 16 - vendor/github.com/gin-gonic/gin/tree.go | 627 - vendor/github.com/gin-gonic/gin/utils.go | 151 - vendor/github.com/gin-gonic/gin/version.go | 8 - vendor/github.com/gogo/protobuf/AUTHORS | 15 - vendor/github.com/gogo/protobuf/CONTRIBUTORS | 22 - .../gogo/protobuf/GOLANG_CONTRIBUTORS | 5 - vendor/github.com/gogo/protobuf/LICENSE | 36 - .../github.com/gogo/protobuf/proto/Makefile | 43 - .../github.com/gogo/protobuf/proto/clone.go | 234 - .../github.com/gogo/protobuf/proto/decode.go | 978 -- .../gogo/protobuf/proto/decode_gogo.go | 172 - .../gogo/protobuf/proto/duration.go | 100 - .../gogo/protobuf/proto/duration_gogo.go | 203 - .../github.com/gogo/protobuf/proto/encode.go | 1362 -- .../gogo/protobuf/proto/encode_gogo.go | 350 - .../github.com/gogo/protobuf/proto/equal.go | 300 - .../gogo/protobuf/proto/extensions.go | 693 - .../gogo/protobuf/proto/extensions_gogo.go | 294 - vendor/github.com/gogo/protobuf/proto/lib.go | 897 -- .../gogo/protobuf/proto/lib_gogo.go | 42 - .../gogo/protobuf/proto/message_set.go | 311 - .../gogo/protobuf/proto/pointer_reflect.go | 484 - .../protobuf/proto/pointer_reflect_gogo.go | 85 - .../gogo/protobuf/proto/pointer_unsafe.go | 270 - .../protobuf/proto/pointer_unsafe_gogo.go | 128 - .../gogo/protobuf/proto/properties.go | 971 -- .../gogo/protobuf/proto/properties_gogo.go | 111 - .../gogo/protobuf/proto/skip_gogo.go | 119 - vendor/github.com/gogo/protobuf/proto/text.go | 939 -- .../gogo/protobuf/proto/text_gogo.go | 57 - .../gogo/protobuf/proto/text_parser.go | 1013 -- .../gogo/protobuf/proto/timestamp.go | 113 - .../gogo/protobuf/proto/timestamp_gogo.go | 229 - .../gogo/protobuf/sortkeys/sortkeys.go | 101 - vendor/github.com/golang/protobuf/AUTHORS | 3 - .../github.com/golang/protobuf/CONTRIBUTORS | 3 - vendor/github.com/golang/protobuf/LICENSE | 31 - .../github.com/golang/protobuf/proto/clone.go | 253 - .../golang/protobuf/proto/decode.go | 428 - .../golang/protobuf/proto/discard.go | 350 - .../golang/protobuf/proto/encode.go | 221 - .../github.com/golang/protobuf/proto/equal.go | 300 - .../golang/protobuf/proto/extensions.go | 543 - .../github.com/golang/protobuf/proto/lib.go | 921 -- .../golang/protobuf/proto/message_set.go | 314 - .../golang/protobuf/proto/pointer_reflect.go | 357 - .../golang/protobuf/proto/pointer_unsafe.go | 308 - .../golang/protobuf/proto/properties.go | 544 - .../golang/protobuf/proto/table_marshal.go | 2681 ---- .../golang/protobuf/proto/table_merge.go | 654 - .../golang/protobuf/proto/table_unmarshal.go | 1967 --- .../github.com/golang/protobuf/proto/text.go | 843 -- .../golang/protobuf/proto/text_parser.go | 880 -- .../github.com/golang/protobuf/ptypes/any.go | 139 - .../golang/protobuf/ptypes/any/any.pb.go | 191 - .../golang/protobuf/ptypes/any/any.proto | 149 - .../github.com/golang/protobuf/ptypes/doc.go | 35 - .../golang/protobuf/ptypes/duration.go | 102 - .../protobuf/ptypes/duration/duration.pb.go | 159 - .../protobuf/ptypes/duration/duration.proto | 117 - .../golang/protobuf/ptypes/timestamp.go | 134 - .../protobuf/ptypes/timestamp/timestamp.pb.go | 175 - .../protobuf/ptypes/timestamp/timestamp.proto | 133 - vendor/github.com/google/btree/.travis.yml | 1 - vendor/github.com/google/btree/LICENSE | 202 - vendor/github.com/google/btree/README.md | 12 - vendor/github.com/google/btree/btree.go | 890 -- vendor/github.com/google/btree/btree_mem.go | 76 - vendor/github.com/google/gofuzz/.travis.yml | 13 - .../github.com/google/gofuzz/CONTRIBUTING.md | 67 - vendor/github.com/google/gofuzz/LICENSE | 202 - vendor/github.com/google/gofuzz/README.md | 71 - vendor/github.com/google/gofuzz/doc.go | 18 - vendor/github.com/google/gofuzz/fuzz.go | 453 - vendor/github.com/googleapis/gnostic/LICENSE | 203 - .../googleapis/gnostic/OpenAPIv2/OpenAPIv2.go | 8728 ----------- .../gnostic/OpenAPIv2/OpenAPIv2.pb.go | 4456 ------ .../gnostic/OpenAPIv2/OpenAPIv2.proto | 663 - .../googleapis/gnostic/OpenAPIv2/README.md | 16 - .../gnostic/OpenAPIv2/openapi-2.0.json | 1610 -- .../googleapis/gnostic/compiler/README.md | 3 - .../googleapis/gnostic/compiler/context.go | 43 - .../googleapis/gnostic/compiler/error.go | 61 - .../gnostic/compiler/extension-handler.go | 101 - .../googleapis/gnostic/compiler/helpers.go | 197 - .../googleapis/gnostic/compiler/main.go | 16 - .../googleapis/gnostic/compiler/reader.go | 167 - .../gnostic/extensions/COMPILE-EXTENSION.sh | 5 - .../googleapis/gnostic/extensions/README.md | 5 - .../gnostic/extensions/extension.pb.go | 219 - .../gnostic/extensions/extension.proto | 93 - .../gnostic/extensions/extensions.go | 82 - .../github.com/gorilla/websocket/.gitignore | 25 - .../github.com/gorilla/websocket/.travis.yml | 19 - vendor/github.com/gorilla/websocket/AUTHORS | 9 - vendor/github.com/gorilla/websocket/LICENSE | 22 - vendor/github.com/gorilla/websocket/README.md | 64 - vendor/github.com/gorilla/websocket/client.go | 395 - .../gorilla/websocket/client_clone.go | 16 - .../gorilla/websocket/client_clone_legacy.go | 38 - .../gorilla/websocket/compression.go | 148 - vendor/github.com/gorilla/websocket/conn.go | 1165 -- .../gorilla/websocket/conn_write.go | 15 - .../gorilla/websocket/conn_write_legacy.go | 18 - vendor/github.com/gorilla/websocket/doc.go | 180 - vendor/github.com/gorilla/websocket/json.go | 60 - vendor/github.com/gorilla/websocket/mask.go | 54 - .../github.com/gorilla/websocket/mask_safe.go | 15 - .../github.com/gorilla/websocket/prepared.go | 102 - vendor/github.com/gorilla/websocket/proxy.go | 77 - vendor/github.com/gorilla/websocket/server.go | 363 - vendor/github.com/gorilla/websocket/trace.go | 19 - .../github.com/gorilla/websocket/trace_17.go | 12 - vendor/github.com/gorilla/websocket/util.go | 237 - .../gorilla/websocket/x_net_proxy.go | 473 - .../gregjones/httpcache/.travis.yml | 18 - .../gregjones/httpcache/LICENSE.txt | 7 - .../github.com/gregjones/httpcache/README.md | 24 - .../httpcache/diskcache/diskcache.go | 61 - .../gregjones/httpcache/httpcache.go | 553 - vendor/github.com/hashicorp/hcl/.gitignore | 9 - vendor/github.com/hashicorp/hcl/.travis.yml | 13 - vendor/github.com/hashicorp/hcl/LICENSE | 354 - vendor/github.com/hashicorp/hcl/Makefile | 18 - vendor/github.com/hashicorp/hcl/README.md | 125 - vendor/github.com/hashicorp/hcl/appveyor.yml | 19 - vendor/github.com/hashicorp/hcl/decoder.go | 729 - vendor/github.com/hashicorp/hcl/go.mod | 3 - vendor/github.com/hashicorp/hcl/go.sum | 2 - vendor/github.com/hashicorp/hcl/hcl.go | 11 - .../github.com/hashicorp/hcl/hcl/ast/ast.go | 219 - .../github.com/hashicorp/hcl/hcl/ast/walk.go | 52 - .../hashicorp/hcl/hcl/parser/error.go | 17 - .../hashicorp/hcl/hcl/parser/parser.go | 532 - .../hashicorp/hcl/hcl/printer/nodes.go | 789 - .../hashicorp/hcl/hcl/printer/printer.go | 66 - .../hashicorp/hcl/hcl/scanner/scanner.go | 652 - .../hashicorp/hcl/hcl/strconv/quote.go | 241 - .../hashicorp/hcl/hcl/token/position.go | 46 - .../hashicorp/hcl/hcl/token/token.go | 219 - .../hashicorp/hcl/json/parser/flatten.go | 117 - .../hashicorp/hcl/json/parser/parser.go | 313 - .../hashicorp/hcl/json/scanner/scanner.go | 451 - .../hashicorp/hcl/json/token/position.go | 46 - .../hashicorp/hcl/json/token/token.go | 118 - vendor/github.com/hashicorp/hcl/lex.go | 38 - vendor/github.com/hashicorp/hcl/parse.go | 39 - vendor/github.com/imdario/mergo/.gitignore | 33 - vendor/github.com/imdario/mergo/.travis.yml | 7 - .../imdario/mergo/CODE_OF_CONDUCT.md | 46 - vendor/github.com/imdario/mergo/LICENSE | 28 - vendor/github.com/imdario/mergo/README.md | 222 - vendor/github.com/imdario/mergo/doc.go | 44 - vendor/github.com/imdario/mergo/map.go | 174 - vendor/github.com/imdario/mergo/merge.go | 245 - vendor/github.com/imdario/mergo/mergo.go | 97 - .../imdario/mergo/testdata/license.yml | 4 - .../github.com/json-iterator/go/.codecov.yml | 3 - vendor/github.com/json-iterator/go/.gitignore | 4 - .../github.com/json-iterator/go/.travis.yml | 14 - vendor/github.com/json-iterator/go/Gopkg.lock | 21 - vendor/github.com/json-iterator/go/Gopkg.toml | 26 - vendor/github.com/json-iterator/go/LICENSE | 21 - vendor/github.com/json-iterator/go/README.md | 91 - vendor/github.com/json-iterator/go/adapter.go | 148 - vendor/github.com/json-iterator/go/any.go | 321 - .../github.com/json-iterator/go/any_array.go | 278 - .../github.com/json-iterator/go/any_bool.go | 137 - .../github.com/json-iterator/go/any_float.go | 83 - .../github.com/json-iterator/go/any_int32.go | 74 - .../github.com/json-iterator/go/any_int64.go | 74 - .../json-iterator/go/any_invalid.go | 82 - vendor/github.com/json-iterator/go/any_nil.go | 69 - .../github.com/json-iterator/go/any_number.go | 123 - .../github.com/json-iterator/go/any_object.go | 374 - vendor/github.com/json-iterator/go/any_str.go | 166 - .../github.com/json-iterator/go/any_uint32.go | 74 - .../github.com/json-iterator/go/any_uint64.go | 74 - vendor/github.com/json-iterator/go/build.sh | 12 - vendor/github.com/json-iterator/go/config.go | 372 - .../go/fuzzy_mode_convert_table.md | 7 - vendor/github.com/json-iterator/go/iter.go | 322 - .../github.com/json-iterator/go/iter_array.go | 58 - .../github.com/json-iterator/go/iter_float.go | 347 - .../github.com/json-iterator/go/iter_int.go | 345 - .../json-iterator/go/iter_object.go | 252 - .../github.com/json-iterator/go/iter_skip.go | 129 - .../json-iterator/go/iter_skip_sloppy.go | 144 - .../json-iterator/go/iter_skip_strict.go | 89 - .../github.com/json-iterator/go/iter_str.go | 215 - .../github.com/json-iterator/go/jsoniter.go | 18 - vendor/github.com/json-iterator/go/pool.go | 42 - vendor/github.com/json-iterator/go/reflect.go | 330 - .../json-iterator/go/reflect_array.go | 104 - .../json-iterator/go/reflect_dynamic.go | 70 - .../json-iterator/go/reflect_extension.go | 471 - .../json-iterator/go/reflect_json_number.go | 112 - .../go/reflect_json_raw_message.go | 60 - .../json-iterator/go/reflect_map.go | 318 - .../json-iterator/go/reflect_marshaler.go | 218 - .../json-iterator/go/reflect_native.go | 451 - .../json-iterator/go/reflect_optional.go | 133 - .../json-iterator/go/reflect_slice.go | 99 - .../go/reflect_struct_decoder.go | 1048 -- .../go/reflect_struct_encoder.go | 210 - vendor/github.com/json-iterator/go/stream.go | 211 - .../json-iterator/go/stream_float.go | 94 - .../github.com/json-iterator/go/stream_int.go | 190 - .../github.com/json-iterator/go/stream_str.go | 372 - vendor/github.com/json-iterator/go/test.sh | 12 - .../go-windows-terminal-sequences/LICENSE | 9 - .../go-windows-terminal-sequences/README.md | 41 - .../go-windows-terminal-sequences/go.mod | 1 - .../sequences.go | 36 - .../sequences_dummy.go | 11 - .../lestrrat/go-file-rotatelogs/.gitignore | 22 - .../lestrrat/go-file-rotatelogs/.travis.yml | 5 - .../lestrrat/go-file-rotatelogs/LICENSE | 20 - .../lestrrat/go-file-rotatelogs/README.md | 170 - .../lestrrat/go-file-rotatelogs/interface.go | 49 - .../lestrrat/go-file-rotatelogs/rotatelogs.go | 313 - .../lestrrat/go-strftime/.gitignore | 24 - .../lestrrat/go-strftime/.travis.yml | 5 - .../github.com/lestrrat/go-strftime/LICENSE | 21 - .../github.com/lestrrat/go-strftime/README.md | 155 - .../lestrrat/go-strftime/strftime.go | 219 - .../github.com/lestrrat/go-strftime/writer.go | 168 - .../magiconair/properties/.gitignore | 6 - .../magiconair/properties/.travis.yml | 10 - .../magiconair/properties/CHANGELOG.md | 131 - .../github.com/magiconair/properties/LICENSE | 25 - .../magiconair/properties/README.md | 129 - .../magiconair/properties/decode.go | 289 - .../github.com/magiconair/properties/doc.go | 156 - .../magiconair/properties/integrate.go | 34 - .../github.com/magiconair/properties/lex.go | 407 - .../github.com/magiconair/properties/load.go | 292 - .../magiconair/properties/parser.go | 95 - .../magiconair/properties/properties.go | 833 -- .../magiconair/properties/rangecheck.go | 31 - vendor/github.com/mattn/go-isatty/.travis.yml | 9 - vendor/github.com/mattn/go-isatty/LICENSE | 9 - vendor/github.com/mattn/go-isatty/README.md | 50 - vendor/github.com/mattn/go-isatty/doc.go | 2 - .../mattn/go-isatty/isatty_appengine.go | 15 - .../github.com/mattn/go-isatty/isatty_bsd.go | 18 - .../mattn/go-isatty/isatty_linux.go | 18 - .../mattn/go-isatty/isatty_others.go | 10 - .../mattn/go-isatty/isatty_solaris.go | 16 - .../mattn/go-isatty/isatty_windows.go | 94 - .../golang_protobuf_extensions/LICENSE | 201 - .../golang_protobuf_extensions/NOTICE | 1 - .../pbutil/.gitignore | 1 - .../pbutil/Makefile | 7 - .../pbutil/decode.go | 75 - .../golang_protobuf_extensions/pbutil/doc.go | 16 - .../pbutil/encode.go | 46 - .../mitchellh/mapstructure/.travis.yml | 8 - .../mitchellh/mapstructure/CHANGELOG.md | 21 - .../github.com/mitchellh/mapstructure/LICENSE | 21 - .../mitchellh/mapstructure/README.md | 46 - .../mitchellh/mapstructure/decode_hooks.go | 217 - .../mitchellh/mapstructure/error.go | 50 - .../github.com/mitchellh/mapstructure/go.mod | 1 - .../mitchellh/mapstructure/mapstructure.go | 1149 -- .../modern-go/concurrent/.gitignore | 1 - .../modern-go/concurrent/.travis.yml | 14 - .../github.com/modern-go/concurrent/LICENSE | 201 - .../github.com/modern-go/concurrent/README.md | 49 - .../modern-go/concurrent/executor.go | 14 - .../modern-go/concurrent/go_above_19.go | 15 - .../modern-go/concurrent/go_below_19.go | 33 - vendor/github.com/modern-go/concurrent/log.go | 13 - .../github.com/modern-go/concurrent/test.sh | 12 - .../concurrent/unbounded_executor.go | 119 - .../github.com/modern-go/reflect2/.gitignore | 2 - .../github.com/modern-go/reflect2/.travis.yml | 15 - .../github.com/modern-go/reflect2/Gopkg.lock | 15 - .../github.com/modern-go/reflect2/Gopkg.toml | 35 - vendor/github.com/modern-go/reflect2/LICENSE | 201 - .../github.com/modern-go/reflect2/README.md | 71 - .../modern-go/reflect2/go_above_17.go | 8 - .../modern-go/reflect2/go_above_19.go | 14 - .../modern-go/reflect2/go_below_17.go | 9 - .../modern-go/reflect2/go_below_19.go | 14 - .../github.com/modern-go/reflect2/reflect2.go | 298 - .../modern-go/reflect2/reflect2_amd64.s | 0 .../modern-go/reflect2/reflect2_kind.go | 30 - .../modern-go/reflect2/relfect2_386.s | 0 .../modern-go/reflect2/relfect2_amd64p32.s | 0 .../modern-go/reflect2/relfect2_arm.s | 0 .../modern-go/reflect2/relfect2_arm64.s | 0 .../modern-go/reflect2/relfect2_mips64x.s | 0 .../modern-go/reflect2/relfect2_mipsx.s | 0 .../modern-go/reflect2/relfect2_ppc64x.s | 0 .../modern-go/reflect2/relfect2_s390x.s | 0 .../modern-go/reflect2/safe_field.go | 58 - .../github.com/modern-go/reflect2/safe_map.go | 101 - .../modern-go/reflect2/safe_slice.go | 92 - .../modern-go/reflect2/safe_struct.go | 29 - .../modern-go/reflect2/safe_type.go | 78 - vendor/github.com/modern-go/reflect2/test.sh | 12 - .../github.com/modern-go/reflect2/type_map.go | 113 - .../modern-go/reflect2/unsafe_array.go | 65 - .../modern-go/reflect2/unsafe_eface.go | 59 - .../modern-go/reflect2/unsafe_field.go | 74 - .../modern-go/reflect2/unsafe_iface.go | 64 - .../modern-go/reflect2/unsafe_link.go | 70 - .../modern-go/reflect2/unsafe_map.go | 138 - .../modern-go/reflect2/unsafe_ptr.go | 46 - .../modern-go/reflect2/unsafe_slice.go | 177 - .../modern-go/reflect2/unsafe_struct.go | 59 - .../modern-go/reflect2/unsafe_type.go | 85 - .../github.com/pelletier/go-toml/.gitignore | 2 - .../github.com/pelletier/go-toml/.travis.yml | 23 - vendor/github.com/pelletier/go-toml/LICENSE | 21 - vendor/github.com/pelletier/go-toml/README.md | 131 - .../pelletier/go-toml/benchmark.json | 164 - .../github.com/pelletier/go-toml/benchmark.sh | 32 - .../pelletier/go-toml/benchmark.toml | 244 - .../pelletier/go-toml/benchmark.yml | 121 - vendor/github.com/pelletier/go-toml/doc.go | 23 - .../pelletier/go-toml/example-crlf.toml | 29 - .../github.com/pelletier/go-toml/example.toml | 29 - vendor/github.com/pelletier/go-toml/fuzz.go | 31 - vendor/github.com/pelletier/go-toml/fuzz.sh | 15 - .../pelletier/go-toml/keysparsing.go | 85 - vendor/github.com/pelletier/go-toml/lexer.go | 750 - .../github.com/pelletier/go-toml/marshal.go | 609 - .../pelletier/go-toml/marshal_test.toml | 38 - vendor/github.com/pelletier/go-toml/parser.go | 430 - .../github.com/pelletier/go-toml/position.go | 29 - vendor/github.com/pelletier/go-toml/test.sh | 88 - vendor/github.com/pelletier/go-toml/token.go | 144 - vendor/github.com/pelletier/go-toml/toml.go | 367 - .../pelletier/go-toml/tomltree_create.go | 142 - .../pelletier/go-toml/tomltree_write.go | 333 - vendor/github.com/petar/GoLLRB/AUTHORS | 4 - vendor/github.com/petar/GoLLRB/LICENSE | 27 - vendor/github.com/petar/GoLLRB/llrb/avgvar.go | 39 - .../github.com/petar/GoLLRB/llrb/iterator.go | 93 - .../petar/GoLLRB/llrb/llrb-stats.go | 46 - vendor/github.com/petar/GoLLRB/llrb/llrb.go | 456 - vendor/github.com/petar/GoLLRB/llrb/util.go | 17 - vendor/github.com/peterbourgon/diskv/LICENSE | 19 - .../github.com/peterbourgon/diskv/README.md | 141 - .../peterbourgon/diskv/compression.go | 64 - vendor/github.com/peterbourgon/diskv/diskv.go | 624 - vendor/github.com/peterbourgon/diskv/index.go | 115 - vendor/github.com/pkg/errors/.gitignore | 24 - vendor/github.com/pkg/errors/.travis.yml | 15 - vendor/github.com/pkg/errors/LICENSE | 23 - vendor/github.com/pkg/errors/README.md | 52 - vendor/github.com/pkg/errors/appveyor.yml | 32 - vendor/github.com/pkg/errors/errors.go | 282 - vendor/github.com/pkg/errors/stack.go | 147 - .../prometheus/client_golang/LICENSE | 201 - .../prometheus/client_golang/NOTICE | 23 - .../client_golang/prometheus/.gitignore | 1 - .../client_golang/prometheus/README.md | 1 - .../client_golang/prometheus/build_info.go | 29 - .../prometheus/build_info_pre_1.12.go | 22 - .../client_golang/prometheus/collector.go | 120 - .../client_golang/prometheus/counter.go | 277 - .../client_golang/prometheus/desc.go | 184 - .../client_golang/prometheus/doc.go | 200 - .../prometheus/expvar_collector.go | 119 - .../client_golang/prometheus/fnv.go | 42 - .../client_golang/prometheus/gauge.go | 286 - .../client_golang/prometheus/go_collector.go | 396 - .../client_golang/prometheus/histogram.go | 586 - .../prometheus/internal/metric.go | 85 - .../client_golang/prometheus/labels.go | 87 - .../client_golang/prometheus/metric.go | 174 - .../client_golang/prometheus/observer.go | 52 - .../prometheus/process_collector.go | 151 - .../prometheus/process_collector_other.go | 65 - .../prometheus/process_collector_windows.go | 112 - .../prometheus/promhttp/delegator.go | 357 - .../client_golang/prometheus/promhttp/http.go | 349 - .../prometheus/promhttp/instrument_client.go | 219 - .../prometheus/promhttp/instrument_server.go | 447 - .../client_golang/prometheus/registry.go | 945 -- .../client_golang/prometheus/summary.go | 736 - .../client_golang/prometheus/timer.go | 54 - .../client_golang/prometheus/untyped.go | 42 - .../client_golang/prometheus/value.go | 162 - .../client_golang/prometheus/vec.go | 472 - .../client_golang/prometheus/wrap.go | 200 - .../prometheus/client_model/LICENSE | 201 - .../github.com/prometheus/client_model/NOTICE | 5 - .../prometheus/client_model/go/metrics.pb.go | 629 - .../prometheus/client_model/ruby/LICENSE | 201 - vendor/github.com/prometheus/common/LICENSE | 201 - vendor/github.com/prometheus/common/NOTICE | 5 - .../prometheus/common/expfmt/decode.go | 429 - .../prometheus/common/expfmt/encode.go | 88 - .../prometheus/common/expfmt/expfmt.go | 38 - .../prometheus/common/expfmt/fuzz.go | 36 - .../prometheus/common/expfmt/text_create.go | 468 - .../prometheus/common/expfmt/text_parse.go | 757 - .../bitbucket.org/ww/goautoneg/README.txt | 67 - .../bitbucket.org/ww/goautoneg/autoneg.go | 162 - .../prometheus/common/model/alert.go | 136 - .../prometheus/common/model/fingerprinting.go | 105 - .../github.com/prometheus/common/model/fnv.go | 42 - .../prometheus/common/model/labels.go | 210 - .../prometheus/common/model/labelset.go | 169 - .../prometheus/common/model/metric.go | 102 - .../prometheus/common/model/model.go | 16 - .../prometheus/common/model/signature.go | 144 - .../prometheus/common/model/silence.go | 106 - .../prometheus/common/model/time.go | 270 - .../prometheus/common/model/value.go | 416 - .../github.com/prometheus/procfs/.gitignore | 1 - .../prometheus/procfs/.golangci.yml | 6 - .../prometheus/procfs/CONTRIBUTING.md | 18 - vendor/github.com/prometheus/procfs/LICENSE | 201 - .../prometheus/procfs/MAINTAINERS.md | 2 - vendor/github.com/prometheus/procfs/Makefile | 29 - .../prometheus/procfs/Makefile.common | 272 - vendor/github.com/prometheus/procfs/NOTICE | 7 - vendor/github.com/prometheus/procfs/README.md | 53 - .../github.com/prometheus/procfs/buddyinfo.go | 85 - vendor/github.com/prometheus/procfs/doc.go | 45 - .../prometheus/procfs/fixtures.ttar | 1808 --- vendor/github.com/prometheus/procfs/fs.go | 43 - vendor/github.com/prometheus/procfs/go.mod | 3 - vendor/github.com/prometheus/procfs/go.sum | 2 - .../prometheus/procfs/internal/fs/fs.go | 52 - vendor/github.com/prometheus/procfs/ipvs.go | 239 - vendor/github.com/prometheus/procfs/mdstat.go | 151 - .../prometheus/procfs/mountstats.go | 621 - .../github.com/prometheus/procfs/net_dev.go | 206 - .../github.com/prometheus/procfs/net_unix.go | 275 - vendor/github.com/prometheus/procfs/proc.go | 267 - .../github.com/prometheus/procfs/proc_io.go | 65 - .../prometheus/procfs/proc_limits.go | 157 - .../github.com/prometheus/procfs/proc_ns.go | 68 - .../github.com/prometheus/procfs/proc_psi.go | 101 - .../github.com/prometheus/procfs/proc_stat.go | 198 - .../prometheus/procfs/proc_status.go | 162 - vendor/github.com/prometheus/procfs/stat.go | 244 - vendor/github.com/prometheus/procfs/ttar | 413 - vendor/github.com/prometheus/procfs/xfrm.go | 187 - vendor/github.com/rifflock/lfshook/LICENSE | 21 - vendor/github.com/rifflock/lfshook/README.md | 87 - vendor/github.com/rifflock/lfshook/lfshook.go | 194 - vendor/github.com/sirupsen/logrus/.gitignore | 2 - vendor/github.com/sirupsen/logrus/.travis.yml | 25 - .../github.com/sirupsen/logrus/CHANGELOG.md | 200 - vendor/github.com/sirupsen/logrus/LICENSE | 21 - vendor/github.com/sirupsen/logrus/README.md | 495 - vendor/github.com/sirupsen/logrus/alt_exit.go | 76 - .../github.com/sirupsen/logrus/appveyor.yml | 14 - vendor/github.com/sirupsen/logrus/doc.go | 26 - vendor/github.com/sirupsen/logrus/entry.go | 407 - vendor/github.com/sirupsen/logrus/exported.go | 225 - .../github.com/sirupsen/logrus/formatter.go | 78 - vendor/github.com/sirupsen/logrus/go.mod | 10 - vendor/github.com/sirupsen/logrus/go.sum | 16 - vendor/github.com/sirupsen/logrus/hooks.go | 34 - .../sirupsen/logrus/json_formatter.go | 121 - vendor/github.com/sirupsen/logrus/logger.go | 351 - vendor/github.com/sirupsen/logrus/logrus.go | 186 - .../logrus/terminal_check_appengine.go | 11 - .../sirupsen/logrus/terminal_check_bsd.go | 13 - .../logrus/terminal_check_no_terminal.go | 11 - .../logrus/terminal_check_notappengine.go | 17 - .../sirupsen/logrus/terminal_check_solaris.go | 11 - .../sirupsen/logrus/terminal_check_unix.go | 13 - .../sirupsen/logrus/terminal_check_windows.go | 34 - .../sirupsen/logrus/text_formatter.go | 295 - vendor/github.com/sirupsen/logrus/writer.go | 64 - vendor/github.com/spf13/afero/.travis.yml | 21 - vendor/github.com/spf13/afero/LICENSE.txt | 174 - vendor/github.com/spf13/afero/README.md | 452 - vendor/github.com/spf13/afero/afero.go | 108 - vendor/github.com/spf13/afero/appveyor.yml | 15 - vendor/github.com/spf13/afero/basepath.go | 180 - .../github.com/spf13/afero/cacheOnReadFs.go | 290 - vendor/github.com/spf13/afero/const_bsds.go | 22 - .../github.com/spf13/afero/const_win_unix.go | 25 - .../github.com/spf13/afero/copyOnWriteFs.go | 293 - vendor/github.com/spf13/afero/go.mod | 3 - vendor/github.com/spf13/afero/go.sum | 2 - vendor/github.com/spf13/afero/httpFs.go | 110 - vendor/github.com/spf13/afero/ioutil.go | 230 - vendor/github.com/spf13/afero/lstater.go | 27 - vendor/github.com/spf13/afero/match.go | 110 - vendor/github.com/spf13/afero/mem/dir.go | 37 - vendor/github.com/spf13/afero/mem/dirmap.go | 43 - vendor/github.com/spf13/afero/mem/file.go | 317 - vendor/github.com/spf13/afero/memmap.go | 365 - vendor/github.com/spf13/afero/os.go | 101 - vendor/github.com/spf13/afero/path.go | 106 - vendor/github.com/spf13/afero/readonlyfs.go | 80 - vendor/github.com/spf13/afero/regexpfs.go | 214 - vendor/github.com/spf13/afero/unionFile.go | 316 - vendor/github.com/spf13/afero/util.go | 330 - vendor/github.com/spf13/cast/.gitignore | 25 - vendor/github.com/spf13/cast/.travis.yml | 15 - vendor/github.com/spf13/cast/LICENSE | 21 - vendor/github.com/spf13/cast/Makefile | 38 - vendor/github.com/spf13/cast/README.md | 75 - vendor/github.com/spf13/cast/cast.go | 171 - vendor/github.com/spf13/cast/caste.go | 1249 -- vendor/github.com/spf13/cast/go.mod | 7 - vendor/github.com/spf13/cast/go.sum | 6 - .../spf13/jwalterweatherman/.gitignore | 24 - .../spf13/jwalterweatherman/LICENSE | 21 - .../spf13/jwalterweatherman/README.md | 148 - .../jwalterweatherman/default_notepad.go | 111 - .../github.com/spf13/jwalterweatherman/go.mod | 7 - .../spf13/jwalterweatherman/log_counter.go | 46 - .../spf13/jwalterweatherman/notepad.go | 225 - vendor/github.com/spf13/pflag/.gitignore | 2 - vendor/github.com/spf13/pflag/.travis.yml | 21 - vendor/github.com/spf13/pflag/LICENSE | 28 - vendor/github.com/spf13/pflag/README.md | 296 - vendor/github.com/spf13/pflag/bool.go | 94 - vendor/github.com/spf13/pflag/bool_slice.go | 147 - vendor/github.com/spf13/pflag/bytes.go | 209 - vendor/github.com/spf13/pflag/count.go | 96 - vendor/github.com/spf13/pflag/duration.go | 86 - .../github.com/spf13/pflag/duration_slice.go | 128 - vendor/github.com/spf13/pflag/flag.go | 1227 -- vendor/github.com/spf13/pflag/float32.go | 88 - vendor/github.com/spf13/pflag/float64.go | 84 - vendor/github.com/spf13/pflag/golangflag.go | 105 - vendor/github.com/spf13/pflag/int.go | 84 - vendor/github.com/spf13/pflag/int16.go | 88 - vendor/github.com/spf13/pflag/int32.go | 88 - vendor/github.com/spf13/pflag/int64.go | 84 - vendor/github.com/spf13/pflag/int8.go | 88 - vendor/github.com/spf13/pflag/int_slice.go | 128 - vendor/github.com/spf13/pflag/ip.go | 94 - vendor/github.com/spf13/pflag/ip_slice.go | 148 - vendor/github.com/spf13/pflag/ipmask.go | 122 - vendor/github.com/spf13/pflag/ipnet.go | 98 - vendor/github.com/spf13/pflag/string.go | 80 - vendor/github.com/spf13/pflag/string_array.go | 103 - vendor/github.com/spf13/pflag/string_slice.go | 149 - .../github.com/spf13/pflag/string_to_int.go | 149 - .../spf13/pflag/string_to_string.go | 160 - vendor/github.com/spf13/pflag/uint.go | 88 - vendor/github.com/spf13/pflag/uint16.go | 88 - vendor/github.com/spf13/pflag/uint32.go | 88 - vendor/github.com/spf13/pflag/uint64.go | 88 - vendor/github.com/spf13/pflag/uint8.go | 88 - vendor/github.com/spf13/pflag/uint_slice.go | 126 - vendor/github.com/spf13/viper/.gitignore | 29 - vendor/github.com/spf13/viper/.travis.yml | 31 - vendor/github.com/spf13/viper/LICENSE | 21 - vendor/github.com/spf13/viper/README.md | 691 - vendor/github.com/spf13/viper/flags.go | 57 - vendor/github.com/spf13/viper/go.mod | 43 - vendor/github.com/spf13/viper/go.sum | 178 - vendor/github.com/spf13/viper/util.go | 221 - vendor/github.com/spf13/viper/viper.go | 1868 --- vendor/github.com/ugorji/go/LICENSE | 22 - vendor/github.com/ugorji/go/codec/0doc.go | 199 - vendor/github.com/ugorji/go/codec/README.md | 148 - vendor/github.com/ugorji/go/codec/binc.go | 929 -- vendor/github.com/ugorji/go/codec/cbor.go | 592 - vendor/github.com/ugorji/go/codec/decode.go | 2066 --- .../github.com/ugorji/go/codec/decode_go.go | 16 - .../github.com/ugorji/go/codec/decode_go14.go | 14 - vendor/github.com/ugorji/go/codec/encode.go | 1461 -- .../ugorji/go/codec/fast-path.go.tmpl | 527 - .../ugorji/go/codec/fast-path.not.go | 34 - .../ugorji/go/codec/gen-dec-array.go.tmpl | 104 - .../ugorji/go/codec/gen-dec-map.go.tmpl | 58 - .../ugorji/go/codec/gen-helper.generated.go | 243 - .../ugorji/go/codec/gen-helper.go.tmpl | 372 - .../ugorji/go/codec/gen.generated.go | 175 - vendor/github.com/ugorji/go/codec/gen.go | 2014 --- vendor/github.com/ugorji/go/codec/gen_15.go | 12 - vendor/github.com/ugorji/go/codec/gen_16.go | 12 - vendor/github.com/ugorji/go/codec/gen_17.go | 10 - vendor/github.com/ugorji/go/codec/helper.go | 1314 -- .../ugorji/go/codec/helper_internal.go | 242 - .../ugorji/go/codec/helper_not_unsafe.go | 20 - .../ugorji/go/codec/helper_unsafe.go | 49 - vendor/github.com/ugorji/go/codec/json.go | 1247 -- vendor/github.com/ugorji/go/codec/msgpack.go | 852 -- vendor/github.com/ugorji/go/codec/noop.go | 213 - vendor/github.com/ugorji/go/codec/prebuild.go | 3 - vendor/github.com/ugorji/go/codec/prebuild.sh | 199 - vendor/github.com/ugorji/go/codec/rpc.go | 180 - vendor/github.com/ugorji/go/codec/simple.go | 526 - .../ugorji/go/codec/test-cbor-goldens.json | 639 - vendor/github.com/ugorji/go/codec/test.py | 126 - vendor/github.com/ugorji/go/codec/tests.sh | 107 - vendor/github.com/ugorji/go/codec/time.go | 233 - vendor/golang.org/x/crypto/AUTHORS | 3 - vendor/golang.org/x/crypto/CONTRIBUTORS | 3 - vendor/golang.org/x/crypto/LICENSE | 27 - vendor/golang.org/x/crypto/PATENTS | 22 - .../x/crypto/ssh/terminal/terminal.go | 955 -- .../golang.org/x/crypto/ssh/terminal/util.go | 114 - .../x/crypto/ssh/terminal/util_aix.go | 12 - .../x/crypto/ssh/terminal/util_bsd.go | 12 - .../x/crypto/ssh/terminal/util_linux.go | 10 - .../x/crypto/ssh/terminal/util_plan9.go | 58 - .../x/crypto/ssh/terminal/util_solaris.go | 124 - .../x/crypto/ssh/terminal/util_windows.go | 105 - vendor/golang.org/x/net/AUTHORS | 3 - vendor/golang.org/x/net/CONTRIBUTORS | 3 - vendor/golang.org/x/net/LICENSE | 27 - vendor/golang.org/x/net/PATENTS | 22 - vendor/golang.org/x/net/context/context.go | 56 - vendor/golang.org/x/net/context/go17.go | 72 - vendor/golang.org/x/net/context/go19.go | 20 - vendor/golang.org/x/net/context/pre_go17.go | 300 - vendor/golang.org/x/net/context/pre_go19.go | 109 - vendor/golang.org/x/net/http2/.gitignore | 2 - vendor/golang.org/x/net/http2/Dockerfile | 51 - vendor/golang.org/x/net/http2/Makefile | 3 - vendor/golang.org/x/net/http2/README | 20 - vendor/golang.org/x/net/http2/ciphers.go | 641 - .../x/net/http2/client_conn_pool.go | 256 - .../x/net/http2/configure_transport.go | 80 - vendor/golang.org/x/net/http2/databuffer.go | 146 - vendor/golang.org/x/net/http2/errors.go | 133 - vendor/golang.org/x/net/http2/flow.go | 50 - vendor/golang.org/x/net/http2/frame.go | 1579 -- vendor/golang.org/x/net/http2/go16.go | 16 - vendor/golang.org/x/net/http2/go17.go | 106 - vendor/golang.org/x/net/http2/go17_not18.go | 36 - vendor/golang.org/x/net/http2/go18.go | 56 - vendor/golang.org/x/net/http2/go19.go | 16 - vendor/golang.org/x/net/http2/gotrack.go | 170 - vendor/golang.org/x/net/http2/headermap.go | 78 - vendor/golang.org/x/net/http2/hpack/encode.go | 240 - vendor/golang.org/x/net/http2/hpack/hpack.go | 490 - .../golang.org/x/net/http2/hpack/huffman.go | 212 - vendor/golang.org/x/net/http2/hpack/tables.go | 479 - vendor/golang.org/x/net/http2/http2.go | 391 - vendor/golang.org/x/net/http2/not_go16.go | 21 - vendor/golang.org/x/net/http2/not_go17.go | 87 - vendor/golang.org/x/net/http2/not_go18.go | 29 - vendor/golang.org/x/net/http2/not_go19.go | 16 - vendor/golang.org/x/net/http2/pipe.go | 163 - vendor/golang.org/x/net/http2/server.go | 2888 ---- vendor/golang.org/x/net/http2/transport.go | 2303 --- vendor/golang.org/x/net/http2/write.go | 365 - vendor/golang.org/x/net/http2/writesched.go | 242 - .../x/net/http2/writesched_priority.go | 452 - .../x/net/http2/writesched_random.go | 72 - vendor/golang.org/x/net/idna/idna.go | 732 - vendor/golang.org/x/net/idna/punycode.go | 203 - vendor/golang.org/x/net/idna/tables.go | 4557 ------ vendor/golang.org/x/net/idna/trie.go | 72 - vendor/golang.org/x/net/idna/trieval.go | 119 - .../golang.org/x/net/lex/httplex/httplex.go | 351 - vendor/golang.org/x/oauth2/.travis.yml | 13 - vendor/golang.org/x/oauth2/AUTHORS | 3 - vendor/golang.org/x/oauth2/CONTRIBUTING.md | 31 - vendor/golang.org/x/oauth2/CONTRIBUTORS | 3 - vendor/golang.org/x/oauth2/LICENSE | 27 - vendor/golang.org/x/oauth2/README.md | 74 - .../golang.org/x/oauth2/client_appengine.go | 25 - vendor/golang.org/x/oauth2/internal/oauth2.go | 76 - vendor/golang.org/x/oauth2/internal/token.go | 247 - .../golang.org/x/oauth2/internal/transport.go | 69 - vendor/golang.org/x/oauth2/oauth2.go | 340 - vendor/golang.org/x/oauth2/token.go | 158 - vendor/golang.org/x/oauth2/transport.go | 132 - vendor/golang.org/x/sys/AUTHORS | 3 - vendor/golang.org/x/sys/CONTRIBUTORS | 3 - vendor/golang.org/x/sys/LICENSE | 27 - vendor/golang.org/x/sys/PATENTS | 22 - vendor/golang.org/x/sys/unix/.gitignore | 2 - vendor/golang.org/x/sys/unix/README.md | 173 - .../golang.org/x/sys/unix/affinity_linux.go | 124 - vendor/golang.org/x/sys/unix/aliases.go | 14 - vendor/golang.org/x/sys/unix/asm_aix_ppc64.s | 17 - vendor/golang.org/x/sys/unix/asm_darwin_386.s | 29 - .../golang.org/x/sys/unix/asm_darwin_amd64.s | 29 - vendor/golang.org/x/sys/unix/asm_darwin_arm.s | 30 - .../golang.org/x/sys/unix/asm_darwin_arm64.s | 30 - .../x/sys/unix/asm_dragonfly_amd64.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_386.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_amd64.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_arm.s | 29 - .../golang.org/x/sys/unix/asm_freebsd_arm64.s | 29 - vendor/golang.org/x/sys/unix/asm_linux_386.s | 65 - .../golang.org/x/sys/unix/asm_linux_amd64.s | 57 - vendor/golang.org/x/sys/unix/asm_linux_arm.s | 56 - .../golang.org/x/sys/unix/asm_linux_arm64.s | 52 - .../golang.org/x/sys/unix/asm_linux_mips64x.s | 56 - .../golang.org/x/sys/unix/asm_linux_mipsx.s | 54 - .../golang.org/x/sys/unix/asm_linux_ppc64x.s | 44 - .../golang.org/x/sys/unix/asm_linux_s390x.s | 56 - vendor/golang.org/x/sys/unix/asm_netbsd_386.s | 29 - .../golang.org/x/sys/unix/asm_netbsd_amd64.s | 29 - vendor/golang.org/x/sys/unix/asm_netbsd_arm.s | 29 - .../golang.org/x/sys/unix/asm_netbsd_arm64.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_386.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_amd64.s | 29 - .../golang.org/x/sys/unix/asm_openbsd_arm.s | 29 - .../golang.org/x/sys/unix/asm_solaris_amd64.s | 17 - .../golang.org/x/sys/unix/bluetooth_linux.go | 35 - vendor/golang.org/x/sys/unix/cap_freebsd.go | 195 - vendor/golang.org/x/sys/unix/constants.go | 13 - vendor/golang.org/x/sys/unix/dev_aix_ppc.go | 27 - vendor/golang.org/x/sys/unix/dev_aix_ppc64.go | 29 - vendor/golang.org/x/sys/unix/dev_darwin.go | 24 - vendor/golang.org/x/sys/unix/dev_dragonfly.go | 30 - vendor/golang.org/x/sys/unix/dev_freebsd.go | 30 - vendor/golang.org/x/sys/unix/dev_linux.go | 42 - vendor/golang.org/x/sys/unix/dev_netbsd.go | 29 - vendor/golang.org/x/sys/unix/dev_openbsd.go | 29 - vendor/golang.org/x/sys/unix/dirent.go | 17 - vendor/golang.org/x/sys/unix/endian_big.go | 9 - vendor/golang.org/x/sys/unix/endian_little.go | 9 - vendor/golang.org/x/sys/unix/env_unix.go | 31 - .../x/sys/unix/errors_freebsd_386.go | 227 - .../x/sys/unix/errors_freebsd_amd64.go | 227 - .../x/sys/unix/errors_freebsd_arm.go | 226 - vendor/golang.org/x/sys/unix/fcntl.go | 32 - vendor/golang.org/x/sys/unix/fcntl_darwin.go | 18 - .../x/sys/unix/fcntl_linux_32bit.go | 13 - vendor/golang.org/x/sys/unix/gccgo.go | 62 - vendor/golang.org/x/sys/unix/gccgo_c.c | 39 - .../x/sys/unix/gccgo_linux_amd64.go | 20 - vendor/golang.org/x/sys/unix/ioctl.go | 30 - vendor/golang.org/x/sys/unix/mkall.sh | 212 - vendor/golang.org/x/sys/unix/mkasm_darwin.go | 61 - vendor/golang.org/x/sys/unix/mkerrors.sh | 659 - vendor/golang.org/x/sys/unix/mkpost.go | 106 - vendor/golang.org/x/sys/unix/mksyscall.go | 402 - .../x/sys/unix/mksyscall_aix_ppc.go | 404 - .../x/sys/unix/mksyscall_aix_ppc64.go | 602 - .../x/sys/unix/mksyscall_solaris.go | 335 - .../golang.org/x/sys/unix/mksysctl_openbsd.pl | 265 - vendor/golang.org/x/sys/unix/mksysnum.go | 190 - .../golang.org/x/sys/unix/openbsd_pledge.go | 166 - .../golang.org/x/sys/unix/openbsd_unveil.go | 44 - vendor/golang.org/x/sys/unix/pagesize_unix.go | 15 - vendor/golang.org/x/sys/unix/race.go | 30 - vendor/golang.org/x/sys/unix/race0.go | 25 - .../golang.org/x/sys/unix/sockcmsg_linux.go | 36 - vendor/golang.org/x/sys/unix/sockcmsg_unix.go | 117 - vendor/golang.org/x/sys/unix/str.go | 26 - vendor/golang.org/x/sys/unix/syscall.go | 54 - vendor/golang.org/x/sys/unix/syscall_aix.go | 549 - .../golang.org/x/sys/unix/syscall_aix_ppc.go | 34 - .../x/sys/unix/syscall_aix_ppc64.go | 34 - vendor/golang.org/x/sys/unix/syscall_bsd.go | 624 - .../golang.org/x/sys/unix/syscall_darwin.go | 689 - .../x/sys/unix/syscall_darwin_386.go | 63 - .../x/sys/unix/syscall_darwin_amd64.go | 63 - .../x/sys/unix/syscall_darwin_arm.go | 64 - .../x/sys/unix/syscall_darwin_arm64.go | 66 - .../x/sys/unix/syscall_darwin_libSystem.go | 31 - .../x/sys/unix/syscall_dragonfly.go | 539 - .../x/sys/unix/syscall_dragonfly_amd64.go | 52 - .../golang.org/x/sys/unix/syscall_freebsd.go | 824 -- .../x/sys/unix/syscall_freebsd_386.go | 52 - .../x/sys/unix/syscall_freebsd_amd64.go | 52 - .../x/sys/unix/syscall_freebsd_arm.go | 52 - .../x/sys/unix/syscall_freebsd_arm64.go | 52 - vendor/golang.org/x/sys/unix/syscall_linux.go | 1771 --- .../x/sys/unix/syscall_linux_386.go | 386 - .../x/sys/unix/syscall_linux_amd64.go | 190 - .../x/sys/unix/syscall_linux_amd64_gc.go | 13 - .../x/sys/unix/syscall_linux_arm.go | 274 - .../x/sys/unix/syscall_linux_arm64.go | 223 - .../golang.org/x/sys/unix/syscall_linux_gc.go | 14 - .../x/sys/unix/syscall_linux_gc_386.go | 16 - .../x/sys/unix/syscall_linux_gccgo_386.go | 30 - .../x/sys/unix/syscall_linux_gccgo_arm.go | 20 - .../x/sys/unix/syscall_linux_mips64x.go | 222 - .../x/sys/unix/syscall_linux_mipsx.go | 234 - .../x/sys/unix/syscall_linux_ppc64x.go | 152 - .../x/sys/unix/syscall_linux_riscv64.go | 226 - .../x/sys/unix/syscall_linux_s390x.go | 338 - .../x/sys/unix/syscall_linux_sparc64.go | 147 - .../golang.org/x/sys/unix/syscall_netbsd.go | 622 - .../x/sys/unix/syscall_netbsd_386.go | 33 - .../x/sys/unix/syscall_netbsd_amd64.go | 33 - .../x/sys/unix/syscall_netbsd_arm.go | 33 - .../x/sys/unix/syscall_netbsd_arm64.go | 33 - .../golang.org/x/sys/unix/syscall_openbsd.go | 416 - .../x/sys/unix/syscall_openbsd_386.go | 37 - .../x/sys/unix/syscall_openbsd_amd64.go | 37 - .../x/sys/unix/syscall_openbsd_arm.go | 37 - .../golang.org/x/sys/unix/syscall_solaris.go | 737 - .../x/sys/unix/syscall_solaris_amd64.go | 23 - vendor/golang.org/x/sys/unix/syscall_unix.go | 416 - .../golang.org/x/sys/unix/syscall_unix_gc.go | 15 - .../x/sys/unix/syscall_unix_gc_ppc64x.go | 24 - vendor/golang.org/x/sys/unix/timestruct.go | 82 - vendor/golang.org/x/sys/unix/types_aix.go | 236 - vendor/golang.org/x/sys/unix/types_darwin.go | 277 - .../golang.org/x/sys/unix/types_dragonfly.go | 263 - vendor/golang.org/x/sys/unix/types_freebsd.go | 356 - vendor/golang.org/x/sys/unix/types_netbsd.go | 289 - vendor/golang.org/x/sys/unix/types_openbsd.go | 282 - vendor/golang.org/x/sys/unix/types_solaris.go | 266 - vendor/golang.org/x/sys/unix/xattr_bsd.go | 240 - .../golang.org/x/sys/unix/zerrors_aix_ppc.go | 1372 -- .../x/sys/unix/zerrors_aix_ppc64.go | 1373 -- .../x/sys/unix/zerrors_darwin_386.go | 1783 --- .../x/sys/unix/zerrors_darwin_amd64.go | 1783 --- .../x/sys/unix/zerrors_darwin_arm.go | 1783 --- .../x/sys/unix/zerrors_darwin_arm64.go | 1783 --- .../x/sys/unix/zerrors_dragonfly_amd64.go | 1650 --- .../x/sys/unix/zerrors_freebsd_386.go | 1793 --- .../x/sys/unix/zerrors_freebsd_amd64.go | 1794 --- .../x/sys/unix/zerrors_freebsd_arm.go | 1802 --- .../x/sys/unix/zerrors_freebsd_arm64.go | 1794 --- .../x/sys/unix/zerrors_linux_386.go | 2835 ---- .../x/sys/unix/zerrors_linux_amd64.go | 2835 ---- .../x/sys/unix/zerrors_linux_arm.go | 2841 ---- .../x/sys/unix/zerrors_linux_arm64.go | 2826 ---- .../x/sys/unix/zerrors_linux_mips.go | 2842 ---- .../x/sys/unix/zerrors_linux_mips64.go | 2842 ---- .../x/sys/unix/zerrors_linux_mips64le.go | 2842 ---- .../x/sys/unix/zerrors_linux_mipsle.go | 2842 ---- .../x/sys/unix/zerrors_linux_ppc64.go | 2897 ---- .../x/sys/unix/zerrors_linux_ppc64le.go | 2897 ---- .../x/sys/unix/zerrors_linux_riscv64.go | 2822 ---- .../x/sys/unix/zerrors_linux_s390x.go | 2895 ---- .../x/sys/unix/zerrors_linux_sparc64.go | 2891 ---- .../x/sys/unix/zerrors_netbsd_386.go | 1772 --- .../x/sys/unix/zerrors_netbsd_amd64.go | 1762 --- .../x/sys/unix/zerrors_netbsd_arm.go | 1751 --- .../x/sys/unix/zerrors_netbsd_arm64.go | 1762 --- .../x/sys/unix/zerrors_openbsd_386.go | 1654 --- .../x/sys/unix/zerrors_openbsd_amd64.go | 1765 --- .../x/sys/unix/zerrors_openbsd_arm.go | 1656 --- .../x/sys/unix/zerrors_solaris_amd64.go | 1532 -- .../golang.org/x/sys/unix/zptrace386_linux.go | 80 - .../golang.org/x/sys/unix/zptracearm_linux.go | 41 - .../x/sys/unix/zptracemips_linux.go | 50 - .../x/sys/unix/zptracemipsle_linux.go | 50 - .../golang.org/x/sys/unix/zsyscall_aix_ppc.go | 1450 -- .../x/sys/unix/zsyscall_aix_ppc64.go | 1416 -- .../x/sys/unix/zsyscall_aix_ppc64_gc.go | 1172 -- .../x/sys/unix/zsyscall_aix_ppc64_gccgo.go | 1051 -- .../x/sys/unix/zsyscall_darwin_386.1_11.go | 1810 --- .../x/sys/unix/zsyscall_darwin_386.go | 2505 ---- .../x/sys/unix/zsyscall_darwin_386.s | 284 - .../x/sys/unix/zsyscall_darwin_amd64.1_11.go | 1810 --- .../x/sys/unix/zsyscall_darwin_amd64.go | 2520 ---- .../x/sys/unix/zsyscall_darwin_amd64.s | 286 - .../x/sys/unix/zsyscall_darwin_arm.1_11.go | 1793 --- .../x/sys/unix/zsyscall_darwin_arm.go | 2483 ---- .../x/sys/unix/zsyscall_darwin_arm.s | 282 - .../x/sys/unix/zsyscall_darwin_arm64.1_11.go | 1793 --- .../x/sys/unix/zsyscall_darwin_arm64.go | 2483 ---- .../x/sys/unix/zsyscall_darwin_arm64.s | 282 - .../x/sys/unix/zsyscall_dragonfly_amd64.go | 1659 --- .../x/sys/unix/zsyscall_freebsd_386.go | 2015 --- .../x/sys/unix/zsyscall_freebsd_amd64.go | 2015 --- .../x/sys/unix/zsyscall_freebsd_arm.go | 2015 --- .../x/sys/unix/zsyscall_freebsd_arm64.go | 2015 --- .../x/sys/unix/zsyscall_linux_386.go | 2220 --- .../x/sys/unix/zsyscall_linux_amd64.go | 2387 --- .../x/sys/unix/zsyscall_linux_arm.go | 2342 --- .../x/sys/unix/zsyscall_linux_arm64.go | 2244 --- .../x/sys/unix/zsyscall_linux_mips.go | 2400 --- .../x/sys/unix/zsyscall_linux_mips64.go | 2371 --- .../x/sys/unix/zsyscall_linux_mips64le.go | 2371 --- .../x/sys/unix/zsyscall_linux_mipsle.go | 2400 --- .../x/sys/unix/zsyscall_linux_ppc64.go | 2449 --- .../x/sys/unix/zsyscall_linux_ppc64le.go | 2449 --- .../x/sys/unix/zsyscall_linux_riscv64.go | 2224 --- .../x/sys/unix/zsyscall_linux_s390x.go | 2219 --- .../x/sys/unix/zsyscall_linux_sparc64.go | 2382 --- .../x/sys/unix/zsyscall_netbsd_386.go | 1826 --- .../x/sys/unix/zsyscall_netbsd_amd64.go | 1826 --- .../x/sys/unix/zsyscall_netbsd_arm.go | 1826 --- .../x/sys/unix/zsyscall_netbsd_arm64.go | 1826 --- .../x/sys/unix/zsyscall_openbsd_386.go | 1692 --- .../x/sys/unix/zsyscall_openbsd_amd64.go | 1692 --- .../x/sys/unix/zsyscall_openbsd_arm.go | 1692 --- .../x/sys/unix/zsyscall_solaris_amd64.go | 1953 --- .../x/sys/unix/zsysctl_openbsd_386.go | 270 - .../x/sys/unix/zsysctl_openbsd_amd64.go | 270 - .../x/sys/unix/zsysctl_openbsd_arm.go | 270 - .../x/sys/unix/zsysnum_darwin_386.go | 436 - .../x/sys/unix/zsysnum_darwin_amd64.go | 438 - .../x/sys/unix/zsysnum_darwin_arm.go | 436 - .../x/sys/unix/zsysnum_darwin_arm64.go | 436 - .../x/sys/unix/zsysnum_dragonfly_amd64.go | 315 - .../x/sys/unix/zsysnum_freebsd_386.go | 403 - .../x/sys/unix/zsysnum_freebsd_amd64.go | 403 - .../x/sys/unix/zsysnum_freebsd_arm.go | 403 - .../x/sys/unix/zsysnum_freebsd_arm64.go | 395 - .../x/sys/unix/zsysnum_linux_386.go | 392 - .../x/sys/unix/zsysnum_linux_amd64.go | 344 - .../x/sys/unix/zsysnum_linux_arm.go | 364 - .../x/sys/unix/zsysnum_linux_arm64.go | 289 - .../x/sys/unix/zsysnum_linux_mips.go | 377 - .../x/sys/unix/zsysnum_linux_mips64.go | 337 - .../x/sys/unix/zsysnum_linux_mips64le.go | 337 - .../x/sys/unix/zsysnum_linux_mipsle.go | 377 - .../x/sys/unix/zsysnum_linux_ppc64.go | 375 - .../x/sys/unix/zsysnum_linux_ppc64le.go | 375 - .../x/sys/unix/zsysnum_linux_riscv64.go | 288 - .../x/sys/unix/zsysnum_linux_s390x.go | 337 - .../x/sys/unix/zsysnum_linux_sparc64.go | 351 - .../x/sys/unix/zsysnum_netbsd_386.go | 274 - .../x/sys/unix/zsysnum_netbsd_amd64.go | 274 - .../x/sys/unix/zsysnum_netbsd_arm.go | 274 - .../x/sys/unix/zsysnum_netbsd_arm64.go | 274 - .../x/sys/unix/zsysnum_openbsd_386.go | 218 - .../x/sys/unix/zsysnum_openbsd_amd64.go | 218 - .../x/sys/unix/zsysnum_openbsd_arm.go | 218 - .../golang.org/x/sys/unix/ztypes_aix_ppc.go | 345 - .../golang.org/x/sys/unix/ztypes_aix_ppc64.go | 354 - .../x/sys/unix/ztypes_darwin_386.go | 489 - .../x/sys/unix/ztypes_darwin_amd64.go | 499 - .../x/sys/unix/ztypes_darwin_arm.go | 490 - .../x/sys/unix/ztypes_darwin_arm64.go | 499 - .../x/sys/unix/ztypes_dragonfly_amd64.go | 469 - .../x/sys/unix/ztypes_freebsd_386.go | 603 - .../x/sys/unix/ztypes_freebsd_amd64.go | 602 - .../x/sys/unix/ztypes_freebsd_arm.go | 602 - .../x/sys/unix/ztypes_freebsd_arm64.go | 602 - .../golang.org/x/sys/unix/ztypes_linux_386.go | 2083 --- .../x/sys/unix/ztypes_linux_amd64.go | 2096 --- .../golang.org/x/sys/unix/ztypes_linux_arm.go | 2074 --- .../x/sys/unix/ztypes_linux_arm64.go | 2075 --- .../x/sys/unix/ztypes_linux_mips.go | 2080 --- .../x/sys/unix/ztypes_linux_mips64.go | 2077 --- .../x/sys/unix/ztypes_linux_mips64le.go | 2077 --- .../x/sys/unix/ztypes_linux_mipsle.go | 2080 --- .../x/sys/unix/ztypes_linux_ppc64.go | 2085 --- .../x/sys/unix/ztypes_linux_ppc64le.go | 2085 --- .../x/sys/unix/ztypes_linux_riscv64.go | 2102 --- .../x/sys/unix/ztypes_linux_s390x.go | 2099 --- .../x/sys/unix/ztypes_linux_sparc64.go | 2080 --- .../x/sys/unix/ztypes_netbsd_386.go | 465 - .../x/sys/unix/ztypes_netbsd_amd64.go | 472 - .../x/sys/unix/ztypes_netbsd_arm.go | 470 - .../x/sys/unix/ztypes_netbsd_arm64.go | 472 - .../x/sys/unix/ztypes_openbsd_386.go | 570 - .../x/sys/unix/ztypes_openbsd_amd64.go | 570 - .../x/sys/unix/ztypes_openbsd_arm.go | 571 - .../x/sys/unix/ztypes_solaris_amd64.go | 442 - vendor/golang.org/x/sys/windows/aliases.go | 13 - .../x/sys/windows/asm_windows_386.s | 13 - .../x/sys/windows/asm_windows_amd64.s | 13 - .../x/sys/windows/asm_windows_arm.s | 11 - .../golang.org/x/sys/windows/dll_windows.go | 378 - .../golang.org/x/sys/windows/env_windows.go | 29 - vendor/golang.org/x/sys/windows/eventlog.go | 20 - .../golang.org/x/sys/windows/exec_windows.go | 97 - .../x/sys/windows/memory_windows.go | 26 - vendor/golang.org/x/sys/windows/mksyscall.go | 7 - vendor/golang.org/x/sys/windows/race.go | 30 - vendor/golang.org/x/sys/windows/race0.go | 25 - .../x/sys/windows/security_windows.go | 649 - vendor/golang.org/x/sys/windows/service.go | 183 - vendor/golang.org/x/sys/windows/str.go | 22 - vendor/golang.org/x/sys/windows/syscall.go | 74 - .../x/sys/windows/syscall_windows.go | 1218 -- .../golang.org/x/sys/windows/types_windows.go | 1479 -- .../x/sys/windows/types_windows_386.go | 22 - .../x/sys/windows/types_windows_amd64.go | 22 - .../x/sys/windows/types_windows_arm.go | 22 - .../x/sys/windows/zsyscall_windows.go | 2747 ---- vendor/golang.org/x/text/AUTHORS | 3 - vendor/golang.org/x/text/CONTRIBUTORS | 3 - vendor/golang.org/x/text/LICENSE | 27 - vendor/golang.org/x/text/PATENTS | 22 - .../x/text/collate/build/builder.go | 702 - .../x/text/collate/build/colelem.go | 294 - .../x/text/collate/build/contract.go | 309 - .../golang.org/x/text/collate/build/order.go | 393 - .../golang.org/x/text/collate/build/table.go | 81 - .../golang.org/x/text/collate/build/trie.go | 290 - vendor/golang.org/x/text/collate/collate.go | 403 - vendor/golang.org/x/text/collate/index.go | 32 - .../golang.org/x/text/collate/maketables.go | 553 - vendor/golang.org/x/text/collate/option.go | 239 - vendor/golang.org/x/text/collate/sort.go | 81 - .../x/text/internal/colltab/collelem.go | 371 - .../x/text/internal/colltab/colltab.go | 105 - .../x/text/internal/colltab/contract.go | 145 - .../x/text/internal/colltab/iter.go | 178 - .../x/text/internal/colltab/numeric.go | 236 - .../x/text/internal/colltab/table.go | 275 - .../x/text/internal/colltab/trie.go | 159 - .../x/text/internal/colltab/weighter.go | 31 - vendor/golang.org/x/text/internal/gen/code.go | 369 - vendor/golang.org/x/text/internal/gen/gen.go | 333 - vendor/golang.org/x/text/internal/tag/tag.go | 100 - .../x/text/internal/triegen/compact.go | 58 - .../x/text/internal/triegen/print.go | 251 - .../x/text/internal/triegen/triegen.go | 494 - vendor/golang.org/x/text/internal/ucd/ucd.go | 371 - vendor/golang.org/x/text/language/Makefile | 16 - vendor/golang.org/x/text/language/common.go | 16 - vendor/golang.org/x/text/language/coverage.go | 197 - vendor/golang.org/x/text/language/doc.go | 102 - vendor/golang.org/x/text/language/gen.go | 1712 --- .../golang.org/x/text/language/gen_common.go | 20 - .../golang.org/x/text/language/gen_index.go | 162 - vendor/golang.org/x/text/language/go1_1.go | 38 - vendor/golang.org/x/text/language/go1_2.go | 11 - vendor/golang.org/x/text/language/index.go | 783 - vendor/golang.org/x/text/language/language.go | 907 -- vendor/golang.org/x/text/language/lookup.go | 396 - vendor/golang.org/x/text/language/match.go | 933 -- vendor/golang.org/x/text/language/parse.go | 859 -- vendor/golang.org/x/text/language/tables.go | 3686 ----- vendor/golang.org/x/text/language/tags.go | 143 - .../x/text/secure/bidirule/bidirule.go | 336 - .../x/text/secure/bidirule/bidirule10.0.0.go | 11 - .../x/text/secure/bidirule/bidirule9.0.0.go | 14 - .../golang.org/x/text/transform/transform.go | 705 - vendor/golang.org/x/text/unicode/bidi/bidi.go | 198 - .../golang.org/x/text/unicode/bidi/bracket.go | 335 - vendor/golang.org/x/text/unicode/bidi/core.go | 1058 -- vendor/golang.org/x/text/unicode/bidi/gen.go | 133 - .../x/text/unicode/bidi/gen_ranges.go | 57 - .../x/text/unicode/bidi/gen_trieval.go | 64 - vendor/golang.org/x/text/unicode/bidi/prop.go | 206 - .../x/text/unicode/bidi/tables10.0.0.go | 1815 --- .../x/text/unicode/bidi/tables9.0.0.go | 1781 --- .../golang.org/x/text/unicode/bidi/trieval.go | 60 - vendor/golang.org/x/text/unicode/cldr/base.go | 105 - vendor/golang.org/x/text/unicode/cldr/cldr.go | 130 - .../golang.org/x/text/unicode/cldr/collate.go | 359 - .../golang.org/x/text/unicode/cldr/decode.go | 171 - .../golang.org/x/text/unicode/cldr/makexml.go | 400 - .../golang.org/x/text/unicode/cldr/resolve.go | 602 - .../golang.org/x/text/unicode/cldr/slice.go | 144 - vendor/golang.org/x/text/unicode/cldr/xml.go | 1494 -- .../x/text/unicode/norm/composition.go | 508 - .../x/text/unicode/norm/forminfo.go | 259 - .../golang.org/x/text/unicode/norm/input.go | 109 - vendor/golang.org/x/text/unicode/norm/iter.go | 457 - .../x/text/unicode/norm/maketables.go | 976 -- .../x/text/unicode/norm/normalize.go | 609 - .../x/text/unicode/norm/readwriter.go | 125 - .../x/text/unicode/norm/tables10.0.0.go | 7653 ---------- .../x/text/unicode/norm/tables9.0.0.go | 7633 ---------- .../x/text/unicode/norm/transform.go | 88 - vendor/golang.org/x/text/unicode/norm/trie.go | 54 - .../golang.org/x/text/unicode/norm/triegen.go | 117 - .../x/text/unicode/rangetable/gen.go | 115 - .../x/text/unicode/rangetable/merge.go | 260 - .../x/text/unicode/rangetable/rangetable.go | 70 - .../x/text/unicode/rangetable/tables10.0.0.go | 6378 -------- .../x/text/unicode/rangetable/tables9.0.0.go | 5737 ------- vendor/golang.org/x/time/AUTHORS | 3 - vendor/golang.org/x/time/CONTRIBUTORS | 3 - vendor/golang.org/x/time/LICENSE | 27 - vendor/golang.org/x/time/PATENTS | 22 - vendor/golang.org/x/time/rate/rate.go | 371 - vendor/google.golang.org/appengine/LICENSE | 202 - .../appengine/internal/api.go | 675 - .../appengine/internal/api_classic.go | 169 - .../appengine/internal/api_common.go | 123 - .../appengine/internal/app_id.go | 28 - .../appengine/internal/base/api_base.pb.go | 308 - .../appengine/internal/base/api_base.proto | 33 - .../internal/datastore/datastore_v3.pb.go | 4367 ------ .../internal/datastore/datastore_v3.proto | 551 - .../appengine/internal/identity.go | 55 - .../appengine/internal/identity_classic.go | 61 - .../appengine/internal/identity_flex.go | 11 - .../appengine/internal/identity_vm.go | 134 - .../appengine/internal/internal.go | 110 - .../appengine/internal/log/log_service.pb.go | 1313 -- .../appengine/internal/log/log_service.proto | 150 - .../appengine/internal/main.go | 16 - .../appengine/internal/main_common.go | 7 - .../appengine/internal/main_vm.go | 69 - .../appengine/internal/metadata.go | 60 - .../appengine/internal/net.go | 56 - .../appengine/internal/regen.sh | 40 - .../internal/remote_api/remote_api.pb.go | 361 - .../internal/remote_api/remote_api.proto | 44 - .../appengine/internal/transaction.go | 115 - .../internal/urlfetch/urlfetch_service.pb.go | 527 - .../internal/urlfetch/urlfetch_service.proto | 64 - .../appengine/urlfetch/urlfetch.go | 210 - .../go-playground/validator.v8/.gitignore | 29 - .../go-playground/validator.v8/LICENSE | 22 - .../go-playground/validator.v8/README.md | 367 - .../go-playground/validator.v8/baked_in.go | 1410 -- .../go-playground/validator.v8/cache.go | 263 - .../go-playground/validator.v8/doc.go | 852 -- .../go-playground/validator.v8/logo.png | Bin 13443 -> 0 bytes .../go-playground/validator.v8/regexes.go | 59 - .../go-playground/validator.v8/util.go | 252 - .../go-playground/validator.v8/validator.go | 782 - vendor/gopkg.in/inf.v0/LICENSE | 28 - vendor/gopkg.in/inf.v0/dec.go | 615 - vendor/gopkg.in/inf.v0/rounder.go | 145 - vendor/gopkg.in/yaml.v2/.travis.yml | 12 - vendor/gopkg.in/yaml.v2/LICENSE | 201 - vendor/gopkg.in/yaml.v2/LICENSE.libyaml | 31 - vendor/gopkg.in/yaml.v2/NOTICE | 13 - vendor/gopkg.in/yaml.v2/README.md | 133 - vendor/gopkg.in/yaml.v2/apic.go | 739 - vendor/gopkg.in/yaml.v2/decode.go | 775 - vendor/gopkg.in/yaml.v2/emitterc.go | 1685 --- vendor/gopkg.in/yaml.v2/encode.go | 390 - vendor/gopkg.in/yaml.v2/go.mod | 5 - vendor/gopkg.in/yaml.v2/parserc.go | 1095 -- vendor/gopkg.in/yaml.v2/readerc.go | 412 - vendor/gopkg.in/yaml.v2/resolve.go | 258 - vendor/gopkg.in/yaml.v2/scannerc.go | 2696 ---- vendor/gopkg.in/yaml.v2/sorter.go | 113 - vendor/gopkg.in/yaml.v2/writerc.go | 26 - vendor/gopkg.in/yaml.v2/yaml.go | 466 - vendor/gopkg.in/yaml.v2/yamlh.go | 738 - vendor/gopkg.in/yaml.v2/yamlprivateh.go | 173 - vendor/k8s.io/api/LICENSE | 202 - .../api/admissionregistration/v1alpha1/doc.go | 25 - .../v1alpha1/generated.pb.go | 1008 -- .../v1alpha1/generated.proto | 107 - .../v1alpha1/register.go | 51 - .../admissionregistration/v1alpha1/types.go | 106 - .../v1alpha1/types_swagger_doc_generated.go | 71 - .../v1alpha1/zz_generated.deepcopy.go | 145 - .../api/admissionregistration/v1beta1/doc.go | 25 - .../v1beta1/generated.pb.go | 2171 --- .../v1beta1/generated.proto | 269 - .../admissionregistration/v1beta1/register.go | 53 - .../admissionregistration/v1beta1/types.go | 306 - .../v1beta1/types_swagger_doc_generated.go | 126 - .../v1beta1/zz_generated.deepcopy.go | 302 - vendor/k8s.io/api/apps/v1/doc.go | 20 - vendor/k8s.io/api/apps/v1/generated.pb.go | 6924 --------- vendor/k8s.io/api/apps/v1/generated.proto | 701 - vendor/k8s.io/api/apps/v1/register.go | 60 - vendor/k8s.io/api/apps/v1/types.go | 826 -- .../apps/v1/types_swagger_doc_generated.go | 365 - .../api/apps/v1/zz_generated.deepcopy.go | 772 - vendor/k8s.io/api/apps/v1beta1/doc.go | 20 - .../k8s.io/api/apps/v1beta1/generated.pb.go | 5275 ------- .../k8s.io/api/apps/v1beta1/generated.proto | 484 - vendor/k8s.io/api/apps/v1beta1/register.go | 58 - vendor/k8s.io/api/apps/v1beta1/types.go | 567 - .../v1beta1/types_swagger_doc_generated.go | 273 - .../api/apps/v1beta1/zz_generated.deepcopy.go | 594 - vendor/k8s.io/api/apps/v1beta2/doc.go | 20 - .../k8s.io/api/apps/v1beta2/generated.pb.go | 7567 ---------- .../k8s.io/api/apps/v1beta2/generated.proto | 752 - vendor/k8s.io/api/apps/v1beta2/register.go | 61 - vendor/k8s.io/api/apps/v1beta2/types.go | 876 -- .../v1beta2/types_swagger_doc_generated.go | 396 - .../api/apps/v1beta2/zz_generated.deepcopy.go | 839 -- .../api/auditregistration/v1alpha1/doc.go | 22 - .../v1alpha1/generated.pb.go | 1685 --- .../v1alpha1/generated.proto | 158 - .../auditregistration/v1alpha1/register.go | 56 - .../api/auditregistration/v1alpha1/types.go | 194 - .../v1alpha1/types_swagger_doc_generated.go | 110 - .../v1alpha1/zz_generated.deepcopy.go | 224 - vendor/k8s.io/api/authentication/v1/doc.go | 21 - .../api/authentication/v1/generated.pb.go | 2233 --- .../api/authentication/v1/generated.proto | 179 - .../k8s.io/api/authentication/v1/register.go | 52 - vendor/k8s.io/api/authentication/v1/types.go | 186 - .../v1/types_swagger_doc_generated.go | 115 - .../v1/zz_generated.deepcopy.go | 244 - .../k8s.io/api/authentication/v1beta1/doc.go | 21 - .../authentication/v1beta1/generated.pb.go | 1388 -- .../authentication/v1beta1/generated.proto | 118 - .../api/authentication/v1beta1/register.go | 51 - .../api/authentication/v1beta1/types.go | 110 - .../v1beta1/types_swagger_doc_generated.go | 74 - .../v1beta1/zz_generated.deepcopy.go | 152 - vendor/k8s.io/api/authorization/v1/doc.go | 22 - .../api/authorization/v1/generated.pb.go | 3511 ----- .../api/authorization/v1/generated.proto | 272 - .../k8s.io/api/authorization/v1/register.go | 55 - vendor/k8s.io/api/authorization/v1/types.go | 268 - .../v1/types_swagger_doc_generated.go | 173 - .../authorization/v1/zz_generated.deepcopy.go | 385 - .../k8s.io/api/authorization/v1beta1/doc.go | 22 - .../api/authorization/v1beta1/generated.pb.go | 3511 ----- .../api/authorization/v1beta1/generated.proto | 272 - .../api/authorization/v1beta1/register.go | 55 - .../k8s.io/api/authorization/v1beta1/types.go | 268 - .../v1beta1/types_swagger_doc_generated.go | 173 - .../v1beta1/zz_generated.deepcopy.go | 385 - vendor/k8s.io/api/autoscaling/v1/doc.go | 20 - .../k8s.io/api/autoscaling/v1/generated.pb.go | 4691 ------ .../k8s.io/api/autoscaling/v1/generated.proto | 415 - vendor/k8s.io/api/autoscaling/v1/register.go | 53 - vendor/k8s.io/api/autoscaling/v1/types.go | 428 - .../v1/types_swagger_doc_generated.go | 250 - .../autoscaling/v1/zz_generated.deepcopy.go | 515 - vendor/k8s.io/api/autoscaling/v2beta1/doc.go | 20 - .../api/autoscaling/v2beta1/generated.pb.go | 4307 ------ .../api/autoscaling/v2beta1/generated.proto | 397 - .../api/autoscaling/v2beta1/register.go | 52 - .../k8s.io/api/autoscaling/v2beta1/types.go | 405 - .../v2beta1/types_swagger_doc_generated.go | 221 - .../v2beta1/zz_generated.deepcopy.go | 466 - vendor/k8s.io/api/autoscaling/v2beta2/doc.go | 20 - .../api/autoscaling/v2beta2/generated.pb.go | 4419 ------ .../api/autoscaling/v2beta2/generated.proto | 369 - .../api/autoscaling/v2beta2/register.go | 50 - .../k8s.io/api/autoscaling/v2beta2/types.go | 393 - .../v2beta2/types_swagger_doc_generated.go | 240 - .../v2beta2/zz_generated.deepcopy.go | 487 - vendor/k8s.io/api/batch/v1/doc.go | 20 - vendor/k8s.io/api/batch/v1/generated.pb.go | 1627 -- vendor/k8s.io/api/batch/v1/generated.proto | 184 - vendor/k8s.io/api/batch/v1/register.go | 52 - vendor/k8s.io/api/batch/v1/types.go | 193 - .../batch/v1/types_swagger_doc_generated.go | 95 - .../api/batch/v1/zz_generated.deepcopy.go | 188 - vendor/k8s.io/api/batch/v1beta1/doc.go | 20 - .../k8s.io/api/batch/v1beta1/generated.pb.go | 1490 -- .../k8s.io/api/batch/v1beta1/generated.proto | 137 - vendor/k8s.io/api/batch/v1beta1/register.go | 53 - vendor/k8s.io/api/batch/v1beta1/types.go | 158 - .../v1beta1/types_swagger_doc_generated.go | 96 - .../batch/v1beta1/zz_generated.deepcopy.go | 194 - vendor/k8s.io/api/batch/v2alpha1/doc.go | 20 - .../k8s.io/api/batch/v2alpha1/generated.pb.go | 1490 -- .../k8s.io/api/batch/v2alpha1/generated.proto | 135 - vendor/k8s.io/api/batch/v2alpha1/register.go | 53 - vendor/k8s.io/api/batch/v2alpha1/types.go | 156 - .../v2alpha1/types_swagger_doc_generated.go | 96 - .../batch/v2alpha1/zz_generated.deepcopy.go | 194 - vendor/k8s.io/api/certificates/v1beta1/doc.go | 22 - .../api/certificates/v1beta1/generated.pb.go | 1676 --- .../api/certificates/v1beta1/generated.proto | 121 - .../api/certificates/v1beta1/register.go | 59 - .../k8s.io/api/certificates/v1beta1/types.go | 155 - .../v1beta1/types_swagger_doc_generated.go | 74 - .../v1beta1/zz_generated.deepcopy.go | 197 - vendor/k8s.io/api/coordination/v1beta1/doc.go | 22 - .../api/coordination/v1beta1/generated.pb.go | 864 -- .../api/coordination/v1beta1/generated.proto | 80 - .../api/coordination/v1beta1/register.go | 53 - .../k8s.io/api/coordination/v1beta1/types.go | 74 - .../v1beta1/types_swagger_doc_generated.go | 63 - .../v1beta1/zz_generated.deepcopy.go | 124 - .../api/core/v1/annotation_key_constants.go | 100 - vendor/k8s.io/api/core/v1/doc.go | 21 - vendor/k8s.io/api/core/v1/generated.proto | 4789 ------ vendor/k8s.io/api/core/v1/objectreference.go | 33 - vendor/k8s.io/api/core/v1/register.go | 99 - vendor/k8s.io/api/core/v1/resource.go | 56 - vendor/k8s.io/api/core/v1/taint.go | 33 - vendor/k8s.io/api/core/v1/toleration.go | 56 - vendor/k8s.io/api/core/v1/types.go | 5360 ------- .../core/v1/types_swagger_doc_generated.go | 2346 --- .../api/core/v1/zz_generated.deepcopy.go | 5430 ------- vendor/k8s.io/api/events/v1beta1/doc.go | 22 - .../k8s.io/api/events/v1beta1/generated.pb.go | 1287 -- .../k8s.io/api/events/v1beta1/generated.proto | 121 - vendor/k8s.io/api/events/v1beta1/register.go | 53 - vendor/k8s.io/api/events/v1beta1/types.go | 122 - .../v1beta1/types_swagger_doc_generated.go | 73 - .../events/v1beta1/zz_generated.deepcopy.go | 117 - vendor/k8s.io/api/extensions/v1beta1/doc.go | 20 - .../api/extensions/v1beta1/generated.pb.go | 12298 ---------------- .../api/extensions/v1beta1/generated.proto | 1160 -- .../k8s.io/api/extensions/v1beta1/register.go | 66 - vendor/k8s.io/api/extensions/v1beta1/types.go | 1360 -- .../v1beta1/types_swagger_doc_generated.go | 640 - .../v1beta1/zz_generated.deepcopy.go | 1445 -- vendor/k8s.io/api/networking/v1/doc.go | 21 - .../k8s.io/api/networking/v1/generated.pb.go | 1849 --- .../k8s.io/api/networking/v1/generated.proto | 195 - vendor/k8s.io/api/networking/v1/register.go | 53 - vendor/k8s.io/api/networking/v1/types.go | 203 - .../v1/types_swagger_doc_generated.go | 113 - .../networking/v1/zz_generated.deepcopy.go | 262 - vendor/k8s.io/api/policy/v1beta1/doc.go | 23 - .../k8s.io/api/policy/v1beta1/generated.pb.go | 4324 ------ .../k8s.io/api/policy/v1beta1/generated.proto | 367 - vendor/k8s.io/api/policy/v1beta1/register.go | 56 - vendor/k8s.io/api/policy/v1beta1/types.go | 454 - .../v1beta1/types_swagger_doc_generated.go | 222 - .../policy/v1beta1/zz_generated.deepcopy.go | 488 - vendor/k8s.io/api/rbac/v1/doc.go | 22 - vendor/k8s.io/api/rbac/v1/generated.pb.go | 2729 ---- vendor/k8s.io/api/rbac/v1/generated.proto | 197 - vendor/k8s.io/api/rbac/v1/register.go | 58 - vendor/k8s.io/api/rbac/v1/types.go | 235 - .../rbac/v1/types_swagger_doc_generated.go | 158 - .../api/rbac/v1/zz_generated.deepcopy.go | 389 - vendor/k8s.io/api/rbac/v1alpha1/doc.go | 22 - .../k8s.io/api/rbac/v1alpha1/generated.pb.go | 2730 ---- .../k8s.io/api/rbac/v1alpha1/generated.proto | 199 - vendor/k8s.io/api/rbac/v1alpha1/register.go | 58 - vendor/k8s.io/api/rbac/v1alpha1/types.go | 237 - .../v1alpha1/types_swagger_doc_generated.go | 158 - .../rbac/v1alpha1/zz_generated.deepcopy.go | 389 - vendor/k8s.io/api/rbac/v1beta1/doc.go | 22 - .../k8s.io/api/rbac/v1beta1/generated.pb.go | 2729 ---- .../k8s.io/api/rbac/v1beta1/generated.proto | 198 - vendor/k8s.io/api/rbac/v1beta1/register.go | 58 - vendor/k8s.io/api/rbac/v1beta1/types.go | 235 - .../v1beta1/types_swagger_doc_generated.go | 158 - .../api/rbac/v1beta1/zz_generated.deepcopy.go | 389 - vendor/k8s.io/api/scheduling/v1alpha1/doc.go | 22 - .../api/scheduling/v1alpha1/generated.pb.go | 621 - .../api/scheduling/v1alpha1/generated.proto | 67 - .../api/scheduling/v1alpha1/register.go | 52 - .../k8s.io/api/scheduling/v1alpha1/types.go | 66 - .../v1alpha1/types_swagger_doc_generated.go | 52 - .../v1alpha1/zz_generated.deepcopy.go | 84 - vendor/k8s.io/api/scheduling/v1beta1/doc.go | 22 - .../api/scheduling/v1beta1/generated.pb.go | 621 - .../api/scheduling/v1beta1/generated.proto | 67 - .../k8s.io/api/scheduling/v1beta1/register.go | 52 - vendor/k8s.io/api/scheduling/v1beta1/types.go | 66 - .../v1beta1/types_swagger_doc_generated.go | 52 - .../v1beta1/zz_generated.deepcopy.go | 84 - vendor/k8s.io/api/settings/v1alpha1/doc.go | 22 - .../api/settings/v1alpha1/generated.pb.go | 910 -- .../api/settings/v1alpha1/generated.proto | 75 - .../k8s.io/api/settings/v1alpha1/register.go | 52 - vendor/k8s.io/api/settings/v1alpha1/types.go | 70 - .../v1alpha1/types_swagger_doc_generated.go | 61 - .../v1alpha1/zz_generated.deepcopy.go | 131 - vendor/k8s.io/api/storage/v1/doc.go | 21 - vendor/k8s.io/api/storage/v1/generated.pb.go | 2246 --- vendor/k8s.io/api/storage/v1/generated.proto | 186 - vendor/k8s.io/api/storage/v1/register.go | 56 - vendor/k8s.io/api/storage/v1/types.go | 211 - .../storage/v1/types_swagger_doc_generated.go | 119 - .../api/storage/v1/zz_generated.deepcopy.go | 268 - vendor/k8s.io/api/storage/v1alpha1/doc.go | 21 - .../api/storage/v1alpha1/generated.pb.go | 1503 -- .../api/storage/v1alpha1/generated.proto | 126 - .../k8s.io/api/storage/v1alpha1/register.go | 50 - vendor/k8s.io/api/storage/v1alpha1/types.go | 126 - .../v1alpha1/types_swagger_doc_generated.go | 93 - .../storage/v1alpha1/zz_generated.deepcopy.go | 174 - vendor/k8s.io/api/storage/v1beta1/doc.go | 21 - .../api/storage/v1beta1/generated.pb.go | 2246 --- .../api/storage/v1beta1/generated.proto | 186 - vendor/k8s.io/api/storage/v1beta1/register.go | 56 - vendor/k8s.io/api/storage/v1beta1/types.go | 211 - .../v1beta1/types_swagger_doc_generated.go | 119 - .../storage/v1beta1/zz_generated.deepcopy.go | 268 - vendor/k8s.io/apimachinery/LICENSE | 202 - .../k8s.io/apimachinery/pkg/api/errors/OWNERS | 24 - .../k8s.io/apimachinery/pkg/api/errors/doc.go | 18 - .../apimachinery/pkg/api/errors/errors.go | 581 - .../k8s.io/apimachinery/pkg/api/meta/OWNERS | 25 - .../k8s.io/apimachinery/pkg/api/meta/doc.go | 19 - .../apimachinery/pkg/api/meta/errors.go | 121 - .../pkg/api/meta/firsthit_restmapper.go | 97 - .../k8s.io/apimachinery/pkg/api/meta/help.go | 205 - .../apimachinery/pkg/api/meta/interfaces.go | 134 - .../k8s.io/apimachinery/pkg/api/meta/lazy.go | 104 - .../k8s.io/apimachinery/pkg/api/meta/meta.go | 650 - .../pkg/api/meta/multirestmapper.go | 210 - .../apimachinery/pkg/api/meta/priority.go | 222 - .../apimachinery/pkg/api/meta/restmapper.go | 518 - .../apimachinery/pkg/api/resource/OWNERS | 16 - .../apimachinery/pkg/api/resource/amount.go | 299 - .../pkg/api/resource/generated.pb.go | 75 - .../pkg/api/resource/generated.proto | 88 - .../apimachinery/pkg/api/resource/math.go | 314 - .../apimachinery/pkg/api/resource/quantity.go | 738 - .../pkg/api/resource/quantity_proto.go | 284 - .../pkg/api/resource/scale_int.go | 95 - .../apimachinery/pkg/api/resource/suffix.go | 198 - .../pkg/api/resource/zz_generated.deepcopy.go | 27 - .../apimachinery/pkg/apis/meta/v1/OWNERS | 31 - .../pkg/apis/meta/v1/controller_ref.go | 54 - .../pkg/apis/meta/v1/conversion.go | 319 - .../apimachinery/pkg/apis/meta/v1/doc.go | 23 - .../apimachinery/pkg/apis/meta/v1/duration.go | 50 - .../pkg/apis/meta/v1/generated.pb.go | 8311 ----------- .../pkg/apis/meta/v1/generated.proto | 879 -- .../pkg/apis/meta/v1/group_version.go | 148 - .../apimachinery/pkg/apis/meta/v1/helpers.go | 234 - .../apimachinery/pkg/apis/meta/v1/labels.go | 55 - .../apimachinery/pkg/apis/meta/v1/meta.go | 170 - .../pkg/apis/meta/v1/micro_time.go | 183 - .../pkg/apis/meta/v1/micro_time_proto.go | 72 - .../apimachinery/pkg/apis/meta/v1/register.go | 97 - .../apimachinery/pkg/apis/meta/v1/time.go | 185 - .../pkg/apis/meta/v1/time_proto.go | 92 - .../apimachinery/pkg/apis/meta/v1/types.go | 1005 -- .../meta/v1/types_swagger_doc_generated.go | 350 - .../pkg/apis/meta/v1/unstructured/helpers.go | 451 - .../apis/meta/v1/unstructured/unstructured.go | 452 - .../meta/v1/unstructured/unstructured_list.go | 188 - .../v1/unstructured/zz_generated.deepcopy.go | 55 - .../apimachinery/pkg/apis/meta/v1/watch.go | 89 - .../pkg/apis/meta/v1/zz_generated.deepcopy.go | 961 -- .../pkg/apis/meta/v1/zz_generated.defaults.go | 32 - .../pkg/apis/meta/v1beta1/conversion.go | 27 - .../pkg/apis/meta/v1beta1/deepcopy.go | 44 - .../apimachinery/pkg/apis/meta/v1beta1/doc.go | 23 - .../pkg/apis/meta/v1beta1/generated.pb.go | 613 - .../pkg/apis/meta/v1beta1/generated.proto | 57 - .../pkg/apis/meta/v1beta1/register.go | 57 - .../pkg/apis/meta/v1beta1/types.go | 161 - .../v1beta1/types_swagger_doc_generated.go | 104 - .../meta/v1beta1/zz_generated.deepcopy.go | 189 - .../meta/v1beta1/zz_generated.defaults.go | 32 - .../apimachinery/pkg/conversion/converter.go | 898 -- .../apimachinery/pkg/conversion/deep_equal.go | 36 - .../k8s.io/apimachinery/pkg/conversion/doc.go | 24 - .../apimachinery/pkg/conversion/helper.go | 39 - .../pkg/conversion/queryparams/convert.go | 198 - .../pkg/conversion/queryparams/doc.go | 19 - vendor/k8s.io/apimachinery/pkg/fields/doc.go | 19 - .../k8s.io/apimachinery/pkg/fields/fields.go | 62 - .../apimachinery/pkg/fields/requirements.go | 30 - .../apimachinery/pkg/fields/selector.go | 476 - vendor/k8s.io/apimachinery/pkg/labels/doc.go | 19 - .../k8s.io/apimachinery/pkg/labels/labels.go | 181 - .../apimachinery/pkg/labels/selector.go | 891 -- .../pkg/labels/zz_generated.deepcopy.go | 42 - .../k8s.io/apimachinery/pkg/runtime/codec.go | 312 - .../apimachinery/pkg/runtime/codec_check.go | 48 - .../apimachinery/pkg/runtime/conversion.go | 113 - .../apimachinery/pkg/runtime/converter.go | 805 - vendor/k8s.io/apimachinery/pkg/runtime/doc.go | 51 - .../apimachinery/pkg/runtime/embedded.go | 142 - .../k8s.io/apimachinery/pkg/runtime/error.go | 122 - .../apimachinery/pkg/runtime/extension.go | 51 - .../apimachinery/pkg/runtime/generated.pb.go | 753 - .../apimachinery/pkg/runtime/generated.proto | 127 - .../k8s.io/apimachinery/pkg/runtime/helper.go | 212 - .../apimachinery/pkg/runtime/interfaces.go | 252 - .../apimachinery/pkg/runtime/register.go | 61 - .../pkg/runtime/schema/generated.pb.go | 63 - .../pkg/runtime/schema/generated.proto | 26 - .../pkg/runtime/schema/group_version.go | 300 - .../pkg/runtime/schema/interfaces.go | 40 - .../k8s.io/apimachinery/pkg/runtime/scheme.go | 754 - .../pkg/runtime/scheme_builder.go | 48 - .../pkg/runtime/serializer/codec_factory.go | 237 - .../pkg/runtime/serializer/json/json.go | 303 - .../pkg/runtime/serializer/json/meta.go | 63 - .../runtime/serializer/negotiated_codec.go | 43 - .../pkg/runtime/serializer/protobuf/doc.go | 18 - .../runtime/serializer/protobuf/protobuf.go | 459 - .../runtime/serializer/protobuf_extension.go | 48 - .../serializer/recognizer/recognizer.go | 127 - .../runtime/serializer/streaming/streaming.go | 137 - .../serializer/versioning/versioning.go | 282 - .../pkg/runtime/swagger_doc_generator.go | 262 - .../k8s.io/apimachinery/pkg/runtime/types.go | 137 - .../apimachinery/pkg/runtime/types_proto.go | 69 - .../pkg/runtime/zz_generated.deepcopy.go | 108 - .../apimachinery/pkg/selection/operator.go | 33 - vendor/k8s.io/apimachinery/pkg/types/doc.go | 18 - .../apimachinery/pkg/types/namespacedname.go | 43 - .../k8s.io/apimachinery/pkg/types/nodename.go | 43 - vendor/k8s.io/apimachinery/pkg/types/patch.go | 28 - vendor/k8s.io/apimachinery/pkg/types/uid.go | 22 - .../apimachinery/pkg/util/clock/clock.go | 348 - .../apimachinery/pkg/util/errors/doc.go | 18 - .../apimachinery/pkg/util/errors/errors.go | 201 - .../apimachinery/pkg/util/framer/framer.go | 167 - .../apimachinery/pkg/util/httpstream/doc.go | 19 - .../pkg/util/httpstream/httpstream.go | 149 - .../pkg/util/httpstream/spdy/connection.go | 145 - .../pkg/util/httpstream/spdy/roundtripper.go | 335 - .../pkg/util/httpstream/spdy/upgrade.go | 107 - .../pkg/util/intstr/generated.pb.go | 362 - .../pkg/util/intstr/generated.proto | 43 - .../apimachinery/pkg/util/intstr/intstr.go | 184 - .../k8s.io/apimachinery/pkg/util/json/json.go | 119 - .../pkg/util/naming/from_stack.go | 93 - .../k8s.io/apimachinery/pkg/util/net/http.go | 442 - .../apimachinery/pkg/util/net/interface.go | 416 - .../apimachinery/pkg/util/net/port_range.go | 149 - .../apimachinery/pkg/util/net/port_split.go | 77 - .../k8s.io/apimachinery/pkg/util/net/util.go | 56 - .../pkg/util/remotecommand/constants.go | 53 - .../apimachinery/pkg/util/runtime/runtime.go | 173 - .../k8s.io/apimachinery/pkg/util/sets/byte.go | 203 - .../k8s.io/apimachinery/pkg/util/sets/doc.go | 20 - .../apimachinery/pkg/util/sets/empty.go | 23 - .../k8s.io/apimachinery/pkg/util/sets/int.go | 203 - .../apimachinery/pkg/util/sets/int64.go | 203 - .../apimachinery/pkg/util/sets/string.go | 203 - .../pkg/util/validation/field/errors.go | 259 - .../pkg/util/validation/field/path.go | 91 - .../pkg/util/validation/validation.go | 407 - .../apimachinery/pkg/util/yaml/decoder.go | 346 - vendor/k8s.io/apimachinery/pkg/version/doc.go | 20 - .../apimachinery/pkg/version/helpers.go | 88 - .../k8s.io/apimachinery/pkg/version/types.go | 37 - vendor/k8s.io/apimachinery/pkg/watch/doc.go | 19 - .../k8s.io/apimachinery/pkg/watch/filter.go | 105 - vendor/k8s.io/apimachinery/pkg/watch/mux.go | 260 - .../apimachinery/pkg/watch/streamwatcher.go | 119 - vendor/k8s.io/apimachinery/pkg/watch/watch.go | 317 - .../pkg/watch/zz_generated.deepcopy.go | 40 - .../third_party/forked/golang/netutil/addr.go | 27 - .../forked/golang/reflect/deep_equal.go | 388 - vendor/k8s.io/client-go/LICENSE | 202 - .../client-go/discovery/cached_discovery.go | 295 - .../client-go/discovery/discovery_client.go | 472 - vendor/k8s.io/client-go/discovery/doc.go | 19 - vendor/k8s.io/client-go/discovery/helper.go | 125 - .../client-go/discovery/round_tripper.go | 62 - .../k8s.io/client-go/kubernetes/clientset.go | 668 - vendor/k8s.io/client-go/kubernetes/doc.go | 20 - vendor/k8s.io/client-go/kubernetes/import.go | 19 - .../k8s.io/client-go/kubernetes/scheme/doc.go | 20 - .../client-go/kubernetes/scheme/register.go | 118 - .../v1alpha1/admissionregistration_client.go | 90 - .../admissionregistration/v1alpha1/doc.go | 20 - .../v1alpha1/generated_expansion.go | 21 - .../v1alpha1/initializerconfiguration.go | 164 - .../v1beta1/admissionregistration_client.go | 95 - .../admissionregistration/v1beta1/doc.go | 20 - .../v1beta1/generated_expansion.go | 23 - .../v1beta1/mutatingwebhookconfiguration.go | 164 - .../v1beta1/validatingwebhookconfiguration.go | 164 - .../kubernetes/typed/apps/v1/apps_client.go | 110 - .../typed/apps/v1/controllerrevision.go | 174 - .../kubernetes/typed/apps/v1/daemonset.go | 191 - .../kubernetes/typed/apps/v1/deployment.go | 223 - .../client-go/kubernetes/typed/apps/v1/doc.go | 20 - .../typed/apps/v1/generated_expansion.go | 29 - .../kubernetes/typed/apps/v1/replicaset.go | 223 - .../kubernetes/typed/apps/v1/statefulset.go | 223 - .../typed/apps/v1beta1/apps_client.go | 100 - .../typed/apps/v1beta1/controllerrevision.go | 174 - .../typed/apps/v1beta1/deployment.go | 191 - .../kubernetes/typed/apps/v1beta1/doc.go | 20 - .../typed/apps/v1beta1/generated_expansion.go | 25 - .../typed/apps/v1beta1/statefulset.go | 191 - .../typed/apps/v1beta2/apps_client.go | 110 - .../typed/apps/v1beta2/controllerrevision.go | 174 - .../typed/apps/v1beta2/daemonset.go | 191 - .../typed/apps/v1beta2/deployment.go | 191 - .../kubernetes/typed/apps/v1beta2/doc.go | 20 - .../typed/apps/v1beta2/generated_expansion.go | 29 - .../typed/apps/v1beta2/replicaset.go | 191 - .../typed/apps/v1beta2/statefulset.go | 222 - .../v1alpha1/auditregistration_client.go | 90 - .../auditregistration/v1alpha1/auditsink.go | 164 - .../typed/auditregistration/v1alpha1/doc.go | 20 - .../v1alpha1/generated_expansion.go | 21 - .../v1/authentication_client.go | 90 - .../kubernetes/typed/authentication/v1/doc.go | 20 - .../authentication/v1/generated_expansion.go | 19 - .../typed/authentication/v1/tokenreview.go | 46 - .../v1/tokenreview_expansion.go | 35 - .../v1beta1/authentication_client.go | 90 - .../typed/authentication/v1beta1/doc.go | 20 - .../v1beta1/generated_expansion.go | 19 - .../authentication/v1beta1/tokenreview.go | 46 - .../v1beta1/tokenreview_expansion.go | 35 - .../authorization/v1/authorization_client.go | 105 - .../kubernetes/typed/authorization/v1/doc.go | 20 - .../authorization/v1/generated_expansion.go | 19 - .../v1/localsubjectaccessreview.go | 48 - .../v1/localsubjectaccessreview_expansion.go | 36 - .../v1/selfsubjectaccessreview.go | 46 - .../v1/selfsubjectaccessreview_expansion.go | 35 - .../v1/selfsubjectrulesreview.go | 46 - .../v1/selfsubjectrulesreview_expansion.go | 35 - .../authorization/v1/subjectaccessreview.go | 46 - .../v1/subjectaccessreview_expansion.go | 36 - .../v1beta1/authorization_client.go | 105 - .../typed/authorization/v1beta1/doc.go | 20 - .../v1beta1/generated_expansion.go | 19 - .../v1beta1/localsubjectaccessreview.go | 48 - .../localsubjectaccessreview_expansion.go | 36 - .../v1beta1/selfsubjectaccessreview.go | 46 - .../selfsubjectaccessreview_expansion.go | 35 - .../v1beta1/selfsubjectrulesreview.go | 46 - .../selfsubjectrulesreview_expansion.go | 35 - .../v1beta1/subjectaccessreview.go | 46 - .../v1beta1/subjectaccessreview_expansion.go | 36 - .../autoscaling/v1/autoscaling_client.go | 90 - .../kubernetes/typed/autoscaling/v1/doc.go | 20 - .../autoscaling/v1/generated_expansion.go | 21 - .../autoscaling/v1/horizontalpodautoscaler.go | 191 - .../autoscaling/v2beta1/autoscaling_client.go | 90 - .../typed/autoscaling/v2beta1/doc.go | 20 - .../v2beta1/generated_expansion.go | 21 - .../v2beta1/horizontalpodautoscaler.go | 191 - .../autoscaling/v2beta2/autoscaling_client.go | 90 - .../typed/autoscaling/v2beta2/doc.go | 20 - .../v2beta2/generated_expansion.go | 21 - .../v2beta2/horizontalpodautoscaler.go | 191 - .../kubernetes/typed/batch/v1/batch_client.go | 90 - .../kubernetes/typed/batch/v1/doc.go | 20 - .../typed/batch/v1/generated_expansion.go | 21 - .../kubernetes/typed/batch/v1/job.go | 191 - .../typed/batch/v1beta1/batch_client.go | 90 - .../kubernetes/typed/batch/v1beta1/cronjob.go | 191 - .../kubernetes/typed/batch/v1beta1/doc.go | 20 - .../batch/v1beta1/generated_expansion.go | 21 - .../typed/batch/v2alpha1/batch_client.go | 90 - .../typed/batch/v2alpha1/cronjob.go | 191 - .../kubernetes/typed/batch/v2alpha1/doc.go | 20 - .../batch/v2alpha1/generated_expansion.go | 21 - .../v1beta1/certificates_client.go | 90 - .../v1beta1/certificatesigningrequest.go | 180 - .../certificatesigningrequest_expansion.go | 37 - .../typed/certificates/v1beta1/doc.go | 20 - .../v1beta1/generated_expansion.go | 19 - .../v1beta1/coordination_client.go | 90 - .../typed/coordination/v1beta1/doc.go | 20 - .../v1beta1/generated_expansion.go | 21 - .../typed/coordination/v1beta1/lease.go | 174 - .../typed/core/v1/componentstatus.go | 164 - .../kubernetes/typed/core/v1/configmap.go | 174 - .../kubernetes/typed/core/v1/core_client.go | 165 - .../client-go/kubernetes/typed/core/v1/doc.go | 20 - .../kubernetes/typed/core/v1/endpoints.go | 174 - .../kubernetes/typed/core/v1/event.go | 174 - .../typed/core/v1/event_expansion.go | 164 - .../typed/core/v1/generated_expansion.go | 39 - .../kubernetes/typed/core/v1/limitrange.go | 174 - .../kubernetes/typed/core/v1/namespace.go | 164 - .../typed/core/v1/namespace_expansion.go | 31 - .../kubernetes/typed/core/v1/node.go | 180 - .../typed/core/v1/node_expansion.go | 43 - .../typed/core/v1/persistentvolume.go | 180 - .../typed/core/v1/persistentvolumeclaim.go | 191 - .../client-go/kubernetes/typed/core/v1/pod.go | 191 - .../kubernetes/typed/core/v1/pod_expansion.go | 45 - .../kubernetes/typed/core/v1/podtemplate.go | 174 - .../typed/core/v1/replicationcontroller.go | 223 - .../kubernetes/typed/core/v1/resourcequota.go | 191 - .../kubernetes/typed/core/v1/secret.go | 174 - .../kubernetes/typed/core/v1/service.go | 174 - .../typed/core/v1/service_expansion.go | 41 - .../typed/core/v1/serviceaccount.go | 174 - .../typed/core/v1/serviceaccount_expansion.go | 41 - .../kubernetes/typed/events/v1beta1/doc.go | 20 - .../kubernetes/typed/events/v1beta1/event.go | 174 - .../typed/events/v1beta1/events_client.go | 90 - .../events/v1beta1/generated_expansion.go | 21 - .../typed/extensions/v1beta1/daemonset.go | 191 - .../typed/extensions/v1beta1/deployment.go | 222 - .../v1beta1/deployment_expansion.go | 29 - .../typed/extensions/v1beta1/doc.go | 20 - .../extensions/v1beta1/extensions_client.go | 110 - .../extensions/v1beta1/generated_expansion.go | 27 - .../typed/extensions/v1beta1/ingress.go | 191 - .../extensions/v1beta1/podsecuritypolicy.go | 164 - .../typed/extensions/v1beta1/replicaset.go | 222 - .../kubernetes/typed/networking/v1/doc.go | 20 - .../networking/v1/generated_expansion.go | 21 - .../typed/networking/v1/networking_client.go | 90 - .../typed/networking/v1/networkpolicy.go | 174 - .../kubernetes/typed/policy/v1beta1/doc.go | 20 - .../typed/policy/v1beta1/eviction.go | 48 - .../policy/v1beta1/eviction_expansion.go | 38 - .../policy/v1beta1/generated_expansion.go | 23 - .../policy/v1beta1/poddisruptionbudget.go | 191 - .../typed/policy/v1beta1/podsecuritypolicy.go | 164 - .../typed/policy/v1beta1/policy_client.go | 100 - .../kubernetes/typed/rbac/v1/clusterrole.go | 164 - .../typed/rbac/v1/clusterrolebinding.go | 164 - .../client-go/kubernetes/typed/rbac/v1/doc.go | 20 - .../typed/rbac/v1/generated_expansion.go | 27 - .../kubernetes/typed/rbac/v1/rbac_client.go | 105 - .../kubernetes/typed/rbac/v1/role.go | 174 - .../kubernetes/typed/rbac/v1/rolebinding.go | 174 - .../typed/rbac/v1alpha1/clusterrole.go | 164 - .../typed/rbac/v1alpha1/clusterrolebinding.go | 164 - .../kubernetes/typed/rbac/v1alpha1/doc.go | 20 - .../rbac/v1alpha1/generated_expansion.go | 27 - .../typed/rbac/v1alpha1/rbac_client.go | 105 - .../kubernetes/typed/rbac/v1alpha1/role.go | 174 - .../typed/rbac/v1alpha1/rolebinding.go | 174 - .../typed/rbac/v1beta1/clusterrole.go | 164 - .../typed/rbac/v1beta1/clusterrolebinding.go | 164 - .../kubernetes/typed/rbac/v1beta1/doc.go | 20 - .../typed/rbac/v1beta1/generated_expansion.go | 27 - .../typed/rbac/v1beta1/rbac_client.go | 105 - .../kubernetes/typed/rbac/v1beta1/role.go | 174 - .../typed/rbac/v1beta1/rolebinding.go | 174 - .../typed/scheduling/v1alpha1/doc.go | 20 - .../v1alpha1/generated_expansion.go | 21 - .../scheduling/v1alpha1/priorityclass.go | 164 - .../scheduling/v1alpha1/scheduling_client.go | 90 - .../typed/scheduling/v1beta1/doc.go | 20 - .../scheduling/v1beta1/generated_expansion.go | 21 - .../typed/scheduling/v1beta1/priorityclass.go | 164 - .../scheduling/v1beta1/scheduling_client.go | 90 - .../kubernetes/typed/settings/v1alpha1/doc.go | 20 - .../settings/v1alpha1/generated_expansion.go | 21 - .../typed/settings/v1alpha1/podpreset.go | 174 - .../settings/v1alpha1/settings_client.go | 90 - .../kubernetes/typed/storage/v1/doc.go | 20 - .../typed/storage/v1/generated_expansion.go | 23 - .../typed/storage/v1/storage_client.go | 95 - .../typed/storage/v1/storageclass.go | 164 - .../typed/storage/v1/volumeattachment.go | 180 - .../kubernetes/typed/storage/v1alpha1/doc.go | 20 - .../storage/v1alpha1/generated_expansion.go | 21 - .../typed/storage/v1alpha1/storage_client.go | 90 - .../storage/v1alpha1/volumeattachment.go | 180 - .../kubernetes/typed/storage/v1beta1/doc.go | 20 - .../storage/v1beta1/generated_expansion.go | 23 - .../typed/storage/v1beta1/storage_client.go | 95 - .../typed/storage/v1beta1/storageclass.go | 164 - .../typed/storage/v1beta1/volumeattachment.go | 180 - .../pkg/apis/clientauthentication/OWNERS | 7 - .../pkg/apis/clientauthentication/doc.go | 20 - .../pkg/apis/clientauthentication/register.go | 50 - .../pkg/apis/clientauthentication/types.go | 77 - .../apis/clientauthentication/v1alpha1/doc.go | 24 - .../clientauthentication/v1alpha1/register.go | 55 - .../clientauthentication/v1alpha1/types.go | 78 - .../v1alpha1/zz_generated.conversion.go | 176 - .../v1alpha1/zz_generated.deepcopy.go | 128 - .../v1alpha1/zz_generated.defaults.go | 32 - .../v1beta1/conversion.go | 26 - .../apis/clientauthentication/v1beta1/doc.go | 24 - .../clientauthentication/v1beta1/register.go | 55 - .../clientauthentication/v1beta1/types.go | 59 - .../v1beta1/zz_generated.conversion.go | 142 - .../v1beta1/zz_generated.deepcopy.go | 92 - .../v1beta1/zz_generated.defaults.go | 32 - .../zz_generated.deepcopy.go | 128 - .../client-go/pkg/version/.gitattributes | 1 - vendor/k8s.io/client-go/pkg/version/base.go | 63 - vendor/k8s.io/client-go/pkg/version/def.bzl | 38 - vendor/k8s.io/client-go/pkg/version/doc.go | 21 - .../k8s.io/client-go/pkg/version/version.go | 42 - .../plugin/pkg/client/auth/exec/exec.go | 361 - vendor/k8s.io/client-go/rest/OWNERS | 24 - vendor/k8s.io/client-go/rest/client.go | 258 - vendor/k8s.io/client-go/rest/config.go | 466 - vendor/k8s.io/client-go/rest/plugin.go | 73 - vendor/k8s.io/client-go/rest/request.go | 1201 -- vendor/k8s.io/client-go/rest/token_source.go | 140 - vendor/k8s.io/client-go/rest/transport.go | 116 - vendor/k8s.io/client-go/rest/url_utils.go | 97 - vendor/k8s.io/client-go/rest/urlbackoff.go | 107 - vendor/k8s.io/client-go/rest/watch/decoder.go | 72 - vendor/k8s.io/client-go/rest/watch/encoder.go | 56 - .../client-go/rest/zz_generated.deepcopy.go | 52 - vendor/k8s.io/client-go/tools/auth/OWNERS | 7 - .../k8s.io/client-go/tools/auth/clientauth.go | 125 - .../client-go/tools/clientcmd/api/doc.go | 19 - .../client-go/tools/clientcmd/api/helpers.go | 188 - .../tools/clientcmd/api/latest/latest.go | 61 - .../client-go/tools/clientcmd/api/register.go | 46 - .../client-go/tools/clientcmd/api/types.go | 218 - .../tools/clientcmd/api/v1/conversion.go | 244 - .../client-go/tools/clientcmd/api/v1/doc.go | 19 - .../tools/clientcmd/api/v1/register.go | 56 - .../client-go/tools/clientcmd/api/v1/types.go | 203 - .../clientcmd/api/v1/zz_generated.deepcopy.go | 348 - .../clientcmd/api/zz_generated.deepcopy.go | 324 - .../client-go/tools/clientcmd/auth_loaders.go | 111 - .../tools/clientcmd/client_config.go | 568 - .../client-go/tools/clientcmd/config.go | 490 - .../k8s.io/client-go/tools/clientcmd/doc.go | 37 - .../k8s.io/client-go/tools/clientcmd/flag.go | 49 - .../client-go/tools/clientcmd/helpers.go | 35 - .../client-go/tools/clientcmd/loader.go | 633 - .../tools/clientcmd/merged_client_builder.go | 168 - .../client-go/tools/clientcmd/overrides.go | 247 - .../client-go/tools/clientcmd/validation.go | 298 - vendor/k8s.io/client-go/tools/metrics/OWNERS | 7 - .../k8s.io/client-go/tools/metrics/metrics.go | 61 - .../k8s.io/client-go/tools/reference/ref.go | 126 - .../client-go/tools/remotecommand/doc.go | 20 - .../tools/remotecommand/errorstream.go | 55 - .../client-go/tools/remotecommand/reader.go | 41 - .../tools/remotecommand/remotecommand.go | 142 - .../client-go/tools/remotecommand/resize.go | 33 - .../client-go/tools/remotecommand/v1.go | 160 - .../client-go/tools/remotecommand/v2.go | 195 - .../client-go/tools/remotecommand/v3.go | 111 - .../client-go/tools/remotecommand/v4.go | 119 - vendor/k8s.io/client-go/transport/OWNERS | 7 - vendor/k8s.io/client-go/transport/cache.go | 117 - vendor/k8s.io/client-go/transport/config.go | 110 - .../client-go/transport/round_trippers.go | 531 - .../k8s.io/client-go/transport/spdy/spdy.go | 94 - .../k8s.io/client-go/transport/transport.go | 169 - vendor/k8s.io/client-go/util/cert/OWNERS | 7 - vendor/k8s.io/client-go/util/cert/cert.go | 269 - vendor/k8s.io/client-go/util/cert/csr.go | 75 - vendor/k8s.io/client-go/util/cert/io.go | 193 - vendor/k8s.io/client-go/util/cert/pem.go | 269 - .../util/connrotation/connrotation.go | 105 - vendor/k8s.io/client-go/util/exec/exec.go | 52 - .../client-go/util/flowcontrol/backoff.go | 149 - .../client-go/util/flowcontrol/throttle.go | 143 - .../k8s.io/client-go/util/homedir/homedir.go | 47 - .../k8s.io/client-go/util/integer/integer.go | 67 - vendor/k8s.io/klog/.travis.yml | 14 - vendor/k8s.io/klog/CONTRIBUTING.md | 31 - vendor/k8s.io/klog/LICENSE | 191 - vendor/k8s.io/klog/OWNERS | 11 - vendor/k8s.io/klog/README.md | 51 - vendor/k8s.io/klog/RELEASE.md | 9 - vendor/k8s.io/klog/SECURITY_CONTACTS | 20 - vendor/k8s.io/klog/klog.go | 1239 -- vendor/k8s.io/klog/klog_file.go | 126 - vendor/sigs.k8s.io/yaml/.gitignore | 20 - vendor/sigs.k8s.io/yaml/.travis.yml | 14 - vendor/sigs.k8s.io/yaml/CONTRIBUTING.md | 31 - vendor/sigs.k8s.io/yaml/LICENSE | 50 - vendor/sigs.k8s.io/yaml/OWNERS | 25 - vendor/sigs.k8s.io/yaml/README.md | 121 - vendor/sigs.k8s.io/yaml/RELEASE.md | 9 - vendor/sigs.k8s.io/yaml/SECURITY_CONTACTS | 17 - vendor/sigs.k8s.io/yaml/code-of-conduct.md | 3 - vendor/sigs.k8s.io/yaml/fields.go | 502 - vendor/sigs.k8s.io/yaml/yaml.go | 319 - vendor/sigs.k8s.io/yaml/yaml_go110.go | 14 - 2332 files changed, 893 insertions(+), 692567 deletions(-) delete mode 100644 Gopkg.lock delete mode 100644 Gopkg.toml create mode 100644 Makefile delete mode 100644 README.md delete mode 100644 cmd/k8s-webshell.go delete mode 100644 configs/devconfig.yaml delete mode 100755 configs/inside_finup.crt delete mode 100755 configs/inside_finup.key delete mode 100644 doc/deploy/k8s/k8s-webshell-deployment.yaml delete mode 100644 doc/deploy/k8s/k8s-webshell-svc.yaml delete mode 100644 doc/imgs/k8s-webshell.gif delete mode 100644 docker-compose.yaml rename {doc => docs}/demo/client/index.html (99%) rename {doc => docs}/demo/client/index.html-bak (100%) rename {doc => docs}/demo/client/node_modules/xterm/.devcontainer/devcontainer.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/LICENSE (100%) rename {doc => docs}/demo/client/node_modules/xterm/README.md (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/attach/attach.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/attach/attach.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/fit/fit.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/fit/fit.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.css (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/search/search.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/search/search.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/terminado/terminado.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/terminado/terminado.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/webLinks/webLinks.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/webLinks/webLinks.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/winptyCompat/winptyCompat.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/winptyCompat/winptyCompat.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/zmodem/zmodem.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/addons/zmodem/zmodem.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/xterm.css (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/xterm.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/dist/xterm.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/gulpfile.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/AccessibilityManager.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/AccessibilityManager.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Buffer.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Buffer.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/BufferLine.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/BufferLine.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/BufferReflow.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/BufferReflow.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/BufferSet.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/BufferSet.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/CharMeasure.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/CharMeasure.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/CharWidth.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/CharWidth.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Clipboard.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Clipboard.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/CompositionHelper.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/CompositionHelper.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/EscapeSequenceParser.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/EscapeSequenceParser.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/InputHandler.api.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/InputHandler.api.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/InputHandler.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/InputHandler.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Linkifier.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Linkifier.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/MouseHelper.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/MouseHelper.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/MouseZoneManager.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/MouseZoneManager.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/SelectionManager.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/SelectionManager.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/SelectionModel.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/SelectionModel.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/SoundManager.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/SoundManager.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Strings.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Strings.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Terminal.integration.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Terminal.integration.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Terminal.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Terminal.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Types.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Types.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Viewport.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/Viewport.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/WindowsMode.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/WindowsMode.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/attach/attach.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/attach/attach.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/attach/attach.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/fit/fit.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/fit/fit.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/fit/fit.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.css (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/search/Interfaces.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/search/Interfaces.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/search/Interfaces.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/search/search.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/search/search.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/search/search.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/terminado/terminado.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/terminado/terminado.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/terminado/terminado.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/CircularList.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/CircularList.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/CircularList.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Clone.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Clone.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Clone.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/EventEmitter.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/EventEmitter.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/EventEmitter.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/EventEmitter2.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/EventEmitter2.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/EventEmitter2.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Lifecycle.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Lifecycle.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Lifecycle.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Platform.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Platform.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Platform.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Types.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Types.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/Types.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/Platform.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/Platform.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/Types.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/Types.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/Types.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/buffer/Marker.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/buffer/Marker.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/buffer/Marker.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/data/Charsets.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/data/Charsets.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/data/Charsets.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/input/Keyboard.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/input/Keyboard.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/input/Keyboard.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/input/TextDecoder.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/input/TextDecoder.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/core/input/TextDecoder.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/handlers/AltClickHandler.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/handlers/AltClickHandler.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/public/AddonManager.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/public/AddonManager.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/public/Terminal.api.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/public/Terminal.api.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/public/Terminal.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/public/Terminal.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/BaseRenderLayer.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/BaseRenderLayer.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/CharacterJoinerRegistry.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/CharacterJoinerRegistry.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/ColorManager.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/ColorManager.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/CursorRenderLayer.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/CursorRenderLayer.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/GridCache.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/GridCache.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/LinkRenderLayer.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/LinkRenderLayer.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/RenderCoordinator.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/RenderCoordinator.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/Renderer.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/Renderer.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/SelectionRenderLayer.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/SelectionRenderLayer.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/TextRenderLayer.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/TextRenderLayer.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/Types.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/Types.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/BaseCharAtlas.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/BaseCharAtlas.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasCache.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasCache.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasGenerator.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasGenerator.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasUtils.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasUtils.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/DynamicCharAtlas.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/DynamicCharAtlas.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/LRUMap.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/LRUMap.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/NoneCharAtlas.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/NoneCharAtlas.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/StaticCharAtlas.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/StaticCharAtlas.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/Types.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/atlas/Types.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/dom/DomRenderer.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/dom/DomRenderer.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/dom/DomRendererRowFactory.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/renderer/dom/DomRendererRowFactory.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/CharMeasure.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/CharMeasure.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/Clipboard.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/Clipboard.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/ColorManager.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/ColorManager.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/ColorManager.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/Lifecycle.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/Lifecycle.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/Lifecycle.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/MouseHelper.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/MouseHelper.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/MouseZoneManager.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/MouseZoneManager.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/Types.d.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/Types.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/ui/Types.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/xterm.css (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/xterm.js (100%) rename {doc => docs}/demo/client/node_modules/xterm/lib/xterm.js.map (100%) rename {doc => docs}/demo/client/node_modules/xterm/package.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/AccessibilityManager.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/Buffer.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/BufferLine.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/BufferReflow.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/BufferSet.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/CharMeasure.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/CharWidth.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/Clipboard.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/CompositionHelper.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/EscapeSequenceParser.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/InputHandler.api.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/InputHandler.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/Linkifier.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/MouseHelper.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/MouseZoneManager.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/SelectionManager.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/SelectionModel.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/SoundManager.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/Strings.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/Terminal.integration.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/Terminal.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/Types.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/Viewport.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/WindowsMode.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/attach/Interfaces.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/attach/attach.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/attach/package.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/attach/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/fit/README.md (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/fit/fit.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/fit/package.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/fit/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/fullscreen/fullscreen.css (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/fullscreen/fullscreen.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/fullscreen/package.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/fullscreen/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/search/Interfaces.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/search/SearchHelper.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/search/package.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/search/search.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/search/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/terminado/Interfaces.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/terminado/package.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/terminado/terminado.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/terminado/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/webLinks/package.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/webLinks/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/webLinks/webLinks.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/winptyCompat/Interfaces.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/winptyCompat/package.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/winptyCompat/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/winptyCompat/winptyCompat.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/zmodem/package.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/zmodem/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/addons/zmodem/zmodem.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/common/CircularList.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/common/Clone.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/common/EventEmitter.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/common/EventEmitter2.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/common/Lifecycle.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/common/Platform.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/common/TypedArrayUtils.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/common/Types.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/common/data/EscapeSequences.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/common/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/core/Platform.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/core/Types.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/core/buffer/BufferLine.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/core/buffer/BufferReflow.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/core/buffer/Marker.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/core/data/Charsets.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/core/input/Keyboard.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/core/input/TextDecoder.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/core/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/handlers/AltClickHandler.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/public/AddonManager.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/public/Terminal.api.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/public/Terminal.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/BaseRenderLayer.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/CharacterJoinerRegistry.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/ColorManager.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/CursorRenderLayer.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/GridCache.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/LinkRenderLayer.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/RenderCoordinator.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/Renderer.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/SelectionRenderLayer.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/TextRenderLayer.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/Types.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/atlas/BaseCharAtlas.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasCache.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasGenerator.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasUtils.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/atlas/DynamicCharAtlas.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/atlas/LRUMap.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/atlas/NoneCharAtlas.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/atlas/StaticCharAtlas.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/atlas/Types.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/dom/DomRenderer.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/renderer/dom/DomRendererRowFactory.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/tsconfig-base.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/tsconfig-library-base.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/tsconfig.all.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/ui/CharMeasure.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/ui/Clipboard.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/ui/ColorManager.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/ui/Lifecycle.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/ui/MouseHelper.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/ui/MouseZoneManager.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/ui/RenderDebouncer.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/ui/ScreenDprMonitor.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/ui/Types.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/ui/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/xterm.css (100%) rename {doc => docs}/demo/client/node_modules/xterm/src/xterm.ts (100%) rename {doc => docs}/demo/client/node_modules/xterm/tsconfig.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/tslint.json (100%) rename {doc => docs}/demo/client/node_modules/xterm/typings/xterm.d.ts (100%) rename {doc => docs}/demo/client/package-lock.json (100%) rename {doc/deploy/k8s => docs/deploy/kubernetes}/k8s-webshell-clusterrole.yaml (100%) rename {doc/deploy/k8s => docs/deploy/kubernetes}/k8s-webshell-clusterrolebinding.yaml (100%) create mode 100644 docs/deploy/kubernetes/k8s-webshell-configmap.yaml create mode 100644 docs/deploy/kubernetes/k8s-webshell-deployment.yaml rename {doc/deploy/k8s => docs/deploy/kubernetes}/k8s-webshell-sa.yaml (100%) create mode 100644 docs/deploy/kubernetes/k8s-webshell-secret.yaml create mode 100644 docs/deploy/kubernetes/k8s-webshell-svc.yaml delete mode 100644 pkg/setting/setting.go create mode 100644 src/go.mod create mode 100644 src/go.sum create mode 100644 src/webshell/cmd/root.go rename {pkg => src/webshell}/common/common.go (70%) rename {pkg => src/webshell/common}/e/code.go (100%) rename {pkg => src/webshell/common}/e/msg.go (99%) rename {pkg/utils => src/webshell/common}/jwt.go (86%) create mode 100644 src/webshell/config/config.go rename {pkg/api => src/webshell/controllers}/auth.go (77%) create mode 100644 src/webshell/controllers/demo.go rename pkg/api/controller.go => src/webshell/controllers/ws.go (85%) create mode 100644 src/webshell/main.go rename {middleware => src/webshell/middlewares}/jwt/jwt.go (89%) rename routers/router.go => src/webshell/router/routers.go (54%) create mode 100644 src/webshell/server/server.go rename {pkg => src/webshell}/utils/logger.go (74%) rename {pkg => src/webshell}/ws/connection.go (99%) delete mode 100644 vendor/github.com/beorn7/perks/LICENSE delete mode 100644 vendor/github.com/beorn7/perks/quantile/exampledata.txt delete mode 100644 vendor/github.com/beorn7/perks/quantile/stream.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/.gitignore delete mode 100644 vendor/github.com/dgrijalva/jwt-go/.travis.yml delete mode 100644 vendor/github.com/dgrijalva/jwt-go/LICENSE delete mode 100644 vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md delete mode 100644 vendor/github.com/dgrijalva/jwt-go/README.md delete mode 100644 vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md delete mode 100644 vendor/github.com/dgrijalva/jwt-go/claims.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/doc.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/ecdsa.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/errors.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/hmac.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/map_claims.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/none.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/parser.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/rsa.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/rsa_pss.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/rsa_utils.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/signing_method.go delete mode 100644 vendor/github.com/dgrijalva/jwt-go/token.go delete mode 100644 vendor/github.com/docker/spdystream/CONTRIBUTING.md delete mode 100644 vendor/github.com/docker/spdystream/LICENSE delete mode 100644 vendor/github.com/docker/spdystream/LICENSE.docs delete mode 100644 vendor/github.com/docker/spdystream/MAINTAINERS delete mode 100644 vendor/github.com/docker/spdystream/README.md delete mode 100644 vendor/github.com/docker/spdystream/connection.go delete mode 100644 vendor/github.com/docker/spdystream/handlers.go delete mode 100644 vendor/github.com/docker/spdystream/priority.go delete mode 100644 vendor/github.com/docker/spdystream/spdy/dictionary.go delete mode 100644 vendor/github.com/docker/spdystream/spdy/read.go delete mode 100644 vendor/github.com/docker/spdystream/spdy/types.go delete mode 100644 vendor/github.com/docker/spdystream/spdy/write.go delete mode 100644 vendor/github.com/docker/spdystream/stream.go delete mode 100644 vendor/github.com/docker/spdystream/utils.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/.editorconfig delete mode 100644 vendor/github.com/fsnotify/fsnotify/.gitignore delete mode 100644 vendor/github.com/fsnotify/fsnotify/.travis.yml delete mode 100644 vendor/github.com/fsnotify/fsnotify/AUTHORS delete mode 100644 vendor/github.com/fsnotify/fsnotify/CHANGELOG.md delete mode 100644 vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md delete mode 100644 vendor/github.com/fsnotify/fsnotify/LICENSE delete mode 100644 vendor/github.com/fsnotify/fsnotify/README.md delete mode 100644 vendor/github.com/fsnotify/fsnotify/fen.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/fsnotify.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/inotify.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/inotify_poller.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/kqueue.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go delete mode 100644 vendor/github.com/fsnotify/fsnotify/windows.go delete mode 100644 vendor/github.com/gin-contrib/sse/.travis.yml delete mode 100644 vendor/github.com/gin-contrib/sse/LICENSE delete mode 100644 vendor/github.com/gin-contrib/sse/README.md delete mode 100644 vendor/github.com/gin-contrib/sse/sse-decoder.go delete mode 100644 vendor/github.com/gin-contrib/sse/sse-encoder.go delete mode 100644 vendor/github.com/gin-contrib/sse/writer.go delete mode 100644 vendor/github.com/gin-gonic/gin/.gitignore delete mode 100644 vendor/github.com/gin-gonic/gin/.travis.yml delete mode 100644 vendor/github.com/gin-gonic/gin/AUTHORS.md delete mode 100644 vendor/github.com/gin-gonic/gin/BENCHMARKS.md delete mode 100644 vendor/github.com/gin-gonic/gin/CHANGELOG.md delete mode 100644 vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/gin-gonic/gin/CONTRIBUTING.md delete mode 100644 vendor/github.com/gin-gonic/gin/LICENSE delete mode 100644 vendor/github.com/gin-gonic/gin/Makefile delete mode 100644 vendor/github.com/gin-gonic/gin/README.md delete mode 100644 vendor/github.com/gin-gonic/gin/auth.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/binding.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/default_validator.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/form.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/form_mapping.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/json.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/msgpack.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/protobuf.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/query.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/uri.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/xml.go delete mode 100644 vendor/github.com/gin-gonic/gin/binding/yaml.go delete mode 100644 vendor/github.com/gin-gonic/gin/codecov.yml delete mode 100644 vendor/github.com/gin-gonic/gin/context.go delete mode 100644 vendor/github.com/gin-gonic/gin/context_appengine.go delete mode 100644 vendor/github.com/gin-gonic/gin/debug.go delete mode 100644 vendor/github.com/gin-gonic/gin/deprecated.go delete mode 100644 vendor/github.com/gin-gonic/gin/doc.go delete mode 100644 vendor/github.com/gin-gonic/gin/errors.go delete mode 100644 vendor/github.com/gin-gonic/gin/fs.go delete mode 100644 vendor/github.com/gin-gonic/gin/gin.go delete mode 100644 vendor/github.com/gin-gonic/gin/go.mod delete mode 100644 vendor/github.com/gin-gonic/gin/go.sum delete mode 100644 vendor/github.com/gin-gonic/gin/internal/json/json.go delete mode 100644 vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go delete mode 100644 vendor/github.com/gin-gonic/gin/logger.go delete mode 100644 vendor/github.com/gin-gonic/gin/mode.go delete mode 100644 vendor/github.com/gin-gonic/gin/path.go delete mode 100644 vendor/github.com/gin-gonic/gin/recovery.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/data.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/html.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/json.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/msgpack.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/protobuf.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/reader.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/redirect.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/render.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/text.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/xml.go delete mode 100644 vendor/github.com/gin-gonic/gin/render/yaml.go delete mode 100644 vendor/github.com/gin-gonic/gin/response_writer.go delete mode 100644 vendor/github.com/gin-gonic/gin/routergroup.go delete mode 100644 vendor/github.com/gin-gonic/gin/test_helpers.go delete mode 100644 vendor/github.com/gin-gonic/gin/tree.go delete mode 100644 vendor/github.com/gin-gonic/gin/utils.go delete mode 100644 vendor/github.com/gin-gonic/gin/version.go delete mode 100644 vendor/github.com/gogo/protobuf/AUTHORS delete mode 100644 vendor/github.com/gogo/protobuf/CONTRIBUTORS delete mode 100644 vendor/github.com/gogo/protobuf/GOLANG_CONTRIBUTORS delete mode 100644 vendor/github.com/gogo/protobuf/LICENSE delete mode 100644 vendor/github.com/gogo/protobuf/proto/Makefile delete mode 100644 vendor/github.com/gogo/protobuf/proto/clone.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/decode.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/decode_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/duration.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/duration_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/encode.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/encode_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/equal.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/extensions.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/extensions_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/lib.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/lib_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/message_set.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/properties.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/properties_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/skip_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/text.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/text_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/text_parser.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp.go delete mode 100644 vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go delete mode 100644 vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go delete mode 100644 vendor/github.com/golang/protobuf/AUTHORS delete mode 100644 vendor/github.com/golang/protobuf/CONTRIBUTORS delete mode 100644 vendor/github.com/golang/protobuf/LICENSE delete mode 100644 vendor/github.com/golang/protobuf/proto/clone.go delete mode 100644 vendor/github.com/golang/protobuf/proto/decode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/discard.go delete mode 100644 vendor/github.com/golang/protobuf/proto/encode.go delete mode 100644 vendor/github.com/golang/protobuf/proto/equal.go delete mode 100644 vendor/github.com/golang/protobuf/proto/extensions.go delete mode 100644 vendor/github.com/golang/protobuf/proto/lib.go delete mode 100644 vendor/github.com/golang/protobuf/proto/message_set.go delete mode 100644 vendor/github.com/golang/protobuf/proto/pointer_reflect.go delete mode 100644 vendor/github.com/golang/protobuf/proto/pointer_unsafe.go delete mode 100644 vendor/github.com/golang/protobuf/proto/properties.go delete mode 100644 vendor/github.com/golang/protobuf/proto/table_marshal.go delete mode 100644 vendor/github.com/golang/protobuf/proto/table_merge.go delete mode 100644 vendor/github.com/golang/protobuf/proto/table_unmarshal.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text.go delete mode 100644 vendor/github.com/golang/protobuf/proto/text_parser.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/any.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/any/any.pb.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/any/any.proto delete mode 100644 vendor/github.com/golang/protobuf/ptypes/doc.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/duration.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/duration/duration.proto delete mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go delete mode 100644 vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto delete mode 100644 vendor/github.com/google/btree/.travis.yml delete mode 100644 vendor/github.com/google/btree/LICENSE delete mode 100644 vendor/github.com/google/btree/README.md delete mode 100644 vendor/github.com/google/btree/btree.go delete mode 100644 vendor/github.com/google/btree/btree_mem.go delete mode 100644 vendor/github.com/google/gofuzz/.travis.yml delete mode 100644 vendor/github.com/google/gofuzz/CONTRIBUTING.md delete mode 100644 vendor/github.com/google/gofuzz/LICENSE delete mode 100644 vendor/github.com/google/gofuzz/README.md delete mode 100644 vendor/github.com/google/gofuzz/doc.go delete mode 100644 vendor/github.com/google/gofuzz/fuzz.go delete mode 100644 vendor/github.com/googleapis/gnostic/LICENSE delete mode 100644 vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.go delete mode 100644 vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.pb.go delete mode 100644 vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.proto delete mode 100644 vendor/github.com/googleapis/gnostic/OpenAPIv2/README.md delete mode 100644 vendor/github.com/googleapis/gnostic/OpenAPIv2/openapi-2.0.json delete mode 100644 vendor/github.com/googleapis/gnostic/compiler/README.md delete mode 100644 vendor/github.com/googleapis/gnostic/compiler/context.go delete mode 100644 vendor/github.com/googleapis/gnostic/compiler/error.go delete mode 100644 vendor/github.com/googleapis/gnostic/compiler/extension-handler.go delete mode 100644 vendor/github.com/googleapis/gnostic/compiler/helpers.go delete mode 100644 vendor/github.com/googleapis/gnostic/compiler/main.go delete mode 100644 vendor/github.com/googleapis/gnostic/compiler/reader.go delete mode 100755 vendor/github.com/googleapis/gnostic/extensions/COMPILE-EXTENSION.sh delete mode 100644 vendor/github.com/googleapis/gnostic/extensions/README.md delete mode 100644 vendor/github.com/googleapis/gnostic/extensions/extension.pb.go delete mode 100644 vendor/github.com/googleapis/gnostic/extensions/extension.proto delete mode 100644 vendor/github.com/googleapis/gnostic/extensions/extensions.go delete mode 100644 vendor/github.com/gorilla/websocket/.gitignore delete mode 100644 vendor/github.com/gorilla/websocket/.travis.yml delete mode 100644 vendor/github.com/gorilla/websocket/AUTHORS delete mode 100644 vendor/github.com/gorilla/websocket/LICENSE delete mode 100644 vendor/github.com/gorilla/websocket/README.md delete mode 100644 vendor/github.com/gorilla/websocket/client.go delete mode 100644 vendor/github.com/gorilla/websocket/client_clone.go delete mode 100644 vendor/github.com/gorilla/websocket/client_clone_legacy.go delete mode 100644 vendor/github.com/gorilla/websocket/compression.go delete mode 100644 vendor/github.com/gorilla/websocket/conn.go delete mode 100644 vendor/github.com/gorilla/websocket/conn_write.go delete mode 100644 vendor/github.com/gorilla/websocket/conn_write_legacy.go delete mode 100644 vendor/github.com/gorilla/websocket/doc.go delete mode 100644 vendor/github.com/gorilla/websocket/json.go delete mode 100644 vendor/github.com/gorilla/websocket/mask.go delete mode 100644 vendor/github.com/gorilla/websocket/mask_safe.go delete mode 100644 vendor/github.com/gorilla/websocket/prepared.go delete mode 100644 vendor/github.com/gorilla/websocket/proxy.go delete mode 100644 vendor/github.com/gorilla/websocket/server.go delete mode 100644 vendor/github.com/gorilla/websocket/trace.go delete mode 100644 vendor/github.com/gorilla/websocket/trace_17.go delete mode 100644 vendor/github.com/gorilla/websocket/util.go delete mode 100644 vendor/github.com/gorilla/websocket/x_net_proxy.go delete mode 100644 vendor/github.com/gregjones/httpcache/.travis.yml delete mode 100644 vendor/github.com/gregjones/httpcache/LICENSE.txt delete mode 100644 vendor/github.com/gregjones/httpcache/README.md delete mode 100644 vendor/github.com/gregjones/httpcache/diskcache/diskcache.go delete mode 100644 vendor/github.com/gregjones/httpcache/httpcache.go delete mode 100644 vendor/github.com/hashicorp/hcl/.gitignore delete mode 100644 vendor/github.com/hashicorp/hcl/.travis.yml delete mode 100644 vendor/github.com/hashicorp/hcl/LICENSE delete mode 100644 vendor/github.com/hashicorp/hcl/Makefile delete mode 100644 vendor/github.com/hashicorp/hcl/README.md delete mode 100644 vendor/github.com/hashicorp/hcl/appveyor.yml delete mode 100644 vendor/github.com/hashicorp/hcl/decoder.go delete mode 100644 vendor/github.com/hashicorp/hcl/go.mod delete mode 100644 vendor/github.com/hashicorp/hcl/go.sum delete mode 100644 vendor/github.com/hashicorp/hcl/hcl.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/ast/ast.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/ast/walk.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/error.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/parser/parser.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/printer/printer.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/token/position.go delete mode 100644 vendor/github.com/hashicorp/hcl/hcl/token/token.go delete mode 100644 vendor/github.com/hashicorp/hcl/json/parser/flatten.go delete mode 100644 vendor/github.com/hashicorp/hcl/json/parser/parser.go delete mode 100644 vendor/github.com/hashicorp/hcl/json/scanner/scanner.go delete mode 100644 vendor/github.com/hashicorp/hcl/json/token/position.go delete mode 100644 vendor/github.com/hashicorp/hcl/json/token/token.go delete mode 100644 vendor/github.com/hashicorp/hcl/lex.go delete mode 100644 vendor/github.com/hashicorp/hcl/parse.go delete mode 100644 vendor/github.com/imdario/mergo/.gitignore delete mode 100644 vendor/github.com/imdario/mergo/.travis.yml delete mode 100644 vendor/github.com/imdario/mergo/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/imdario/mergo/LICENSE delete mode 100644 vendor/github.com/imdario/mergo/README.md delete mode 100644 vendor/github.com/imdario/mergo/doc.go delete mode 100644 vendor/github.com/imdario/mergo/map.go delete mode 100644 vendor/github.com/imdario/mergo/merge.go delete mode 100644 vendor/github.com/imdario/mergo/mergo.go delete mode 100644 vendor/github.com/imdario/mergo/testdata/license.yml delete mode 100644 vendor/github.com/json-iterator/go/.codecov.yml delete mode 100644 vendor/github.com/json-iterator/go/.gitignore delete mode 100644 vendor/github.com/json-iterator/go/.travis.yml delete mode 100644 vendor/github.com/json-iterator/go/Gopkg.lock delete mode 100644 vendor/github.com/json-iterator/go/Gopkg.toml delete mode 100644 vendor/github.com/json-iterator/go/LICENSE delete mode 100644 vendor/github.com/json-iterator/go/README.md delete mode 100644 vendor/github.com/json-iterator/go/adapter.go delete mode 100644 vendor/github.com/json-iterator/go/any.go delete mode 100644 vendor/github.com/json-iterator/go/any_array.go delete mode 100644 vendor/github.com/json-iterator/go/any_bool.go delete mode 100644 vendor/github.com/json-iterator/go/any_float.go delete mode 100644 vendor/github.com/json-iterator/go/any_int32.go delete mode 100644 vendor/github.com/json-iterator/go/any_int64.go delete mode 100644 vendor/github.com/json-iterator/go/any_invalid.go delete mode 100644 vendor/github.com/json-iterator/go/any_nil.go delete mode 100644 vendor/github.com/json-iterator/go/any_number.go delete mode 100644 vendor/github.com/json-iterator/go/any_object.go delete mode 100644 vendor/github.com/json-iterator/go/any_str.go delete mode 100644 vendor/github.com/json-iterator/go/any_uint32.go delete mode 100644 vendor/github.com/json-iterator/go/any_uint64.go delete mode 100755 vendor/github.com/json-iterator/go/build.sh delete mode 100644 vendor/github.com/json-iterator/go/config.go delete mode 100644 vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md delete mode 100644 vendor/github.com/json-iterator/go/iter.go delete mode 100644 vendor/github.com/json-iterator/go/iter_array.go delete mode 100644 vendor/github.com/json-iterator/go/iter_float.go delete mode 100644 vendor/github.com/json-iterator/go/iter_int.go delete mode 100644 vendor/github.com/json-iterator/go/iter_object.go delete mode 100644 vendor/github.com/json-iterator/go/iter_skip.go delete mode 100644 vendor/github.com/json-iterator/go/iter_skip_sloppy.go delete mode 100644 vendor/github.com/json-iterator/go/iter_skip_strict.go delete mode 100644 vendor/github.com/json-iterator/go/iter_str.go delete mode 100644 vendor/github.com/json-iterator/go/jsoniter.go delete mode 100644 vendor/github.com/json-iterator/go/pool.go delete mode 100644 vendor/github.com/json-iterator/go/reflect.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_array.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_dynamic.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_extension.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_json_number.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_json_raw_message.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_map.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_marshaler.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_native.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_optional.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_slice.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_struct_decoder.go delete mode 100644 vendor/github.com/json-iterator/go/reflect_struct_encoder.go delete mode 100644 vendor/github.com/json-iterator/go/stream.go delete mode 100644 vendor/github.com/json-iterator/go/stream_float.go delete mode 100644 vendor/github.com/json-iterator/go/stream_int.go delete mode 100644 vendor/github.com/json-iterator/go/stream_str.go delete mode 100755 vendor/github.com/json-iterator/go/test.sh delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/LICENSE delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/README.md delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/go.mod delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/sequences.go delete mode 100644 vendor/github.com/konsorten/go-windows-terminal-sequences/sequences_dummy.go delete mode 100644 vendor/github.com/lestrrat/go-file-rotatelogs/.gitignore delete mode 100644 vendor/github.com/lestrrat/go-file-rotatelogs/.travis.yml delete mode 100644 vendor/github.com/lestrrat/go-file-rotatelogs/LICENSE delete mode 100644 vendor/github.com/lestrrat/go-file-rotatelogs/README.md delete mode 100644 vendor/github.com/lestrrat/go-file-rotatelogs/interface.go delete mode 100644 vendor/github.com/lestrrat/go-file-rotatelogs/rotatelogs.go delete mode 100644 vendor/github.com/lestrrat/go-strftime/.gitignore delete mode 100644 vendor/github.com/lestrrat/go-strftime/.travis.yml delete mode 100644 vendor/github.com/lestrrat/go-strftime/LICENSE delete mode 100644 vendor/github.com/lestrrat/go-strftime/README.md delete mode 100644 vendor/github.com/lestrrat/go-strftime/strftime.go delete mode 100644 vendor/github.com/lestrrat/go-strftime/writer.go delete mode 100644 vendor/github.com/magiconair/properties/.gitignore delete mode 100644 vendor/github.com/magiconair/properties/.travis.yml delete mode 100644 vendor/github.com/magiconair/properties/CHANGELOG.md delete mode 100644 vendor/github.com/magiconair/properties/LICENSE delete mode 100644 vendor/github.com/magiconair/properties/README.md delete mode 100644 vendor/github.com/magiconair/properties/decode.go delete mode 100644 vendor/github.com/magiconair/properties/doc.go delete mode 100644 vendor/github.com/magiconair/properties/integrate.go delete mode 100644 vendor/github.com/magiconair/properties/lex.go delete mode 100644 vendor/github.com/magiconair/properties/load.go delete mode 100644 vendor/github.com/magiconair/properties/parser.go delete mode 100644 vendor/github.com/magiconair/properties/properties.go delete mode 100644 vendor/github.com/magiconair/properties/rangecheck.go delete mode 100644 vendor/github.com/mattn/go-isatty/.travis.yml delete mode 100644 vendor/github.com/mattn/go-isatty/LICENSE delete mode 100644 vendor/github.com/mattn/go-isatty/README.md delete mode 100644 vendor/github.com/mattn/go-isatty/doc.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_appengine.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_bsd.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_linux.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_others.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_solaris.go delete mode 100644 vendor/github.com/mattn/go-isatty/isatty_windows.go delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/LICENSE delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/NOTICE delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/.gitignore delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/Makefile delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/decode.go delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/doc.go delete mode 100644 vendor/github.com/matttproud/golang_protobuf_extensions/pbutil/encode.go delete mode 100644 vendor/github.com/mitchellh/mapstructure/.travis.yml delete mode 100644 vendor/github.com/mitchellh/mapstructure/CHANGELOG.md delete mode 100644 vendor/github.com/mitchellh/mapstructure/LICENSE delete mode 100644 vendor/github.com/mitchellh/mapstructure/README.md delete mode 100644 vendor/github.com/mitchellh/mapstructure/decode_hooks.go delete mode 100644 vendor/github.com/mitchellh/mapstructure/error.go delete mode 100644 vendor/github.com/mitchellh/mapstructure/go.mod delete mode 100644 vendor/github.com/mitchellh/mapstructure/mapstructure.go delete mode 100644 vendor/github.com/modern-go/concurrent/.gitignore delete mode 100644 vendor/github.com/modern-go/concurrent/.travis.yml delete mode 100644 vendor/github.com/modern-go/concurrent/LICENSE delete mode 100644 vendor/github.com/modern-go/concurrent/README.md delete mode 100644 vendor/github.com/modern-go/concurrent/executor.go delete mode 100644 vendor/github.com/modern-go/concurrent/go_above_19.go delete mode 100644 vendor/github.com/modern-go/concurrent/go_below_19.go delete mode 100644 vendor/github.com/modern-go/concurrent/log.go delete mode 100755 vendor/github.com/modern-go/concurrent/test.sh delete mode 100644 vendor/github.com/modern-go/concurrent/unbounded_executor.go delete mode 100644 vendor/github.com/modern-go/reflect2/.gitignore delete mode 100644 vendor/github.com/modern-go/reflect2/.travis.yml delete mode 100644 vendor/github.com/modern-go/reflect2/Gopkg.lock delete mode 100644 vendor/github.com/modern-go/reflect2/Gopkg.toml delete mode 100644 vendor/github.com/modern-go/reflect2/LICENSE delete mode 100644 vendor/github.com/modern-go/reflect2/README.md delete mode 100644 vendor/github.com/modern-go/reflect2/go_above_17.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_above_19.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_below_17.go delete mode 100644 vendor/github.com/modern-go/reflect2/go_below_19.go delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2.go delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2_amd64.s delete mode 100644 vendor/github.com/modern-go/reflect2/reflect2_kind.go delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_386.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_amd64p32.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_arm64.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mips64x.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_mipsx.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_ppc64x.s delete mode 100644 vendor/github.com/modern-go/reflect2/relfect2_s390x.s delete mode 100644 vendor/github.com/modern-go/reflect2/safe_field.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_slice.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_struct.go delete mode 100644 vendor/github.com/modern-go/reflect2/safe_type.go delete mode 100755 vendor/github.com/modern-go/reflect2/test.sh delete mode 100644 vendor/github.com/modern-go/reflect2/type_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_array.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_eface.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_field.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_iface.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_link.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_map.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_ptr.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_slice.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_struct.go delete mode 100644 vendor/github.com/modern-go/reflect2/unsafe_type.go delete mode 100644 vendor/github.com/pelletier/go-toml/.gitignore delete mode 100644 vendor/github.com/pelletier/go-toml/.travis.yml delete mode 100644 vendor/github.com/pelletier/go-toml/LICENSE delete mode 100644 vendor/github.com/pelletier/go-toml/README.md delete mode 100644 vendor/github.com/pelletier/go-toml/benchmark.json delete mode 100755 vendor/github.com/pelletier/go-toml/benchmark.sh delete mode 100644 vendor/github.com/pelletier/go-toml/benchmark.toml delete mode 100644 vendor/github.com/pelletier/go-toml/benchmark.yml delete mode 100644 vendor/github.com/pelletier/go-toml/doc.go delete mode 100644 vendor/github.com/pelletier/go-toml/example-crlf.toml delete mode 100644 vendor/github.com/pelletier/go-toml/example.toml delete mode 100644 vendor/github.com/pelletier/go-toml/fuzz.go delete mode 100755 vendor/github.com/pelletier/go-toml/fuzz.sh delete mode 100644 vendor/github.com/pelletier/go-toml/keysparsing.go delete mode 100644 vendor/github.com/pelletier/go-toml/lexer.go delete mode 100644 vendor/github.com/pelletier/go-toml/marshal.go delete mode 100644 vendor/github.com/pelletier/go-toml/marshal_test.toml delete mode 100644 vendor/github.com/pelletier/go-toml/parser.go delete mode 100644 vendor/github.com/pelletier/go-toml/position.go delete mode 100755 vendor/github.com/pelletier/go-toml/test.sh delete mode 100644 vendor/github.com/pelletier/go-toml/token.go delete mode 100644 vendor/github.com/pelletier/go-toml/toml.go delete mode 100644 vendor/github.com/pelletier/go-toml/tomltree_create.go delete mode 100644 vendor/github.com/pelletier/go-toml/tomltree_write.go delete mode 100644 vendor/github.com/petar/GoLLRB/AUTHORS delete mode 100644 vendor/github.com/petar/GoLLRB/LICENSE delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/avgvar.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/iterator.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/llrb-stats.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/llrb.go delete mode 100644 vendor/github.com/petar/GoLLRB/llrb/util.go delete mode 100644 vendor/github.com/peterbourgon/diskv/LICENSE delete mode 100644 vendor/github.com/peterbourgon/diskv/README.md delete mode 100644 vendor/github.com/peterbourgon/diskv/compression.go delete mode 100644 vendor/github.com/peterbourgon/diskv/diskv.go delete mode 100644 vendor/github.com/peterbourgon/diskv/index.go delete mode 100644 vendor/github.com/pkg/errors/.gitignore delete mode 100644 vendor/github.com/pkg/errors/.travis.yml delete mode 100644 vendor/github.com/pkg/errors/LICENSE delete mode 100644 vendor/github.com/pkg/errors/README.md delete mode 100644 vendor/github.com/pkg/errors/appveyor.yml delete mode 100644 vendor/github.com/pkg/errors/errors.go delete mode 100644 vendor/github.com/pkg/errors/stack.go delete mode 100644 vendor/github.com/prometheus/client_golang/LICENSE delete mode 100644 vendor/github.com/prometheus/client_golang/NOTICE delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/.gitignore delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/README.md delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/build_info.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/build_info_pre_1.12.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/collector.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/counter.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/desc.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/doc.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/expvar_collector.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/fnv.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/gauge.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/go_collector.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/histogram.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/internal/metric.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/labels.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/metric.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/observer.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector_other.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/process_collector_windows.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/delegator.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/http.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_client.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/promhttp/instrument_server.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/registry.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/summary.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/timer.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/untyped.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/value.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/vec.go delete mode 100644 vendor/github.com/prometheus/client_golang/prometheus/wrap.go delete mode 100644 vendor/github.com/prometheus/client_model/LICENSE delete mode 100644 vendor/github.com/prometheus/client_model/NOTICE delete mode 100644 vendor/github.com/prometheus/client_model/go/metrics.pb.go delete mode 100644 vendor/github.com/prometheus/client_model/ruby/LICENSE delete mode 100644 vendor/github.com/prometheus/common/LICENSE delete mode 100644 vendor/github.com/prometheus/common/NOTICE delete mode 100644 vendor/github.com/prometheus/common/expfmt/decode.go delete mode 100644 vendor/github.com/prometheus/common/expfmt/encode.go delete mode 100644 vendor/github.com/prometheus/common/expfmt/expfmt.go delete mode 100644 vendor/github.com/prometheus/common/expfmt/fuzz.go delete mode 100644 vendor/github.com/prometheus/common/expfmt/text_create.go delete mode 100644 vendor/github.com/prometheus/common/expfmt/text_parse.go delete mode 100644 vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/README.txt delete mode 100644 vendor/github.com/prometheus/common/internal/bitbucket.org/ww/goautoneg/autoneg.go delete mode 100644 vendor/github.com/prometheus/common/model/alert.go delete mode 100644 vendor/github.com/prometheus/common/model/fingerprinting.go delete mode 100644 vendor/github.com/prometheus/common/model/fnv.go delete mode 100644 vendor/github.com/prometheus/common/model/labels.go delete mode 100644 vendor/github.com/prometheus/common/model/labelset.go delete mode 100644 vendor/github.com/prometheus/common/model/metric.go delete mode 100644 vendor/github.com/prometheus/common/model/model.go delete mode 100644 vendor/github.com/prometheus/common/model/signature.go delete mode 100644 vendor/github.com/prometheus/common/model/silence.go delete mode 100644 vendor/github.com/prometheus/common/model/time.go delete mode 100644 vendor/github.com/prometheus/common/model/value.go delete mode 100644 vendor/github.com/prometheus/procfs/.gitignore delete mode 100644 vendor/github.com/prometheus/procfs/.golangci.yml delete mode 100644 vendor/github.com/prometheus/procfs/CONTRIBUTING.md delete mode 100644 vendor/github.com/prometheus/procfs/LICENSE delete mode 100644 vendor/github.com/prometheus/procfs/MAINTAINERS.md delete mode 100644 vendor/github.com/prometheus/procfs/Makefile delete mode 100644 vendor/github.com/prometheus/procfs/Makefile.common delete mode 100644 vendor/github.com/prometheus/procfs/NOTICE delete mode 100644 vendor/github.com/prometheus/procfs/README.md delete mode 100644 vendor/github.com/prometheus/procfs/buddyinfo.go delete mode 100644 vendor/github.com/prometheus/procfs/doc.go delete mode 100644 vendor/github.com/prometheus/procfs/fixtures.ttar delete mode 100644 vendor/github.com/prometheus/procfs/fs.go delete mode 100644 vendor/github.com/prometheus/procfs/go.mod delete mode 100644 vendor/github.com/prometheus/procfs/go.sum delete mode 100644 vendor/github.com/prometheus/procfs/internal/fs/fs.go delete mode 100644 vendor/github.com/prometheus/procfs/ipvs.go delete mode 100644 vendor/github.com/prometheus/procfs/mdstat.go delete mode 100644 vendor/github.com/prometheus/procfs/mountstats.go delete mode 100644 vendor/github.com/prometheus/procfs/net_dev.go delete mode 100644 vendor/github.com/prometheus/procfs/net_unix.go delete mode 100644 vendor/github.com/prometheus/procfs/proc.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_io.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_limits.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_ns.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_psi.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_stat.go delete mode 100644 vendor/github.com/prometheus/procfs/proc_status.go delete mode 100644 vendor/github.com/prometheus/procfs/stat.go delete mode 100755 vendor/github.com/prometheus/procfs/ttar delete mode 100644 vendor/github.com/prometheus/procfs/xfrm.go delete mode 100644 vendor/github.com/rifflock/lfshook/LICENSE delete mode 100644 vendor/github.com/rifflock/lfshook/README.md delete mode 100644 vendor/github.com/rifflock/lfshook/lfshook.go delete mode 100644 vendor/github.com/sirupsen/logrus/.gitignore delete mode 100644 vendor/github.com/sirupsen/logrus/.travis.yml delete mode 100644 vendor/github.com/sirupsen/logrus/CHANGELOG.md delete mode 100644 vendor/github.com/sirupsen/logrus/LICENSE delete mode 100644 vendor/github.com/sirupsen/logrus/README.md delete mode 100644 vendor/github.com/sirupsen/logrus/alt_exit.go delete mode 100644 vendor/github.com/sirupsen/logrus/appveyor.yml delete mode 100644 vendor/github.com/sirupsen/logrus/doc.go delete mode 100644 vendor/github.com/sirupsen/logrus/entry.go delete mode 100644 vendor/github.com/sirupsen/logrus/exported.go delete mode 100644 vendor/github.com/sirupsen/logrus/formatter.go delete mode 100644 vendor/github.com/sirupsen/logrus/go.mod delete mode 100644 vendor/github.com/sirupsen/logrus/go.sum delete mode 100644 vendor/github.com/sirupsen/logrus/hooks.go delete mode 100644 vendor/github.com/sirupsen/logrus/json_formatter.go delete mode 100644 vendor/github.com/sirupsen/logrus/logger.go delete mode 100644 vendor/github.com/sirupsen/logrus/logrus.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_appengine.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_bsd.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_no_terminal.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_notappengine.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_solaris.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_unix.go delete mode 100644 vendor/github.com/sirupsen/logrus/terminal_check_windows.go delete mode 100644 vendor/github.com/sirupsen/logrus/text_formatter.go delete mode 100644 vendor/github.com/sirupsen/logrus/writer.go delete mode 100644 vendor/github.com/spf13/afero/.travis.yml delete mode 100644 vendor/github.com/spf13/afero/LICENSE.txt delete mode 100644 vendor/github.com/spf13/afero/README.md delete mode 100644 vendor/github.com/spf13/afero/afero.go delete mode 100644 vendor/github.com/spf13/afero/appveyor.yml delete mode 100644 vendor/github.com/spf13/afero/basepath.go delete mode 100644 vendor/github.com/spf13/afero/cacheOnReadFs.go delete mode 100644 vendor/github.com/spf13/afero/const_bsds.go delete mode 100644 vendor/github.com/spf13/afero/const_win_unix.go delete mode 100644 vendor/github.com/spf13/afero/copyOnWriteFs.go delete mode 100644 vendor/github.com/spf13/afero/go.mod delete mode 100644 vendor/github.com/spf13/afero/go.sum delete mode 100644 vendor/github.com/spf13/afero/httpFs.go delete mode 100644 vendor/github.com/spf13/afero/ioutil.go delete mode 100644 vendor/github.com/spf13/afero/lstater.go delete mode 100644 vendor/github.com/spf13/afero/match.go delete mode 100644 vendor/github.com/spf13/afero/mem/dir.go delete mode 100644 vendor/github.com/spf13/afero/mem/dirmap.go delete mode 100644 vendor/github.com/spf13/afero/mem/file.go delete mode 100644 vendor/github.com/spf13/afero/memmap.go delete mode 100644 vendor/github.com/spf13/afero/os.go delete mode 100644 vendor/github.com/spf13/afero/path.go delete mode 100644 vendor/github.com/spf13/afero/readonlyfs.go delete mode 100644 vendor/github.com/spf13/afero/regexpfs.go delete mode 100644 vendor/github.com/spf13/afero/unionFile.go delete mode 100644 vendor/github.com/spf13/afero/util.go delete mode 100644 vendor/github.com/spf13/cast/.gitignore delete mode 100644 vendor/github.com/spf13/cast/.travis.yml delete mode 100644 vendor/github.com/spf13/cast/LICENSE delete mode 100644 vendor/github.com/spf13/cast/Makefile delete mode 100644 vendor/github.com/spf13/cast/README.md delete mode 100644 vendor/github.com/spf13/cast/cast.go delete mode 100644 vendor/github.com/spf13/cast/caste.go delete mode 100644 vendor/github.com/spf13/cast/go.mod delete mode 100644 vendor/github.com/spf13/cast/go.sum delete mode 100644 vendor/github.com/spf13/jwalterweatherman/.gitignore delete mode 100644 vendor/github.com/spf13/jwalterweatherman/LICENSE delete mode 100644 vendor/github.com/spf13/jwalterweatherman/README.md delete mode 100644 vendor/github.com/spf13/jwalterweatherman/default_notepad.go delete mode 100644 vendor/github.com/spf13/jwalterweatherman/go.mod delete mode 100644 vendor/github.com/spf13/jwalterweatherman/log_counter.go delete mode 100644 vendor/github.com/spf13/jwalterweatherman/notepad.go delete mode 100644 vendor/github.com/spf13/pflag/.gitignore delete mode 100644 vendor/github.com/spf13/pflag/.travis.yml delete mode 100644 vendor/github.com/spf13/pflag/LICENSE delete mode 100644 vendor/github.com/spf13/pflag/README.md delete mode 100644 vendor/github.com/spf13/pflag/bool.go delete mode 100644 vendor/github.com/spf13/pflag/bool_slice.go delete mode 100644 vendor/github.com/spf13/pflag/bytes.go delete mode 100644 vendor/github.com/spf13/pflag/count.go delete mode 100644 vendor/github.com/spf13/pflag/duration.go delete mode 100644 vendor/github.com/spf13/pflag/duration_slice.go delete mode 100644 vendor/github.com/spf13/pflag/flag.go delete mode 100644 vendor/github.com/spf13/pflag/float32.go delete mode 100644 vendor/github.com/spf13/pflag/float64.go delete mode 100644 vendor/github.com/spf13/pflag/golangflag.go delete mode 100644 vendor/github.com/spf13/pflag/int.go delete mode 100644 vendor/github.com/spf13/pflag/int16.go delete mode 100644 vendor/github.com/spf13/pflag/int32.go delete mode 100644 vendor/github.com/spf13/pflag/int64.go delete mode 100644 vendor/github.com/spf13/pflag/int8.go delete mode 100644 vendor/github.com/spf13/pflag/int_slice.go delete mode 100644 vendor/github.com/spf13/pflag/ip.go delete mode 100644 vendor/github.com/spf13/pflag/ip_slice.go delete mode 100644 vendor/github.com/spf13/pflag/ipmask.go delete mode 100644 vendor/github.com/spf13/pflag/ipnet.go delete mode 100644 vendor/github.com/spf13/pflag/string.go delete mode 100644 vendor/github.com/spf13/pflag/string_array.go delete mode 100644 vendor/github.com/spf13/pflag/string_slice.go delete mode 100644 vendor/github.com/spf13/pflag/string_to_int.go delete mode 100644 vendor/github.com/spf13/pflag/string_to_string.go delete mode 100644 vendor/github.com/spf13/pflag/uint.go delete mode 100644 vendor/github.com/spf13/pflag/uint16.go delete mode 100644 vendor/github.com/spf13/pflag/uint32.go delete mode 100644 vendor/github.com/spf13/pflag/uint64.go delete mode 100644 vendor/github.com/spf13/pflag/uint8.go delete mode 100644 vendor/github.com/spf13/pflag/uint_slice.go delete mode 100644 vendor/github.com/spf13/viper/.gitignore delete mode 100644 vendor/github.com/spf13/viper/.travis.yml delete mode 100644 vendor/github.com/spf13/viper/LICENSE delete mode 100644 vendor/github.com/spf13/viper/README.md delete mode 100644 vendor/github.com/spf13/viper/flags.go delete mode 100644 vendor/github.com/spf13/viper/go.mod delete mode 100644 vendor/github.com/spf13/viper/go.sum delete mode 100644 vendor/github.com/spf13/viper/util.go delete mode 100644 vendor/github.com/spf13/viper/viper.go delete mode 100644 vendor/github.com/ugorji/go/LICENSE delete mode 100644 vendor/github.com/ugorji/go/codec/0doc.go delete mode 100644 vendor/github.com/ugorji/go/codec/README.md delete mode 100644 vendor/github.com/ugorji/go/codec/binc.go delete mode 100644 vendor/github.com/ugorji/go/codec/cbor.go delete mode 100644 vendor/github.com/ugorji/go/codec/decode.go delete mode 100644 vendor/github.com/ugorji/go/codec/decode_go.go delete mode 100644 vendor/github.com/ugorji/go/codec/decode_go14.go delete mode 100644 vendor/github.com/ugorji/go/codec/encode.go delete mode 100644 vendor/github.com/ugorji/go/codec/fast-path.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/fast-path.not.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen-dec-array.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/gen-dec-map.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/gen-helper.generated.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen-helper.go.tmpl delete mode 100644 vendor/github.com/ugorji/go/codec/gen.generated.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen_15.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen_16.go delete mode 100644 vendor/github.com/ugorji/go/codec/gen_17.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper_internal.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper_not_unsafe.go delete mode 100644 vendor/github.com/ugorji/go/codec/helper_unsafe.go delete mode 100644 vendor/github.com/ugorji/go/codec/json.go delete mode 100644 vendor/github.com/ugorji/go/codec/msgpack.go delete mode 100644 vendor/github.com/ugorji/go/codec/noop.go delete mode 100644 vendor/github.com/ugorji/go/codec/prebuild.go delete mode 100755 vendor/github.com/ugorji/go/codec/prebuild.sh delete mode 100644 vendor/github.com/ugorji/go/codec/rpc.go delete mode 100644 vendor/github.com/ugorji/go/codec/simple.go delete mode 100644 vendor/github.com/ugorji/go/codec/test-cbor-goldens.json delete mode 100755 vendor/github.com/ugorji/go/codec/test.py delete mode 100755 vendor/github.com/ugorji/go/codec/tests.sh delete mode 100644 vendor/github.com/ugorji/go/codec/time.go delete mode 100644 vendor/golang.org/x/crypto/AUTHORS delete mode 100644 vendor/golang.org/x/crypto/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/crypto/LICENSE delete mode 100644 vendor/golang.org/x/crypto/PATENTS delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/terminal.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_aix.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_bsd.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_linux.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_plan9.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_solaris.go delete mode 100644 vendor/golang.org/x/crypto/ssh/terminal/util_windows.go delete mode 100644 vendor/golang.org/x/net/AUTHORS delete mode 100644 vendor/golang.org/x/net/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/net/LICENSE delete mode 100644 vendor/golang.org/x/net/PATENTS delete mode 100644 vendor/golang.org/x/net/context/context.go delete mode 100644 vendor/golang.org/x/net/context/go17.go delete mode 100644 vendor/golang.org/x/net/context/go19.go delete mode 100644 vendor/golang.org/x/net/context/pre_go17.go delete mode 100644 vendor/golang.org/x/net/context/pre_go19.go delete mode 100644 vendor/golang.org/x/net/http2/.gitignore delete mode 100644 vendor/golang.org/x/net/http2/Dockerfile delete mode 100644 vendor/golang.org/x/net/http2/Makefile delete mode 100644 vendor/golang.org/x/net/http2/README delete mode 100644 vendor/golang.org/x/net/http2/ciphers.go delete mode 100644 vendor/golang.org/x/net/http2/client_conn_pool.go delete mode 100644 vendor/golang.org/x/net/http2/configure_transport.go delete mode 100644 vendor/golang.org/x/net/http2/databuffer.go delete mode 100644 vendor/golang.org/x/net/http2/errors.go delete mode 100644 vendor/golang.org/x/net/http2/flow.go delete mode 100644 vendor/golang.org/x/net/http2/frame.go delete mode 100644 vendor/golang.org/x/net/http2/go16.go delete mode 100644 vendor/golang.org/x/net/http2/go17.go delete mode 100644 vendor/golang.org/x/net/http2/go17_not18.go delete mode 100644 vendor/golang.org/x/net/http2/go18.go delete mode 100644 vendor/golang.org/x/net/http2/go19.go delete mode 100644 vendor/golang.org/x/net/http2/gotrack.go delete mode 100644 vendor/golang.org/x/net/http2/headermap.go delete mode 100644 vendor/golang.org/x/net/http2/hpack/encode.go delete mode 100644 vendor/golang.org/x/net/http2/hpack/hpack.go delete mode 100644 vendor/golang.org/x/net/http2/hpack/huffman.go delete mode 100644 vendor/golang.org/x/net/http2/hpack/tables.go delete mode 100644 vendor/golang.org/x/net/http2/http2.go delete mode 100644 vendor/golang.org/x/net/http2/not_go16.go delete mode 100644 vendor/golang.org/x/net/http2/not_go17.go delete mode 100644 vendor/golang.org/x/net/http2/not_go18.go delete mode 100644 vendor/golang.org/x/net/http2/not_go19.go delete mode 100644 vendor/golang.org/x/net/http2/pipe.go delete mode 100644 vendor/golang.org/x/net/http2/server.go delete mode 100644 vendor/golang.org/x/net/http2/transport.go delete mode 100644 vendor/golang.org/x/net/http2/write.go delete mode 100644 vendor/golang.org/x/net/http2/writesched.go delete mode 100644 vendor/golang.org/x/net/http2/writesched_priority.go delete mode 100644 vendor/golang.org/x/net/http2/writesched_random.go delete mode 100644 vendor/golang.org/x/net/idna/idna.go delete mode 100644 vendor/golang.org/x/net/idna/punycode.go delete mode 100644 vendor/golang.org/x/net/idna/tables.go delete mode 100644 vendor/golang.org/x/net/idna/trie.go delete mode 100644 vendor/golang.org/x/net/idna/trieval.go delete mode 100644 vendor/golang.org/x/net/lex/httplex/httplex.go delete mode 100644 vendor/golang.org/x/oauth2/.travis.yml delete mode 100644 vendor/golang.org/x/oauth2/AUTHORS delete mode 100644 vendor/golang.org/x/oauth2/CONTRIBUTING.md delete mode 100644 vendor/golang.org/x/oauth2/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/oauth2/LICENSE delete mode 100644 vendor/golang.org/x/oauth2/README.md delete mode 100644 vendor/golang.org/x/oauth2/client_appengine.go delete mode 100644 vendor/golang.org/x/oauth2/internal/oauth2.go delete mode 100644 vendor/golang.org/x/oauth2/internal/token.go delete mode 100644 vendor/golang.org/x/oauth2/internal/transport.go delete mode 100644 vendor/golang.org/x/oauth2/oauth2.go delete mode 100644 vendor/golang.org/x/oauth2/token.go delete mode 100644 vendor/golang.org/x/oauth2/transport.go delete mode 100644 vendor/golang.org/x/sys/AUTHORS delete mode 100644 vendor/golang.org/x/sys/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/sys/LICENSE delete mode 100644 vendor/golang.org/x/sys/PATENTS delete mode 100644 vendor/golang.org/x/sys/unix/.gitignore delete mode 100644 vendor/golang.org/x/sys/unix/README.md delete mode 100644 vendor/golang.org/x/sys/unix/affinity_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/aliases.go delete mode 100644 vendor/golang.org/x/sys/unix/asm_aix_ppc64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_darwin_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_dragonfly_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_freebsd_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mips64x.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_mipsx.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_ppc64x.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_linux_s390x.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_netbsd_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_386.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_openbsd_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/asm_solaris_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/bluetooth_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/cap_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/constants.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_netbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/dev_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/dirent.go delete mode 100644 vendor/golang.org/x/sys/unix/endian_big.go delete mode 100644 vendor/golang.org/x/sys/unix/endian_little.go delete mode 100644 vendor/golang.org/x/sys/unix/env_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/errors_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/fcntl.go delete mode 100644 vendor/golang.org/x/sys/unix/fcntl_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/fcntl_linux_32bit.go delete mode 100644 vendor/golang.org/x/sys/unix/gccgo.go delete mode 100644 vendor/golang.org/x/sys/unix/gccgo_c.c delete mode 100644 vendor/golang.org/x/sys/unix/gccgo_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ioctl.go delete mode 100755 vendor/golang.org/x/sys/unix/mkall.sh delete mode 100644 vendor/golang.org/x/sys/unix/mkasm_darwin.go delete mode 100755 vendor/golang.org/x/sys/unix/mkerrors.sh delete mode 100644 vendor/golang.org/x/sys/unix/mkpost.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/mksyscall_solaris.go delete mode 100755 vendor/golang.org/x/sys/unix/mksysctl_openbsd.pl delete mode 100644 vendor/golang.org/x/sys/unix/mksysnum.go delete mode 100644 vendor/golang.org/x/sys/unix/openbsd_pledge.go delete mode 100644 vendor/golang.org/x/sys/unix/openbsd_unveil.go delete mode 100644 vendor/golang.org/x/sys/unix/pagesize_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/race.go delete mode 100644 vendor/golang.org/x/sys/unix/race0.go delete mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/sockcmsg_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/str.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_aix.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_bsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_darwin_libSystem.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_amd64_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gc_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_gccgo_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mips64x.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_mipsx.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_ppc64x.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_solaris_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_unix.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/syscall_unix_gc_ppc64x.go delete mode 100644 vendor/golang.org/x/sys/unix/timestruct.go delete mode 100644 vendor/golang.org/x/sys/unix/types_aix.go delete mode 100644 vendor/golang.org/x/sys/unix/types_darwin.go delete mode 100644 vendor/golang.org/x/sys/unix/types_dragonfly.go delete mode 100644 vendor/golang.org/x/sys/unix/types_freebsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_netbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_openbsd.go delete mode 100644 vendor/golang.org/x/sys/unix/types_solaris.go delete mode 100644 vendor/golang.org/x/sys/unix/xattr_bsd.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zerrors_solaris_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zptrace386_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zptracearm_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zptracemips_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zptracemipsle_linux.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gc.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_aix_ppc64_gccgo.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_386.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_amd64.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.1_11.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_darwin_arm64.s delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsyscall_solaris_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysctl_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/zsysnum_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_aix_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_darwin_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_dragonfly_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_freebsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mips64le.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_mipsle.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_ppc64le.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_riscv64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_s390x.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_linux_sparc64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_netbsd_arm64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_386.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_amd64.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_openbsd_arm.go delete mode 100644 vendor/golang.org/x/sys/unix/ztypes_solaris_amd64.go delete mode 100644 vendor/golang.org/x/sys/windows/aliases.go delete mode 100644 vendor/golang.org/x/sys/windows/asm_windows_386.s delete mode 100644 vendor/golang.org/x/sys/windows/asm_windows_amd64.s delete mode 100644 vendor/golang.org/x/sys/windows/asm_windows_arm.s delete mode 100644 vendor/golang.org/x/sys/windows/dll_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/env_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/eventlog.go delete mode 100644 vendor/golang.org/x/sys/windows/exec_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/memory_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/mksyscall.go delete mode 100644 vendor/golang.org/x/sys/windows/race.go delete mode 100644 vendor/golang.org/x/sys/windows/race0.go delete mode 100644 vendor/golang.org/x/sys/windows/security_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/service.go delete mode 100644 vendor/golang.org/x/sys/windows/str.go delete mode 100644 vendor/golang.org/x/sys/windows/syscall.go delete mode 100644 vendor/golang.org/x/sys/windows/syscall_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/types_windows.go delete mode 100644 vendor/golang.org/x/sys/windows/types_windows_386.go delete mode 100644 vendor/golang.org/x/sys/windows/types_windows_amd64.go delete mode 100644 vendor/golang.org/x/sys/windows/types_windows_arm.go delete mode 100644 vendor/golang.org/x/sys/windows/zsyscall_windows.go delete mode 100644 vendor/golang.org/x/text/AUTHORS delete mode 100644 vendor/golang.org/x/text/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/text/LICENSE delete mode 100644 vendor/golang.org/x/text/PATENTS delete mode 100644 vendor/golang.org/x/text/collate/build/builder.go delete mode 100644 vendor/golang.org/x/text/collate/build/colelem.go delete mode 100644 vendor/golang.org/x/text/collate/build/contract.go delete mode 100644 vendor/golang.org/x/text/collate/build/order.go delete mode 100644 vendor/golang.org/x/text/collate/build/table.go delete mode 100644 vendor/golang.org/x/text/collate/build/trie.go delete mode 100644 vendor/golang.org/x/text/collate/collate.go delete mode 100644 vendor/golang.org/x/text/collate/index.go delete mode 100644 vendor/golang.org/x/text/collate/maketables.go delete mode 100644 vendor/golang.org/x/text/collate/option.go delete mode 100644 vendor/golang.org/x/text/collate/sort.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/collelem.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/colltab.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/contract.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/iter.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/numeric.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/table.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/trie.go delete mode 100644 vendor/golang.org/x/text/internal/colltab/weighter.go delete mode 100644 vendor/golang.org/x/text/internal/gen/code.go delete mode 100644 vendor/golang.org/x/text/internal/gen/gen.go delete mode 100644 vendor/golang.org/x/text/internal/tag/tag.go delete mode 100644 vendor/golang.org/x/text/internal/triegen/compact.go delete mode 100644 vendor/golang.org/x/text/internal/triegen/print.go delete mode 100644 vendor/golang.org/x/text/internal/triegen/triegen.go delete mode 100644 vendor/golang.org/x/text/internal/ucd/ucd.go delete mode 100644 vendor/golang.org/x/text/language/Makefile delete mode 100644 vendor/golang.org/x/text/language/common.go delete mode 100644 vendor/golang.org/x/text/language/coverage.go delete mode 100644 vendor/golang.org/x/text/language/doc.go delete mode 100644 vendor/golang.org/x/text/language/gen.go delete mode 100644 vendor/golang.org/x/text/language/gen_common.go delete mode 100644 vendor/golang.org/x/text/language/gen_index.go delete mode 100644 vendor/golang.org/x/text/language/go1_1.go delete mode 100644 vendor/golang.org/x/text/language/go1_2.go delete mode 100644 vendor/golang.org/x/text/language/index.go delete mode 100644 vendor/golang.org/x/text/language/language.go delete mode 100644 vendor/golang.org/x/text/language/lookup.go delete mode 100644 vendor/golang.org/x/text/language/match.go delete mode 100644 vendor/golang.org/x/text/language/parse.go delete mode 100644 vendor/golang.org/x/text/language/tables.go delete mode 100644 vendor/golang.org/x/text/language/tags.go delete mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule.go delete mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule10.0.0.go delete mode 100644 vendor/golang.org/x/text/secure/bidirule/bidirule9.0.0.go delete mode 100644 vendor/golang.org/x/text/transform/transform.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/bidi.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/bracket.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/core.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/gen.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/gen_ranges.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/gen_trieval.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/prop.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/tables10.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/tables9.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/bidi/trieval.go delete mode 100644 vendor/golang.org/x/text/unicode/cldr/base.go delete mode 100644 vendor/golang.org/x/text/unicode/cldr/cldr.go delete mode 100644 vendor/golang.org/x/text/unicode/cldr/collate.go delete mode 100644 vendor/golang.org/x/text/unicode/cldr/decode.go delete mode 100644 vendor/golang.org/x/text/unicode/cldr/makexml.go delete mode 100644 vendor/golang.org/x/text/unicode/cldr/resolve.go delete mode 100644 vendor/golang.org/x/text/unicode/cldr/slice.go delete mode 100644 vendor/golang.org/x/text/unicode/cldr/xml.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/composition.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/forminfo.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/input.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/iter.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/maketables.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/normalize.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/readwriter.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/tables10.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/tables9.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/transform.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/trie.go delete mode 100644 vendor/golang.org/x/text/unicode/norm/triegen.go delete mode 100644 vendor/golang.org/x/text/unicode/rangetable/gen.go delete mode 100644 vendor/golang.org/x/text/unicode/rangetable/merge.go delete mode 100644 vendor/golang.org/x/text/unicode/rangetable/rangetable.go delete mode 100644 vendor/golang.org/x/text/unicode/rangetable/tables10.0.0.go delete mode 100644 vendor/golang.org/x/text/unicode/rangetable/tables9.0.0.go delete mode 100644 vendor/golang.org/x/time/AUTHORS delete mode 100644 vendor/golang.org/x/time/CONTRIBUTORS delete mode 100644 vendor/golang.org/x/time/LICENSE delete mode 100644 vendor/golang.org/x/time/PATENTS delete mode 100644 vendor/golang.org/x/time/rate/rate.go delete mode 100644 vendor/google.golang.org/appengine/LICENSE delete mode 100644 vendor/google.golang.org/appengine/internal/api.go delete mode 100644 vendor/google.golang.org/appengine/internal/api_classic.go delete mode 100644 vendor/google.golang.org/appengine/internal/api_common.go delete mode 100644 vendor/google.golang.org/appengine/internal/app_id.go delete mode 100644 vendor/google.golang.org/appengine/internal/base/api_base.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/base/api_base.proto delete mode 100644 vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go delete mode 100755 vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto delete mode 100644 vendor/google.golang.org/appengine/internal/identity.go delete mode 100644 vendor/google.golang.org/appengine/internal/identity_classic.go delete mode 100644 vendor/google.golang.org/appengine/internal/identity_flex.go delete mode 100644 vendor/google.golang.org/appengine/internal/identity_vm.go delete mode 100644 vendor/google.golang.org/appengine/internal/internal.go delete mode 100644 vendor/google.golang.org/appengine/internal/log/log_service.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/log/log_service.proto delete mode 100644 vendor/google.golang.org/appengine/internal/main.go delete mode 100644 vendor/google.golang.org/appengine/internal/main_common.go delete mode 100644 vendor/google.golang.org/appengine/internal/main_vm.go delete mode 100644 vendor/google.golang.org/appengine/internal/metadata.go delete mode 100644 vendor/google.golang.org/appengine/internal/net.go delete mode 100755 vendor/google.golang.org/appengine/internal/regen.sh delete mode 100644 vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto delete mode 100644 vendor/google.golang.org/appengine/internal/transaction.go delete mode 100644 vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go delete mode 100644 vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto delete mode 100644 vendor/google.golang.org/appengine/urlfetch/urlfetch.go delete mode 100644 vendor/gopkg.in/go-playground/validator.v8/.gitignore delete mode 100644 vendor/gopkg.in/go-playground/validator.v8/LICENSE delete mode 100644 vendor/gopkg.in/go-playground/validator.v8/README.md delete mode 100644 vendor/gopkg.in/go-playground/validator.v8/baked_in.go delete mode 100644 vendor/gopkg.in/go-playground/validator.v8/cache.go delete mode 100644 vendor/gopkg.in/go-playground/validator.v8/doc.go delete mode 100644 vendor/gopkg.in/go-playground/validator.v8/logo.png delete mode 100644 vendor/gopkg.in/go-playground/validator.v8/regexes.go delete mode 100644 vendor/gopkg.in/go-playground/validator.v8/util.go delete mode 100644 vendor/gopkg.in/go-playground/validator.v8/validator.go delete mode 100644 vendor/gopkg.in/inf.v0/LICENSE delete mode 100644 vendor/gopkg.in/inf.v0/dec.go delete mode 100644 vendor/gopkg.in/inf.v0/rounder.go delete mode 100644 vendor/gopkg.in/yaml.v2/.travis.yml delete mode 100644 vendor/gopkg.in/yaml.v2/LICENSE delete mode 100644 vendor/gopkg.in/yaml.v2/LICENSE.libyaml delete mode 100644 vendor/gopkg.in/yaml.v2/NOTICE delete mode 100644 vendor/gopkg.in/yaml.v2/README.md delete mode 100644 vendor/gopkg.in/yaml.v2/apic.go delete mode 100644 vendor/gopkg.in/yaml.v2/decode.go delete mode 100644 vendor/gopkg.in/yaml.v2/emitterc.go delete mode 100644 vendor/gopkg.in/yaml.v2/encode.go delete mode 100644 vendor/gopkg.in/yaml.v2/go.mod delete mode 100644 vendor/gopkg.in/yaml.v2/parserc.go delete mode 100644 vendor/gopkg.in/yaml.v2/readerc.go delete mode 100644 vendor/gopkg.in/yaml.v2/resolve.go delete mode 100644 vendor/gopkg.in/yaml.v2/scannerc.go delete mode 100644 vendor/gopkg.in/yaml.v2/sorter.go delete mode 100644 vendor/gopkg.in/yaml.v2/writerc.go delete mode 100644 vendor/gopkg.in/yaml.v2/yaml.go delete mode 100644 vendor/gopkg.in/yaml.v2/yamlh.go delete mode 100644 vendor/gopkg.in/yaml.v2/yamlprivateh.go delete mode 100644 vendor/k8s.io/api/LICENSE delete mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/generated.pb.go delete mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/generated.proto delete mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/register.go delete mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/types.go delete mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/admissionregistration/v1alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/admissionregistration/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/apps/v1/doc.go delete mode 100644 vendor/k8s.io/api/apps/v1/generated.pb.go delete mode 100644 vendor/k8s.io/api/apps/v1/generated.proto delete mode 100644 vendor/k8s.io/api/apps/v1/register.go delete mode 100644 vendor/k8s.io/api/apps/v1/types.go delete mode 100644 vendor/k8s.io/api/apps/v1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/apps/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/apps/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/apps/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/apps/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/apps/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/apps/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/apps/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/apps/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/apps/v1beta2/doc.go delete mode 100644 vendor/k8s.io/api/apps/v1beta2/generated.pb.go delete mode 100644 vendor/k8s.io/api/apps/v1beta2/generated.proto delete mode 100644 vendor/k8s.io/api/apps/v1beta2/register.go delete mode 100644 vendor/k8s.io/api/apps/v1beta2/types.go delete mode 100644 vendor/k8s.io/api/apps/v1beta2/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/apps/v1beta2/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/generated.pb.go delete mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/generated.proto delete mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/register.go delete mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/types.go delete mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/auditregistration/v1alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/authentication/v1/doc.go delete mode 100644 vendor/k8s.io/api/authentication/v1/generated.pb.go delete mode 100644 vendor/k8s.io/api/authentication/v1/generated.proto delete mode 100644 vendor/k8s.io/api/authentication/v1/register.go delete mode 100644 vendor/k8s.io/api/authentication/v1/types.go delete mode 100644 vendor/k8s.io/api/authentication/v1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/authentication/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/authentication/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/authentication/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/authentication/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/authentication/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/authentication/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/authentication/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/authentication/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/authorization/v1/doc.go delete mode 100644 vendor/k8s.io/api/authorization/v1/generated.pb.go delete mode 100644 vendor/k8s.io/api/authorization/v1/generated.proto delete mode 100644 vendor/k8s.io/api/authorization/v1/register.go delete mode 100644 vendor/k8s.io/api/authorization/v1/types.go delete mode 100644 vendor/k8s.io/api/authorization/v1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/authorization/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/authorization/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/authorization/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/authorization/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/authorization/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/authorization/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/authorization/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/authorization/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/autoscaling/v1/doc.go delete mode 100644 vendor/k8s.io/api/autoscaling/v1/generated.pb.go delete mode 100644 vendor/k8s.io/api/autoscaling/v1/generated.proto delete mode 100644 vendor/k8s.io/api/autoscaling/v1/register.go delete mode 100644 vendor/k8s.io/api/autoscaling/v1/types.go delete mode 100644 vendor/k8s.io/api/autoscaling/v1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/autoscaling/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/doc.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/generated.proto delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/register.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/types.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/doc.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/generated.pb.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/generated.proto delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/register.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/types.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/autoscaling/v2beta2/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/batch/v1/doc.go delete mode 100644 vendor/k8s.io/api/batch/v1/generated.pb.go delete mode 100644 vendor/k8s.io/api/batch/v1/generated.proto delete mode 100644 vendor/k8s.io/api/batch/v1/register.go delete mode 100644 vendor/k8s.io/api/batch/v1/types.go delete mode 100644 vendor/k8s.io/api/batch/v1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/batch/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/batch/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/batch/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/batch/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/batch/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/batch/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/batch/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/batch/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/doc.go delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/generated.pb.go delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/generated.proto delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/register.go delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/types.go delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/batch/v2alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/certificates/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/certificates/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/certificates/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/certificates/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/certificates/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/certificates/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/certificates/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/coordination/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/coordination/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/coordination/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/coordination/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/coordination/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/coordination/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/coordination/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/core/v1/annotation_key_constants.go delete mode 100644 vendor/k8s.io/api/core/v1/doc.go delete mode 100644 vendor/k8s.io/api/core/v1/generated.proto delete mode 100644 vendor/k8s.io/api/core/v1/objectreference.go delete mode 100644 vendor/k8s.io/api/core/v1/register.go delete mode 100644 vendor/k8s.io/api/core/v1/resource.go delete mode 100644 vendor/k8s.io/api/core/v1/taint.go delete mode 100644 vendor/k8s.io/api/core/v1/toleration.go delete mode 100644 vendor/k8s.io/api/core/v1/types.go delete mode 100644 vendor/k8s.io/api/core/v1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/core/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/events/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/events/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/events/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/events/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/events/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/events/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/events/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/extensions/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/extensions/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/extensions/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/extensions/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/extensions/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/extensions/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/extensions/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/networking/v1/doc.go delete mode 100644 vendor/k8s.io/api/networking/v1/generated.pb.go delete mode 100644 vendor/k8s.io/api/networking/v1/generated.proto delete mode 100644 vendor/k8s.io/api/networking/v1/register.go delete mode 100644 vendor/k8s.io/api/networking/v1/types.go delete mode 100644 vendor/k8s.io/api/networking/v1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/networking/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/policy/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/policy/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/policy/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/policy/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/policy/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/policy/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/policy/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/rbac/v1/doc.go delete mode 100644 vendor/k8s.io/api/rbac/v1/generated.pb.go delete mode 100644 vendor/k8s.io/api/rbac/v1/generated.proto delete mode 100644 vendor/k8s.io/api/rbac/v1/register.go delete mode 100644 vendor/k8s.io/api/rbac/v1/types.go delete mode 100644 vendor/k8s.io/api/rbac/v1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/rbac/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/rbac/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/api/rbac/v1alpha1/generated.pb.go delete mode 100644 vendor/k8s.io/api/rbac/v1alpha1/generated.proto delete mode 100644 vendor/k8s.io/api/rbac/v1alpha1/register.go delete mode 100644 vendor/k8s.io/api/rbac/v1alpha1/types.go delete mode 100644 vendor/k8s.io/api/rbac/v1alpha1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/rbac/v1alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/rbac/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/rbac/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/rbac/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/rbac/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/rbac/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/rbac/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/rbac/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/generated.pb.go delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/generated.proto delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/register.go delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/types.go delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/scheduling/v1alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/scheduling/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/scheduling/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/scheduling/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/scheduling/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/scheduling/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/scheduling/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/scheduling/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/settings/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/api/settings/v1alpha1/generated.pb.go delete mode 100644 vendor/k8s.io/api/settings/v1alpha1/generated.proto delete mode 100644 vendor/k8s.io/api/settings/v1alpha1/register.go delete mode 100644 vendor/k8s.io/api/settings/v1alpha1/types.go delete mode 100644 vendor/k8s.io/api/settings/v1alpha1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/settings/v1alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/storage/v1/doc.go delete mode 100644 vendor/k8s.io/api/storage/v1/generated.pb.go delete mode 100644 vendor/k8s.io/api/storage/v1/generated.proto delete mode 100644 vendor/k8s.io/api/storage/v1/register.go delete mode 100644 vendor/k8s.io/api/storage/v1/types.go delete mode 100644 vendor/k8s.io/api/storage/v1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/storage/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/storage/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/api/storage/v1alpha1/generated.pb.go delete mode 100644 vendor/k8s.io/api/storage/v1alpha1/generated.proto delete mode 100644 vendor/k8s.io/api/storage/v1alpha1/register.go delete mode 100644 vendor/k8s.io/api/storage/v1alpha1/types.go delete mode 100644 vendor/k8s.io/api/storage/v1alpha1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/storage/v1alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/api/storage/v1beta1/doc.go delete mode 100644 vendor/k8s.io/api/storage/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/api/storage/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/api/storage/v1beta1/register.go delete mode 100644 vendor/k8s.io/api/storage/v1beta1/types.go delete mode 100644 vendor/k8s.io/api/storage/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/api/storage/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/apimachinery/LICENSE delete mode 100755 vendor/k8s.io/apimachinery/pkg/api/errors/OWNERS delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/errors/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/errors/errors.go delete mode 100755 vendor/k8s.io/apimachinery/pkg/api/meta/OWNERS delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/errors.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/firsthit_restmapper.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/help.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/interfaces.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/lazy.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/meta.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/multirestmapper.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/priority.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/meta/restmapper.go delete mode 100755 vendor/k8s.io/apimachinery/pkg/api/resource/OWNERS delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/amount.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/generated.pb.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/generated.proto delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/math.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/quantity.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/quantity_proto.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/scale_int.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/suffix.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/api/resource/zz_generated.deepcopy.go delete mode 100755 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/OWNERS delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/controller_ref.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/conversion.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/duration.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.pb.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/generated.proto delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/group_version.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/helpers.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/labels.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/meta.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/micro_time_proto.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/register.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/time_proto.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/helpers.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/unstructured_list.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/unstructured/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/watch.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1/zz_generated.defaults.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/conversion.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/deepcopy.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.pb.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/generated.proto delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/register.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/types_swagger_doc_generated.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/apis/meta/v1beta1/zz_generated.defaults.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/converter.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/deep_equal.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/helper.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/queryparams/convert.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/conversion/queryparams/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/fields/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/fields/fields.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/fields/requirements.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/fields/selector.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/labels/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/labels/labels.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/labels/selector.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/labels/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/codec.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/codec_check.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/conversion.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/converter.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/embedded.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/error.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/extension.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/generated.pb.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/generated.proto delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/helper.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/interfaces.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/register.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.pb.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/generated.proto delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/group_version.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/schema/interfaces.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/scheme.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/scheme_builder.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/codec_factory.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/json.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/json/meta.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/negotiated_codec.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf/protobuf.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/protobuf_extension.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/recognizer/recognizer.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/streaming/streaming.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/serializer/versioning/versioning.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/swagger_doc_generator.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/types.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/types_proto.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/runtime/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/selection/operator.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/types/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/types/namespacedname.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/types/nodename.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/types/patch.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/types/uid.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/clock/clock.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/errors/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/errors/errors.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/framer/framer.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/httpstream.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/connection.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/roundtripper.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/httpstream/spdy/upgrade.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/intstr/generated.pb.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/intstr/generated.proto delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/intstr/intstr.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/json/json.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/naming/from_stack.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/http.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/interface.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/port_range.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/port_split.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/net/util.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/remotecommand/constants.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/runtime/runtime.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/byte.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/empty.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/int.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/int64.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/sets/string.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/field/errors.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/field/path.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/validation/validation.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/util/yaml/decoder.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/version/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/version/helpers.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/version/types.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/watch/doc.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/watch/filter.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/watch/mux.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/watch/streamwatcher.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/watch/watch.go delete mode 100644 vendor/k8s.io/apimachinery/pkg/watch/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/netutil/addr.go delete mode 100644 vendor/k8s.io/apimachinery/third_party/forked/golang/reflect/deep_equal.go delete mode 100644 vendor/k8s.io/client-go/LICENSE delete mode 100644 vendor/k8s.io/client-go/discovery/cached_discovery.go delete mode 100644 vendor/k8s.io/client-go/discovery/discovery_client.go delete mode 100644 vendor/k8s.io/client-go/discovery/doc.go delete mode 100644 vendor/k8s.io/client-go/discovery/helper.go delete mode 100644 vendor/k8s.io/client-go/discovery/round_tripper.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/clientset.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/import.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/scheme/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/scheme/register.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/admissionregistration_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1alpha1/initializerconfiguration.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/admissionregistration_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/mutatingwebhookconfiguration.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/admissionregistration/v1beta1/validatingwebhookconfiguration.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/apps_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/controllerrevision.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/daemonset.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/deployment.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/replicaset.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1/statefulset.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/apps_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/controllerrevision.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/deployment.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta1/statefulset.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/apps_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/controllerrevision.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/daemonset.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/deployment.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/replicaset.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/apps/v1beta2/statefulset.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1/auditregistration_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1/auditsink.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/auditregistration/v1alpha1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/authentication_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/tokenreview.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1/tokenreview_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/authentication_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/tokenreview.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authentication/v1beta1/tokenreview_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/authorization_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/localsubjectaccessreview.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/localsubjectaccessreview_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectaccessreview.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectaccessreview_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectrulesreview.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/selfsubjectrulesreview_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/subjectaccessreview.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1/subjectaccessreview_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/authorization_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/localsubjectaccessreview.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/localsubjectaccessreview_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectaccessreview.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectaccessreview_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectrulesreview.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/selfsubjectrulesreview_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/subjectaccessreview.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/authorization/v1beta1/subjectaccessreview_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/autoscaling_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v1/horizontalpodautoscaler.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/autoscaling_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta1/horizontalpodautoscaler.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/autoscaling_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/autoscaling/v2beta2/horizontalpodautoscaler.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/batch_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1/job.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/batch_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/cronjob.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/batch_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/cronjob.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/batch/v2alpha1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificates_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/certificatesigningrequest_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/certificates/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/coordination_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/coordination/v1beta1/lease.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/componentstatus.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/configmap.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/core_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/endpoints.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/event.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/event_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/limitrange.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/namespace_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/node.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/node_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolume.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/persistentvolumeclaim.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/pod_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/podtemplate.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/replicationcontroller.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/resourcequota.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/secret.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/service.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/service_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/core/v1/serviceaccount_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/event.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/events_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/events/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/daemonset.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/deployment_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/extensions_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/ingress.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/podsecuritypolicy.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/extensions/v1beta1/replicaset.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networking_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/networking/v1/networkpolicy.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/eviction.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/eviction_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/poddisruptionbudget.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/podsecuritypolicy.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/policy/v1beta1/policy_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrole.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/clusterrolebinding.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rbac_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/role.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1/rolebinding.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrole.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/clusterrolebinding.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rbac_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/role.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1alpha1/rolebinding.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrole.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/clusterrolebinding.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rbac_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/role.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/rbac/v1beta1/rolebinding.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/priorityclass.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1alpha1/scheduling_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/priorityclass.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/scheduling/v1beta1/scheduling_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/podpreset.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/settings/v1alpha1/settings_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storage_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/storageclass.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1/volumeattachment.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/storage_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1alpha1/volumeattachment.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/generated_expansion.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storage_client.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/storageclass.go delete mode 100644 vendor/k8s.io/client-go/kubernetes/typed/storage/v1beta1/volumeattachment.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/OWNERS delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/doc.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/register.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/types.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/doc.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/register.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/types.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.conversion.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1alpha1/zz_generated.defaults.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/conversion.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/doc.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/register.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/types.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.conversion.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/v1beta1/zz_generated.defaults.go delete mode 100644 vendor/k8s.io/client-go/pkg/apis/clientauthentication/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/client-go/pkg/version/.gitattributes delete mode 100644 vendor/k8s.io/client-go/pkg/version/base.go delete mode 100644 vendor/k8s.io/client-go/pkg/version/def.bzl delete mode 100644 vendor/k8s.io/client-go/pkg/version/doc.go delete mode 100644 vendor/k8s.io/client-go/pkg/version/version.go delete mode 100644 vendor/k8s.io/client-go/plugin/pkg/client/auth/exec/exec.go delete mode 100755 vendor/k8s.io/client-go/rest/OWNERS delete mode 100644 vendor/k8s.io/client-go/rest/client.go delete mode 100644 vendor/k8s.io/client-go/rest/config.go delete mode 100644 vendor/k8s.io/client-go/rest/plugin.go delete mode 100644 vendor/k8s.io/client-go/rest/request.go delete mode 100644 vendor/k8s.io/client-go/rest/token_source.go delete mode 100644 vendor/k8s.io/client-go/rest/transport.go delete mode 100644 vendor/k8s.io/client-go/rest/url_utils.go delete mode 100644 vendor/k8s.io/client-go/rest/urlbackoff.go delete mode 100644 vendor/k8s.io/client-go/rest/watch/decoder.go delete mode 100644 vendor/k8s.io/client-go/rest/watch/encoder.go delete mode 100644 vendor/k8s.io/client-go/rest/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/client-go/tools/auth/OWNERS delete mode 100644 vendor/k8s.io/client-go/tools/auth/clientauth.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/doc.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/helpers.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/latest/latest.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/register.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/types.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/v1/conversion.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/v1/doc.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/v1/register.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/v1/types.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/v1/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/api/zz_generated.deepcopy.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/auth_loaders.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/client_config.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/config.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/doc.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/flag.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/helpers.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/loader.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/merged_client_builder.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/overrides.go delete mode 100644 vendor/k8s.io/client-go/tools/clientcmd/validation.go delete mode 100755 vendor/k8s.io/client-go/tools/metrics/OWNERS delete mode 100644 vendor/k8s.io/client-go/tools/metrics/metrics.go delete mode 100644 vendor/k8s.io/client-go/tools/reference/ref.go delete mode 100644 vendor/k8s.io/client-go/tools/remotecommand/doc.go delete mode 100644 vendor/k8s.io/client-go/tools/remotecommand/errorstream.go delete mode 100644 vendor/k8s.io/client-go/tools/remotecommand/reader.go delete mode 100644 vendor/k8s.io/client-go/tools/remotecommand/remotecommand.go delete mode 100644 vendor/k8s.io/client-go/tools/remotecommand/resize.go delete mode 100644 vendor/k8s.io/client-go/tools/remotecommand/v1.go delete mode 100644 vendor/k8s.io/client-go/tools/remotecommand/v2.go delete mode 100644 vendor/k8s.io/client-go/tools/remotecommand/v3.go delete mode 100644 vendor/k8s.io/client-go/tools/remotecommand/v4.go delete mode 100755 vendor/k8s.io/client-go/transport/OWNERS delete mode 100644 vendor/k8s.io/client-go/transport/cache.go delete mode 100644 vendor/k8s.io/client-go/transport/config.go delete mode 100644 vendor/k8s.io/client-go/transport/round_trippers.go delete mode 100644 vendor/k8s.io/client-go/transport/spdy/spdy.go delete mode 100644 vendor/k8s.io/client-go/transport/transport.go delete mode 100644 vendor/k8s.io/client-go/util/cert/OWNERS delete mode 100644 vendor/k8s.io/client-go/util/cert/cert.go delete mode 100644 vendor/k8s.io/client-go/util/cert/csr.go delete mode 100644 vendor/k8s.io/client-go/util/cert/io.go delete mode 100644 vendor/k8s.io/client-go/util/cert/pem.go delete mode 100644 vendor/k8s.io/client-go/util/connrotation/connrotation.go delete mode 100644 vendor/k8s.io/client-go/util/exec/exec.go delete mode 100644 vendor/k8s.io/client-go/util/flowcontrol/backoff.go delete mode 100644 vendor/k8s.io/client-go/util/flowcontrol/throttle.go delete mode 100644 vendor/k8s.io/client-go/util/homedir/homedir.go delete mode 100644 vendor/k8s.io/client-go/util/integer/integer.go delete mode 100644 vendor/k8s.io/klog/.travis.yml delete mode 100644 vendor/k8s.io/klog/CONTRIBUTING.md delete mode 100644 vendor/k8s.io/klog/LICENSE delete mode 100644 vendor/k8s.io/klog/OWNERS delete mode 100644 vendor/k8s.io/klog/README.md delete mode 100644 vendor/k8s.io/klog/RELEASE.md delete mode 100644 vendor/k8s.io/klog/SECURITY_CONTACTS delete mode 100644 vendor/k8s.io/klog/klog.go delete mode 100644 vendor/k8s.io/klog/klog_file.go delete mode 100644 vendor/sigs.k8s.io/yaml/.gitignore delete mode 100644 vendor/sigs.k8s.io/yaml/.travis.yml delete mode 100644 vendor/sigs.k8s.io/yaml/CONTRIBUTING.md delete mode 100644 vendor/sigs.k8s.io/yaml/LICENSE delete mode 100644 vendor/sigs.k8s.io/yaml/OWNERS delete mode 100644 vendor/sigs.k8s.io/yaml/README.md delete mode 100644 vendor/sigs.k8s.io/yaml/RELEASE.md delete mode 100644 vendor/sigs.k8s.io/yaml/SECURITY_CONTACTS delete mode 100644 vendor/sigs.k8s.io/yaml/code-of-conduct.md delete mode 100644 vendor/sigs.k8s.io/yaml/fields.go delete mode 100644 vendor/sigs.k8s.io/yaml/yaml.go delete mode 100644 vendor/sigs.k8s.io/yaml/yaml_go110.go diff --git a/Dockerfile b/Dockerfile index b44035b..dfb8e98 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,12 +1,8 @@ FROM alpine:latest ADD bin/k8s-webshell /data/k8s-webshell -ADD configs/inside_finup.crt /data/inside_finup.crt -ADD configs/inside_finup.key /data/inside_finup.key -RUN chmod 755 /data/k8s-webshell +RUN chmod +x /data/k8s-webshell WORKDIR /data -ENTRYPOINT ["./k8s-webshell"] - - +ENTRYPOINT ["./k8s-webshell"] \ No newline at end of file diff --git a/Gopkg.lock b/Gopkg.lock deleted file mode 100644 index d807708..0000000 --- a/Gopkg.lock +++ /dev/null @@ -1,681 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" - name = "github.com/beorn7/perks" - packages = ["quantile"] - pruneopts = "UT" - revision = "4b2b341e8d7715fae06375aa633dbb6e91b3fb46" - version = "v1.0.0" - -[[projects]] - digest = "1:76dc72490af7174349349838f2fe118996381b31ea83243812a97e5a0fd5ed55" - name = "github.com/dgrijalva/jwt-go" - packages = ["."] - pruneopts = "UT" - revision = "06ea1031745cb8b3dab3f6a236daf2b0aa468b7e" - version = "v3.2.0" - -[[projects]] - digest = "1:58be7025fd84632dfbb8a398f931b5bdbbecc0390e4385df4ae56775487a0f87" - name = "github.com/docker/spdystream" - packages = [ - ".", - "spdy", - ] - pruneopts = "UT" - revision = "449fdfce4d962303d702fec724ef0ad181c92528" - -[[projects]] - digest = "1:abeb38ade3f32a92943e5be54f55ed6d6e3b6602761d74b4aab4c9dd45c18abd" - name = "github.com/fsnotify/fsnotify" - packages = ["."] - pruneopts = "UT" - revision = "c2828203cd70a50dcccfb2761f8b1f8ceef9a8e9" - version = "v1.4.7" - -[[projects]] - digest = "1:36fe9527deed01d2a317617e59304eb2c4ce9f8a24115bcc5c2e37b3aee5bae4" - name = "github.com/gin-contrib/sse" - packages = ["."] - pruneopts = "UT" - revision = "22d885f9ecc78bf4ee5d72b937e4bbcdc58e8cae" - -[[projects]] - digest = "1:d8bd2a337f6ff2188e08f72c614f2f3f0fd48e6a7b37a071b197e427d77d3a47" - name = "github.com/gin-gonic/gin" - packages = [ - ".", - "binding", - "internal/json", - "render", - ] - pruneopts = "UT" - revision = "b75d67cd51eb53c3c3a2fc406524c940021ffbda" - version = "v1.4.0" - -[[projects]] - digest = "1:b7a8552c62868d867795b63eaf4f45d3e92d36db82b428e680b9c95a8c33e5b1" - name = "github.com/gogo/protobuf" - packages = [ - "proto", - "sortkeys", - ] - pruneopts = "UT" - revision = "342cbe0a04158f6dcb03ca0079991a51a4248c02" - version = "v0.5" - -[[projects]] - digest = "1:17fe264ee908afc795734e8c4e63db2accabaf57326dbf21763a7d6b86096260" - name = "github.com/golang/protobuf" - packages = [ - "proto", - "ptypes", - "ptypes/any", - "ptypes/duration", - "ptypes/timestamp", - ] - pruneopts = "UT" - revision = "b4deda0973fb4c70b50d226b1af49f3da59f5265" - version = "v1.1.0" - -[[projects]] - digest = "1:0bfbe13936953a98ae3cfe8ed6670d396ad81edf069a806d2f6515d7bb6950df" - name = "github.com/google/btree" - packages = ["."] - pruneopts = "UT" - revision = "4030bb1f1f0c35b30ca7009e9ebd06849dd45306" - version = "v1.0.0" - -[[projects]] - digest = "1:41bfd4219241b7f7d6e6fdb13fc712576f1337e68e6b895136283b76928fdd66" - name = "github.com/google/gofuzz" - packages = ["."] - pruneopts = "UT" - revision = "44d81051d367757e1c7c6a5a86423ece9afcf63c" - -[[projects]] - digest = "1:75eb87381d25cc75212f52358df9c3a2719584eaa9685cd510ce28699122f39d" - name = "github.com/googleapis/gnostic" - packages = [ - "OpenAPIv2", - "compiler", - "extensions", - ] - pruneopts = "UT" - revision = "0c5108395e2debce0d731cf0287ddf7242066aba" - -[[projects]] - digest = "1:7b5c6e2eeaa9ae5907c391a91c132abfd5c9e8a784a341b5625e750c67e6825d" - name = "github.com/gorilla/websocket" - packages = ["."] - pruneopts = "UT" - revision = "66b9c49e59c6c48f0ffce28c2d8b8a5678502c6d" - version = "v1.4.0" - -[[projects]] - digest = "1:878f0defa9b853f9acfaf4a162ba450a89d0050eff084f9fe7f5bd15948f172a" - name = "github.com/gregjones/httpcache" - packages = [ - ".", - "diskcache", - ] - pruneopts = "UT" - revision = "787624de3eb7bd915c329cba748687a3b22666a6" - -[[projects]] - digest = "1:c0d19ab64b32ce9fe5cf4ddceba78d5bc9807f0016db6b1183599da3dcc24d10" - name = "github.com/hashicorp/hcl" - packages = [ - ".", - "hcl/ast", - "hcl/parser", - "hcl/printer", - "hcl/scanner", - "hcl/strconv", - "hcl/token", - "json/parser", - "json/scanner", - "json/token", - ] - pruneopts = "UT" - revision = "8cb6e5b959231cc1119e43259c4a608f9c51a241" - version = "v1.0.0" - -[[projects]] - digest = "1:3e260afa138eab6492b531a3b3d10ab4cb70512d423faa78b8949dec76e66a21" - name = "github.com/imdario/mergo" - packages = ["."] - pruneopts = "UT" - revision = "9316a62528ac99aaecb4e47eadd6dc8aa6533d58" - version = "v0.3.5" - -[[projects]] - digest = "1:eaefc85d32c03e5f0c2b88ea2f79fce3d993e2c78316d21319575dd4ea9153ca" - name = "github.com/json-iterator/go" - packages = ["."] - pruneopts = "UT" - revision = "ab8a2e0c74be9d3be70b3184d9acc634935ded82" - version = "1.1.4" - -[[projects]] - digest = "1:31e761d97c76151dde79e9d28964a812c46efc5baee4085b86f68f0c654450de" - name = "github.com/konsorten/go-windows-terminal-sequences" - packages = ["."] - pruneopts = "UT" - revision = "f55edac94c9bbba5d6182a4be46d86a2c9b5b50e" - version = "v1.0.2" - -[[projects]] - branch = "master" - digest = "1:f7d8e8432e355163397d2da1e17d0fb616d611db1360c43b1ac73e56f87038e2" - name = "github.com/lestrrat/go-file-rotatelogs" - packages = ["."] - pruneopts = "UT" - revision = "d3151e2a480fdcd05fb97102f5310a47d96274c4" - -[[projects]] - branch = "master" - digest = "1:b9f2e1d7b042e6fdb2aa1e3762afdb99e0c584f66a1a346b03cf8b4be203c694" - name = "github.com/lestrrat/go-strftime" - packages = ["."] - pruneopts = "UT" - revision = "ba3bf9c1d0421aa146564a632931730344f1f9f1" - -[[projects]] - digest = "1:c568d7727aa262c32bdf8a3f7db83614f7af0ed661474b24588de635c20024c7" - name = "github.com/magiconair/properties" - packages = ["."] - pruneopts = "UT" - revision = "c2353362d570a7bfa228149c62842019201cfb71" - version = "v1.8.0" - -[[projects]] - digest = "1:fa610f9fe6a93f4a75e64c83673dfff9bf1a34bbb21e6102021b6bc7850834a3" - name = "github.com/mattn/go-isatty" - packages = ["."] - pruneopts = "UT" - revision = "57fdcb988a5c543893cc61bce354a6e24ab70022" - -[[projects]] - digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" - name = "github.com/matttproud/golang_protobuf_extensions" - packages = ["pbutil"] - pruneopts = "UT" - revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" - version = "v1.0.1" - -[[projects]] - digest = "1:53bc4cd4914cd7cd52139990d5170d6dc99067ae31c56530621b18b35fc30318" - name = "github.com/mitchellh/mapstructure" - packages = ["."] - pruneopts = "UT" - revision = "3536a929edddb9a5b34bd6861dc4a9647cb459fe" - version = "v1.1.2" - -[[projects]] - digest = "1:33422d238f147d247752996a26574ac48dcf472976eda7f5134015f06bf16563" - name = "github.com/modern-go/concurrent" - packages = ["."] - pruneopts = "UT" - revision = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94" - version = "1.0.3" - -[[projects]] - digest = "1:c56ad36f5722eb07926c979d5e80676ee007a9e39e7808577b9d87ec92b00460" - name = "github.com/modern-go/reflect2" - packages = ["."] - pruneopts = "UT" - revision = "94122c33edd36123c84d5368cfb2b69df93a0ec8" - version = "v1.0.1" - -[[projects]] - digest = "1:95741de3af260a92cc5c7f3f3061e85273f5a81b5db20d4bd68da74bd521675e" - name = "github.com/pelletier/go-toml" - packages = ["."] - pruneopts = "UT" - revision = "c01d1270ff3e442a8a57cddc1c92dc1138598194" - version = "v1.2.0" - -[[projects]] - branch = "master" - digest = "1:3bf17a6e6eaa6ad24152148a631d18662f7212e21637c2699bff3369b7f00fa2" - name = "github.com/petar/GoLLRB" - packages = ["llrb"] - pruneopts = "UT" - revision = "53be0d36a84c2a886ca057d34b6aa4468df9ccb4" - -[[projects]] - digest = "1:0e7775ebbcf00d8dd28ac663614af924411c868dca3d5aa762af0fae3808d852" - name = "github.com/peterbourgon/diskv" - packages = ["."] - pruneopts = "UT" - revision = "5f041e8faa004a95c88a202771f4cc3e991971e6" - version = "v2.0.1" - -[[projects]] - digest = "1:cf31692c14422fa27c83a05292eb5cbe0fb2775972e8f1f8446a71549bd8980b" - name = "github.com/pkg/errors" - packages = ["."] - pruneopts = "UT" - revision = "ba968bfe8b2f7e042a574c888954fccecfa385b4" - version = "v0.8.1" - -[[projects]] - digest = "1:eb04f69c8991e52eff33c428bd729e04208bf03235be88e4df0d88497c6861b9" - name = "github.com/prometheus/client_golang" - packages = [ - "prometheus", - "prometheus/internal", - "prometheus/promhttp", - ] - pruneopts = "UT" - revision = "4ab88e80c249ed361d3299e2930427d9ac43ef8d" - version = "v1.0.0" - -[[projects]] - branch = "master" - digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" - name = "github.com/prometheus/client_model" - packages = ["go"] - pruneopts = "UT" - revision = "fd36f4220a901265f90734c3183c5f0c91daa0b8" - -[[projects]] - digest = "1:8dcedf2e8f06c7f94e48267dea0bc0be261fa97b377f3ae3e87843a92a549481" - name = "github.com/prometheus/common" - packages = [ - "expfmt", - "internal/bitbucket.org/ww/goautoneg", - "model", - ] - pruneopts = "UT" - revision = "d9a1ac54fefb52fd16b910a12a09fa4b496d0a8d" - version = "v0.5.0" - -[[projects]] - digest = "1:403b810b43500b5b0a9a24a47347e31dc2783ccae8cf97c891b46f5b0496fa1a" - name = "github.com/prometheus/procfs" - packages = [ - ".", - "internal/fs", - ] - pruneopts = "UT" - revision = "833678b5bb319f2d20a475cb165c6cc59c2cc77c" - version = "v0.0.2" - -[[projects]] - digest = "1:1a23fdd843129ef761ffe7651bc5fe7c5b09fbe933e92783ab06cc11c37b7b37" - name = "github.com/rifflock/lfshook" - packages = ["."] - pruneopts = "UT" - revision = "b9218ef580f59a2e72dad1aa33d660150445d05a" - version = "v2.4" - -[[projects]] - digest = "1:04457f9f6f3ffc5fea48e71d62f2ca256637dee0a04d710288e27e05c8b41976" - name = "github.com/sirupsen/logrus" - packages = ["."] - pruneopts = "UT" - revision = "839c75faf7f98a33d445d181f3018b5c3409a45e" - version = "v1.4.2" - -[[projects]] - digest = "1:3e39bafd6c2f4bf3c76c3bfd16a2e09e016510ad5db90dc02b88e2f565d6d595" - name = "github.com/spf13/afero" - packages = [ - ".", - "mem", - ] - pruneopts = "UT" - revision = "f4711e4db9e9a1d3887343acb72b2bbfc2f686f5" - version = "v1.2.1" - -[[projects]] - digest = "1:08d65904057412fc0270fc4812a1c90c594186819243160dc779a402d4b6d0bc" - name = "github.com/spf13/cast" - packages = ["."] - pruneopts = "UT" - revision = "8c9545af88b134710ab1cd196795e7f2388358d7" - version = "v1.3.0" - -[[projects]] - digest = "1:1b753ec16506f5864d26a28b43703c58831255059644351bbcb019b843950900" - name = "github.com/spf13/jwalterweatherman" - packages = ["."] - pruneopts = "UT" - revision = "94f6ae3ed3bceceafa716478c5fbf8d29ca601a1" - version = "v1.1.0" - -[[projects]] - digest = "1:c1b1102241e7f645bc8e0c22ae352e8f0dc6484b6cb4d132fa9f24174e0119e2" - name = "github.com/spf13/pflag" - packages = ["."] - pruneopts = "UT" - revision = "298182f68c66c05229eb03ac171abe6e309ee79a" - version = "v1.0.3" - -[[projects]] - digest = "1:11118bd196646c6515fea3d6c43f66162833c6ae4939bfb229b9956d91c6cf17" - name = "github.com/spf13/viper" - packages = ["."] - pruneopts = "UT" - revision = "b5bf975e5823809fb22c7644d008757f78a4259e" - version = "v1.4.0" - -[[projects]] - digest = "1:c268acaa4a4d94a467980e5e91452eb61c460145765293dc0aed48e5e9919cc6" - name = "github.com/ugorji/go" - packages = ["codec"] - pruneopts = "UT" - revision = "c88ee250d0221a57af388746f5cf03768c21d6e2" - -[[projects]] - branch = "master" - digest = "1:058e9504b9a79bfe86092974d05bb3298d2aa0c312d266d43148de289a5065d9" - name = "golang.org/x/crypto" - packages = ["ssh/terminal"] - pruneopts = "UT" - revision = "b7391e95e576cacdcdd422573063bc057239113d" - -[[projects]] - branch = "release-branch.go1.10" - digest = "1:bdc99a0ff03b87c7fe65dce8cfd5f7db86d65446850b2c655db7bc740f16aded" - name = "golang.org/x/net" - packages = [ - "context", - "http2", - "http2/hpack", - "idna", - "lex/httplex", - ] - pruneopts = "UT" - revision = "0ed95abb35c445290478a5348a7b38bb154135fd" - -[[projects]] - digest = "1:9359217acc6040b4be710ce34473acef28023ad39bfafecea34ffaea7f1e1890" - name = "golang.org/x/oauth2" - packages = [ - ".", - "internal", - ] - pruneopts = "UT" - revision = "a6bd8cefa1811bd24b86f8902872e4e8225f74c4" - -[[projects]] - branch = "master" - digest = "1:012ffea19e0c7f3bf69652ba71b42c8ffa9929ad53f8a1d50534b279cfd7a34f" - name = "golang.org/x/sys" - packages = [ - "unix", - "windows", - ] - pruneopts = "UT" - revision = "f7bb7a8bee54210937e93ec56d007d892c1f0580" - -[[projects]] - digest = "1:a2ab62866c75542dd18d2b069fec854577a20211d7c0ea6ae746072a1dccdd18" - name = "golang.org/x/text" - packages = [ - "collate", - "collate/build", - "internal/colltab", - "internal/gen", - "internal/tag", - "internal/triegen", - "internal/ucd", - "language", - "secure/bidirule", - "transform", - "unicode/bidi", - "unicode/cldr", - "unicode/norm", - "unicode/rangetable", - ] - pruneopts = "UT" - revision = "f21a4dfb5e38f5895301dc265a8def02365cc3d0" - version = "v0.3.0" - -[[projects]] - digest = "1:d37b0ef2944431fe9e8ef35c6fffc8990d9e2ca300588df94a6890f3649ae365" - name = "golang.org/x/time" - packages = ["rate"] - pruneopts = "UT" - revision = "f51c12702a4d776e4c1fa9b0fabab841babae631" - -[[projects]] - digest = "1:6eb6e3b6d9fffb62958cf7f7d88dbbe1dd6839436b0802e194c590667a40412a" - name = "google.golang.org/appengine" - packages = [ - "internal", - "internal/base", - "internal/datastore", - "internal/log", - "internal/remote_api", - "internal/urlfetch", - "urlfetch", - ] - pruneopts = "UT" - revision = "54a98f90d1c46b7731eb8fb305d2a321c30ef610" - version = "v1.5.0" - -[[projects]] - digest = "1:1b4724d3c8125f6044925f02b485b74bfec9905cbf579d95aafd1a6c8f8447d3" - name = "gopkg.in/go-playground/validator.v8" - packages = ["."] - pruneopts = "UT" - revision = "5f57d2222ad794d0dffb07e664ea05e2ee07d60c" - version = "v8.18.1" - -[[projects]] - digest = "1:ef72505cf098abdd34efeea032103377bec06abb61d8a06f002d5d296a4b1185" - name = "gopkg.in/inf.v0" - packages = ["."] - pruneopts = "UT" - revision = "3887ee99ecf07df5b447e9b00d9c0b2adaa9f3e4" - version = "v0.9.0" - -[[projects]] - digest = "1:4d2e5a73dc1500038e504a8d78b986630e3626dc027bc030ba5c75da257cdb96" - name = "gopkg.in/yaml.v2" - packages = ["."] - pruneopts = "UT" - revision = "51d6538a90f86fe93ac480b35f37b2be17fef232" - version = "v2.2.2" - -[[projects]] - digest = "1:0d299a04c6472e4458461d7034c76d014cc6f632a3262cbf21d123b19ce13e65" - name = "k8s.io/api" - packages = [ - "admissionregistration/v1alpha1", - "admissionregistration/v1beta1", - "apps/v1", - "apps/v1beta1", - "apps/v1beta2", - "auditregistration/v1alpha1", - "authentication/v1", - "authentication/v1beta1", - "authorization/v1", - "authorization/v1beta1", - "autoscaling/v1", - "autoscaling/v2beta1", - "autoscaling/v2beta2", - "batch/v1", - "batch/v1beta1", - "batch/v2alpha1", - "certificates/v1beta1", - "coordination/v1beta1", - "core/v1", - "events/v1beta1", - "extensions/v1beta1", - "networking/v1", - "policy/v1beta1", - "rbac/v1", - "rbac/v1alpha1", - "rbac/v1beta1", - "scheduling/v1alpha1", - "scheduling/v1beta1", - "settings/v1alpha1", - "storage/v1", - "storage/v1alpha1", - "storage/v1beta1", - ] - pruneopts = "UT" - revision = "89a74a8d264df0e993299876a8cde88379b940ee" - version = "kubernetes-1.13.0" - -[[projects]] - digest = "1:d0727b638acf14f150c5e2bdf70413af1099b7a76d69f4f85ad3049b615d24a3" - name = "k8s.io/apimachinery" - packages = [ - "pkg/api/errors", - "pkg/api/meta", - "pkg/api/resource", - "pkg/apis/meta/v1", - "pkg/apis/meta/v1/unstructured", - "pkg/apis/meta/v1beta1", - "pkg/conversion", - "pkg/conversion/queryparams", - "pkg/fields", - "pkg/labels", - "pkg/runtime", - "pkg/runtime/schema", - "pkg/runtime/serializer", - "pkg/runtime/serializer/json", - "pkg/runtime/serializer/protobuf", - "pkg/runtime/serializer/recognizer", - "pkg/runtime/serializer/streaming", - "pkg/runtime/serializer/versioning", - "pkg/selection", - "pkg/types", - "pkg/util/clock", - "pkg/util/errors", - "pkg/util/framer", - "pkg/util/httpstream", - "pkg/util/httpstream/spdy", - "pkg/util/intstr", - "pkg/util/json", - "pkg/util/naming", - "pkg/util/net", - "pkg/util/remotecommand", - "pkg/util/runtime", - "pkg/util/sets", - "pkg/util/validation", - "pkg/util/validation/field", - "pkg/util/yaml", - "pkg/version", - "pkg/watch", - "third_party/forked/golang/netutil", - "third_party/forked/golang/reflect", - ] - pruneopts = "UT" - revision = "2b1284ed4c93a43499e781493253e2ac5959c4fd" - version = "kubernetes-1.13.0" - -[[projects]] - digest = "1:92c7b523fffa5badf467754612745bfa8629c4999a44c0c2521c16e2ad50bd2a" - name = "k8s.io/client-go" - packages = [ - "discovery", - "kubernetes", - "kubernetes/scheme", - "kubernetes/typed/admissionregistration/v1alpha1", - "kubernetes/typed/admissionregistration/v1beta1", - "kubernetes/typed/apps/v1", - "kubernetes/typed/apps/v1beta1", - "kubernetes/typed/apps/v1beta2", - "kubernetes/typed/auditregistration/v1alpha1", - "kubernetes/typed/authentication/v1", - "kubernetes/typed/authentication/v1beta1", - "kubernetes/typed/authorization/v1", - "kubernetes/typed/authorization/v1beta1", - "kubernetes/typed/autoscaling/v1", - "kubernetes/typed/autoscaling/v2beta1", - "kubernetes/typed/autoscaling/v2beta2", - "kubernetes/typed/batch/v1", - "kubernetes/typed/batch/v1beta1", - "kubernetes/typed/batch/v2alpha1", - "kubernetes/typed/certificates/v1beta1", - "kubernetes/typed/coordination/v1beta1", - "kubernetes/typed/core/v1", - "kubernetes/typed/events/v1beta1", - "kubernetes/typed/extensions/v1beta1", - "kubernetes/typed/networking/v1", - "kubernetes/typed/policy/v1beta1", - "kubernetes/typed/rbac/v1", - "kubernetes/typed/rbac/v1alpha1", - "kubernetes/typed/rbac/v1beta1", - "kubernetes/typed/scheduling/v1alpha1", - "kubernetes/typed/scheduling/v1beta1", - "kubernetes/typed/settings/v1alpha1", - "kubernetes/typed/storage/v1", - "kubernetes/typed/storage/v1alpha1", - "kubernetes/typed/storage/v1beta1", - "pkg/apis/clientauthentication", - "pkg/apis/clientauthentication/v1alpha1", - "pkg/apis/clientauthentication/v1beta1", - "pkg/version", - "plugin/pkg/client/auth/exec", - "rest", - "rest/watch", - "tools/auth", - "tools/clientcmd", - "tools/clientcmd/api", - "tools/clientcmd/api/latest", - "tools/clientcmd/api/v1", - "tools/metrics", - "tools/reference", - "tools/remotecommand", - "transport", - "transport/spdy", - "util/cert", - "util/connrotation", - "util/exec", - "util/flowcontrol", - "util/homedir", - "util/integer", - ] - pruneopts = "UT" - revision = "e64494209f554a6723674bd494d69445fb76a1d4" - version = "v10.0.0" - -[[projects]] - digest = "1:e2999bf1bb6eddc2a6aa03fe5e6629120a53088926520ca3b4765f77d7ff7eab" - name = "k8s.io/klog" - packages = ["."] - pruneopts = "UT" - revision = "8139d8cb77af419532b33dfa7dd09fbc5f1d344f" - -[[projects]] - digest = "1:7719608fe0b52a4ece56c2dde37bedd95b938677d1ab0f84b8a7852e4c59f849" - name = "sigs.k8s.io/yaml" - packages = ["."] - pruneopts = "UT" - revision = "fd68e9863619f6ec2fdd8625fe1f02e7c877e480" - version = "v1.1.0" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - input-imports = [ - "github.com/dgrijalva/jwt-go", - "github.com/gin-gonic/gin", - "github.com/gorilla/websocket", - "github.com/lestrrat/go-file-rotatelogs", - "github.com/pkg/errors", - "github.com/prometheus/client_golang/prometheus", - "github.com/prometheus/client_golang/prometheus/promhttp", - "github.com/rifflock/lfshook", - "github.com/sirupsen/logrus", - "github.com/spf13/viper", - "k8s.io/api/core/v1", - "k8s.io/apimachinery/pkg/util/json", - "k8s.io/client-go/kubernetes", - "k8s.io/client-go/kubernetes/scheme", - "k8s.io/client-go/rest", - "k8s.io/client-go/tools/clientcmd", - "k8s.io/client-go/tools/remotecommand", - ] - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/Gopkg.toml b/Gopkg.toml deleted file mode 100644 index 84d5981..0000000 --- a/Gopkg.toml +++ /dev/null @@ -1,86 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://golang.github.io/dep/docs/Gopkg.toml.html -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" -# -# [prune] -# non-go = false -# go-tests = true -# unused-packages = true - - -[[constraint]] - name = "github.com/gin-gonic/gin" - version = "1.3.0" - -[[constraint]] - name = "github.com/gorilla/websocket" - version = "1.4.0" - -[[constraint]] - branch = "master" - name = "github.com/lestrrat/go-file-rotatelogs" - -[[constraint]] - name = "github.com/pkg/errors" - version = "0.8.1" - -[[constraint]] - name = "github.com/rifflock/lfshook" - version = "2.4.0" - -[[constraint]] - name = "github.com/sirupsen/logrus" - version = "1.4.0" - -[[constraint]] - name = "github.com/spf13/viper" - version = "1.3.2" - -[[constraint]] - name = "k8s.io/api" - version = "kubernetes-1.13.0" - -[[constraint]] - name = "k8s.io/apimachinery" - version = "kubernetes-1.13.0" - -[[constraint]] - name = "k8s.io/client-go" - version = "10.0.0" - -[prune] - go-tests = true - unused-packages = true - -[[constraint]] - name = "github.com/spf13/cobra" - version = "0.0.3" - -[[constraint]] - name = "github.com/dgrijalva/jwt-go" - version = "3.2.0" - -[[constraint]] - name = "gopkg.in/go-playground/validator.v9" - version = "9.28.0" - -[[constraint]] - name = "github.com/prometheus/client_golang" - version = "1.0.0" diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..3f3f3de --- /dev/null +++ b/Makefile @@ -0,0 +1,49 @@ +PROJECT="k8s-webshell" +BINARY="k8s-webshell" +VERSION=1.3 +BUILD=`data +%F%T%z` + +PACKAGES=`go list ./... |grep -v /vendor/` +VETPACKAGES=`go list ./... |grep -v /vendor/ |grep -v /examples/` +GOFILES=`find . -name "*.go" -type -f -not -path "./vendor/*"` + +default: + @cd src && go build -o ../bin/${BINARY} webshell/main.go + + +build-linux: + @cd src \ + && GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -gcflags \ + all=-trimpath=${GOPATH} -asmflags all=-trimpath=${GOPATH} \ + -ldflags '-w -s' -o ../bin/${BINARY} webshell/main.go + +list: + @echo ${PACKAGES} + @echo ${VETPACKAGES} + @echo ${GOFILES} +fmt: + @gofmt -s -w ${GOFILES} + +fmt-check: + @diff=$$(gofmt -s -d $(GOFILES)) + if [-n "$$diff"]; then \ + echo "Please run 'make fmt' and commit the result:"; \ + echo "$${diff}";\ + exit 1;\ + fi; + +install: + @govendor sync -v + +test: + @go test -cpu=1,2,4 -v -tags integration ./... + +docker: + @docker build -t k8s-webshell:v1.3 . + +clean: + @if [ -f ${BINARY} ] ; then rm ${BINARY} ; fi + + + +.PHONY: default fmt fmt-check install test vet docker clean \ No newline at end of file diff --git a/README.md b/README.md deleted file mode 100644 index b6445fc..0000000 --- a/README.md +++ /dev/null @@ -1,79 +0,0 @@ -##
k8s-webshell
- -### k8s-webshell 能做什么 -用户可以再web页面上直接登录k8s内部容器, 执行shell命令. -#### 示例如下: -![k8s-webshell](doc/imgs/k8s-webshell.gif) - -### build - -- compile k8s-webshell (需要本地安装docker以及docker-compose): - ```bash - # docker-compose -f docker-compose.yaml run --rm go-build - ``` - -- build 镜像(根据自己的仓库情况修改docker-compose.yaml中`image`字段): - ```bash - # docker-compose -f docker-compose.yaml build k8s-webshell - ``` - -- push 镜像: - ```bash - docker-compose push k8s-webshell - ``` - - -### 部署方式有2种: -- kubernetes 部署(k8s 集群内 incluster 模式)到集群当中 -- docker-compose 部署(k8s集群外部署) - -### kubernetes 部署 k8s-webshell - -进入到doc/deploy/k8s 下面依次执行: -(`注意` 根据自己的pod部署的命名空间修改里面的`namespace`字段) -```bash -# kubectl apply -f k8s-webshell-sa.yaml -# kubectl apply -f k8s-webshell-clusterrole.yaml -# kubectl apply -f k8s-webshell-clusterrolebinding.yaml -# kubectl apply -f k8s-webshell-deployment.yaml -# kubectl apply -f k8s-webshell-svc.yaml -``` -修改`doc/demo/client/index.html` 中的以下内容的ip修改为容器的为域名(ssl证书为xx.com): -```javascript -ws = new WebSocket("wss://xx.com:30001/api/ws?" + "token=" + wsToken); -``` -然后打开index.html 就可以测试了 - -### docker-compose 部署 - -在项目根目录下执行: -```bash -docker-compose -f docker-compose.yaml up -d k8s-webshell -``` - -### 接口使用 -调用`/auth`(POST方法)先获取token,参数如下: -```json -{ - "secretKey":"ERkyNK2Q", - "paasUser":"zhuruiqing", - "podNs":"richie", - "podName":"my-nginx-f9995bdb6-jtr5k", - "containerName":"my-nginx" - -} -``` -参数说明: -```python -secretKey api认证secretKey -paasUser paas平台用户 -podNs pod命名空间 -podName pod名称 -containerName 容器名称 - -``` - -### web页面调用k8s-webshell websocket接口 -调用接口`/api/ws`其中token为 请求auth后获得的token: -`ws = new WebSocket("wss://xx.com:30001/api/ws?" + "token=" + wsToken);` - diff --git a/cmd/k8s-webshell.go b/cmd/k8s-webshell.go deleted file mode 100644 index ec17c64..0000000 --- a/cmd/k8s-webshell.go +++ /dev/null @@ -1,22 +0,0 @@ -package main - -import ( - "os" - - "k8s-webshell/pkg/setting" - "k8s-webshell/pkg/utils" - "k8s-webshell/routers" -) - -func main() { - ginServer := routers.InitRouter() - //ginpprof.Wrapper(ginServer) - utils.Logger.Info("Current ENV: ", os.Getenv("env")) - utils.Logger.Info("Start k8s-webshell on Port: ", setting.HTTPPort) - err := ginServer.RunTLS(":"+setting.HTTPPort, setting.SslCertificate, setting.SslCertificateKey) - - if err != nil { - utils.Logger.Fatal("Gin Start err", err) - } - -} diff --git a/configs/admin.conf b/configs/admin.conf index 70600e8..6a74293 100644 --- a/configs/admin.conf +++ b/configs/admin.conf @@ -1,6 +1,9 @@ apiVersion: v1 clusters: - +- cluster: + insecure-skip-tls-verify: true + server: https://localhost:6443 + name: docker-desktop - cluster: certificate-authority-data: LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCk1JSURtakNDQW9LZ0F3SUJBZ0lVSXNTUnBPRUdlZCtCVXYyd2FObGJKM084TWRVd0RRWUpLb1pJaHZjTkFRRUwKQlFBd1pURUxNQWtHQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFXcHBibWN4RURBT0JnTlZCQWNUQjBKbAphV3BwYm1jeEREQUtCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByCmRXSmxjbTVsZEdWek1CNFhEVEU1TURFeE5UQTVNamN3TUZvWERUSTBNREV4TkRBNU1qY3dNRm93WlRFTE1Ba0cKQTFVRUJoTUNRMDR4RURBT0JnTlZCQWdUQjBKbGFXcHBibWN4RURBT0JnTlZCQWNUQjBKbGFXcHBibWN4RERBSwpCZ05WQkFvVEEyczRjekVQTUEwR0ExVUVDeE1HVTNsemRHVnRNUk13RVFZRFZRUURFd3ByZFdKbGNtNWxkR1Z6Ck1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBNllOK1o4SGJsYk9KbnR2RXJCc3MKVXEvZnpHMlBUVjJ1aTdzSjRwY1JoTE9GeFFhcjlaWHYyWkRjaTdoczY2ZXYvZVpHVTBJMWw4Z3NkK3lMUWE3VAp1VGJBR0FURGVxVk15YnVHc0xaNXkycFdSYVNUcXhmdUZrUWdHOE03L1pkRWthZERKUWRYd1FWeHozTnZCL2lJCnFOOUptT08ybnh0bDFLcEQ0OVJNVHhsV0JZTTlnc25uV25YMzcycHBHMWdSaFJyZjY4eDZIYnRVWFkxeTl2dWoKdVdpdUd6NDloVm53ZGkvWTZkRjIvOFdVbzAwMVRLT1dvSVZFbHdjVlR5L01xOVJjWkpXUE1WTk45YWlTVGQ5MQpMME0yU0xCNDkxVWNySy83TVppdk94MXNNUjlHd2dQYmx0MUxuay90ODl2QWNPNkQ3Mis1VzRDQ3c3OVFZNlRXCnNRSURBUUFCbzBJd1FEQU9CZ05WSFE4QkFmOEVCQU1DQVFZd0R3WURWUjBUQVFIL0JBVXdBd0VCL3pBZEJnTlYKSFE0RUZnUVUvTXArZm5PWjBSVVJ0bzkvZU8wTVI2cU54OWN3RFFZSktvWklodmNOQVFFTEJRQURnZ0VCQURtZgpMZU5SMG9DNHVaYVIyK1hGdTg5K3k0a2dYa05qVTR2S0s2cUJGcHhFRE5TMTQ2TWZsbUtVYWErN2NSUTYxUm9QClowOFhRNkVtRWZ2S2ErVDduN2s3MVpuK3ZLQ05YSzdMc2VRc2ljWHBkaS9Hd2xmS2dDYi9CMStGZldUeWF3MUUKT1h0QXJhQmNzUTlIaS8rTGlaemZwS1pacXQyZ0JUeVZFdWtpeTk5Q1BIaWhYOFlsOVMxN2RRVnRjdHA1SUNEegpYWDVZRXZKUCtUc0JHZ09wWDZ4Zk15TW81NHE2RldUYjdCYmt2NVM3cUFWVC9MTml0dkR0OVRsUWtzL2c0MVVnCjQvRm9uTExKeE9zS0Fma0lWM21xTWZXL01NV1ozY2d6RUtXSVNPVDRsL3hTNjRxQklHdUFDN252R3MrRlJaMnoKYkgxS1JzZlJZRDVST0hJdHZybz0KLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQo= server: https://10.10.215.69:6443 diff --git a/configs/config.yaml b/configs/config.yaml index c534185..9171d3b 100644 --- a/configs/config.yaml +++ b/configs/config.yaml @@ -3,6 +3,13 @@ server: run_mode: debug logpath: /Users/finup/GoglandProjects/src/k8s-webshell logname: webshell.log - kubeconfig: /Users/finup/GoglandProjects/src/k8s-webshell/configs/admin.conf + certificate: /Users/finup/GolandProjects/src/k8s-webshell/configs/inside_finup.crt + certificatekey: /Users/finup/GolandProjects/src/k8s-webshell/configs/inside_finup.key + jwtsecret: YouGuess + secretkey: richie + +k8s: + kubeconfig: /Users/finup/finupdata/go-projects/k8s-webshell/configs/admin.conf + incluster: false diff --git a/configs/devconfig.yaml b/configs/devconfig.yaml deleted file mode 100644 index 4548666..0000000 --- a/configs/devconfig.yaml +++ /dev/null @@ -1,11 +0,0 @@ -server: - port: 7777 - run_mode: debug - logpath: /tmp/k8s-webshell - logname: webshell.log - kubeconfig: /Users/finup/GoglandProjects/src/k8s-webshell/configs/admin.conf - incluster: false - ssl_certificate: /Users/finup/GoglandProjects/src/k8s-webshell/configs/inside_finup.crt - ssl_certificate_key: /Users/finup/GoglandProjects/src/k8s-webshell/configs/inside_finup.key - jwt_secret: YouGuess - secret_key: richie diff --git a/configs/inside_finup.crt b/configs/inside_finup.crt deleted file mode 100755 index 74d063f..0000000 --- a/configs/inside_finup.crt +++ /dev/null @@ -1,131 +0,0 @@ ------BEGIN CERTIFICATE----- -MIIFYTCCBEmgAwIBAgIMTbN5yjcrx8/luoD3MA0GCSqGSIb3DQEBCwUAMGYxCzAJ -BgNVBAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTwwOgYDVQQDEzNH -bG9iYWxTaWduIE9yZ2FuaXphdGlvbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0g -RzIwHhcNMTcwOTIyMTMxMjU1WhcNMjAwOTIyMTMxMjU1WjCBgTELMAkGA1UEBhMC -Q04xEDAOBgNVBAgTB0d1YW5neGkxDzANBgNVBAcTBkJlaWhhaTELMAkGA1UECxMC -SVQxJzAlBgNVBAoMHuWHoeaZrumHkeenkembhuWbouaciemZkOWFrOWPuDEZMBcG -A1UEAwwQKi5maW51cGdyb3VwLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCC -AQoCggEBAOsxqmFX0zQMz9sih4mjP71tm3Dobq0NdvEj5FP8pCxzKwwVwN9rj3gh -ST/iUIWrEG8+2hjKzUVo79Zkcw4D99fawIIz7qRokCyDyk7+p/no3s3xzmHt4EZv -sRbx4twUYlcAxZpL9crOMBOZ2AMHr6wunfHGOgDhf77MpREogNf/FH7tGTW/aIGI -1YrrQ7aWfnPplflkUDA9pzCJKhttwwqLhK9vjHsUgKFo8+sADQRDARSinVOgCAn0 -1/lvx9gF5UTuED9aD5It+q8xyrdqHQSBV/n1t7kybHAHCfHN4+qG7nAx1H7kKWKz -qXpvZg76d0HlXRYIGWpfhQmFIMHT9V0CAwEAAaOCAfEwggHtMA4GA1UdDwEB/wQE -AwIFoDCBoAYIKwYBBQUHAQEEgZMwgZAwTQYIKwYBBQUHMAKGQWh0dHA6Ly9zZWN1 -cmUuZ2xvYmFsc2lnbi5jb20vY2FjZXJ0L2dzb3JnYW5pemF0aW9udmFsc2hhMmcy -cjEuY3J0MD8GCCsGAQUFBzABhjNodHRwOi8vb2NzcDIuZ2xvYmFsc2lnbi5jb20v -Z3Nvcmdhbml6YXRpb252YWxzaGEyZzIwVgYDVR0gBE8wTTBBBgkrBgEEAaAyARQw -NDAyBggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3Np -dG9yeS8wCAYGZ4EMAQICMAkGA1UdEwQCMAAwSQYDVR0fBEIwQDA+oDygOoY4aHR0 -cDovL2NybC5nbG9iYWxzaWduLmNvbS9ncy9nc29yZ2FuaXphdGlvbnZhbHNoYTJn -Mi5jcmwwKwYDVR0RBCQwIoIQKi5maW51cGdyb3VwLmNvbYIOZmludXBncm91cC5j -b20wHQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTienLS -u2JR3dCl0nsx4QRgZUiK3zAfBgNVHSMEGDAWgBSW3mHxvRwWKVMcwMx9O4MAQOYa -fDANBgkqhkiG9w0BAQsFAAOCAQEAByXTMrf3sJpU68uqpRx0/nOEcOXPrTCD/WrU -8FOQgRNFgg7KR9g5+PLoujNIHAT0uary3o8JmpFhAc6ZgZmxBgJKSA5FNRiGwQgH -gitMS417mnC1dAWgMp3R8NvPevS01vxoP7a5On4/JmZcvvIkcPZl9t8Vntuf29Qf -KAG6iIli967gANzFeKGgU9CcgtSpm9tGg+S3FOloYpckCdpxKEJo7hV2QPxSatcm -4KuIE5eeUUDZ/fSOYJspr61aF4SJb5pUtyreoaIu8TVzScKlndbHFfHCHTc+H2Ow -5/H9/DYYo+hcbrN171EWGQ/1BHuHuqgzShX+X0JbJh543cRG+Q== ------END CERTIFICATE----- ------BEGIN CERTIFICATE----- -MIIEaTCCA1GgAwIBAgILBAAAAAABRE7wQkcwDQYJKoZIhvcNAQELBQAwVzELMAkG -A1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYtc2ExEDAOBgNVBAsTB1Jv -b3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBDQTAeFw0xNDAyMjAxMDAw -MDBaFw0yNDAyMjAxMDAwMDBaMGYxCzAJBgNVBAYTAkJFMRkwFwYDVQQKExBHbG9i -YWxTaWduIG52LXNhMTwwOgYDVQQDEzNHbG9iYWxTaWduIE9yZ2FuaXphdGlvbiBW -YWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDHDmw/I5N/zHClnSDDDlM/fsBOwphJykfVI+8DNIV0yKMCLkZc -C33JiJ1Pi/D4nGyMVTXbv/Kz6vvjVudKRtkTIso21ZvBqOOWQ5PyDLzm+ebomchj -SHh/VzZpGhkdWtHUfcKc1H/hgBKueuqI6lfYygoKOhJJomIZeg0k9zfrtHOSewUj -mxK1zusp36QUArkBpdSmnENkiN74fv7j9R7l/tyjqORmMdlMJekYuYlZCa7pnRxt -Nw9KHjUgKOKv1CGLAcRFrW4rY6uSa2EKTSDtc7p8zv4WtdufgPDWi2zZCHlKT3hl -2pK8vjX5s8T5J4BO/5ZS5gIg4Qdz6V0rvbLxAgMBAAGjggElMIIBITAOBgNVHQ8B -Af8EBAMCAQYwEgYDVR0TAQH/BAgwBgEB/wIBADAdBgNVHQ4EFgQUlt5h8b0cFilT -HMDMfTuDAEDmGnwwRwYDVR0gBEAwPjA8BgRVHSAAMDQwMgYIKwYBBQUHAgEWJmh0 -dHBzOi8vd3d3Lmdsb2JhbHNpZ24uY29tL3JlcG9zaXRvcnkvMDMGA1UdHwQsMCow -KKAmoCSGImh0dHA6Ly9jcmwuZ2xvYmFsc2lnbi5uZXQvcm9vdC5jcmwwPQYIKwYB -BQUHAQEEMTAvMC0GCCsGAQUFBzABhiFodHRwOi8vb2NzcC5nbG9iYWxzaWduLmNv -bS9yb290cjEwHwYDVR0jBBgwFoAUYHtmGkUNl8qJUC99BM00qP/8/UswDQYJKoZI -hvcNAQELBQADggEBAEYq7l69rgFgNzERhnF0tkZJyBAW/i9iIxerH4f4gu3K3w4s -32R1juUYcqeMOovJrKV3UPfvnqTgoI8UV6MqX+x+bRDmuo2wCId2Dkyy2VG7EQLy -XN0cvfNVlg/UBsD84iOKJHDTu/B5GqdhcIOKrwbFINihY9Bsrk8y1658GEV1BSl3 -30JAZGSGvip2CTFvHST0mdCF/vIhCPnG9vHQWe3WVjwIKANnuvD58ZAWR65n5ryA -SOlCdjSXVWkkDoPWoC209fN5ikkodBpBocLTJIg1MGCUF7ThBCIxPTsvFwayuJ2G -K1pp74P1S8SqtCr4fKGxhZSM9AyHDPSsQPhZSZg= ------END CERTIFICATE----- ------BEGIN PKCS7----- -MIINdgYJKoZIhvcNAQcCoIINZzCCDWMCAQExADALBgkqhkiG9w0BBwGggg1LMIIF -YTCCBEmgAwIBAgIMTbN5yjcrx8/luoD3MA0GCSqGSIb3DQEBCwUAMGYxCzAJBgNV -BAYTAkJFMRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMTwwOgYDVQQDEzNHbG9i -YWxTaWduIE9yZ2FuaXphdGlvbiBWYWxpZGF0aW9uIENBIC0gU0hBMjU2IC0gRzIw -HhcNMTcwOTIyMTMxMjU1WhcNMjAwOTIyMTMxMjU1WjCBgTELMAkGA1UEBhMCQ04x -EDAOBgNVBAgTB0d1YW5neGkxDzANBgNVBAcTBkJlaWhhaTELMAkGA1UECxMCSVQx -JzAlBgNVBAoMHuWHoeaZrumHkeenkembhuWbouaciemZkOWFrOWPuDEZMBcGA1UE -AwwQKi5maW51cGdyb3VwLmNvbTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoC -ggEBAOsxqmFX0zQMz9sih4mjP71tm3Dobq0NdvEj5FP8pCxzKwwVwN9rj3ghST/i -UIWrEG8+2hjKzUVo79Zkcw4D99fawIIz7qRokCyDyk7+p/no3s3xzmHt4EZvsRbx -4twUYlcAxZpL9crOMBOZ2AMHr6wunfHGOgDhf77MpREogNf/FH7tGTW/aIGI1Yrr -Q7aWfnPplflkUDA9pzCJKhttwwqLhK9vjHsUgKFo8+sADQRDARSinVOgCAn01/lv -x9gF5UTuED9aD5It+q8xyrdqHQSBV/n1t7kybHAHCfHN4+qG7nAx1H7kKWKzqXpv -Zg76d0HlXRYIGWpfhQmFIMHT9V0CAwEAAaOCAfEwggHtMA4GA1UdDwEB/wQEAwIF -oDCBoAYIKwYBBQUHAQEEgZMwgZAwTQYIKwYBBQUHMAKGQWh0dHA6Ly9zZWN1cmUu -Z2xvYmFsc2lnbi5jb20vY2FjZXJ0L2dzb3JnYW5pemF0aW9udmFsc2hhMmcycjEu -Y3J0MD8GCCsGAQUFBzABhjNodHRwOi8vb2NzcDIuZ2xvYmFsc2lnbi5jb20vZ3Nv -cmdhbml6YXRpb252YWxzaGEyZzIwVgYDVR0gBE8wTTBBBgkrBgEEAaAyARQwNDAy -BggrBgEFBQcCARYmaHR0cHM6Ly93d3cuZ2xvYmFsc2lnbi5jb20vcmVwb3NpdG9y -eS8wCAYGZ4EMAQICMAkGA1UdEwQCMAAwSQYDVR0fBEIwQDA+oDygOoY4aHR0cDov -L2NybC5nbG9iYWxzaWduLmNvbS9ncy9nc29yZ2FuaXphdGlvbnZhbHNoYTJnMi5j -cmwwKwYDVR0RBCQwIoIQKi5maW51cGdyb3VwLmNvbYIOZmludXBncm91cC5jb20w -HQYDVR0lBBYwFAYIKwYBBQUHAwEGCCsGAQUFBwMCMB0GA1UdDgQWBBTienLSu2JR -3dCl0nsx4QRgZUiK3zAfBgNVHSMEGDAWgBSW3mHxvRwWKVMcwMx9O4MAQOYafDAN -BgkqhkiG9w0BAQsFAAOCAQEAByXTMrf3sJpU68uqpRx0/nOEcOXPrTCD/WrU8FOQ -gRNFgg7KR9g5+PLoujNIHAT0uary3o8JmpFhAc6ZgZmxBgJKSA5FNRiGwQgHgitM -S417mnC1dAWgMp3R8NvPevS01vxoP7a5On4/JmZcvvIkcPZl9t8Vntuf29QfKAG6 -iIli967gANzFeKGgU9CcgtSpm9tGg+S3FOloYpckCdpxKEJo7hV2QPxSatcm4KuI -E5eeUUDZ/fSOYJspr61aF4SJb5pUtyreoaIu8TVzScKlndbHFfHCHTc+H2Ow5/H9 -/DYYo+hcbrN171EWGQ/1BHuHuqgzShX+X0JbJh543cRG+TCCBGkwggNRoAMCAQIC -CwQAAAAAAURO8EJHMA0GCSqGSIb3DQEBCwUAMFcxCzAJBgNVBAYTAkJFMRkwFwYD -VQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRswGQYDVQQD -ExJHbG9iYWxTaWduIFJvb3QgQ0EwHhcNMTQwMjIwMTAwMDAwWhcNMjQwMjIwMTAw -MDAwWjBmMQswCQYDVQQGEwJCRTEZMBcGA1UEChMQR2xvYmFsU2lnbiBudi1zYTE8 -MDoGA1UEAxMzR2xvYmFsU2lnbiBPcmdhbml6YXRpb24gVmFsaWRhdGlvbiBDQSAt -IFNIQTI1NiAtIEcyMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxw5s -PyOTf8xwpZ0gww5TP37ATsKYScpH1SPvAzSFdMijAi5GXAt9yYidT4vw+JxsjFU1 -27/ys+r741bnSkbZEyLKNtWbwajjlkOT8gy85vnm6JnIY0h4f1c2aRoZHVrR1H3C -nNR/4YASrnrqiOpX2MoKCjoSSaJiGXoNJPc367RzknsFI5sStc7rKd+kFAK5AaXU -ppxDZIje+H7+4/Ue5f7co6jkZjHZTCXpGLmJWQmu6Z0cbTcPSh41ICjir9QhiwHE -Ra1uK2OrkmthCk0g7XO6fM7+FrXbn4Dw1ots2Qh5Sk94ZdqSvL41+bPE+SeATv+W -UuYCIOEHc+ldK72y8QIDAQABo4IBJTCCASEwDgYDVR0PAQH/BAQDAgEGMBIGA1Ud -EwEB/wQIMAYBAf8CAQAwHQYDVR0OBBYEFJbeYfG9HBYpUxzAzH07gwBA5hp8MEcG -A1UdIARAMD4wPAYEVR0gADA0MDIGCCsGAQUFBwIBFiZodHRwczovL3d3dy5nbG9i -YWxzaWduLmNvbS9yZXBvc2l0b3J5LzAzBgNVHR8ELDAqMCigJqAkhiJodHRwOi8v -Y3JsLmdsb2JhbHNpZ24ubmV0L3Jvb3QuY3JsMD0GCCsGAQUFBwEBBDEwLzAtBggr -BgEFBQcwAYYhaHR0cDovL29jc3AuZ2xvYmFsc2lnbi5jb20vcm9vdHIxMB8GA1Ud -IwQYMBaAFGB7ZhpFDZfKiVAvfQTNNKj//P1LMA0GCSqGSIb3DQEBCwUAA4IBAQBG -Ku5eva4BYDcxEYZxdLZGScgQFv4vYiMXqx+H+ILtyt8OLN9kdY7lGHKnjDqLyayl -d1D3756k4KCPFFejKl/sfm0Q5rqNsAiHdg5MstlRuxEC8lzdHL3zVZYP1AbA/OIj -iiRw07vweRqnYXCDiq8GxSDYoWPQbK5PMteufBhFdQUpd99CQGRkhr4qdgkxbx0k -9JnQhf7yIQj5xvbx0Fnt1lY8CCgDZ7rw+fGQFkeuZ+a8gEjpQnY0l1VpJA6D1qAt -tPXzeYpJKHQaQaHC0ySINTBglBe04QQiMT07LxcGsridhitaae+D9UvEqrQq+Hyh -sYWUjPQMhwz0rED4WUmYMIIDdTCCAl2gAwIBAgILBAAAAAABFUtaw5QwDQYJKoZI -hvcNAQEFBQAwVzELMAkGA1UEBhMCQkUxGTAXBgNVBAoTEEdsb2JhbFNpZ24gbnYt -c2ExEDAOBgNVBAsTB1Jvb3QgQ0ExGzAZBgNVBAMTEkdsb2JhbFNpZ24gUm9vdCBD -QTAeFw05ODA5MDExMjAwMDBaFw0yODAxMjgxMjAwMDBaMFcxCzAJBgNVBAYTAkJF -MRkwFwYDVQQKExBHbG9iYWxTaWduIG52LXNhMRAwDgYDVQQLEwdSb290IENBMRsw -GQYDVQQDExJHbG9iYWxTaWduIFJvb3QgQ0EwggEiMA0GCSqGSIb3DQEBAQUAA4IB -DwAwggEKAoIBAQDaDuaZjc6j40+Kfvvxi4Mla+pIH/EqsLmVEQS98GPR4mdmzxzd -zxtIK+6NiY6arymAZavpxy0Sy6scTHAHoT0KMM0VjU/43dSMUBUc71DuxC73/OlS -8pF94G3VNTCOXkNz8kHp1Wrjsok6Vjk4bwY8iGlbKk3Fp1S4bInMm/k8yuX9ifUS -PJJ4ltbcdG6TRGHRjcdGsnUOhugZitVtbNV4FpWi6cgKOOvyJBNPc1STE4U6G7we -NLWLBYy5d4ux2x8gkasJU26Qzns3dLlwR5EiUWMWea6xrkEmCMgZK9FGqkjWZCrX -gzT/LCrBbBlDSgeF59N89iFo7+ryUp9/k5DPAgMBAAGjQjBAMA4GA1UdDwEB/wQE -AwIBBjAPBgNVHRMBAf8EBTADAQH/MB0GA1UdDgQWBBRge2YaRQ2XyolQL30EzTSo -//z9SzANBgkqhkiG9w0BAQUFAAOCAQEA1nPnfE920I2/7LqivjTFKDK1fPxsnCwr -vQmeU79rXqoRSLblCKOzyj1hTdNGCbM+w6DjY1Ub8rrvrTnhQ7k4o+YviiY776BQ -VvnGCv04zcQLcFGUl5gE38NflNUVyRRBnMRddWQVDf9VMOyGj/8N7yy5Y0b2qvzf -vGn9LhJIZJrglfCm7ymPAbEVtQwdpf5pLGkkeB6zpxxxYu7KyJesF12KwvhHhm4q -xFYxldBniYUr+WymXUadDKqC5JlR3XC321Y9YeRq4VzW9v493kHMB65jUr9TU/Qr -6cf9tveCX4XSQRjbgbMEHMUfpIBvFSDJ3gyICh3WZlXi/EjJKSZp4DEA ------END PKCS7----- \ No newline at end of file diff --git a/configs/inside_finup.key b/configs/inside_finup.key deleted file mode 100755 index 969122b..0000000 --- a/configs/inside_finup.key +++ /dev/null @@ -1,27 +0,0 @@ ------BEGIN RSA PRIVATE KEY----- -MIIEpAIBAAKCAQEA6zGqYVfTNAzP2yKHiaM/vW2bcOhurQ128SPkU/ykLHMrDBXA -32uPeCFJP+JQhasQbz7aGMrNRWjv1mRzDgP319rAgjPupGiQLIPKTv6n+ejezfHO -Ye3gRm+xFvHi3BRiVwDFmkv1ys4wE5nYAwevrC6d8cY6AOF/vsylESiA1/8Ufu0Z -Nb9ogYjViutDtpZ+c+mV+WRQMD2nMIkqG23DCouEr2+MexSAoWjz6wANBEMBFKKd -U6AICfTX+W/H2AXlRO4QP1oPki36rzHKt2odBIFX+fW3uTJscAcJ8c3j6obucDHU -fuQpYrOpem9mDvp3QeVdFggZal+FCYUgwdP1XQIDAQABAoIBAHEc5sOAOJxc2Q6c -EbF5aOtSrqJjtu7VffHFgEeARvj1vqtGPwd0tIBjCdaGopFWz0WhZcTsrEKIkGh8 -0PTZpbYTh+hWz5wUidpO29qYEPNZMua7N7XTcLyPdQ0C8kdEKnOLdH2bsK+D8I1M -vR3f8XYOyXmBC15nFUgPJggVgbnfELpZbNPoQK/oNM+EJZUGpvh/SfSQl3IgaoiA -vKXr2j5DgBIz8eFg/8nRRXVSGpk5/UWiM0GwTXbecS6rjijHBEIn0b5DB8JS4Qjg -9zb6C8y+9e7uV9UkyEGtGiAThCJ4tfjTpgPaNCUXIMjBbjpKsZth+JSSZkslfBQs -+vqyk0ECgYEA/RiAO+dwajhDInhx5GcwuU93RM0El+5i6ukpqKQON2vBAB5IRYvU -DljQN5sDL1KaEnJj6CCFD5ZcosaHVQEEaTRUOacuYk3Lk3W6r2IWiZWohE24Iaak -wBv5N54JO1hieeYluoxLfbtGisxhqmPglCWF9vhJEni6XirTN4mZURECgYEA7eST -hBtAowJJPja/aILVMm6TIGrq6nyLtdjFvsyHevgUSbun+p3o+F9g6xtqxD6rtsgA -LUDJWbZNUEsQseWj7yUwlcFRpbwuEdjaYdubVhrVhhVatsSd9GZmHDqHFU83ua+y -O1VeBV5AjhNC3i5tgT00nsNpm7YzjfVKRZ59X40CgYEAxID4VwpLMn06SpIfQ0mG -/+md3XIcReXVMTQUnxW43/iuYWwhirWU0ArOps2YvG4yp23e+cP962s/wzXGrw3a -IeB6IEUX80UZcQTwC+lpPCtRKl+5PY9HzMwrQ65U1pm545D37A2vMxBrJaqnjYZ8 -QCmeCHEfMtM/R4uScEVKHzECgYEA0igjyYjpyRez7Kog3gr2nN7iSrkpXo04PyWJ -S80TwqZ2Bc0p0FTAAur/i7Nk1okm2QpGXbPmLMLH+i7WSNI9yH5qNWHa5zce29Ve -1yRSTfbWuuUShnObttTfUADEZSbea8OzCIeZz9Q740dQw0bwpkOTwM2Q9mY3lSkk -u+wPheECgYARoyqd+9pen/tnJQmO9g6cOEN9v1VUiWugWJRA1dqHZXqFcQdQ/o4L -Yt/R5shkPATXA8127lk8zanHR8l1uE8G8b1rqcJfwxJoNOkjjd6zCcLSkUCrvStV -wZ8BOCOePfH4o69sg9iwzEIKybeXGSfTDnhIezxTNbF8vc+oKs939g== ------END RSA PRIVATE KEY----- diff --git a/doc/deploy/k8s/k8s-webshell-deployment.yaml b/doc/deploy/k8s/k8s-webshell-deployment.yaml deleted file mode 100644 index c196e96..0000000 --- a/doc/deploy/k8s/k8s-webshell-deployment.yaml +++ /dev/null @@ -1,42 +0,0 @@ ---- -apiVersion: apps/v1 -kind: Deployment -metadata: - name: k8s-webshell - namespace: -spec: - replicas: 1 - selector: - matchLabels: - app: k8s-webshell - template: - metadata: - labels: - app: k8s-webshell - spec: - serviceAccountName: k8s-webshell - automountServiceAccountToken: true - containers: - - name: k8s-webshell - image: harbor.finupgroup.com/galaxy/k8s-webshell:v1 - imagePullPolicy: Always - env: - - name: WEBSHELL_SERVER_RUN_MODE - value: "debug" - - name: WEBSHELL_SERVER_LOGPATH - value: "/var/app/log" - - name: WEBSHELL_SERVER_LOGNAME - value: "webshell.log" - - name: WEBSHELL_SERVER_PORT - value: "7777" - - name: WEBSHELL_SERVER_INCLUSTER - value: "true" - - name: WEBSHELL_SERVER_SSL_CERTIFICATE - value: /data/inside_finup.crt - - name: WEBSHELL_SERVER_SSL_CERTIFICATE_KEY - value: /data/inside_finup.key - - name: WEBSHELL_SERVER_SECRET_KEY - value: secret_key - - ports: - - containerPort: 7777 \ No newline at end of file diff --git a/doc/deploy/k8s/k8s-webshell-svc.yaml b/doc/deploy/k8s/k8s-webshell-svc.yaml deleted file mode 100644 index ce0aef9..0000000 --- a/doc/deploy/k8s/k8s-webshell-svc.yaml +++ /dev/null @@ -1,16 +0,0 @@ ---- -apiVersion: v1 -kind: Service -metadata: - name: k8s-webshell - namespace: production-k8s-webshell # 根据自己的情况进行修改 -spec: - selector: - app: k8s-webshell - type: NodePort - ports: - - name: http - port: 7777 - targetPort: 7777 - nodePort: 30001 - protocol: TCP \ No newline at end of file diff --git a/doc/imgs/k8s-webshell.gif b/doc/imgs/k8s-webshell.gif deleted file mode 100644 index 3d3271f210dc79f90b010b9e751ac76bbbfdc22f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 867905 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

>VuPtuWD%u~xW56MYj<^Q<1M3kwRY&aR`? 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

g5`5YY4%pscI@>=jIp1Bb5*{imbQ_Qdq{ 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�@-E{k&gf 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 AJ+H`Y`8y6&1D1VYNr2W{wd&e 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ⅆa?RlrR~NC7=qNG`=1EOVcn79zmK&zSjXt>6P` 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

DYKFwk{Qc9@g!sK841s4`?t{6ypk+G~u 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

l?{4U)jJQ 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

RP`{5`UHpF(sHI;Y** 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 diff --git a/docker-compose.yaml b/docker-compose.yaml deleted file mode 100644 index 6e7c79d..0000000 --- a/docker-compose.yaml +++ /dev/null @@ -1,50 +0,0 @@ -version: "3" -services: - go-build: - image: golang:1.12-alpine - environment: - - GOBIN=/go/bin - - GOOS=linux - - GOARCH=amd64 - - volumes: - - ./cmd:/go/src/k8s-webshell/cmd - - ./configs:/go/src/k8s-webshell/configs - - ./configs/inside_finup.crt:/go/src/k8s-webshell/configs/inside_finup.crt - - ./configs/inside_finup.key:/go/src/k8s-webshell/configs/inside_finup.key - - ./pkg:/go/src/k8s-webshell/pkg - - ./middleware:/go/src/k8s-webshell/middleware - - ./routers:/go/src/k8s-webshell/routers - - ./vendor:/go/src/k8s-webshell/vendor - - ./bin:/go/bin - command: ["go", "install", "-v", "/go/src/k8s-webshell/cmd/k8s-webshell.go"] - - k8s-webshell: - build: - context: . - #dockerfile: Dockerfile - image: harbor.finupgroup.com/galaxy/k8s-webshell:v1.2 - ports: - - "30001:7777" - environment: - - WEBSHELL_SERVER_RUN_MODE=debug - - WEBSHELL_SERVER_LOGPATH=/var/logs - - WEBSHELL_SERVER_LOGNAME=webshell.log - - WEBSHELL_SERVER_PORT=7777 - - WEBSHELL_SERVER_KUBECONFIG=/data/admin.conf - - WEBSHELL_SERVER_INCLUSTER=false - - WEBSHELL_SERVER_JWT_SECRET=Youguess - - WEBSHELL_SERVER_SECRET_KEY=ERkyNK2Q - - WEBSHELL_SERVER_SSL_CERTIFICATE=/data/inside_finup.crt - - WEBSHELL_SERVER_SSL_CERTIFICATE_KEY=/data/inside_finup.key - volumes: - - ./configs/admin.conf:/data/admin.conf - command: ["./k8s-webshell"] - - - - - - - - diff --git a/doc/demo/client/index.html b/docs/demo/client/index.html similarity index 99% rename from doc/demo/client/index.html rename to docs/demo/client/index.html index 784e9da..6c5060a 100644 --- a/doc/demo/client/index.html +++ b/docs/demo/client/index.html @@ -333,7 +333,7 @@ var wsToken = document.getElementById("wsToken").value // 连接websocket // ws = new WebSocket("wss://k8s-webshell.finupgroup.com:7777/api/ws?" + "podNs=" + podNs + "&podName=" + podName + "&containerName=" + containerName + "&token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiUGFzc3dvcmQiOiIxMjMiLCJleHAiOjE1NTQxMTgxMjUsImlzcyI6Ims4cy13ZWJzaGVsbCJ9.Dss1g9ZMflB_x0vkaK9GhRHYSZf2xek9VpfUeZaThL"); - ws = new WebSocket("wss://k8s-webshell.finupgroup.com:7777/api/ws?" + "token=" + wsToken); + ws = new WebSocket("wss://test-k8s-webshell.finupgroup.com:7777/api/ws?" + "token=" + wsToken); ws.binaryType = "arraybuffer"; ws.onopen = function(event) { // ws.send(JSON.stringify({'podNs':podNs, 'podName':podName, 'containerName':containerName, 'token':'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiUGFzc3dvcmQiOiIxMjMiLCJleHAiOjE1NTQxMjI2MjQsImlzcyI6Ims4cy13ZWJzaGVsbCJ9.93CNsR7QeifmnV-MmPOYqp9n1jNaceLfyWujDSSFdMM'})) diff --git a/doc/demo/client/index.html-bak b/docs/demo/client/index.html-bak similarity index 100% rename from doc/demo/client/index.html-bak rename to docs/demo/client/index.html-bak diff --git a/doc/demo/client/node_modules/xterm/.devcontainer/devcontainer.json b/docs/demo/client/node_modules/xterm/.devcontainer/devcontainer.json similarity index 100% rename from doc/demo/client/node_modules/xterm/.devcontainer/devcontainer.json rename to docs/demo/client/node_modules/xterm/.devcontainer/devcontainer.json diff --git a/doc/demo/client/node_modules/xterm/LICENSE b/docs/demo/client/node_modules/xterm/LICENSE similarity index 100% rename from doc/demo/client/node_modules/xterm/LICENSE rename to docs/demo/client/node_modules/xterm/LICENSE diff --git a/doc/demo/client/node_modules/xterm/README.md b/docs/demo/client/node_modules/xterm/README.md similarity index 100% rename from doc/demo/client/node_modules/xterm/README.md rename to docs/demo/client/node_modules/xterm/README.md diff --git a/doc/demo/client/node_modules/xterm/dist/addons/attach/attach.js b/docs/demo/client/node_modules/xterm/dist/addons/attach/attach.js similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/attach/attach.js rename to docs/demo/client/node_modules/xterm/dist/addons/attach/attach.js diff --git a/doc/demo/client/node_modules/xterm/dist/addons/attach/attach.js.map b/docs/demo/client/node_modules/xterm/dist/addons/attach/attach.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/attach/attach.js.map rename to docs/demo/client/node_modules/xterm/dist/addons/attach/attach.js.map diff --git a/doc/demo/client/node_modules/xterm/dist/addons/fit/fit.js b/docs/demo/client/node_modules/xterm/dist/addons/fit/fit.js similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/fit/fit.js rename to docs/demo/client/node_modules/xterm/dist/addons/fit/fit.js diff --git a/doc/demo/client/node_modules/xterm/dist/addons/fit/fit.js.map b/docs/demo/client/node_modules/xterm/dist/addons/fit/fit.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/fit/fit.js.map rename to docs/demo/client/node_modules/xterm/dist/addons/fit/fit.js.map diff --git a/doc/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.css b/docs/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.css similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.css rename to docs/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.css diff --git a/doc/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.js b/docs/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.js similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.js rename to docs/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.js diff --git a/doc/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.js.map b/docs/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.js.map rename to docs/demo/client/node_modules/xterm/dist/addons/fullscreen/fullscreen.js.map diff --git a/doc/demo/client/node_modules/xterm/dist/addons/search/search.js b/docs/demo/client/node_modules/xterm/dist/addons/search/search.js similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/search/search.js rename to docs/demo/client/node_modules/xterm/dist/addons/search/search.js diff --git a/doc/demo/client/node_modules/xterm/dist/addons/search/search.js.map b/docs/demo/client/node_modules/xterm/dist/addons/search/search.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/search/search.js.map rename to docs/demo/client/node_modules/xterm/dist/addons/search/search.js.map diff --git a/doc/demo/client/node_modules/xterm/dist/addons/terminado/terminado.js b/docs/demo/client/node_modules/xterm/dist/addons/terminado/terminado.js similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/terminado/terminado.js rename to docs/demo/client/node_modules/xterm/dist/addons/terminado/terminado.js diff --git a/doc/demo/client/node_modules/xterm/dist/addons/terminado/terminado.js.map b/docs/demo/client/node_modules/xterm/dist/addons/terminado/terminado.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/terminado/terminado.js.map rename to docs/demo/client/node_modules/xterm/dist/addons/terminado/terminado.js.map diff --git a/doc/demo/client/node_modules/xterm/dist/addons/webLinks/webLinks.js b/docs/demo/client/node_modules/xterm/dist/addons/webLinks/webLinks.js similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/webLinks/webLinks.js rename to docs/demo/client/node_modules/xterm/dist/addons/webLinks/webLinks.js diff --git a/doc/demo/client/node_modules/xterm/dist/addons/webLinks/webLinks.js.map b/docs/demo/client/node_modules/xterm/dist/addons/webLinks/webLinks.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/webLinks/webLinks.js.map rename to docs/demo/client/node_modules/xterm/dist/addons/webLinks/webLinks.js.map diff --git a/doc/demo/client/node_modules/xterm/dist/addons/winptyCompat/winptyCompat.js b/docs/demo/client/node_modules/xterm/dist/addons/winptyCompat/winptyCompat.js similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/winptyCompat/winptyCompat.js rename to docs/demo/client/node_modules/xterm/dist/addons/winptyCompat/winptyCompat.js diff --git a/doc/demo/client/node_modules/xterm/dist/addons/winptyCompat/winptyCompat.js.map b/docs/demo/client/node_modules/xterm/dist/addons/winptyCompat/winptyCompat.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/winptyCompat/winptyCompat.js.map rename to docs/demo/client/node_modules/xterm/dist/addons/winptyCompat/winptyCompat.js.map diff --git a/doc/demo/client/node_modules/xterm/dist/addons/zmodem/zmodem.js b/docs/demo/client/node_modules/xterm/dist/addons/zmodem/zmodem.js similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/zmodem/zmodem.js rename to docs/demo/client/node_modules/xterm/dist/addons/zmodem/zmodem.js diff --git a/doc/demo/client/node_modules/xterm/dist/addons/zmodem/zmodem.js.map b/docs/demo/client/node_modules/xterm/dist/addons/zmodem/zmodem.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/addons/zmodem/zmodem.js.map rename to docs/demo/client/node_modules/xterm/dist/addons/zmodem/zmodem.js.map diff --git a/doc/demo/client/node_modules/xterm/dist/xterm.css b/docs/demo/client/node_modules/xterm/dist/xterm.css similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/xterm.css rename to docs/demo/client/node_modules/xterm/dist/xterm.css diff --git a/doc/demo/client/node_modules/xterm/dist/xterm.js b/docs/demo/client/node_modules/xterm/dist/xterm.js similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/xterm.js rename to docs/demo/client/node_modules/xterm/dist/xterm.js diff --git a/doc/demo/client/node_modules/xterm/dist/xterm.js.map b/docs/demo/client/node_modules/xterm/dist/xterm.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/dist/xterm.js.map rename to docs/demo/client/node_modules/xterm/dist/xterm.js.map diff --git a/doc/demo/client/node_modules/xterm/gulpfile.js b/docs/demo/client/node_modules/xterm/gulpfile.js similarity index 100% rename from doc/demo/client/node_modules/xterm/gulpfile.js rename to docs/demo/client/node_modules/xterm/gulpfile.js diff --git a/doc/demo/client/node_modules/xterm/lib/AccessibilityManager.js b/docs/demo/client/node_modules/xterm/lib/AccessibilityManager.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/AccessibilityManager.js rename to docs/demo/client/node_modules/xterm/lib/AccessibilityManager.js diff --git a/doc/demo/client/node_modules/xterm/lib/AccessibilityManager.js.map b/docs/demo/client/node_modules/xterm/lib/AccessibilityManager.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/AccessibilityManager.js.map rename to docs/demo/client/node_modules/xterm/lib/AccessibilityManager.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/Buffer.js b/docs/demo/client/node_modules/xterm/lib/Buffer.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Buffer.js rename to docs/demo/client/node_modules/xterm/lib/Buffer.js diff --git a/doc/demo/client/node_modules/xterm/lib/Buffer.js.map b/docs/demo/client/node_modules/xterm/lib/Buffer.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Buffer.js.map rename to docs/demo/client/node_modules/xterm/lib/Buffer.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/BufferLine.js b/docs/demo/client/node_modules/xterm/lib/BufferLine.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/BufferLine.js rename to docs/demo/client/node_modules/xterm/lib/BufferLine.js diff --git a/doc/demo/client/node_modules/xterm/lib/BufferLine.js.map b/docs/demo/client/node_modules/xterm/lib/BufferLine.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/BufferLine.js.map rename to docs/demo/client/node_modules/xterm/lib/BufferLine.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/BufferReflow.js b/docs/demo/client/node_modules/xterm/lib/BufferReflow.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/BufferReflow.js rename to docs/demo/client/node_modules/xterm/lib/BufferReflow.js diff --git a/doc/demo/client/node_modules/xterm/lib/BufferReflow.js.map b/docs/demo/client/node_modules/xterm/lib/BufferReflow.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/BufferReflow.js.map rename to docs/demo/client/node_modules/xterm/lib/BufferReflow.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/BufferSet.js b/docs/demo/client/node_modules/xterm/lib/BufferSet.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/BufferSet.js rename to docs/demo/client/node_modules/xterm/lib/BufferSet.js diff --git a/doc/demo/client/node_modules/xterm/lib/BufferSet.js.map b/docs/demo/client/node_modules/xterm/lib/BufferSet.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/BufferSet.js.map rename to docs/demo/client/node_modules/xterm/lib/BufferSet.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/CharMeasure.js b/docs/demo/client/node_modules/xterm/lib/CharMeasure.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/CharMeasure.js rename to docs/demo/client/node_modules/xterm/lib/CharMeasure.js diff --git a/doc/demo/client/node_modules/xterm/lib/CharMeasure.js.map b/docs/demo/client/node_modules/xterm/lib/CharMeasure.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/CharMeasure.js.map rename to docs/demo/client/node_modules/xterm/lib/CharMeasure.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/CharWidth.js b/docs/demo/client/node_modules/xterm/lib/CharWidth.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/CharWidth.js rename to docs/demo/client/node_modules/xterm/lib/CharWidth.js diff --git a/doc/demo/client/node_modules/xterm/lib/CharWidth.js.map b/docs/demo/client/node_modules/xterm/lib/CharWidth.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/CharWidth.js.map rename to docs/demo/client/node_modules/xterm/lib/CharWidth.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/Clipboard.js b/docs/demo/client/node_modules/xterm/lib/Clipboard.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Clipboard.js rename to docs/demo/client/node_modules/xterm/lib/Clipboard.js diff --git a/doc/demo/client/node_modules/xterm/lib/Clipboard.js.map b/docs/demo/client/node_modules/xterm/lib/Clipboard.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Clipboard.js.map rename to docs/demo/client/node_modules/xterm/lib/Clipboard.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/CompositionHelper.js b/docs/demo/client/node_modules/xterm/lib/CompositionHelper.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/CompositionHelper.js rename to docs/demo/client/node_modules/xterm/lib/CompositionHelper.js diff --git a/doc/demo/client/node_modules/xterm/lib/CompositionHelper.js.map b/docs/demo/client/node_modules/xterm/lib/CompositionHelper.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/CompositionHelper.js.map rename to docs/demo/client/node_modules/xterm/lib/CompositionHelper.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/EscapeSequenceParser.js b/docs/demo/client/node_modules/xterm/lib/EscapeSequenceParser.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/EscapeSequenceParser.js rename to docs/demo/client/node_modules/xterm/lib/EscapeSequenceParser.js diff --git a/doc/demo/client/node_modules/xterm/lib/EscapeSequenceParser.js.map b/docs/demo/client/node_modules/xterm/lib/EscapeSequenceParser.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/EscapeSequenceParser.js.map rename to docs/demo/client/node_modules/xterm/lib/EscapeSequenceParser.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/InputHandler.api.js b/docs/demo/client/node_modules/xterm/lib/InputHandler.api.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/InputHandler.api.js rename to docs/demo/client/node_modules/xterm/lib/InputHandler.api.js diff --git a/doc/demo/client/node_modules/xterm/lib/InputHandler.api.js.map b/docs/demo/client/node_modules/xterm/lib/InputHandler.api.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/InputHandler.api.js.map rename to docs/demo/client/node_modules/xterm/lib/InputHandler.api.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/InputHandler.js b/docs/demo/client/node_modules/xterm/lib/InputHandler.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/InputHandler.js rename to docs/demo/client/node_modules/xterm/lib/InputHandler.js diff --git a/doc/demo/client/node_modules/xterm/lib/InputHandler.js.map b/docs/demo/client/node_modules/xterm/lib/InputHandler.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/InputHandler.js.map rename to docs/demo/client/node_modules/xterm/lib/InputHandler.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/Linkifier.js b/docs/demo/client/node_modules/xterm/lib/Linkifier.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Linkifier.js rename to docs/demo/client/node_modules/xterm/lib/Linkifier.js diff --git a/doc/demo/client/node_modules/xterm/lib/Linkifier.js.map b/docs/demo/client/node_modules/xterm/lib/Linkifier.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Linkifier.js.map rename to docs/demo/client/node_modules/xterm/lib/Linkifier.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/MouseHelper.js b/docs/demo/client/node_modules/xterm/lib/MouseHelper.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/MouseHelper.js rename to docs/demo/client/node_modules/xterm/lib/MouseHelper.js diff --git a/doc/demo/client/node_modules/xterm/lib/MouseHelper.js.map b/docs/demo/client/node_modules/xterm/lib/MouseHelper.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/MouseHelper.js.map rename to docs/demo/client/node_modules/xterm/lib/MouseHelper.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/MouseZoneManager.js b/docs/demo/client/node_modules/xterm/lib/MouseZoneManager.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/MouseZoneManager.js rename to docs/demo/client/node_modules/xterm/lib/MouseZoneManager.js diff --git a/doc/demo/client/node_modules/xterm/lib/MouseZoneManager.js.map b/docs/demo/client/node_modules/xterm/lib/MouseZoneManager.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/MouseZoneManager.js.map rename to docs/demo/client/node_modules/xterm/lib/MouseZoneManager.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/SelectionManager.js b/docs/demo/client/node_modules/xterm/lib/SelectionManager.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/SelectionManager.js rename to docs/demo/client/node_modules/xterm/lib/SelectionManager.js diff --git a/doc/demo/client/node_modules/xterm/lib/SelectionManager.js.map b/docs/demo/client/node_modules/xterm/lib/SelectionManager.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/SelectionManager.js.map rename to docs/demo/client/node_modules/xterm/lib/SelectionManager.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/SelectionModel.js b/docs/demo/client/node_modules/xterm/lib/SelectionModel.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/SelectionModel.js rename to docs/demo/client/node_modules/xterm/lib/SelectionModel.js diff --git a/doc/demo/client/node_modules/xterm/lib/SelectionModel.js.map b/docs/demo/client/node_modules/xterm/lib/SelectionModel.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/SelectionModel.js.map rename to docs/demo/client/node_modules/xterm/lib/SelectionModel.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/SoundManager.js b/docs/demo/client/node_modules/xterm/lib/SoundManager.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/SoundManager.js rename to docs/demo/client/node_modules/xterm/lib/SoundManager.js diff --git a/doc/demo/client/node_modules/xterm/lib/SoundManager.js.map b/docs/demo/client/node_modules/xterm/lib/SoundManager.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/SoundManager.js.map rename to docs/demo/client/node_modules/xterm/lib/SoundManager.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/Strings.js b/docs/demo/client/node_modules/xterm/lib/Strings.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Strings.js rename to docs/demo/client/node_modules/xterm/lib/Strings.js diff --git a/doc/demo/client/node_modules/xterm/lib/Strings.js.map b/docs/demo/client/node_modules/xterm/lib/Strings.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Strings.js.map rename to docs/demo/client/node_modules/xterm/lib/Strings.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/Terminal.integration.js b/docs/demo/client/node_modules/xterm/lib/Terminal.integration.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Terminal.integration.js rename to docs/demo/client/node_modules/xterm/lib/Terminal.integration.js diff --git a/doc/demo/client/node_modules/xterm/lib/Terminal.integration.js.map b/docs/demo/client/node_modules/xterm/lib/Terminal.integration.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Terminal.integration.js.map rename to docs/demo/client/node_modules/xterm/lib/Terminal.integration.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/Terminal.js b/docs/demo/client/node_modules/xterm/lib/Terminal.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Terminal.js rename to docs/demo/client/node_modules/xterm/lib/Terminal.js diff --git a/doc/demo/client/node_modules/xterm/lib/Terminal.js.map b/docs/demo/client/node_modules/xterm/lib/Terminal.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Terminal.js.map rename to docs/demo/client/node_modules/xterm/lib/Terminal.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/Types.js b/docs/demo/client/node_modules/xterm/lib/Types.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Types.js rename to docs/demo/client/node_modules/xterm/lib/Types.js diff --git a/doc/demo/client/node_modules/xterm/lib/Types.js.map b/docs/demo/client/node_modules/xterm/lib/Types.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Types.js.map rename to docs/demo/client/node_modules/xterm/lib/Types.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/Viewport.js b/docs/demo/client/node_modules/xterm/lib/Viewport.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Viewport.js rename to docs/demo/client/node_modules/xterm/lib/Viewport.js diff --git a/doc/demo/client/node_modules/xterm/lib/Viewport.js.map b/docs/demo/client/node_modules/xterm/lib/Viewport.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/Viewport.js.map rename to docs/demo/client/node_modules/xterm/lib/Viewport.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/WindowsMode.js b/docs/demo/client/node_modules/xterm/lib/WindowsMode.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/WindowsMode.js rename to docs/demo/client/node_modules/xterm/lib/WindowsMode.js diff --git a/doc/demo/client/node_modules/xterm/lib/WindowsMode.js.map b/docs/demo/client/node_modules/xterm/lib/WindowsMode.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/WindowsMode.js.map rename to docs/demo/client/node_modules/xterm/lib/WindowsMode.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.js b/docs/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.js rename to docs/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.js.map b/docs/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/attach/Interfaces.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/attach/attach.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/attach/attach.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/attach/attach.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/attach/attach.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/attach/attach.js b/docs/demo/client/node_modules/xterm/lib/addons/attach/attach.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/attach/attach.js rename to docs/demo/client/node_modules/xterm/lib/addons/attach/attach.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/attach/attach.js.map b/docs/demo/client/node_modules/xterm/lib/addons/attach/attach.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/attach/attach.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/attach/attach.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/fit/fit.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/fit/fit.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/fit/fit.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/fit/fit.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/fit/fit.js b/docs/demo/client/node_modules/xterm/lib/addons/fit/fit.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/fit/fit.js rename to docs/demo/client/node_modules/xterm/lib/addons/fit/fit.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/fit/fit.js.map b/docs/demo/client/node_modules/xterm/lib/addons/fit/fit.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/fit/fit.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/fit/fit.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.css b/docs/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.css similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.css rename to docs/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.css diff --git a/doc/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.js b/docs/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.js rename to docs/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.js.map b/docs/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/fullscreen/fullscreen.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/search/Interfaces.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/search/Interfaces.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/search/Interfaces.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/search/Interfaces.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/search/Interfaces.js b/docs/demo/client/node_modules/xterm/lib/addons/search/Interfaces.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/search/Interfaces.js rename to docs/demo/client/node_modules/xterm/lib/addons/search/Interfaces.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/search/Interfaces.js.map b/docs/demo/client/node_modules/xterm/lib/addons/search/Interfaces.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/search/Interfaces.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/search/Interfaces.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.js b/docs/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.js rename to docs/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.js.map b/docs/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/search/SearchHelper.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/search/search.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/search/search.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/search/search.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/search/search.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/search/search.js b/docs/demo/client/node_modules/xterm/lib/addons/search/search.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/search/search.js rename to docs/demo/client/node_modules/xterm/lib/addons/search/search.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/search/search.js.map b/docs/demo/client/node_modules/xterm/lib/addons/search/search.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/search/search.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/search/search.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.js b/docs/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.js rename to docs/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.js.map b/docs/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/terminado/Interfaces.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/terminado/terminado.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/terminado/terminado.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/terminado/terminado.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/terminado/terminado.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/terminado/terminado.js b/docs/demo/client/node_modules/xterm/lib/addons/terminado/terminado.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/terminado/terminado.js rename to docs/demo/client/node_modules/xterm/lib/addons/terminado/terminado.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/terminado/terminado.js.map b/docs/demo/client/node_modules/xterm/lib/addons/terminado/terminado.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/terminado/terminado.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/terminado/terminado.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.js b/docs/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.js rename to docs/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.js.map b/docs/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/webLinks/webLinks.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.js b/docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.js rename to docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.js.map b/docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/Interfaces.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.js b/docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.js rename to docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.js.map b/docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/winptyCompat/winptyCompat.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.d.ts b/docs/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.d.ts rename to docs/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.js b/docs/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.js rename to docs/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.js diff --git a/doc/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.js.map b/docs/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.js.map rename to docs/demo/client/node_modules/xterm/lib/addons/zmodem/zmodem.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/common/CircularList.d.ts b/docs/demo/client/node_modules/xterm/lib/common/CircularList.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/CircularList.d.ts rename to docs/demo/client/node_modules/xterm/lib/common/CircularList.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/common/CircularList.js b/docs/demo/client/node_modules/xterm/lib/common/CircularList.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/CircularList.js rename to docs/demo/client/node_modules/xterm/lib/common/CircularList.js diff --git a/doc/demo/client/node_modules/xterm/lib/common/CircularList.js.map b/docs/demo/client/node_modules/xterm/lib/common/CircularList.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/CircularList.js.map rename to docs/demo/client/node_modules/xterm/lib/common/CircularList.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/common/Clone.d.ts b/docs/demo/client/node_modules/xterm/lib/common/Clone.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Clone.d.ts rename to docs/demo/client/node_modules/xterm/lib/common/Clone.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/common/Clone.js b/docs/demo/client/node_modules/xterm/lib/common/Clone.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Clone.js rename to docs/demo/client/node_modules/xterm/lib/common/Clone.js diff --git a/doc/demo/client/node_modules/xterm/lib/common/Clone.js.map b/docs/demo/client/node_modules/xterm/lib/common/Clone.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Clone.js.map rename to docs/demo/client/node_modules/xterm/lib/common/Clone.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/common/EventEmitter.d.ts b/docs/demo/client/node_modules/xterm/lib/common/EventEmitter.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/EventEmitter.d.ts rename to docs/demo/client/node_modules/xterm/lib/common/EventEmitter.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/common/EventEmitter.js b/docs/demo/client/node_modules/xterm/lib/common/EventEmitter.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/EventEmitter.js rename to docs/demo/client/node_modules/xterm/lib/common/EventEmitter.js diff --git a/doc/demo/client/node_modules/xterm/lib/common/EventEmitter.js.map b/docs/demo/client/node_modules/xterm/lib/common/EventEmitter.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/EventEmitter.js.map rename to docs/demo/client/node_modules/xterm/lib/common/EventEmitter.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/common/EventEmitter2.d.ts b/docs/demo/client/node_modules/xterm/lib/common/EventEmitter2.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/EventEmitter2.d.ts rename to docs/demo/client/node_modules/xterm/lib/common/EventEmitter2.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/common/EventEmitter2.js b/docs/demo/client/node_modules/xterm/lib/common/EventEmitter2.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/EventEmitter2.js rename to docs/demo/client/node_modules/xterm/lib/common/EventEmitter2.js diff --git a/doc/demo/client/node_modules/xterm/lib/common/EventEmitter2.js.map b/docs/demo/client/node_modules/xterm/lib/common/EventEmitter2.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/EventEmitter2.js.map rename to docs/demo/client/node_modules/xterm/lib/common/EventEmitter2.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/common/Lifecycle.d.ts b/docs/demo/client/node_modules/xterm/lib/common/Lifecycle.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Lifecycle.d.ts rename to docs/demo/client/node_modules/xterm/lib/common/Lifecycle.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/common/Lifecycle.js b/docs/demo/client/node_modules/xterm/lib/common/Lifecycle.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Lifecycle.js rename to docs/demo/client/node_modules/xterm/lib/common/Lifecycle.js diff --git a/doc/demo/client/node_modules/xterm/lib/common/Lifecycle.js.map b/docs/demo/client/node_modules/xterm/lib/common/Lifecycle.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Lifecycle.js.map rename to docs/demo/client/node_modules/xterm/lib/common/Lifecycle.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/common/Platform.d.ts b/docs/demo/client/node_modules/xterm/lib/common/Platform.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Platform.d.ts rename to docs/demo/client/node_modules/xterm/lib/common/Platform.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/common/Platform.js b/docs/demo/client/node_modules/xterm/lib/common/Platform.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Platform.js rename to docs/demo/client/node_modules/xterm/lib/common/Platform.js diff --git a/doc/demo/client/node_modules/xterm/lib/common/Platform.js.map b/docs/demo/client/node_modules/xterm/lib/common/Platform.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Platform.js.map rename to docs/demo/client/node_modules/xterm/lib/common/Platform.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.d.ts b/docs/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.d.ts rename to docs/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.js b/docs/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.js rename to docs/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.js diff --git a/doc/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.js.map b/docs/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.js.map rename to docs/demo/client/node_modules/xterm/lib/common/TypedArrayUtils.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/common/Types.d.ts b/docs/demo/client/node_modules/xterm/lib/common/Types.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Types.d.ts rename to docs/demo/client/node_modules/xterm/lib/common/Types.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/common/Types.js b/docs/demo/client/node_modules/xterm/lib/common/Types.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Types.js rename to docs/demo/client/node_modules/xterm/lib/common/Types.js diff --git a/doc/demo/client/node_modules/xterm/lib/common/Types.js.map b/docs/demo/client/node_modules/xterm/lib/common/Types.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/Types.js.map rename to docs/demo/client/node_modules/xterm/lib/common/Types.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.d.ts b/docs/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.d.ts rename to docs/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.js b/docs/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.js rename to docs/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.js diff --git a/doc/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.js.map b/docs/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.js.map rename to docs/demo/client/node_modules/xterm/lib/common/data/EscapeSequences.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/core/Platform.js b/docs/demo/client/node_modules/xterm/lib/core/Platform.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/Platform.js rename to docs/demo/client/node_modules/xterm/lib/core/Platform.js diff --git a/doc/demo/client/node_modules/xterm/lib/core/Platform.js.map b/docs/demo/client/node_modules/xterm/lib/core/Platform.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/Platform.js.map rename to docs/demo/client/node_modules/xterm/lib/core/Platform.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/core/Types.d.ts b/docs/demo/client/node_modules/xterm/lib/core/Types.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/Types.d.ts rename to docs/demo/client/node_modules/xterm/lib/core/Types.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/core/Types.js b/docs/demo/client/node_modules/xterm/lib/core/Types.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/Types.js rename to docs/demo/client/node_modules/xterm/lib/core/Types.js diff --git a/doc/demo/client/node_modules/xterm/lib/core/Types.js.map b/docs/demo/client/node_modules/xterm/lib/core/Types.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/Types.js.map rename to docs/demo/client/node_modules/xterm/lib/core/Types.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.d.ts b/docs/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.d.ts rename to docs/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.js b/docs/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.js rename to docs/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.js diff --git a/doc/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.js.map b/docs/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.js.map rename to docs/demo/client/node_modules/xterm/lib/core/buffer/BufferLine.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.d.ts b/docs/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.d.ts rename to docs/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.js b/docs/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.js rename to docs/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.js diff --git a/doc/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.js.map b/docs/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.js.map rename to docs/demo/client/node_modules/xterm/lib/core/buffer/BufferReflow.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/core/buffer/Marker.d.ts b/docs/demo/client/node_modules/xterm/lib/core/buffer/Marker.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/buffer/Marker.d.ts rename to docs/demo/client/node_modules/xterm/lib/core/buffer/Marker.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/core/buffer/Marker.js b/docs/demo/client/node_modules/xterm/lib/core/buffer/Marker.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/buffer/Marker.js rename to docs/demo/client/node_modules/xterm/lib/core/buffer/Marker.js diff --git a/doc/demo/client/node_modules/xterm/lib/core/buffer/Marker.js.map b/docs/demo/client/node_modules/xterm/lib/core/buffer/Marker.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/buffer/Marker.js.map rename to docs/demo/client/node_modules/xterm/lib/core/buffer/Marker.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/core/data/Charsets.d.ts b/docs/demo/client/node_modules/xterm/lib/core/data/Charsets.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/data/Charsets.d.ts rename to docs/demo/client/node_modules/xterm/lib/core/data/Charsets.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/core/data/Charsets.js b/docs/demo/client/node_modules/xterm/lib/core/data/Charsets.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/data/Charsets.js rename to docs/demo/client/node_modules/xterm/lib/core/data/Charsets.js diff --git a/doc/demo/client/node_modules/xterm/lib/core/data/Charsets.js.map b/docs/demo/client/node_modules/xterm/lib/core/data/Charsets.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/data/Charsets.js.map rename to docs/demo/client/node_modules/xterm/lib/core/data/Charsets.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/core/input/Keyboard.d.ts b/docs/demo/client/node_modules/xterm/lib/core/input/Keyboard.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/input/Keyboard.d.ts rename to docs/demo/client/node_modules/xterm/lib/core/input/Keyboard.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/core/input/Keyboard.js b/docs/demo/client/node_modules/xterm/lib/core/input/Keyboard.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/input/Keyboard.js rename to docs/demo/client/node_modules/xterm/lib/core/input/Keyboard.js diff --git a/doc/demo/client/node_modules/xterm/lib/core/input/Keyboard.js.map b/docs/demo/client/node_modules/xterm/lib/core/input/Keyboard.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/input/Keyboard.js.map rename to docs/demo/client/node_modules/xterm/lib/core/input/Keyboard.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/core/input/TextDecoder.d.ts b/docs/demo/client/node_modules/xterm/lib/core/input/TextDecoder.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/input/TextDecoder.d.ts rename to docs/demo/client/node_modules/xterm/lib/core/input/TextDecoder.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/core/input/TextDecoder.js b/docs/demo/client/node_modules/xterm/lib/core/input/TextDecoder.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/input/TextDecoder.js rename to docs/demo/client/node_modules/xterm/lib/core/input/TextDecoder.js diff --git a/doc/demo/client/node_modules/xterm/lib/core/input/TextDecoder.js.map b/docs/demo/client/node_modules/xterm/lib/core/input/TextDecoder.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/core/input/TextDecoder.js.map rename to docs/demo/client/node_modules/xterm/lib/core/input/TextDecoder.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/handlers/AltClickHandler.js b/docs/demo/client/node_modules/xterm/lib/handlers/AltClickHandler.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/handlers/AltClickHandler.js rename to docs/demo/client/node_modules/xterm/lib/handlers/AltClickHandler.js diff --git a/doc/demo/client/node_modules/xterm/lib/handlers/AltClickHandler.js.map b/docs/demo/client/node_modules/xterm/lib/handlers/AltClickHandler.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/handlers/AltClickHandler.js.map rename to docs/demo/client/node_modules/xterm/lib/handlers/AltClickHandler.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/public/AddonManager.js b/docs/demo/client/node_modules/xterm/lib/public/AddonManager.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/public/AddonManager.js rename to docs/demo/client/node_modules/xterm/lib/public/AddonManager.js diff --git a/doc/demo/client/node_modules/xterm/lib/public/AddonManager.js.map b/docs/demo/client/node_modules/xterm/lib/public/AddonManager.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/public/AddonManager.js.map rename to docs/demo/client/node_modules/xterm/lib/public/AddonManager.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/public/Terminal.api.js b/docs/demo/client/node_modules/xterm/lib/public/Terminal.api.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/public/Terminal.api.js rename to docs/demo/client/node_modules/xterm/lib/public/Terminal.api.js diff --git a/doc/demo/client/node_modules/xterm/lib/public/Terminal.api.js.map b/docs/demo/client/node_modules/xterm/lib/public/Terminal.api.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/public/Terminal.api.js.map rename to docs/demo/client/node_modules/xterm/lib/public/Terminal.api.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/public/Terminal.js b/docs/demo/client/node_modules/xterm/lib/public/Terminal.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/public/Terminal.js rename to docs/demo/client/node_modules/xterm/lib/public/Terminal.js diff --git a/doc/demo/client/node_modules/xterm/lib/public/Terminal.js.map b/docs/demo/client/node_modules/xterm/lib/public/Terminal.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/public/Terminal.js.map rename to docs/demo/client/node_modules/xterm/lib/public/Terminal.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/BaseRenderLayer.js b/docs/demo/client/node_modules/xterm/lib/renderer/BaseRenderLayer.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/BaseRenderLayer.js rename to docs/demo/client/node_modules/xterm/lib/renderer/BaseRenderLayer.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/BaseRenderLayer.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/BaseRenderLayer.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/BaseRenderLayer.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/BaseRenderLayer.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/CharacterJoinerRegistry.js b/docs/demo/client/node_modules/xterm/lib/renderer/CharacterJoinerRegistry.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/CharacterJoinerRegistry.js rename to docs/demo/client/node_modules/xterm/lib/renderer/CharacterJoinerRegistry.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/CharacterJoinerRegistry.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/CharacterJoinerRegistry.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/CharacterJoinerRegistry.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/CharacterJoinerRegistry.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/ColorManager.js b/docs/demo/client/node_modules/xterm/lib/renderer/ColorManager.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/ColorManager.js rename to docs/demo/client/node_modules/xterm/lib/renderer/ColorManager.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/ColorManager.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/ColorManager.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/ColorManager.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/ColorManager.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/CursorRenderLayer.js b/docs/demo/client/node_modules/xterm/lib/renderer/CursorRenderLayer.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/CursorRenderLayer.js rename to docs/demo/client/node_modules/xterm/lib/renderer/CursorRenderLayer.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/CursorRenderLayer.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/CursorRenderLayer.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/CursorRenderLayer.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/CursorRenderLayer.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/GridCache.js b/docs/demo/client/node_modules/xterm/lib/renderer/GridCache.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/GridCache.js rename to docs/demo/client/node_modules/xterm/lib/renderer/GridCache.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/GridCache.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/GridCache.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/GridCache.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/GridCache.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/LinkRenderLayer.js b/docs/demo/client/node_modules/xterm/lib/renderer/LinkRenderLayer.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/LinkRenderLayer.js rename to docs/demo/client/node_modules/xterm/lib/renderer/LinkRenderLayer.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/LinkRenderLayer.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/LinkRenderLayer.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/LinkRenderLayer.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/LinkRenderLayer.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/RenderCoordinator.js b/docs/demo/client/node_modules/xterm/lib/renderer/RenderCoordinator.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/RenderCoordinator.js rename to docs/demo/client/node_modules/xterm/lib/renderer/RenderCoordinator.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/RenderCoordinator.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/RenderCoordinator.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/RenderCoordinator.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/RenderCoordinator.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/Renderer.js b/docs/demo/client/node_modules/xterm/lib/renderer/Renderer.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/Renderer.js rename to docs/demo/client/node_modules/xterm/lib/renderer/Renderer.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/Renderer.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/Renderer.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/Renderer.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/Renderer.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/SelectionRenderLayer.js b/docs/demo/client/node_modules/xterm/lib/renderer/SelectionRenderLayer.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/SelectionRenderLayer.js rename to docs/demo/client/node_modules/xterm/lib/renderer/SelectionRenderLayer.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/SelectionRenderLayer.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/SelectionRenderLayer.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/SelectionRenderLayer.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/SelectionRenderLayer.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/TextRenderLayer.js b/docs/demo/client/node_modules/xterm/lib/renderer/TextRenderLayer.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/TextRenderLayer.js rename to docs/demo/client/node_modules/xterm/lib/renderer/TextRenderLayer.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/TextRenderLayer.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/TextRenderLayer.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/TextRenderLayer.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/TextRenderLayer.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/Types.js b/docs/demo/client/node_modules/xterm/lib/renderer/Types.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/Types.js rename to docs/demo/client/node_modules/xterm/lib/renderer/Types.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/Types.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/Types.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/Types.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/Types.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/BaseCharAtlas.js b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/BaseCharAtlas.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/BaseCharAtlas.js rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/BaseCharAtlas.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/BaseCharAtlas.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/BaseCharAtlas.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/BaseCharAtlas.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/BaseCharAtlas.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasCache.js b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasCache.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasCache.js rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasCache.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasCache.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasCache.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasCache.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasCache.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasGenerator.js b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasGenerator.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasGenerator.js rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasGenerator.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasGenerator.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasGenerator.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasGenerator.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasGenerator.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasUtils.js b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasUtils.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasUtils.js rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasUtils.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasUtils.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasUtils.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasUtils.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/CharAtlasUtils.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/DynamicCharAtlas.js b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/DynamicCharAtlas.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/DynamicCharAtlas.js rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/DynamicCharAtlas.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/DynamicCharAtlas.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/DynamicCharAtlas.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/DynamicCharAtlas.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/DynamicCharAtlas.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/LRUMap.js b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/LRUMap.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/LRUMap.js rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/LRUMap.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/LRUMap.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/LRUMap.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/LRUMap.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/LRUMap.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/NoneCharAtlas.js b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/NoneCharAtlas.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/NoneCharAtlas.js rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/NoneCharAtlas.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/NoneCharAtlas.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/NoneCharAtlas.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/NoneCharAtlas.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/NoneCharAtlas.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/StaticCharAtlas.js b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/StaticCharAtlas.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/StaticCharAtlas.js rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/StaticCharAtlas.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/StaticCharAtlas.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/StaticCharAtlas.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/StaticCharAtlas.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/StaticCharAtlas.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/Types.js b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/Types.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/Types.js rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/Types.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/atlas/Types.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/atlas/Types.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/atlas/Types.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/atlas/Types.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/dom/DomRenderer.js b/docs/demo/client/node_modules/xterm/lib/renderer/dom/DomRenderer.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/dom/DomRenderer.js rename to docs/demo/client/node_modules/xterm/lib/renderer/dom/DomRenderer.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/dom/DomRenderer.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/dom/DomRenderer.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/dom/DomRenderer.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/dom/DomRenderer.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/dom/DomRendererRowFactory.js b/docs/demo/client/node_modules/xterm/lib/renderer/dom/DomRendererRowFactory.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/dom/DomRendererRowFactory.js rename to docs/demo/client/node_modules/xterm/lib/renderer/dom/DomRendererRowFactory.js diff --git a/doc/demo/client/node_modules/xterm/lib/renderer/dom/DomRendererRowFactory.js.map b/docs/demo/client/node_modules/xterm/lib/renderer/dom/DomRendererRowFactory.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/renderer/dom/DomRendererRowFactory.js.map rename to docs/demo/client/node_modules/xterm/lib/renderer/dom/DomRendererRowFactory.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/ui/CharMeasure.js b/docs/demo/client/node_modules/xterm/lib/ui/CharMeasure.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/CharMeasure.js rename to docs/demo/client/node_modules/xterm/lib/ui/CharMeasure.js diff --git a/doc/demo/client/node_modules/xterm/lib/ui/CharMeasure.js.map b/docs/demo/client/node_modules/xterm/lib/ui/CharMeasure.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/CharMeasure.js.map rename to docs/demo/client/node_modules/xterm/lib/ui/CharMeasure.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/ui/Clipboard.js b/docs/demo/client/node_modules/xterm/lib/ui/Clipboard.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/Clipboard.js rename to docs/demo/client/node_modules/xterm/lib/ui/Clipboard.js diff --git a/doc/demo/client/node_modules/xterm/lib/ui/Clipboard.js.map b/docs/demo/client/node_modules/xterm/lib/ui/Clipboard.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/Clipboard.js.map rename to docs/demo/client/node_modules/xterm/lib/ui/Clipboard.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/ui/ColorManager.d.ts b/docs/demo/client/node_modules/xterm/lib/ui/ColorManager.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/ColorManager.d.ts rename to docs/demo/client/node_modules/xterm/lib/ui/ColorManager.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/ui/ColorManager.js b/docs/demo/client/node_modules/xterm/lib/ui/ColorManager.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/ColorManager.js rename to docs/demo/client/node_modules/xterm/lib/ui/ColorManager.js diff --git a/doc/demo/client/node_modules/xterm/lib/ui/ColorManager.js.map b/docs/demo/client/node_modules/xterm/lib/ui/ColorManager.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/ColorManager.js.map rename to docs/demo/client/node_modules/xterm/lib/ui/ColorManager.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/ui/Lifecycle.d.ts b/docs/demo/client/node_modules/xterm/lib/ui/Lifecycle.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/Lifecycle.d.ts rename to docs/demo/client/node_modules/xterm/lib/ui/Lifecycle.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/ui/Lifecycle.js b/docs/demo/client/node_modules/xterm/lib/ui/Lifecycle.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/Lifecycle.js rename to docs/demo/client/node_modules/xterm/lib/ui/Lifecycle.js diff --git a/doc/demo/client/node_modules/xterm/lib/ui/Lifecycle.js.map b/docs/demo/client/node_modules/xterm/lib/ui/Lifecycle.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/Lifecycle.js.map rename to docs/demo/client/node_modules/xterm/lib/ui/Lifecycle.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/ui/MouseHelper.js b/docs/demo/client/node_modules/xterm/lib/ui/MouseHelper.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/MouseHelper.js rename to docs/demo/client/node_modules/xterm/lib/ui/MouseHelper.js diff --git a/doc/demo/client/node_modules/xterm/lib/ui/MouseHelper.js.map b/docs/demo/client/node_modules/xterm/lib/ui/MouseHelper.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/MouseHelper.js.map rename to docs/demo/client/node_modules/xterm/lib/ui/MouseHelper.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/ui/MouseZoneManager.js b/docs/demo/client/node_modules/xterm/lib/ui/MouseZoneManager.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/MouseZoneManager.js rename to docs/demo/client/node_modules/xterm/lib/ui/MouseZoneManager.js diff --git a/doc/demo/client/node_modules/xterm/lib/ui/MouseZoneManager.js.map b/docs/demo/client/node_modules/xterm/lib/ui/MouseZoneManager.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/MouseZoneManager.js.map rename to docs/demo/client/node_modules/xterm/lib/ui/MouseZoneManager.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.d.ts b/docs/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.d.ts rename to docs/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.js b/docs/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.js rename to docs/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.js diff --git a/doc/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.js.map b/docs/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.js.map rename to docs/demo/client/node_modules/xterm/lib/ui/RenderDebouncer.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.d.ts b/docs/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.d.ts rename to docs/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.js b/docs/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.js rename to docs/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.js diff --git a/doc/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.js.map b/docs/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.js.map rename to docs/demo/client/node_modules/xterm/lib/ui/ScreenDprMonitor.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/ui/Types.d.ts b/docs/demo/client/node_modules/xterm/lib/ui/Types.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/Types.d.ts rename to docs/demo/client/node_modules/xterm/lib/ui/Types.d.ts diff --git a/doc/demo/client/node_modules/xterm/lib/ui/Types.js b/docs/demo/client/node_modules/xterm/lib/ui/Types.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/Types.js rename to docs/demo/client/node_modules/xterm/lib/ui/Types.js diff --git a/doc/demo/client/node_modules/xterm/lib/ui/Types.js.map b/docs/demo/client/node_modules/xterm/lib/ui/Types.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/ui/Types.js.map rename to docs/demo/client/node_modules/xterm/lib/ui/Types.js.map diff --git a/doc/demo/client/node_modules/xterm/lib/xterm.css b/docs/demo/client/node_modules/xterm/lib/xterm.css similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/xterm.css rename to docs/demo/client/node_modules/xterm/lib/xterm.css diff --git a/doc/demo/client/node_modules/xterm/lib/xterm.js b/docs/demo/client/node_modules/xterm/lib/xterm.js similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/xterm.js rename to docs/demo/client/node_modules/xterm/lib/xterm.js diff --git a/doc/demo/client/node_modules/xterm/lib/xterm.js.map b/docs/demo/client/node_modules/xterm/lib/xterm.js.map similarity index 100% rename from doc/demo/client/node_modules/xterm/lib/xterm.js.map rename to docs/demo/client/node_modules/xterm/lib/xterm.js.map diff --git a/doc/demo/client/node_modules/xterm/package.json b/docs/demo/client/node_modules/xterm/package.json similarity index 100% rename from doc/demo/client/node_modules/xterm/package.json rename to docs/demo/client/node_modules/xterm/package.json diff --git a/doc/demo/client/node_modules/xterm/src/AccessibilityManager.ts b/docs/demo/client/node_modules/xterm/src/AccessibilityManager.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/AccessibilityManager.ts rename to docs/demo/client/node_modules/xterm/src/AccessibilityManager.ts diff --git a/doc/demo/client/node_modules/xterm/src/Buffer.ts b/docs/demo/client/node_modules/xterm/src/Buffer.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/Buffer.ts rename to docs/demo/client/node_modules/xterm/src/Buffer.ts diff --git a/doc/demo/client/node_modules/xterm/src/BufferLine.ts b/docs/demo/client/node_modules/xterm/src/BufferLine.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/BufferLine.ts rename to docs/demo/client/node_modules/xterm/src/BufferLine.ts diff --git a/doc/demo/client/node_modules/xterm/src/BufferReflow.ts b/docs/demo/client/node_modules/xterm/src/BufferReflow.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/BufferReflow.ts rename to docs/demo/client/node_modules/xterm/src/BufferReflow.ts diff --git a/doc/demo/client/node_modules/xterm/src/BufferSet.ts b/docs/demo/client/node_modules/xterm/src/BufferSet.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/BufferSet.ts rename to docs/demo/client/node_modules/xterm/src/BufferSet.ts diff --git a/doc/demo/client/node_modules/xterm/src/CharMeasure.ts b/docs/demo/client/node_modules/xterm/src/CharMeasure.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/CharMeasure.ts rename to docs/demo/client/node_modules/xterm/src/CharMeasure.ts diff --git a/doc/demo/client/node_modules/xterm/src/CharWidth.ts b/docs/demo/client/node_modules/xterm/src/CharWidth.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/CharWidth.ts rename to docs/demo/client/node_modules/xterm/src/CharWidth.ts diff --git a/doc/demo/client/node_modules/xterm/src/Clipboard.ts b/docs/demo/client/node_modules/xterm/src/Clipboard.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/Clipboard.ts rename to docs/demo/client/node_modules/xterm/src/Clipboard.ts diff --git a/doc/demo/client/node_modules/xterm/src/CompositionHelper.ts b/docs/demo/client/node_modules/xterm/src/CompositionHelper.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/CompositionHelper.ts rename to docs/demo/client/node_modules/xterm/src/CompositionHelper.ts diff --git a/doc/demo/client/node_modules/xterm/src/EscapeSequenceParser.ts b/docs/demo/client/node_modules/xterm/src/EscapeSequenceParser.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/EscapeSequenceParser.ts rename to docs/demo/client/node_modules/xterm/src/EscapeSequenceParser.ts diff --git a/doc/demo/client/node_modules/xterm/src/InputHandler.api.ts b/docs/demo/client/node_modules/xterm/src/InputHandler.api.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/InputHandler.api.ts rename to docs/demo/client/node_modules/xterm/src/InputHandler.api.ts diff --git a/doc/demo/client/node_modules/xterm/src/InputHandler.ts b/docs/demo/client/node_modules/xterm/src/InputHandler.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/InputHandler.ts rename to docs/demo/client/node_modules/xterm/src/InputHandler.ts diff --git a/doc/demo/client/node_modules/xterm/src/Linkifier.ts b/docs/demo/client/node_modules/xterm/src/Linkifier.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/Linkifier.ts rename to docs/demo/client/node_modules/xterm/src/Linkifier.ts diff --git a/doc/demo/client/node_modules/xterm/src/MouseHelper.ts b/docs/demo/client/node_modules/xterm/src/MouseHelper.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/MouseHelper.ts rename to docs/demo/client/node_modules/xterm/src/MouseHelper.ts diff --git a/doc/demo/client/node_modules/xterm/src/MouseZoneManager.ts b/docs/demo/client/node_modules/xterm/src/MouseZoneManager.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/MouseZoneManager.ts rename to docs/demo/client/node_modules/xterm/src/MouseZoneManager.ts diff --git a/doc/demo/client/node_modules/xterm/src/SelectionManager.ts b/docs/demo/client/node_modules/xterm/src/SelectionManager.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/SelectionManager.ts rename to docs/demo/client/node_modules/xterm/src/SelectionManager.ts diff --git a/doc/demo/client/node_modules/xterm/src/SelectionModel.ts b/docs/demo/client/node_modules/xterm/src/SelectionModel.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/SelectionModel.ts rename to docs/demo/client/node_modules/xterm/src/SelectionModel.ts diff --git a/doc/demo/client/node_modules/xterm/src/SoundManager.ts b/docs/demo/client/node_modules/xterm/src/SoundManager.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/SoundManager.ts rename to docs/demo/client/node_modules/xterm/src/SoundManager.ts diff --git a/doc/demo/client/node_modules/xterm/src/Strings.ts b/docs/demo/client/node_modules/xterm/src/Strings.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/Strings.ts rename to docs/demo/client/node_modules/xterm/src/Strings.ts diff --git a/doc/demo/client/node_modules/xterm/src/Terminal.integration.ts b/docs/demo/client/node_modules/xterm/src/Terminal.integration.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/Terminal.integration.ts rename to docs/demo/client/node_modules/xterm/src/Terminal.integration.ts diff --git a/doc/demo/client/node_modules/xterm/src/Terminal.ts b/docs/demo/client/node_modules/xterm/src/Terminal.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/Terminal.ts rename to docs/demo/client/node_modules/xterm/src/Terminal.ts diff --git a/doc/demo/client/node_modules/xterm/src/Types.ts b/docs/demo/client/node_modules/xterm/src/Types.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/Types.ts rename to docs/demo/client/node_modules/xterm/src/Types.ts diff --git a/doc/demo/client/node_modules/xterm/src/Viewport.ts b/docs/demo/client/node_modules/xterm/src/Viewport.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/Viewport.ts rename to docs/demo/client/node_modules/xterm/src/Viewport.ts diff --git a/doc/demo/client/node_modules/xterm/src/WindowsMode.ts b/docs/demo/client/node_modules/xterm/src/WindowsMode.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/WindowsMode.ts rename to docs/demo/client/node_modules/xterm/src/WindowsMode.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/attach/Interfaces.ts b/docs/demo/client/node_modules/xterm/src/addons/attach/Interfaces.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/attach/Interfaces.ts rename to docs/demo/client/node_modules/xterm/src/addons/attach/Interfaces.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/attach/attach.ts b/docs/demo/client/node_modules/xterm/src/addons/attach/attach.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/attach/attach.ts rename to docs/demo/client/node_modules/xterm/src/addons/attach/attach.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/attach/package.json b/docs/demo/client/node_modules/xterm/src/addons/attach/package.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/attach/package.json rename to docs/demo/client/node_modules/xterm/src/addons/attach/package.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/attach/tsconfig.json b/docs/demo/client/node_modules/xterm/src/addons/attach/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/attach/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/addons/attach/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/fit/README.md b/docs/demo/client/node_modules/xterm/src/addons/fit/README.md similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/fit/README.md rename to docs/demo/client/node_modules/xterm/src/addons/fit/README.md diff --git a/doc/demo/client/node_modules/xterm/src/addons/fit/fit.ts b/docs/demo/client/node_modules/xterm/src/addons/fit/fit.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/fit/fit.ts rename to docs/demo/client/node_modules/xterm/src/addons/fit/fit.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/fit/package.json b/docs/demo/client/node_modules/xterm/src/addons/fit/package.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/fit/package.json rename to docs/demo/client/node_modules/xterm/src/addons/fit/package.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/fit/tsconfig.json b/docs/demo/client/node_modules/xterm/src/addons/fit/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/fit/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/addons/fit/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/fullscreen/fullscreen.css b/docs/demo/client/node_modules/xterm/src/addons/fullscreen/fullscreen.css similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/fullscreen/fullscreen.css rename to docs/demo/client/node_modules/xterm/src/addons/fullscreen/fullscreen.css diff --git a/doc/demo/client/node_modules/xterm/src/addons/fullscreen/fullscreen.ts b/docs/demo/client/node_modules/xterm/src/addons/fullscreen/fullscreen.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/fullscreen/fullscreen.ts rename to docs/demo/client/node_modules/xterm/src/addons/fullscreen/fullscreen.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/fullscreen/package.json b/docs/demo/client/node_modules/xterm/src/addons/fullscreen/package.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/fullscreen/package.json rename to docs/demo/client/node_modules/xterm/src/addons/fullscreen/package.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/fullscreen/tsconfig.json b/docs/demo/client/node_modules/xterm/src/addons/fullscreen/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/fullscreen/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/addons/fullscreen/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/search/Interfaces.ts b/docs/demo/client/node_modules/xterm/src/addons/search/Interfaces.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/search/Interfaces.ts rename to docs/demo/client/node_modules/xterm/src/addons/search/Interfaces.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/search/SearchHelper.ts b/docs/demo/client/node_modules/xterm/src/addons/search/SearchHelper.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/search/SearchHelper.ts rename to docs/demo/client/node_modules/xterm/src/addons/search/SearchHelper.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/search/package.json b/docs/demo/client/node_modules/xterm/src/addons/search/package.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/search/package.json rename to docs/demo/client/node_modules/xterm/src/addons/search/package.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/search/search.ts b/docs/demo/client/node_modules/xterm/src/addons/search/search.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/search/search.ts rename to docs/demo/client/node_modules/xterm/src/addons/search/search.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/search/tsconfig.json b/docs/demo/client/node_modules/xterm/src/addons/search/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/search/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/addons/search/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/terminado/Interfaces.ts b/docs/demo/client/node_modules/xterm/src/addons/terminado/Interfaces.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/terminado/Interfaces.ts rename to docs/demo/client/node_modules/xterm/src/addons/terminado/Interfaces.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/terminado/package.json b/docs/demo/client/node_modules/xterm/src/addons/terminado/package.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/terminado/package.json rename to docs/demo/client/node_modules/xterm/src/addons/terminado/package.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/terminado/terminado.ts b/docs/demo/client/node_modules/xterm/src/addons/terminado/terminado.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/terminado/terminado.ts rename to docs/demo/client/node_modules/xterm/src/addons/terminado/terminado.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/terminado/tsconfig.json b/docs/demo/client/node_modules/xterm/src/addons/terminado/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/terminado/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/addons/terminado/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/webLinks/package.json b/docs/demo/client/node_modules/xterm/src/addons/webLinks/package.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/webLinks/package.json rename to docs/demo/client/node_modules/xterm/src/addons/webLinks/package.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/webLinks/tsconfig.json b/docs/demo/client/node_modules/xterm/src/addons/webLinks/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/webLinks/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/addons/webLinks/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/webLinks/webLinks.ts b/docs/demo/client/node_modules/xterm/src/addons/webLinks/webLinks.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/webLinks/webLinks.ts rename to docs/demo/client/node_modules/xterm/src/addons/webLinks/webLinks.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/winptyCompat/Interfaces.ts b/docs/demo/client/node_modules/xterm/src/addons/winptyCompat/Interfaces.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/winptyCompat/Interfaces.ts rename to docs/demo/client/node_modules/xterm/src/addons/winptyCompat/Interfaces.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/winptyCompat/package.json b/docs/demo/client/node_modules/xterm/src/addons/winptyCompat/package.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/winptyCompat/package.json rename to docs/demo/client/node_modules/xterm/src/addons/winptyCompat/package.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/winptyCompat/tsconfig.json b/docs/demo/client/node_modules/xterm/src/addons/winptyCompat/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/winptyCompat/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/addons/winptyCompat/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/winptyCompat/winptyCompat.ts b/docs/demo/client/node_modules/xterm/src/addons/winptyCompat/winptyCompat.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/winptyCompat/winptyCompat.ts rename to docs/demo/client/node_modules/xterm/src/addons/winptyCompat/winptyCompat.ts diff --git a/doc/demo/client/node_modules/xterm/src/addons/zmodem/package.json b/docs/demo/client/node_modules/xterm/src/addons/zmodem/package.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/zmodem/package.json rename to docs/demo/client/node_modules/xterm/src/addons/zmodem/package.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/zmodem/tsconfig.json b/docs/demo/client/node_modules/xterm/src/addons/zmodem/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/zmodem/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/addons/zmodem/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/addons/zmodem/zmodem.ts b/docs/demo/client/node_modules/xterm/src/addons/zmodem/zmodem.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/addons/zmodem/zmodem.ts rename to docs/demo/client/node_modules/xterm/src/addons/zmodem/zmodem.ts diff --git a/doc/demo/client/node_modules/xterm/src/common/CircularList.ts b/docs/demo/client/node_modules/xterm/src/common/CircularList.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/common/CircularList.ts rename to docs/demo/client/node_modules/xterm/src/common/CircularList.ts diff --git a/doc/demo/client/node_modules/xterm/src/common/Clone.ts b/docs/demo/client/node_modules/xterm/src/common/Clone.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/common/Clone.ts rename to docs/demo/client/node_modules/xterm/src/common/Clone.ts diff --git a/doc/demo/client/node_modules/xterm/src/common/EventEmitter.ts b/docs/demo/client/node_modules/xterm/src/common/EventEmitter.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/common/EventEmitter.ts rename to docs/demo/client/node_modules/xterm/src/common/EventEmitter.ts diff --git a/doc/demo/client/node_modules/xterm/src/common/EventEmitter2.ts b/docs/demo/client/node_modules/xterm/src/common/EventEmitter2.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/common/EventEmitter2.ts rename to docs/demo/client/node_modules/xterm/src/common/EventEmitter2.ts diff --git a/doc/demo/client/node_modules/xterm/src/common/Lifecycle.ts b/docs/demo/client/node_modules/xterm/src/common/Lifecycle.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/common/Lifecycle.ts rename to docs/demo/client/node_modules/xterm/src/common/Lifecycle.ts diff --git a/doc/demo/client/node_modules/xterm/src/common/Platform.ts b/docs/demo/client/node_modules/xterm/src/common/Platform.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/common/Platform.ts rename to docs/demo/client/node_modules/xterm/src/common/Platform.ts diff --git a/doc/demo/client/node_modules/xterm/src/common/TypedArrayUtils.ts b/docs/demo/client/node_modules/xterm/src/common/TypedArrayUtils.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/common/TypedArrayUtils.ts rename to docs/demo/client/node_modules/xterm/src/common/TypedArrayUtils.ts diff --git a/doc/demo/client/node_modules/xterm/src/common/Types.ts b/docs/demo/client/node_modules/xterm/src/common/Types.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/common/Types.ts rename to docs/demo/client/node_modules/xterm/src/common/Types.ts diff --git a/doc/demo/client/node_modules/xterm/src/common/data/EscapeSequences.ts b/docs/demo/client/node_modules/xterm/src/common/data/EscapeSequences.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/common/data/EscapeSequences.ts rename to docs/demo/client/node_modules/xterm/src/common/data/EscapeSequences.ts diff --git a/doc/demo/client/node_modules/xterm/src/common/tsconfig.json b/docs/demo/client/node_modules/xterm/src/common/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/common/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/common/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/core/Platform.ts b/docs/demo/client/node_modules/xterm/src/core/Platform.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/core/Platform.ts rename to docs/demo/client/node_modules/xterm/src/core/Platform.ts diff --git a/doc/demo/client/node_modules/xterm/src/core/Types.ts b/docs/demo/client/node_modules/xterm/src/core/Types.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/core/Types.ts rename to docs/demo/client/node_modules/xterm/src/core/Types.ts diff --git a/doc/demo/client/node_modules/xterm/src/core/buffer/BufferLine.ts b/docs/demo/client/node_modules/xterm/src/core/buffer/BufferLine.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/core/buffer/BufferLine.ts rename to docs/demo/client/node_modules/xterm/src/core/buffer/BufferLine.ts diff --git a/doc/demo/client/node_modules/xterm/src/core/buffer/BufferReflow.ts b/docs/demo/client/node_modules/xterm/src/core/buffer/BufferReflow.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/core/buffer/BufferReflow.ts rename to docs/demo/client/node_modules/xterm/src/core/buffer/BufferReflow.ts diff --git a/doc/demo/client/node_modules/xterm/src/core/buffer/Marker.ts b/docs/demo/client/node_modules/xterm/src/core/buffer/Marker.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/core/buffer/Marker.ts rename to docs/demo/client/node_modules/xterm/src/core/buffer/Marker.ts diff --git a/doc/demo/client/node_modules/xterm/src/core/data/Charsets.ts b/docs/demo/client/node_modules/xterm/src/core/data/Charsets.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/core/data/Charsets.ts rename to docs/demo/client/node_modules/xterm/src/core/data/Charsets.ts diff --git a/doc/demo/client/node_modules/xterm/src/core/input/Keyboard.ts b/docs/demo/client/node_modules/xterm/src/core/input/Keyboard.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/core/input/Keyboard.ts rename to docs/demo/client/node_modules/xterm/src/core/input/Keyboard.ts diff --git a/doc/demo/client/node_modules/xterm/src/core/input/TextDecoder.ts b/docs/demo/client/node_modules/xterm/src/core/input/TextDecoder.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/core/input/TextDecoder.ts rename to docs/demo/client/node_modules/xterm/src/core/input/TextDecoder.ts diff --git a/doc/demo/client/node_modules/xterm/src/core/tsconfig.json b/docs/demo/client/node_modules/xterm/src/core/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/core/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/core/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/handlers/AltClickHandler.ts b/docs/demo/client/node_modules/xterm/src/handlers/AltClickHandler.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/handlers/AltClickHandler.ts rename to docs/demo/client/node_modules/xterm/src/handlers/AltClickHandler.ts diff --git a/doc/demo/client/node_modules/xterm/src/public/AddonManager.ts b/docs/demo/client/node_modules/xterm/src/public/AddonManager.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/public/AddonManager.ts rename to docs/demo/client/node_modules/xterm/src/public/AddonManager.ts diff --git a/doc/demo/client/node_modules/xterm/src/public/Terminal.api.ts b/docs/demo/client/node_modules/xterm/src/public/Terminal.api.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/public/Terminal.api.ts rename to docs/demo/client/node_modules/xterm/src/public/Terminal.api.ts diff --git a/doc/demo/client/node_modules/xterm/src/public/Terminal.ts b/docs/demo/client/node_modules/xterm/src/public/Terminal.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/public/Terminal.ts rename to docs/demo/client/node_modules/xterm/src/public/Terminal.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/BaseRenderLayer.ts b/docs/demo/client/node_modules/xterm/src/renderer/BaseRenderLayer.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/BaseRenderLayer.ts rename to docs/demo/client/node_modules/xterm/src/renderer/BaseRenderLayer.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/CharacterJoinerRegistry.ts b/docs/demo/client/node_modules/xterm/src/renderer/CharacterJoinerRegistry.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/CharacterJoinerRegistry.ts rename to docs/demo/client/node_modules/xterm/src/renderer/CharacterJoinerRegistry.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/ColorManager.ts b/docs/demo/client/node_modules/xterm/src/renderer/ColorManager.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/ColorManager.ts rename to docs/demo/client/node_modules/xterm/src/renderer/ColorManager.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/CursorRenderLayer.ts b/docs/demo/client/node_modules/xterm/src/renderer/CursorRenderLayer.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/CursorRenderLayer.ts rename to docs/demo/client/node_modules/xterm/src/renderer/CursorRenderLayer.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/GridCache.ts b/docs/demo/client/node_modules/xterm/src/renderer/GridCache.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/GridCache.ts rename to docs/demo/client/node_modules/xterm/src/renderer/GridCache.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/LinkRenderLayer.ts b/docs/demo/client/node_modules/xterm/src/renderer/LinkRenderLayer.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/LinkRenderLayer.ts rename to docs/demo/client/node_modules/xterm/src/renderer/LinkRenderLayer.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/RenderCoordinator.ts b/docs/demo/client/node_modules/xterm/src/renderer/RenderCoordinator.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/RenderCoordinator.ts rename to docs/demo/client/node_modules/xterm/src/renderer/RenderCoordinator.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/Renderer.ts b/docs/demo/client/node_modules/xterm/src/renderer/Renderer.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/Renderer.ts rename to docs/demo/client/node_modules/xterm/src/renderer/Renderer.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/SelectionRenderLayer.ts b/docs/demo/client/node_modules/xterm/src/renderer/SelectionRenderLayer.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/SelectionRenderLayer.ts rename to docs/demo/client/node_modules/xterm/src/renderer/SelectionRenderLayer.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/TextRenderLayer.ts b/docs/demo/client/node_modules/xterm/src/renderer/TextRenderLayer.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/TextRenderLayer.ts rename to docs/demo/client/node_modules/xterm/src/renderer/TextRenderLayer.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/Types.ts b/docs/demo/client/node_modules/xterm/src/renderer/Types.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/Types.ts rename to docs/demo/client/node_modules/xterm/src/renderer/Types.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/atlas/BaseCharAtlas.ts b/docs/demo/client/node_modules/xterm/src/renderer/atlas/BaseCharAtlas.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/atlas/BaseCharAtlas.ts rename to docs/demo/client/node_modules/xterm/src/renderer/atlas/BaseCharAtlas.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasCache.ts b/docs/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasCache.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasCache.ts rename to docs/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasCache.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasGenerator.ts b/docs/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasGenerator.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasGenerator.ts rename to docs/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasGenerator.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasUtils.ts b/docs/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasUtils.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasUtils.ts rename to docs/demo/client/node_modules/xterm/src/renderer/atlas/CharAtlasUtils.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/atlas/DynamicCharAtlas.ts b/docs/demo/client/node_modules/xterm/src/renderer/atlas/DynamicCharAtlas.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/atlas/DynamicCharAtlas.ts rename to docs/demo/client/node_modules/xterm/src/renderer/atlas/DynamicCharAtlas.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/atlas/LRUMap.ts b/docs/demo/client/node_modules/xterm/src/renderer/atlas/LRUMap.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/atlas/LRUMap.ts rename to docs/demo/client/node_modules/xterm/src/renderer/atlas/LRUMap.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/atlas/NoneCharAtlas.ts b/docs/demo/client/node_modules/xterm/src/renderer/atlas/NoneCharAtlas.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/atlas/NoneCharAtlas.ts rename to docs/demo/client/node_modules/xterm/src/renderer/atlas/NoneCharAtlas.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/atlas/StaticCharAtlas.ts b/docs/demo/client/node_modules/xterm/src/renderer/atlas/StaticCharAtlas.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/atlas/StaticCharAtlas.ts rename to docs/demo/client/node_modules/xterm/src/renderer/atlas/StaticCharAtlas.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/atlas/Types.ts b/docs/demo/client/node_modules/xterm/src/renderer/atlas/Types.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/atlas/Types.ts rename to docs/demo/client/node_modules/xterm/src/renderer/atlas/Types.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/dom/DomRenderer.ts b/docs/demo/client/node_modules/xterm/src/renderer/dom/DomRenderer.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/dom/DomRenderer.ts rename to docs/demo/client/node_modules/xterm/src/renderer/dom/DomRenderer.ts diff --git a/doc/demo/client/node_modules/xterm/src/renderer/dom/DomRendererRowFactory.ts b/docs/demo/client/node_modules/xterm/src/renderer/dom/DomRendererRowFactory.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/renderer/dom/DomRendererRowFactory.ts rename to docs/demo/client/node_modules/xterm/src/renderer/dom/DomRendererRowFactory.ts diff --git a/doc/demo/client/node_modules/xterm/src/tsconfig-base.json b/docs/demo/client/node_modules/xterm/src/tsconfig-base.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/tsconfig-base.json rename to docs/demo/client/node_modules/xterm/src/tsconfig-base.json diff --git a/doc/demo/client/node_modules/xterm/src/tsconfig-library-base.json b/docs/demo/client/node_modules/xterm/src/tsconfig-library-base.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/tsconfig-library-base.json rename to docs/demo/client/node_modules/xterm/src/tsconfig-library-base.json diff --git a/doc/demo/client/node_modules/xterm/src/tsconfig.all.json b/docs/demo/client/node_modules/xterm/src/tsconfig.all.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/tsconfig.all.json rename to docs/demo/client/node_modules/xterm/src/tsconfig.all.json diff --git a/doc/demo/client/node_modules/xterm/src/tsconfig.json b/docs/demo/client/node_modules/xterm/src/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/ui/CharMeasure.ts b/docs/demo/client/node_modules/xterm/src/ui/CharMeasure.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/ui/CharMeasure.ts rename to docs/demo/client/node_modules/xterm/src/ui/CharMeasure.ts diff --git a/doc/demo/client/node_modules/xterm/src/ui/Clipboard.ts b/docs/demo/client/node_modules/xterm/src/ui/Clipboard.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/ui/Clipboard.ts rename to docs/demo/client/node_modules/xterm/src/ui/Clipboard.ts diff --git a/doc/demo/client/node_modules/xterm/src/ui/ColorManager.ts b/docs/demo/client/node_modules/xterm/src/ui/ColorManager.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/ui/ColorManager.ts rename to docs/demo/client/node_modules/xterm/src/ui/ColorManager.ts diff --git a/doc/demo/client/node_modules/xterm/src/ui/Lifecycle.ts b/docs/demo/client/node_modules/xterm/src/ui/Lifecycle.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/ui/Lifecycle.ts rename to docs/demo/client/node_modules/xterm/src/ui/Lifecycle.ts diff --git a/doc/demo/client/node_modules/xterm/src/ui/MouseHelper.ts b/docs/demo/client/node_modules/xterm/src/ui/MouseHelper.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/ui/MouseHelper.ts rename to docs/demo/client/node_modules/xterm/src/ui/MouseHelper.ts diff --git a/doc/demo/client/node_modules/xterm/src/ui/MouseZoneManager.ts b/docs/demo/client/node_modules/xterm/src/ui/MouseZoneManager.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/ui/MouseZoneManager.ts rename to docs/demo/client/node_modules/xterm/src/ui/MouseZoneManager.ts diff --git a/doc/demo/client/node_modules/xterm/src/ui/RenderDebouncer.ts b/docs/demo/client/node_modules/xterm/src/ui/RenderDebouncer.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/ui/RenderDebouncer.ts rename to docs/demo/client/node_modules/xterm/src/ui/RenderDebouncer.ts diff --git a/doc/demo/client/node_modules/xterm/src/ui/ScreenDprMonitor.ts b/docs/demo/client/node_modules/xterm/src/ui/ScreenDprMonitor.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/ui/ScreenDprMonitor.ts rename to docs/demo/client/node_modules/xterm/src/ui/ScreenDprMonitor.ts diff --git a/doc/demo/client/node_modules/xterm/src/ui/Types.ts b/docs/demo/client/node_modules/xterm/src/ui/Types.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/ui/Types.ts rename to docs/demo/client/node_modules/xterm/src/ui/Types.ts diff --git a/doc/demo/client/node_modules/xterm/src/ui/tsconfig.json b/docs/demo/client/node_modules/xterm/src/ui/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/src/ui/tsconfig.json rename to docs/demo/client/node_modules/xterm/src/ui/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/src/xterm.css b/docs/demo/client/node_modules/xterm/src/xterm.css similarity index 100% rename from doc/demo/client/node_modules/xterm/src/xterm.css rename to docs/demo/client/node_modules/xterm/src/xterm.css diff --git a/doc/demo/client/node_modules/xterm/src/xterm.ts b/docs/demo/client/node_modules/xterm/src/xterm.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/src/xterm.ts rename to docs/demo/client/node_modules/xterm/src/xterm.ts diff --git a/doc/demo/client/node_modules/xterm/tsconfig.json b/docs/demo/client/node_modules/xterm/tsconfig.json similarity index 100% rename from doc/demo/client/node_modules/xterm/tsconfig.json rename to docs/demo/client/node_modules/xterm/tsconfig.json diff --git a/doc/demo/client/node_modules/xterm/tslint.json b/docs/demo/client/node_modules/xterm/tslint.json similarity index 100% rename from doc/demo/client/node_modules/xterm/tslint.json rename to docs/demo/client/node_modules/xterm/tslint.json diff --git a/doc/demo/client/node_modules/xterm/typings/xterm.d.ts b/docs/demo/client/node_modules/xterm/typings/xterm.d.ts similarity index 100% rename from doc/demo/client/node_modules/xterm/typings/xterm.d.ts rename to docs/demo/client/node_modules/xterm/typings/xterm.d.ts diff --git a/doc/demo/client/package-lock.json b/docs/demo/client/package-lock.json similarity index 100% rename from doc/demo/client/package-lock.json rename to docs/demo/client/package-lock.json diff --git a/doc/deploy/k8s/k8s-webshell-clusterrole.yaml b/docs/deploy/kubernetes/k8s-webshell-clusterrole.yaml similarity index 100% rename from doc/deploy/k8s/k8s-webshell-clusterrole.yaml rename to docs/deploy/kubernetes/k8s-webshell-clusterrole.yaml diff --git a/doc/deploy/k8s/k8s-webshell-clusterrolebinding.yaml b/docs/deploy/kubernetes/k8s-webshell-clusterrolebinding.yaml similarity index 100% rename from doc/deploy/k8s/k8s-webshell-clusterrolebinding.yaml rename to docs/deploy/kubernetes/k8s-webshell-clusterrolebinding.yaml diff --git a/docs/deploy/kubernetes/k8s-webshell-configmap.yaml b/docs/deploy/kubernetes/k8s-webshell-configmap.yaml new file mode 100644 index 0000000..a62d495 --- /dev/null +++ b/docs/deploy/kubernetes/k8s-webshell-configmap.yaml @@ -0,0 +1,21 @@ +--- +kind: ConfigMap +apiVersion: v1 +metadata: + name: k8s-webshell + namespaces: production-k8s-webshell # 根据自身情况进行修改 +data: + config.yaml: | + server: + port: 7777 + run_mode: debug + logpath: /var/log/app + logname: webshell.log + certificate: /etc/k8s-webshell/ssl/webshell.crt + certificatekey: /etc/k8s-webshell/ssl/webshell.key + jwtsecret: YouGuess + secretkey: richie + + k8s: + kubeconfig: /etc/k8s-webshell/admin.conf + incluster: true diff --git a/docs/deploy/kubernetes/k8s-webshell-deployment.yaml b/docs/deploy/kubernetes/k8s-webshell-deployment.yaml new file mode 100644 index 0000000..618136c --- /dev/null +++ b/docs/deploy/kubernetes/k8s-webshell-deployment.yaml @@ -0,0 +1,40 @@ +--- +apiVersion: apps/v1 +kind: Deployment +metadata: + name: k8s-webshell + namespace: +spec: + replicas: 1 + selector: + matchLabels: + app: k8s-webshell + template: + metadata: + labels: + app: k8s-webshell + spec: + serviceAccountName: k8s-webshell + automountServiceAccountToken: true + containers: + - name: k8s-webshell + image: harbor.finupgroup.com/galaxy/k8s-webshell:v1 + command: ["./k8s-webshell", "--config", "/etc/k8s-webshell/config.yaml"] + imagePullPolicy: Always + volumeMounts: + - name: k8s-webshell-config + mountPath: /etc/k8s-webshell/config.yaml + subPath: config.yaml + - name: k8s-webshell-ssl + mountPath: /etc/k8s-webshell/ssl + readOnly: true + ports: + - containerPort: 7777 + volumes: + - name: k8s-webshell-config + configMap: + name: k8s-webshell + - name: k8s-webshell-ssl + secret: + secretName: k8s-webshell-ssl + diff --git a/doc/deploy/k8s/k8s-webshell-sa.yaml b/docs/deploy/kubernetes/k8s-webshell-sa.yaml similarity index 100% rename from doc/deploy/k8s/k8s-webshell-sa.yaml rename to docs/deploy/kubernetes/k8s-webshell-sa.yaml diff --git a/docs/deploy/kubernetes/k8s-webshell-secret.yaml b/docs/deploy/kubernetes/k8s-webshell-secret.yaml new file mode 100644 index 0000000..ef45d86 --- /dev/null +++ b/docs/deploy/kubernetes/k8s-webshell-secret.yaml @@ -0,0 +1,11 @@ +kind: Secret +apiVersion: v1 +metadata: + name: k8s-webshell-ssl +type: Opaque +data: + webshell.crt: # base64 webshell.crt + LS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tDQpNSUlGWVRDQ0JFbWdBd0lCQWdJTVRiTjV5amNyeDgvbHVvRDNNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1HWXhDekFKDQpCZ05WQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aVlXeFRhV2R1SUc1MkxYTmhNVHd3T2dZRFZRUURFek5IDQpiRzlpWVd4VGFXZHVJRTl5WjJGdWFYcGhkR2x2YmlCV1lXeHBaR0YwYVc5dUlFTkJJQzBnVTBoQk1qVTJJQzBnDQpSekl3SGhjTk1UY3dPVEl5TVRNeE1qVTFXaGNOTWpBd09USXlNVE14TWpVMVdqQ0JnVEVMTUFrR0ExVUVCaE1DDQpRMDR4RURBT0JnTlZCQWdUQjBkMVlXNW5lR2t4RHpBTkJnTlZCQWNUQmtKbGFXaGhhVEVMTUFrR0ExVUVDeE1DDQpTVlF4SnpBbEJnTlZCQW9NSHVXSG9lYVpydW1Ia2VlbmtlbWJodVdib3VhY2llbVprT1dGck9XUHVERVpNQmNHDQpBMVVFQXd3UUtpNW1hVzUxY0dkeWIzVndMbU52YlRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDDQpBUW9DZ2dFQkFPc3hxbUZYMHpRTXo5c2loNG1qUDcxdG0zRG9icTBOZHZFajVGUDhwQ3h6S3d3VndOOXJqM2doDQpTVC9pVUlXckVHOCsyaGpLelVWbzc5WmtjdzREOTlmYXdJSXo3cVJva0N5RHlrNytwL25vM3MzeHptSHQ0RVp2DQpzUmJ4NHR3VVlsY0F4WnBMOWNyT01CT1oyQU1IcjZ3dW5mSEdPZ0RoZjc3TXBSRW9nTmYvRkg3dEdUVy9hSUdJDQoxWXJyUTdhV2ZuUHBsZmxrVURBOXB6Q0pLaHR0d3dxTGhLOXZqSHNVZ0tGbzgrc0FEUVJEQVJTaW5WT2dDQW4wDQoxL2x2eDlnRjVVVHVFRDlhRDVJdCtxOHh5cmRxSFFTQlYvbjF0N2t5YkhBSENmSE40K3FHN25BeDFIN2tLV0t6DQpxWHB2Wmc3NmQwSGxYUllJR1dwZmhRbUZJTUhUOVYwQ0F3RUFBYU9DQWZFd2dnSHRNQTRHQTFVZER3RUIvd1FFDQpBd0lGb0RDQm9BWUlLd1lCQlFVSEFRRUVnWk13Z1pBd1RRWUlLd1lCQlFVSE1BS0dRV2gwZEhBNkx5OXpaV04xDQpjbVV1WjJ4dlltRnNjMmxuYmk1amIyMHZZMkZqWlhKMEwyZHpiM0puWVc1cGVtRjBhVzl1ZG1Gc2MyaGhNbWN5DQpjakV1WTNKME1EOEdDQ3NHQVFVRkJ6QUJoak5vZEhSd09pOHZiMk56Y0RJdVoyeHZZbUZzYzJsbmJpNWpiMjB2DQpaM052Y21kaGJtbDZZWFJwYjI1MllXeHphR0V5WnpJd1ZnWURWUjBnQkU4d1RUQkJCZ2tyQmdFRUFhQXlBUlF3DQpOREF5QmdnckJnRUZCUWNDQVJZbWFIUjBjSE02THk5M2QzY3VaMnh2WW1Gc2MybG5iaTVqYjIwdmNtVndiM05wDQpkRzl5ZVM4d0NBWUdaNEVNQVFJQ01Ba0dBMVVkRXdRQ01BQXdTUVlEVlIwZkJFSXdRREErb0R5Z09vWTRhSFIwDQpjRG92TDJOeWJDNW5iRzlpWVd4emFXZHVMbU52YlM5bmN5OW5jMjl5WjJGdWFYcGhkR2x2Ym5aaGJITm9ZVEpuDQpNaTVqY213d0t3WURWUjBSQkNRd0lvSVFLaTVtYVc1MWNHZHliM1Z3TG1OdmJZSU9abWx1ZFhCbmNtOTFjQzVqDQpiMjB3SFFZRFZSMGxCQll3RkFZSUt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQ01CMEdBMVVkRGdRV0JCVGllbkxTDQp1MkpSM2RDbDBuc3g0UVJnWlVpSzN6QWZCZ05WSFNNRUdEQVdnQlNXM21IeHZSd1dLVk1jd014OU80TUFRT1lhDQpmREFOQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBQnlYVE1yZjNzSnBVNjh1cXBSeDAvbk9FY09YUHJUQ0QvV3JVDQo4Rk9RZ1JORmdnN0tSOWc1K1BMb3VqTklIQVQwdWFyeTNvOEptcEZoQWM2WmdabXhCZ0pLU0E1Rk5SaUd3UWdIDQpnaXRNUzQxN21uQzFkQVdnTXAzUjhOdlBldlMwMXZ4b1A3YTVPbjQvSm1aY3Z2SWtjUFpsOXQ4Vm50dWYyOVFmDQpLQUc2aUlsaTk2N2dBTnpGZUtHZ1U5Q2NndFNwbTl0R2crUzNGT2xvWXBja0NkcHhLRUpvN2hWMlFQeFNhdGNtDQo0S3VJRTVlZVVVRFovZlNPWUpzcHI2MWFGNFNKYjVwVXR5cmVvYUl1OFRWelNjS2xuZGJIRmZIQ0hUYytIMk93DQo1L0g5L0RZWW8raGNick4xNzFFV0dRLzFCSHVIdXFnelNoWCtYMEpiSmg1NDNjUkcrUT09DQotLS0tLUVORCBDRVJUSUZJQ0FURS0tLS0tDQotLS0tLUJFR0lOIENFUlRJRklDQVRFLS0tLS0NCk1JSUVhVENDQTFHZ0F3SUJBZ0lMQkFBQUFBQUJSRTd3UWtjd0RRWUpLb1pJaHZjTkFRRUxCUUF3VnpFTE1Ba0cNCkExVUVCaE1DUWtVeEdUQVhCZ05WQkFvVEVFZHNiMkpoYkZOcFoyNGdibll0YzJFeEVEQU9CZ05WQkFzVEIxSnYNCmIzUWdRMEV4R3pBWkJnTlZCQU1URWtkc2IySmhiRk5wWjI0Z1VtOXZkQ0JEUVRBZUZ3MHhOREF5TWpBeE1EQXcNCk1EQmFGdzB5TkRBeU1qQXhNREF3TURCYU1HWXhDekFKQmdOVkJBWVRBa0pGTVJrd0Z3WURWUVFLRXhCSGJHOWkNCllXeFRhV2R1SUc1MkxYTmhNVHd3T2dZRFZRUURFek5IYkc5aVlXeFRhV2R1SUU5eVoyRnVhWHBoZEdsdmJpQlcNCllXeHBaR0YwYVc5dUlFTkJJQzBnVTBoQk1qVTJJQzBnUnpJd2dnRWlNQTBHQ1NxR1NJYjNEUUVCQVFVQUE0SUINCkR3QXdnZ0VLQW9JQkFRREhEbXcvSTVOL3pIQ2xuU0RERGxNL2ZzQk93cGhKeWtmVkkrOEROSVYweUtNQ0xrWmMNCkMzM0ppSjFQaS9ENG5HeU1WVFhidi9LejZ2dmpWdWRLUnRrVElzbzIxWnZCcU9PV1E1UHlETHptK2Vib21jaGoNClNIaC9WelpwR2hrZFd0SFVmY0tjMUgvaGdCS3VldXFJNmxmWXlnb0tPaEpKb21JWmVnMGs5emZydEhPU2V3VWoNCm14SzF6dXNwMzZRVUFya0JwZFNtbkVOa2lONzRmdjdqOVI3bC90eWpxT1JtTWRsTUpla1l1WWxaQ2E3cG5SeHQNCk53OUtIalVnS09LdjFDR0xBY1JGclc0clk2dVNhMkVLVFNEdGM3cDh6djRXdGR1ZmdQRFdpMnpaQ0hsS1QzaGwNCjJwSzh2alg1czhUNUo0Qk8vNVpTNWdJZzRRZHo2VjBydmJMeEFnTUJBQUdqZ2dFbE1JSUJJVEFPQmdOVkhROEINCkFmOEVCQU1DQVFZd0VnWURWUjBUQVFIL0JBZ3dCZ0VCL3dJQkFEQWRCZ05WSFE0RUZnUVVsdDVoOGIwY0ZpbFQNCkhNRE1mVHVEQUVEbUdud3dSd1lEVlIwZ0JFQXdQakE4QmdSVkhTQUFNRFF3TWdZSUt3WUJCUVVIQWdFV0ptaDANCmRIQnpPaTh2ZDNkM0xtZHNiMkpoYkhOcFoyNHVZMjl0TDNKbGNHOXphWFJ2Y25rdk1ETUdBMVVkSHdRc01Db3cNCktLQW1vQ1NHSW1oMGRIQTZMeTlqY213dVoyeHZZbUZzYzJsbmJpNXVaWFF2Y205dmRDNWpjbXd3UFFZSUt3WUINCkJRVUhBUUVFTVRBdk1DMEdDQ3NHQVFVRkJ6QUJoaUZvZEhSd09pOHZiMk56Y0M1bmJHOWlZV3h6YVdkdUxtTnYNCmJTOXliMjkwY2pFd0h3WURWUjBqQkJnd0ZvQVVZSHRtR2tVTmw4cUpVQzk5Qk0wMHFQLzgvVXN3RFFZSktvWkkNCmh2Y05BUUVMQlFBRGdnRUJBRVlxN2w2OXJnRmdOekVSaG5GMHRrWkp5QkFXL2k5aUl4ZXJINGY0Z3UzSzN3NHMNCjMyUjFqdVVZY3FlTU9vdkpyS1YzVVBmdm5xVGdvSThVVjZNcVgreCtiUkRtdW8yd0NJZDJEa3l5MlZHN0VRTHkNClhOMGN2Zk5WbGcvVUJzRDg0aU9LSkhEVHUvQjVHcWRoY0lPS3J3YkZJTmloWTlCc3JrOHkxNjU4R0VWMUJTbDMNCjMwSkFaR1NHdmlwMkNURnZIU1QwbWRDRi92SWhDUG5HOXZIUVdlM1dWandJS0FObnV2RDU4WkFXUjY1bjVyeUENClNPbENkalNYVldra0RvUFdvQzIwOWZONWlra29kQnBCb2NMVEpJZzFNR0NVRjdUaEJDSXhQVHN2RndheXVKMkcNCksxcHA3NFAxUzhTcXRDcjRmS0d4aFpTTTlBeUhEUFNzUVBoWlNaZz0NCi0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0NCi0tLS0tQkVHSU4gUEtDUzctLS0tLQ0KTUlJTmRnWUpLb1pJaHZjTkFRY0NvSUlOWnpDQ0RXTUNBUUV4QURBTEJna3Foa2lHOXcwQkJ3R2dnZzFMTUlJRg0KWVRDQ0JFbWdBd0lCQWdJTVRiTjV5amNyeDgvbHVvRDNNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1HWXhDekFKQmdOVg0KQkFZVEFrSkZNUmt3RndZRFZRUUtFeEJIYkc5aVlXeFRhV2R1SUc1MkxYTmhNVHd3T2dZRFZRUURFek5IYkc5aQ0KWVd4VGFXZHVJRTl5WjJGdWFYcGhkR2x2YmlCV1lXeHBaR0YwYVc5dUlFTkJJQzBnVTBoQk1qVTJJQzBnUnpJdw0KSGhjTk1UY3dPVEl5TVRNeE1qVTFXaGNOTWpBd09USXlNVE14TWpVMVdqQ0JnVEVMTUFrR0ExVUVCaE1DUTA0eA0KRURBT0JnTlZCQWdUQjBkMVlXNW5lR2t4RHpBTkJnTlZCQWNUQmtKbGFXaGhhVEVMTUFrR0ExVUVDeE1DU1ZReA0KSnpBbEJnTlZCQW9NSHVXSG9lYVpydW1Ia2VlbmtlbWJodVdib3VhY2llbVprT1dGck9XUHVERVpNQmNHQTFVRQ0KQXd3UUtpNW1hVzUxY0dkeWIzVndMbU52YlRDQ0FTSXdEUVlKS29aSWh2Y05BUUVCQlFBRGdnRVBBRENDQVFvQw0KZ2dFQkFPc3hxbUZYMHpRTXo5c2loNG1qUDcxdG0zRG9icTBOZHZFajVGUDhwQ3h6S3d3VndOOXJqM2doU1QvaQ0KVUlXckVHOCsyaGpLelVWbzc5WmtjdzREOTlmYXdJSXo3cVJva0N5RHlrNytwL25vM3MzeHptSHQ0RVp2c1JieA0KNHR3VVlsY0F4WnBMOWNyT01CT1oyQU1IcjZ3dW5mSEdPZ0RoZjc3TXBSRW9nTmYvRkg3dEdUVy9hSUdJMVlycg0KUTdhV2ZuUHBsZmxrVURBOXB6Q0pLaHR0d3dxTGhLOXZqSHNVZ0tGbzgrc0FEUVJEQVJTaW5WT2dDQW4wMS9sdg0KeDlnRjVVVHVFRDlhRDVJdCtxOHh5cmRxSFFTQlYvbjF0N2t5YkhBSENmSE40K3FHN25BeDFIN2tLV0t6cVhwdg0KWmc3NmQwSGxYUllJR1dwZmhRbUZJTUhUOVYwQ0F3RUFBYU9DQWZFd2dnSHRNQTRHQTFVZER3RUIvd1FFQXdJRg0Kb0RDQm9BWUlLd1lCQlFVSEFRRUVnWk13Z1pBd1RRWUlLd1lCQlFVSE1BS0dRV2gwZEhBNkx5OXpaV04xY21VdQ0KWjJ4dlltRnNjMmxuYmk1amIyMHZZMkZqWlhKMEwyZHpiM0puWVc1cGVtRjBhVzl1ZG1Gc2MyaGhNbWN5Y2pFdQ0KWTNKME1EOEdDQ3NHQVFVRkJ6QUJoak5vZEhSd09pOHZiMk56Y0RJdVoyeHZZbUZzYzJsbmJpNWpiMjB2WjNOdg0KY21kaGJtbDZZWFJwYjI1MllXeHphR0V5WnpJd1ZnWURWUjBnQkU4d1RUQkJCZ2tyQmdFRUFhQXlBUlF3TkRBeQ0KQmdnckJnRUZCUWNDQVJZbWFIUjBjSE02THk5M2QzY3VaMnh2WW1Gc2MybG5iaTVqYjIwdmNtVndiM05wZEc5eQ0KZVM4d0NBWUdaNEVNQVFJQ01Ba0dBMVVkRXdRQ01BQXdTUVlEVlIwZkJFSXdRREErb0R5Z09vWTRhSFIwY0Rvdg0KTDJOeWJDNW5iRzlpWVd4emFXZHVMbU52YlM5bmN5OW5jMjl5WjJGdWFYcGhkR2x2Ym5aaGJITm9ZVEpuTWk1ag0KY213d0t3WURWUjBSQkNRd0lvSVFLaTVtYVc1MWNHZHliM1Z3TG1OdmJZSU9abWx1ZFhCbmNtOTFjQzVqYjIwdw0KSFFZRFZSMGxCQll3RkFZSUt3WUJCUVVIQXdFR0NDc0dBUVVGQndNQ01CMEdBMVVkRGdRV0JCVGllbkxTdTJKUg0KM2RDbDBuc3g0UVJnWlVpSzN6QWZCZ05WSFNNRUdEQVdnQlNXM21IeHZSd1dLVk1jd014OU80TUFRT1lhZkRBTg0KQmdrcWhraUc5dzBCQVFzRkFBT0NBUUVBQnlYVE1yZjNzSnBVNjh1cXBSeDAvbk9FY09YUHJUQ0QvV3JVOEZPUQ0KZ1JORmdnN0tSOWc1K1BMb3VqTklIQVQwdWFyeTNvOEptcEZoQWM2WmdabXhCZ0pLU0E1Rk5SaUd3UWdIZ2l0TQ0KUzQxN21uQzFkQVdnTXAzUjhOdlBldlMwMXZ4b1A3YTVPbjQvSm1aY3Z2SWtjUFpsOXQ4Vm50dWYyOVFmS0FHNg0KaUlsaTk2N2dBTnpGZUtHZ1U5Q2NndFNwbTl0R2crUzNGT2xvWXBja0NkcHhLRUpvN2hWMlFQeFNhdGNtNEt1SQ0KRTVlZVVVRFovZlNPWUpzcHI2MWFGNFNKYjVwVXR5cmVvYUl1OFRWelNjS2xuZGJIRmZIQ0hUYytIMk93NS9IOQ0KL0RZWW8raGNick4xNzFFV0dRLzFCSHVIdXFnelNoWCtYMEpiSmg1NDNjUkcrVENDQkdrd2dnTlJvQU1DQVFJQw0KQ3dRQUFBQUFBVVJPOEVKSE1BMEdDU3FHU0liM0RRRUJDd1VBTUZjeEN6QUpCZ05WQkFZVEFrSkZNUmt3RndZRA0KVlFRS0V4QkhiRzlpWVd4VGFXZHVJRzUyTFhOaE1SQXdEZ1lEVlFRTEV3ZFNiMjkwSUVOQk1Sc3dHUVlEVlFRRA0KRXhKSGJHOWlZV3hUYVdkdUlGSnZiM1FnUTBFd0hoY05NVFF3TWpJd01UQXdNREF3V2hjTk1qUXdNakl3TVRBdw0KTURBd1dqQm1NUXN3Q1FZRFZRUUdFd0pDUlRFWk1CY0dBMVVFQ2hNUVIyeHZZbUZzVTJsbmJpQnVkaTF6WVRFOA0KTURvR0ExVUVBeE16UjJ4dlltRnNVMmxuYmlCUGNtZGhibWw2WVhScGIyNGdWbUZzYVdSaGRHbHZiaUJEUVNBdA0KSUZOSVFUSTFOaUF0SUVjeU1JSUJJakFOQmdrcWhraUc5dzBCQVFFRkFBT0NBUThBTUlJQkNnS0NBUUVBeHc1cw0KUHlPVGY4eHdwWjBnd3c1VFAzN0FUc0tZU2NwSDFTUHZBelNGZE1pakFpNUdYQXQ5eVlpZFQ0dncrSnhzakZVMQ0KMjcveXMrcjc0MWJuU2tiWkV5TEtOdFdid2FqamxrT1Q4Z3k4NXZubTZKbklZMGg0ZjFjMmFSb1pIVnJSMUgzQw0Kbk5SLzRZQVNybnJxaU9wWDJNb0tDam9TU2FKaUdYb05KUGMzNjdSemtuc0ZJNXNTdGM3cktkK2tGQUs1QWFYVQ0KcHB4RFpJamUrSDcrNC9VZTVmN2NvNmprWmpIWlRDWHBHTG1KV1FtdTZaMGNiVGNQU2g0MUlDamlyOVFoaXdIRQ0KUmExdUsyT3JrbXRoQ2swZzdYTzZmTTcrRnJYYm40RHcxb3RzMlFoNVNrOTRaZHFTdkw0MStiUEUrU2VBVHYrVw0KVXVZQ0lPRUhjK2xkSzcyeThRSURBUUFCbzRJQkpUQ0NBU0V3RGdZRFZSMFBBUUgvQkFRREFnRUdNQklHQTFVZA0KRXdFQi93UUlNQVlCQWY4Q0FRQXdIUVlEVlIwT0JCWUVGSmJlWWZHOUhCWXBVeHpBekgwN2d3QkE1aHA4TUVjRw0KQTFVZElBUkFNRDR3UEFZRVZSMGdBREEwTURJR0NDc0dBUVVGQndJQkZpWm9kSFJ3Y3pvdkwzZDNkeTVuYkc5aQ0KWVd4emFXZHVMbU52YlM5eVpYQnZjMmwwYjNKNUx6QXpCZ05WSFI4RUxEQXFNQ2lnSnFBa2hpSm9kSFJ3T2k4dg0KWTNKc0xtZHNiMkpoYkhOcFoyNHVibVYwTDNKdmIzUXVZM0pzTUQwR0NDc0dBUVVGQndFQkJERXdMekF0Qmdncg0KQmdFRkJRY3dBWVloYUhSMGNEb3ZMMjlqYzNBdVoyeHZZbUZzYzJsbmJpNWpiMjB2Y205dmRISXhNQjhHQTFVZA0KSXdRWU1CYUFGR0I3WmhwRkRaZktpVkF2ZlFUTk5Lai8vUDFMTUEwR0NTcUdTSWIzRFFFQkN3VUFBNElCQVFCRw0KS3U1ZXZhNEJZRGN4RVlaeGRMWkdTY2dRRnY0dllpTVhxeCtIK0lMdHl0OE9MTjlrZFk3bEdIS25qRHFMeWF5bA0KZDFEMzc1Nms0S0NQRkZlaktsL3NmbTBRNXJxTnNBaUhkZzVNc3RsUnV4RUM4bHpkSEwzelZaWVAxQWJBL09Jag0KaWlSdzA3dndlUnFuWVhDRGlxOEd4U0RZb1dQUWJLNVBNdGV1ZkJoRmRRVXBkOTlDUUdSa2hyNHFkZ2t4Yngwaw0KOUpuUWhmN3lJUWo1eHZieDBGbnQxbFk4Q0NnRFo3cncrZkdRRmtldVorYThnRWpwUW5ZMGwxVnBKQTZEMXFBdA0KdFBYemVZcEpLSFFhUWFIQzB5U0lOVEJnbEJlMDRRUWlNVDA3THhjR3NyaWRoaXRhYWUrRDlVdkVxclFxK0h5aA0Kc1lXVWpQUU1od3owckVENFdVbVlNSUlEZFRDQ0FsMmdBd0lCQWdJTEJBQUFBQUFCRlV0YXc1UXdEUVlKS29aSQ0KaHZjTkFRRUZCUUF3VnpFTE1Ba0dBMVVFQmhNQ1FrVXhHVEFYQmdOVkJBb1RFRWRzYjJKaGJGTnBaMjRnYm5ZdA0KYzJFeEVEQU9CZ05WQkFzVEIxSnZiM1FnUTBFeEd6QVpCZ05WQkFNVEVrZHNiMkpoYkZOcFoyNGdVbTl2ZENCRA0KUVRBZUZ3MDVPREE1TURFeE1qQXdNREJhRncweU9EQXhNamd4TWpBd01EQmFNRmN4Q3pBSkJnTlZCQVlUQWtKRg0KTVJrd0Z3WURWUVFLRXhCSGJHOWlZV3hUYVdkdUlHNTJMWE5oTVJBd0RnWURWUVFMRXdkU2IyOTBJRU5CTVJzdw0KR1FZRFZRUURFeEpIYkc5aVlXeFRhV2R1SUZKdmIzUWdRMEV3Z2dFaU1BMEdDU3FHU0liM0RRRUJBUVVBQTRJQg0KRHdBd2dnRUtBb0lCQVFEYUR1YVpqYzZqNDArS2Z2dnhpNE1sYStwSUgvRXFzTG1WRVFTOThHUFI0bWRtenh6ZA0Kenh0SUsrNk5pWTZhcnltQVphdnB4eTBTeTZzY1RIQUhvVDBLTU0wVmpVLzQzZFNNVUJVYzcxRHV4QzczL09sUw0KOHBGOTRHM1ZOVENPWGtOejhrSHAxV3Jqc29rNlZqazRid1k4aUdsYktrM0ZwMVM0YkluTW0vazh5dVg5aWZVUw0KUEpKNGx0YmNkRzZUUkdIUmpjZEdzblVPaHVnWml0VnRiTlY0RnBXaTZjZ0tPT3Z5SkJOUGMxU1RFNFU2Rzd3ZQ0KTkxXTEJZeTVkNHV4Mng4Z2thc0pVMjZRem5zM2RMbHdSNUVpVVdNV2VhNnhya0VtQ01nWks5Rkdxa2pXWkNyWA0KZ3pUL0xDckJiQmxEU2dlRjU5Tjg5aUZvNytyeVVwOS9rNURQQWdNQkFBR2pRakJBTUE0R0ExVWREd0VCL3dRRQ0KQXdJQkJqQVBCZ05WSFJNQkFmOEVCVEFEQVFIL01CMEdBMVVkRGdRV0JCUmdlMllhUlEyWHlvbFFMMzBFelRTbw0KLy96OVN6QU5CZ2txaGtpRzl3MEJBUVVGQUFPQ0FRRUExblBuZkU5MjBJMi83THFpdmpURktESzFmUHhzbkN3cg0KdlFtZVU3OXJYcW9SU0xibENLT3p5ajFoVGROR0NiTSt3NkRqWTFVYjhycnZyVG5oUTdrNG8rWXZpaVk3NzZCUQ0KVnZuR0N2MDR6Y1FMY0ZHVWw1Z0UzOE5mbE5VVnlSUkJuTVJkZFdRVkRmOVZNT3lHai84Tjd5eTVZMGIycXZ6Zg0KdkduOUxoSklaSnJnbGZDbTd5bVBBYkVWdFF3ZHBmNXBMR2trZUI2enB4eHhZdTdLeUplc0YxMkt3dmhIaG00cQ0KeEZZeGxkQm5pWVVyK1d5bVhVYWRES3FDNUpsUjNYQzMyMVk5WWVScTRWelc5djQ5M2tITUI2NWpVcjlUVS9Rcg0KNmNmOXR2ZUNYNFhTUVJqYmdiTUVITVVmcElCdkZTREozZ3lJQ2gzV1psWGkvRWpKS1NacDRERUENCi0tLS0tRU5EIFBLQ1M3LS0tLS0= + + webshell.key: # base64 webshell.key + LS0tLS1CRUdJTiBSU0EgUFJJVkFURSBLRVktLS0tLQ0KTUlJRXBBSUJBQUtDQVFFQTZ6R3FZVmZUTkF6UDJ5S0hpYU0vdlcyYmNPaHVyUTEyOFNQa1UveWtMSE1yREJYQQ0KMzJ1UGVDRkpQK0pRaGFzUWJ6N2FHTXJOUldqdjFtUnpEZ1AzMTlyQWdqUHVwR2lRTElQS1R2Nm4rZWplemZITw0KWWUzZ1JtK3hGdkhpM0JSaVZ3REZta3YxeXM0d0U1bllBd2V2ckM2ZDhjWTZBT0YvdnN5bEVTaUExLzhVZnUwWg0KTmI5b2dZalZpdXREdHBaK2MrbVYrV1JRTUQybk1Ja3FHMjNEQ291RXIyK01leFNBb1dqejZ3QU5CRU1CRktLZA0KVTZBSUNmVFgrVy9IMkFYbFJPNFFQMW9Qa2kzNnJ6SEt0Mm9kQklGWCtmVzN1VEpzY0FjSjhjM2o2b2J1Y0RIVQ0KZnVRcFlyT3BlbTltRHZwM1FlVmRGZ2daYWwrRkNZVWd3ZFAxWFFJREFRQUJBb0lCQUhFYzVzT0FPSnhjMlE2Yw0KRWJGNWFPdFNycUpqdHU3VmZmSEZnRWVBUnZqMXZxdEdQd2QwdElCakNkYUdvcEZXejBXaFpjVHNyRUtJa0doOA0KMFBUWnBiWVRoK2hXejV3VWlkcE8yOXFZRVBOWk11YTdON1hUY0x5UGRRMEM4a2RFS25PTGRIMmJzSytEOEkxTQ0KdlIzZjhYWU95WG1CQzE1bkZVZ1BKZ2dWZ2JuZkVMcFpiTlBvUUsvb05NK0VKWlVHcHZoL1NmU1FsM0lnYW9pQQ0KdktYcjJqNURnQkl6OGVGZy84blJSWFZTR3BrNS9VV2lNMEd3VFhiZWNTNnJqaWpIQkVJbjBiNURCOEpTNFFqZw0KOXpiNkM4eSs5ZTd1VjlVa3lFR3RHaUFUaENKNHRmalRwZ1BhTkNVWElNakJianBLc1p0aCtKU1Naa3NsZkJRcw0KK3ZxeWswRUNnWUVBL1JpQU8rZHdhamhESW5oeDVHY3d1VTkzUk0wRWwrNWk2dWtwcUtRT04ydkJBQjVJUll2VQ0KRGxqUU41c0RMMUthRW5KajZDQ0ZENVpjb3NhSFZRRUVhVFJVT2FjdVlrM0xrM1c2cjJJV2laV29oRTI0SWFhaw0Kd0J2NU41NEpPMWhpZWVZbHVveExmYnRHaXN4aHFtUGdsQ1dGOXZoSkVuaTZYaXJUTjRtWlVSRUNnWUVBN2VTVA0KaEJ0QW93SkpQamEvYUlMVk1tNlRJR3JxNm55THRkakZ2c3lIZXZnVVNidW4rcDNvK0Y5ZzZ4dHF4RDZydHNnQQ0KTFVESldiWk5VRXNRc2VXajd5VXdsY0ZScGJ3dUVkamFZZHViVmhyVmhoVmF0c1NkOUdabUhEcUhGVTgzdWEreQ0KTzFWZUJWNUFqaE5DM2k1dGdUMDBuc05wbTdZempmVktSWjU5WDQwQ2dZRUF4SUQ0VndwTE1uMDZTcElmUTBtRw0KLyttZDNYSWNSZVhWTVRRVW54VzQzL2l1WVd3aGlyV1UwQXJPcHMyWXZHNHlwMjNlK2NQOTYycy93elhHcnczYQ0KSWVCNklFVVg4MFVaY1FUd0MrbHBQQ3RSS2wrNVBZOUh6TXdyUTY1VTFwbTU0NUQzN0Eydk14QnJKYXFuallaOA0KUUNtZUNIRWZNdE0vUjR1U2NFVktIekVDZ1lFQTBpZ2p5WWpweVJlejdLb2czZ3Iybk43aVNya3BYbzA0UHlXSg0KUzgwVHdxWjJCYzBwMEZUQUF1ci9pN05rMW9rbTJRcEdYYlBtTE1MSCtpN1dTTkk5eUg1cU5XSGE1emNlMjlWZQ0KMXlSU1RmYld1dVVTaG5PYnR0VGZVQURFWlNiZWE4T3pDSWVaejlRNzQwZFF3MGJ3cGtPVHdNMlE5bVkzbFNraw0KdSt3UGhlRUNnWUFSb3lxZCs5cGVuL3RuSlFtTzlnNmNPRU45djFWVWlXdWdXSlJBMWRxSFpYcUZjUWRRL280TA0KWXQvUjVzaGtQQVRYQTgxMjdsazh6YW5IUjhsMXVFOEc4YjFycWNKZnd4Sm9OT2tqamQ2ekNjTFNrVUNydlN0Vg0Kd1o4Qk9DT2VQZkg0bzY5c2c5aXd6RUlLeWJlWEdTZlREbmhJZXp4VE5iRjh2YytvS3M5MzlnPT0NCi0tLS0tRU5EIFJTQSBQUklWQVRFIEtFWS0tLS0tDQo= diff --git a/docs/deploy/kubernetes/k8s-webshell-svc.yaml b/docs/deploy/kubernetes/k8s-webshell-svc.yaml new file mode 100644 index 0000000..2f0ad9e --- /dev/null +++ b/docs/deploy/kubernetes/k8s-webshell-svc.yaml @@ -0,0 +1,16 @@ + -- + apiVersion: v1 + kind: Service + metadata: + name: k8s-webshell + namespace: production-k8s-webshell # 根据自己的情况进行修改 + spec: + selector: + app: k8s-webshell + type: NodePort + ports: + - name: http + port: 7777 + targetPort: 7777 + nodePort: 30001 + protocol: TCP \ No newline at end of file diff --git a/pkg/setting/setting.go b/pkg/setting/setting.go deleted file mode 100644 index 736727c..0000000 --- a/pkg/setting/setting.go +++ /dev/null @@ -1,89 +0,0 @@ -package setting - -import ( - "os" - "strings" - - "github.com/spf13/viper" -) - -var ( - RunMode string - HTTPPort string - - LogPath string - LogName string - - KubeConfig string - InCluster bool - SslCertificate string - SslCertificateKey string - JwtSecret string - - SecretKey string - -) - -type Config struct { - vp *viper.Viper -} - -type Configer interface { - LoadConfig() error - LoadServer() -} - -func LoadBaseConfig(conf Configer) { - conf.LoadConfig() -} - -func init() { - var config Config - LoadBaseConfig(&config) - config.LoadServer() - -} - -func (config *Config) LoadConfig() error { - config.vp = viper.New() - // load config from env prefix harbortools - config.vp.SetEnvPrefix("webshell") // 环境变量前缀,环境变量必须大写. - config.vp.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) // 为了兼容读取yaml文件 - config.vp.AutomaticEnv() - - // load config from yaml - config.vp.AddConfigPath("/Users/zhuruiqing/go/src/k8s-webshell/configs") - config.vp.AddConfigPath("/Users/finup/GoglandProjects/src/k8s-webshell/configs") - config.vp.AddConfigPath("./") - if os.Getenv("env") == "production" { - config.vp.SetConfigName("config") - - } else { - config.vp.SetConfigName("devconfig") - } - //fmt.Println(os.Getenv("env")) - //utils.Logger.Info("Current Env: ", os.Getenv("env")) - - config.vp.SetConfigType("yaml") - if err := config.vp.ReadInConfig(); err != nil { - return err - } - - return nil -} - -func (config *Config) LoadServer() { - - RunMode = config.vp.GetString("server.run_mode") - HTTPPort = config.vp.GetString("server.port") - LogPath = config.vp.GetString("server.logpath") - LogName = config.vp.GetString("server.logname") - KubeConfig = config.vp.GetString("server.kubeconfig") - InCluster = config.vp.GetBool("server.incluster") - SslCertificate = config.vp.GetString("server.ssl_certificate") - SslCertificateKey = config.vp.GetString("server.ssl_certificate_key") - JwtSecret = config.vp.GetString("server.jwt_secret") - SecretKey = config.vp.GetString("server.secret_key") - - -} diff --git a/src/go.mod b/src/go.mod new file mode 100644 index 0000000..7a4f04a --- /dev/null +++ b/src/go.mod @@ -0,0 +1,28 @@ +module webshell + +go 1.13 + +require ( + github.com/dgrijalva/jwt-go v3.2.0+incompatible + github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 // indirect + github.com/gin-gonic/gin v1.5.0 + github.com/googleapis/gnostic v0.3.1 // indirect + github.com/gorilla/websocket v1.4.0 + github.com/imdario/mergo v0.3.8 // indirect + github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 // indirect + github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570 // indirect + github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f + github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 // indirect + github.com/mitchellh/go-homedir v1.1.0 + github.com/pkg/errors v0.8.0 + github.com/prometheus/client_golang v0.9.3 + github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 + github.com/sirupsen/logrus v1.2.0 + github.com/spf13/cobra v0.0.5 + github.com/spf13/viper v1.6.1 + github.com/tebeka/strftime v0.1.3 // indirect + k8s.io/api v0.17.0 + k8s.io/client-go v0.17.0 + + k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6 // indirect +) diff --git a/src/go.sum b/src/go.sum new file mode 100644 index 0000000..7ee4100 --- /dev/null +++ b/src/go.sum @@ -0,0 +1,374 @@ +cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= +cloud.google.com/go v0.38.0/go.mod h1:990N+gfupTy94rShfmMCWGDn0LpTmnzTp2qbd1dvSRU= +github.com/Azure/go-autorest/autorest v0.9.0/go.mod h1:xyHB1BMZT0cuDHU7I0+g046+BFDTQ8rEZB0s4Yfa6bI= +github.com/Azure/go-autorest/autorest/adal v0.5.0/go.mod h1:8Z9fGy2MpX0PvDjB1pEgQTmVqjGhiHBW7RJJEciWzS0= +github.com/Azure/go-autorest/autorest/date v0.1.0/go.mod h1:plvfp3oPSKwf2DNjlBjWF/7vwR+cUD/ELuzDCXwHUVA= +github.com/Azure/go-autorest/autorest/mocks v0.1.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/autorest/mocks v0.2.0/go.mod h1:OTyCOPRA2IgIlWxVYxBee2F5Gr4kF2zd2J5cFRaIDN0= +github.com/Azure/go-autorest/logger v0.1.0/go.mod h1:oExouG+K6PryycPJfVSxi/koC6LSNgds39diKLz7Vrc= +github.com/Azure/go-autorest/tracing v0.5.0/go.mod h1:r/s2XiOKccPW3HrqB+W0TQzfbtp2fGCgRFtBroKn4Dk= +github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= +github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/NYTimes/gziphandler v0.0.0-20170623195520-56545f4a5d46/go.mod h1:3wb06e3pkSAbeQ52E9H9iFoQsEEwGN64994WTCIhntQ= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/PuerkitoBio/purell v1.0.0/go.mod h1:c11w/QuzBsJSee3cPx9rAFu61PvFxuPbtSwDGJws/X0= +github.com/PuerkitoBio/urlesc v0.0.0-20160726150825-5bd2802263f2/go.mod h1:uGdkoq3SwY9Y+13GIhn11/XLaGBb4BfwItxLd5jeuXE= +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 h1:HWo1m869IqiPhD389kmkxeTalrjNbbJTC8LXupb+sl0= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +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/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/davecgh/go-spew v0.0.0-20151105211317-5215b55f46b2/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +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 h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= +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/docker/spdystream v0.0.0-20160310174837-449fdfce4d96 h1:cenwrSVm+Z7QLSV/BsnenAOcDXdX4cMv4wP0B/5QbPg= +github.com/docker/spdystream v0.0.0-20160310174837-449fdfce4d96/go.mod h1:Qh8CwZgvJUkLughtfhJv5dyTYa91l1fOUCrgjqmcifM= +github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e h1:p1yVGRW3nmb85p1Sh1ZJSDm4A4iKLS5QNbvUHMgGu/M= +github.com/elazarl/goproxy v0.0.0-20170405201442-c4fc26588b6e/go.mod h1:/Zj4wYkgs4iZTTu3o/KG3Itv/qCCa8VVMlb3i9OVuzc= +github.com/emicklei/go-restful v0.0.0-20170410110728-ff4f55a20633/go.mod h1:otzb+WCGbkyDHkqmQmT5YD2WR4BBwUdeQoFo8l/7tVs= +github.com/evanphx/json-patch v4.2.0+incompatible/go.mod h1:50XU6AFN0ol/bzJsmQLiYLvXMP4fmwYFNcr97nuDLSk= +github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239 h1:Ghm4eQYC0nEPnSJdVkTrXpu9KtoVCSo1hg7mtI7G9KU= +github.com/fastly/go-utils v0.0.0-20180712184237-d95a45783239/go.mod h1:Gdwt2ce0yfBxPvZrHkprdPPTTS3N5rwmLE8T22KBXlw= +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/ghodss/yaml v0.0.0-20150909031657-73d445a93680/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= +github.com/gin-contrib/sse v0.1.0 h1:Y/yl/+YNO8GZSjAhjMsSuLt29uWRFHdHYUb5lYOV9qE= +github.com/gin-contrib/sse v0.1.0/go.mod h1:RHrZQHXnP2xjPF+u1gW/2HnVO7nvIa9PG3Gm+fLHvGI= +github.com/gin-gonic/gin v1.5.0 h1:fi+bqFAx/oLK54somfCtEZs9HeH1LHVoEPUgARpTqyc= +github.com/gin-gonic/gin v1.5.0/go.mod h1:Nd6IXA8m5kNZdNEHMBd93KT+mdY3+bewLgRvmCsR2Do= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +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-logr/logr v0.1.0/go.mod h1:ixOQHD9gLJUVQQ2ZOR7zLEifBX6tGkNJF4QyIY7sIas= +github.com/go-openapi/jsonpointer v0.0.0-20160704185906-46af16f9f7b1/go.mod h1:+35s3my2LFTysnkMfxsJBAMHj/DoqoB9knIWoYG/Vk0= +github.com/go-openapi/jsonreference v0.0.0-20160704190145-13c6e3589ad9/go.mod h1:W3Z9FmVs9qj+KR4zFKmDPGiLdk1D9Rlm7cyMvf57TTg= +github.com/go-openapi/spec v0.0.0-20160808142527-6aced65f8501/go.mod h1:J8+jY1nAiCcj+friV/PDoE1/3eeccG9LYBs0tYvLOWc= +github.com/go-openapi/swag v0.0.0-20160704191624-1d0bd113de87/go.mod h1:DXUve3Dpr1UfpPtxFw+EFuQ41HhCWZfha5jSVRG7C7I= +github.com/go-playground/locales v0.12.1 h1:2FITxuFt/xuCNP1Acdhv62OzaCiviiE4kotfhkmOqEc= +github.com/go-playground/locales v0.12.1/go.mod h1:IUMDtCfWo/w/mtMfIE/IG2K+Ey3ygWanZIBtBW0W2TM= +github.com/go-playground/universal-translator v0.16.0 h1:X++omBR/4cE2MNg91AoC3rmGrCjJ8eAeUP/K/EKx4DM= +github.com/go-playground/universal-translator v0.16.0/go.mod h1:1AnU7NaIRDWWzGEKwgtJRd2xk99HeFyHw3yid4rvQIY= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +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.2.2-0.20190723190241-65acae22fc9d h1:3PaI8p3seN09VjbTYC/QWlUZdZ1qS1zGjy7LH2Wt07I= +github.com/gogo/protobuf v1.2.2-0.20190723190241-65acae22fc9d/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-20160516000752-02826c3e7903/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= +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/mock v1.2.0/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= +github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +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/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= +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/go-cmp v0.3.0 h1:crn/baboCvb5fXaQ0IJ1SGTsTVrWpDsCWC8EGETZijY= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/gofuzz v0.0.0-20161122191042-44d81051d367/go.mod h1:HP5RmnzzSNb993RKQDq4+1A4ia9nllfqcQFTQJedwGI= +github.com/google/gofuzz v1.0.0 h1:A8PeW59pxE9IoFRqBp37U+mSNaQoZ46F1f0f863XSXw= +github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +github.com/google/martian v2.1.0+incompatible/go.mod h1:9I4somxYTbIHy5NJKHRl3wXiIaQGbYVAs8BPL6v8lEs= +github.com/google/pprof v0.0.0-20181206194817-3ea8567a2e57/go.mod h1:zfwlbNMJ+OItoe0UupaVj+oy1omPYYDuagoSzA8v9mc= +github.com/google/uuid v1.1.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/gax-go/v2 v2.0.4/go.mod h1:0Wqv26UfaUD9n4G6kQubkQ+KchISgw+vpHVxEJEs9eg= +github.com/googleapis/gnostic v0.0.0-20170729233727-0c5108395e2d/go.mod h1:sJBsCZ4ayReDTBIg8b9dl28c5xFWyhBTVRp3pOg5EKY= +github.com/googleapis/gnostic v0.3.1 h1:WeAefnSUHlBb0iJKwxFDZdbfGwkd7xRNuV+IpXMJhYk= +github.com/googleapis/gnostic v0.3.1/go.mod h1:on+2t9HRStVgn95RSsFWFz+6Q0Snyqv1awfrALZdbtU= +github.com/gophercloud/gophercloud v0.1.0/go.mod h1:vxM41WHh5uqHVBMZHzuwNOHh8XEoIEcSTewFxm1c5g8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gorilla/websocket v1.4.0 h1:WDFjx/TMzVgy9VdMMQi2K2Emtwi2QcUQsztZ/zLaH/Q= +github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= +github.com/gregjones/httpcache v0.0.0-20180305231024-9cad4c3443a7/go.mod h1:FecbI9+v66THATjSRHfNgh1IVFe/9kFxbXtjV0ctIMA= +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/golang-lru v0.5.0/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/golang-lru v0.5.1/go.mod h1:/m3WP610KZHVQ1SGc6re/UDhFvYD7pJ4Ao+sR/qLZy8= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/imdario/mergo v0.3.5/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/imdario/mergo v0.3.8 h1:CGgOkSJeqMRmt0D9XLWExdT4m4F1vd3FV3VPt+0VxkQ= +github.com/imdario/mergo v0.3.8/go.mod h1:2EnlNZ0deacrJVfApfmtdGgDfMuh/nq6Ok1EcJh5FfA= +github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= +github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869 h1:IPJ3dvxmJ4uczJe5YQdrYB16oTJlGSC/OyZDqUk9xX4= +github.com/jehiah/go-strftime v0.0.0-20171201141054-1d33003b3869/go.mod h1:cJ6Cj7dQo+O6GJNiMx+Pa94qKj+TG8ONdKHgMNIyyag= +github.com/jonboulle/clockwork v0.1.0 h1:VKV+ZcuP6l3yW9doeqz6ziZGgcynBVQO+obU0+0hcPo= +github.com/jonboulle/clockwork v0.1.0/go.mod h1:Ii8DK3G1RaLaWxj9trq07+26W01tbo22gdxWY5EU2bo= +github.com/json-iterator/go v0.0.0-20180612202835-f2b4162afba3/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/json-iterator/go v1.1.7 h1:KfgG9LzI+pYjr4xvmz/5H4FXjokeP+rlHLhv3iH62Fo= +github.com/json-iterator/go v1.1.7/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.8 h1:QiWkFLKq0T7mpzwOTu6BzNDbfTE8OLrYhVKYMLF46Ok= +github.com/json-iterator/go v1.1.8/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/jstemmer/go-junit-report v0.0.0-20190106144839-af01ea7f8024/go.mod h1:6v2b51hI/fHJwM22ozAgKL4VKDeJcHhJFhtBdhmNjmU= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= +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/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/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/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/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= +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/leodido/go-urn v1.1.0 h1:Sm1gr51B1kKyfD2BlRcLSiEkffoG96g6TPv6eRoEiB8= +github.com/leodido/go-urn v1.1.0/go.mod h1:+cyI34gQWZcE1eQU7NVgKkkzdXDQHr1dBMtdAPozLkw= +github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570 h1:0iQektZGS248WXmGIYOwRXSQhD4qn3icjMpuxwO7qlo= +github.com/lestrrat/go-envload v0.0.0-20180220120943-6ed08b54a570/go.mod h1:BLt8L9ld7wVsvEWQbuLrUZnCMnUmLZ+CGDzKtclrTlE= +github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f h1:sgUSP4zdTUZYZgAGGtN5Lxk92rK+JUFOwf+FT99EEI4= +github.com/lestrrat/go-file-rotatelogs v0.0.0-20180223000712-d3151e2a480f/go.mod h1:UGmTpUd3rjbtfIpwAPrcfmGf/Z1HS95TATB+m57TPB8= +github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042 h1:Bvq8AziQ5jFF4BHGAEDSqwPW1NJS3XshxbRCxtjFAZc= +github.com/lestrrat/go-strftime v0.0.0-20180220042222-ba3bf9c1d042/go.mod h1:TPpsiPUEh0zFL1Snz4crhMlBe60PYxRHr5oFF3rRYg0= +github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/magiconair/properties v1.8.1 h1:ZC2Vc7/ZFkGmsVC9KvOjumD+G5lXy2RtTKyzRKO2BQ4= +github.com/magiconair/properties v1.8.1/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mailru/easyjson v0.0.0-20160728113105-d5b7844b561a/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mattn/go-isatty v0.0.9 h1:d5US/mDsogSGW37IV293h//ZFaeajb69h+EHFsv2xGg= +github.com/mattn/go-isatty v0.0.9/go.mod h1:YNRxwqDuOph6SZLI9vUUz6OYw3QyUt7WiY2yME+cCiQ= +github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0jegS5sx/RkqARlsWZ6pIwiU= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= +github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421 h1:ZqeYNhU3OHLH3mGKHDcjJRFFRrJa6eAM5H+CtDdOsPc= +github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/reflect2 v0.0.0-20180320133207-05fbef0ca5da/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742 h1:Esafd1046DLDQ0W1YjYsBW+p8U2u7vzgW2SQVmlNazg= +github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= +github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/munnerz/goautoneg v0.0.0-20120707110453-a547fc61f48d/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ= +github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= +github.com/mxk/go-flowrate v0.0.0-20140419014527-cca7078d478f/go.mod h1:ZdcZmHo+o7JKHSa8/e818NopupXU1YMK5fe1lsApnBw= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/onsi/ginkgo v0.0.0-20170829012221-11459a886d9c/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.10.1/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/gomega v0.0.0-20170829124025-dcabb60a477c/go.mod h1:C1qb7wdrVGGVU+Z6iS04AVkA3Q65CEZX59MT0QO5uiA= +github.com/onsi/gomega v1.7.0/go.mod h1:ex+gbHU/CVuBBDIJjb2X0qEXbFg53c61hWP/1CpauHY= +github.com/pelletier/go-toml v1.2.0 h1:T5zMGML61Wp+FlcbWjRDT7yAxhJNAiPPLOFECq181zc= +github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic= +github.com/peterbourgon/diskv v2.0.1+incompatible/go.mod h1:uqqh8zWWbv1HBMNONnaR/tNboyR3/BZd58JJSHlUSCU= +github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v0.0.0-20151028094244-d8ed2627bdf0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +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 h1:9iH4JKXLzFbOAdtqv/a+j8aewx2Y8lAjAydhbaScPF8= +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 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE= +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 h1:7etb9YClo3a6HjLzfl6rIQaU+FDfi0VSX39io3aQ+DM= +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 h1:sofwID9zm4tzrgykg80hfFph1mryUeLRsUfoocVVmRY= +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/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5 h1:mZHayPoR0lNmnHyvtYjDeq0zlVHn9K/ZXoy17ylucdo= +github.com/rifflock/lfshook v0.0.0-20180920164130-b9218ef580f5/go.mod h1:GEXHk5HgEKCvEIIrSpFI3ozzG5xOKA2DVlEX/gGnewM= +github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g= +github.com/sirupsen/logrus v1.2.0 h1:juTguoYk5qI21pwyTXY3B3Y5cOTH3ZUyZCg1v/mihuo= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= +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/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/spf13/afero v1.1.2 h1:m8/z1t7/fwjysjQRYbP0RD+bUIF/8tJwPdEZsI83ACI= +github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ= +github.com/spf13/afero v1.2.2 h1:5jhuqJyZCZf2JRofRvN/nIFgIWNzPa3/Vz8mYylgbWc= +github.com/spf13/afero v1.2.2/go.mod h1:9ZxEEn6pIJ8Rxe320qSDBk6AsU0r9pR7Q4OcevTdifk= +github.com/spf13/cast v1.3.0 h1:oget//CVOEoFewqQxwr0Ej5yjygnqGkvggSE/gB35Q8= +github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= +github.com/spf13/cobra v0.0.5 h1:f0B+LkLX6DtmRH1isoNA9VTtNUK9K8xYd28JNNfOv/s= +github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= +github.com/spf13/jwalterweatherman v1.0.0 h1:XHEdyB+EcvlqZamSM4ZOMGlc93t6AcsBEu9Gc1vn7yk= +github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= +github.com/spf13/pflag v0.0.0-20170130214245-9ff6c6923cff/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= +github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= +github.com/spf13/pflag v1.0.5 h1:iy+VFUOCP1a+8yFto/drg2CJ5u0yRoB7fZw3DKv/JXA= +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.6.1 h1:VPZzIkznI1YhVMRi6vNFLHSwhnhReBfgTxIPccpfdZk= +github.com/spf13/viper v1.6.1/go.mod h1:t3iDnF5Jlj76alVNuyFBk5oUMCvsrkbvZK0WQdfDi5k= +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/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +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/subosito/gotenv v1.2.0 h1:Slr1R9HxAlEKefgq5jn9U+DnETlIUa6HfgEzj0g5d7s= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tebeka/strftime v0.1.3 h1:5HQXOqWKYRFfNyBMNVc9z5+QzuBtIXy03psIhtdJYto= +github.com/tebeka/strftime v0.1.3/go.mod h1:7wJm3dZlpr4l/oVK0t1HYIc4rMzQ2XJlOMIUJUJH6XQ= +github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= +github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/ugorji/go v1.1.7 h1:/68gy2h+1mWMrwZFeD1kQialdSzAb432dtpeJ42ovdo= +github.com/ugorji/go v1.1.7/go.mod h1:kZn38zHttfInRq0xu/PH0az30d+z6vm202qpg1oXVMw= +github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= +github.com/ugorji/go/codec v1.1.7 h1:2SvQaVZ1ouYrrKKwoSk2pzd4A9evlKJb9oTL+OaLUSs= +github.com/ugorji/go/codec v1.1.7/go.mod h1:Ax+UKWsSmolVDwsd+7N3ZtXu+yMGCf907BLYF3GoBXY= +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= +go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= +go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= +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-20190211182817-74369b46fc67/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2 h1:VklqNMn3ovrHsnt90PveolxSbWFaJdECFbxSq0Mqo2M= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586 h1:7KByu05hhLed2MO29w7p1XfZvZ13m8mub3shuVftRs0= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= +golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190227174305-5b3e6a55c961/go.mod h1:wehouNa3lNwaWXcvxsM5YxQ5yQlVC4a0KAMCusXpPoU= +golang.org/x/lint v0.0.0-20190301231843-5614ed5bae6f/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= +golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= +golang.org/x/net v0.0.0-20170114055629-f2499483f923/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +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-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-20190108225652-1e06a53dbb7e/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 h1:4QSRKanuywn15aTZvI/mIDEgPQpswuFndXpOj3rKEco= +golang.org/x/net v0.0.0-20190522155817-f3200d17e092/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9 h1:rjwSpXsdiK0dV8/Naq3kAw9ymfAeJIyd0upUIElB+lI= +golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be h1:vEDujvNQGv4jgYKudGeI/+DAX4Jffq6hpD55MmoEvKs= +golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= +golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45 h1:SVwTIAaPC2U/AvvLNZ2a7OVsmBpC8L5BlwK1whH3hm0= +golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= +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-20190227155943-e225da77a7e6/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sys v0.0.0-20170830134202-bb24a47a89ea/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +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-20190209173611-3b5209105503/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a h1:1BGLXjeY4akVXGgbC9HugT3Jv3hCI0z56oJR5vAMgBU= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/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-20190813064441-fde4db37ae7a h1:aYOabOQFp6Vj6W1F80affTUvO9UxmJRx8K0gsfABByQ= +golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456 h1:ng0gs1AKnRRuEMZoTLLlbOd+C17zUDepwGQBb/n+JVg= +golang.org/x/sys v0.0.0-20190826190057-c7b8b68b1456/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/text v0.0.0-20160726164857-2910a502d2bf/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/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-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= +golang.org/x/time v0.0.0-20190308202827-9d24e82272b4 h1:SvFZT6jyqRaOeXpc5h/JSfZenJ2O330aBsf7JfSUXmQ= +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-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181011042414-1f849cf54d09/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/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-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= +golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= +google.golang.org/api v0.4.0/go.mod h1:8k5glujaEP+g9n7WNsDg8QP6cUVNI86fCNMcbazEtwE= +google.golang.org/appengine v1.1.0 h1:igQkv0AAhEIvTEpD5LIpAfav2eeVO9HBTjvKHVJPRSs= +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/appengine v1.5.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= +google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= +google.golang.org/genproto v0.0.0-20190307195333-5fe7a883aa19/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +google.golang.org/genproto v0.0.0-20190418145605-e7d98fc518a7/go.mod h1:VzzqZJRnGkLBvHegQrXjBqPurQTc5/KpmUdxsrq26oE= +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/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= +gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= +gopkg.in/go-playground/validator.v9 v9.29.1 h1:SvGtYmN60a5CVKTOzMSyfzWDeZRxRuGvRQyEAKbw1xc= +gopkg.in/go-playground/validator.v9 v9.29.1/go.mod h1:+c9/zcJMFNgbLvly1L1V+PpxWdVbfP1avr/N00E2vyQ= +gopkg.in/inf.v0 v0.9.1 h1:73M5CoZyi3ZLMOyDlQh031Cx6N9NDJ2Vvfl76EDAgDc= +gopkg.in/inf.v0 v0.9.1/go.mod h1:cWUDdTG/fYaXco+Dcufb5Vnc6Gp2YChqWtbxRZE0mXw= +gopkg.in/ini.v1 v1.51.0 h1:AQvPpx3LzTDM0AjnIRlVFwFFGC+npRopjZxLJj6gdno= +gopkg.in/ini.v1 v1.51.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/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/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4 h1:/eiJrUcujPVeJ3xlSWaiNi3uSVmDGBK1pDHUHAnao1I= +gopkg.in/yaml.v2 v2.2.4/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.0-20190106161140-3f1c8253044a/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= +k8s.io/api v0.17.0 h1:H9d/lw+VkZKEVIUc8F3wgiQ+FUXTTr21M87jXLU7yqM= +k8s.io/api v0.17.0/go.mod h1:npsyOePkeP0CPwyGfXDHxvypiYMJxBWAMpQxCaJ4ZxI= +k8s.io/apimachinery v0.17.0 h1:xRBnuie9rXcPxUkDizUsGvPf1cnlZCFu210op7J7LJo= +k8s.io/apimachinery v0.17.0/go.mod h1:b9qmWdKlLuU9EBh+06BtLcSf/Mu89rWL33naRxs1uZg= +k8s.io/client-go v0.17.0 h1:8QOGvUGdqDMFrm9sD6IUFl256BcffynGoe80sxgTEDg= +k8s.io/client-go v0.17.0/go.mod h1:TYgR6EUHs6k45hb6KWjVD6jFZvJV4gHDikv/It0xz+k= +k8s.io/client-go v11.0.0+incompatible h1:LBbX2+lOwY9flffWlJM7f1Ct8V2SRNiMRDFeiwnJo9o= +k8s.io/client-go v11.0.0+incompatible/go.mod h1:7vJpHMYJwNQCWgzmNV+VYUl1zCObLyodBc8nIyt8L5s= +k8s.io/gengo v0.0.0-20190128074634-0689ccc1d7d6/go.mod h1:ezvh/TsK7cY6rbqRK0oQQ8IAqLxYwwyPxAX1Pzy0ii0= +k8s.io/klog v0.0.0-20181102134211-b9b56d5dfc92/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v0.3.0/go.mod h1:Gq+BEi5rUBO/HRz0bTSXDUcqjScdoY3a9IHpCEIOOfk= +k8s.io/klog v1.0.0 h1:Pt+yjF5aB1xDSVbau4VsWe+dQNzA0qv1LlXdC2dF6Q8= +k8s.io/klog v1.0.0/go.mod h1:4Bi6QPql/J/LkTDqv7R/cd3hPo4k2DG6Ptcz060Ez5I= +k8s.io/kube-openapi v0.0.0-20191107075043-30be4d16710a/go.mod h1:1TqjTSzOxsLGIKfj0lK8EeCP7K1iUG65v09OM0/WG5E= +k8s.io/utils v0.0.0-20191114184206-e782cd3c129f/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6 h1:p0Ai3qVtkbCG/Af26dBmU0E1W58NID3hSSh7cMyylpM= +k8s.io/utils v0.0.0-20191114200735-6ca3b61696b6/go.mod h1:sZAwmy6armz5eXlNoLmJcl4F1QuKu7sr+mFQ0byX7Ew= +sigs.k8s.io/structured-merge-diff v0.0.0-20190525122527-15d366b2352e/go.mod h1:wWxsB5ozmmv/SG7nM11ayaAW51xMvak/t1r0CSlcokI= +sigs.k8s.io/yaml v1.1.0 h1:4A07+ZFc2wgJwo8YNlQpr1rVlgUDlxXHhPJciaPY5gs= +sigs.k8s.io/yaml v1.1.0/go.mod h1:UJmg0vDUVViEyp3mgSv9WPwZCDxu4rQW1olrI1uml+o= diff --git a/src/webshell/cmd/root.go b/src/webshell/cmd/root.go new file mode 100644 index 0000000..b7efd6b --- /dev/null +++ b/src/webshell/cmd/root.go @@ -0,0 +1,145 @@ +package cmd + +import ( + "fmt" + "github.com/mitchellh/go-homedir" + "github.com/sirupsen/logrus" + "github.com/spf13/cobra" + "github.com/spf13/viper" + "log" + "os" + "strings" + "webshell/webshell/common" + "webshell/webshell/config" + "webshell/webshell/server" +) +var cfgFile string +var cfg = config.NewConfig() + +var rootCmd = &cobra.Command{ + Use: "k8s-webshell", + Short: "k8s-webshell", + Long: "k8s-webshell", + Run: func(cmd *cobra.Command, args []string) { + fmt.Println("Start server") + server.Start() + }, + +} + +// Execute ... +func Execute() { + if err := rootCmd.Execute(); err !=nil { + fmt.Println(err) + os.Exit(1) + } +} + +func init() { + cobra.OnInitialize(initConfig) + rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.cfg.yaml)") + rootCmd.PersistentFlags().StringP("port","p", "8888","listen port") + //rootCmd.PersistentFlags().StringP("host","h", "0.0.0.0","listen port") + rootCmd.PersistentFlags().String("kubeconf", "","kubeconfig file") + rootCmd.PersistentFlags().Bool("incluster", true,"incluster mode") + rootCmd.PersistentFlags().String("ssl-crt","", "ssl_certificate") + rootCmd.PersistentFlags().String("ssl-key","", "ssl_certificate") + rootCmd.PersistentFlags().String("jwt-secret","", "jwt_secret") + rootCmd.PersistentFlags().String("secret-key","", "secret_key") + rootCmd.PersistentFlags().String("logpath","", "logpath") + rootCmd.PersistentFlags().StringP("logpname","l","k8s-webshell.log", "logpath") + + viper.BindPFlag("server.port", rootCmd.PersistentFlags().Lookup("port")) + //viper.BindPFlag("server.host", rootCmd.PersistentFlags().Lookup("host")) + viper.BindPFlag("k8s.kubeconfig", rootCmd.PersistentFlags().Lookup("kubeconf")) + viper.BindPFlag("k8s.incluster", rootCmd.PersistentFlags().Lookup("incluster")) + viper.BindPFlag("server.certificate", rootCmd.PersistentFlags().Lookup("ssl-crt")) + viper.BindPFlag("server.certificatekey", rootCmd.PersistentFlags().Lookup("ssl-key")) + viper.BindPFlag("server.jwtsecret", rootCmd.PersistentFlags().Lookup("jwt-secret")) + viper.BindPFlag("server.secretkey", rootCmd.PersistentFlags().Lookup("secret-key")) + viper.BindPFlag("server.logpath", rootCmd.PersistentFlags().Lookup("logpath")) + viper.BindPFlag("server.logpname",rootCmd.PersistentFlags().Lookup("logpname")) + + +} + +func initConfig() { + + currentDir, err := os.Getwd() + if err != nil { + log.Panicf("Get currentir Fail: %s ", err.Error()) + } + if cfgFile != "" { + viper.SetConfigFile(cfgFile) + } else { + home, err := homedir.Dir() + if err != nil { + log.Printf("Get $HOME Dir error:%s", err.Error()) + os.Exit(1) + } + viper.AddConfigPath(currentDir) + viper.AddConfigPath(home) + viper.SetConfigName(".cfg") + } + + + // Search config in home directory with name ".config" (without extension) + + viper.SetEnvPrefix("webshell") // 环境变量前缀,环境变量必须大写. + viper.SetEnvKeyReplacer(strings.NewReplacer(".", "_")) // 为了兼容读取yaml文 + viper.AutomaticEnv() + + // If a config file is found, read it in. + if err := viper.ReadInConfig(); err == nil { + log.Println("Using config file:", viper.ConfigFileUsed()) + + } + + cfg.RunMode = viper.GetString("server.run_mode") + cfg.HTTP.Host = viper.GetString("server.host") + cfg.HTTP.Port = viper.GetInt("server.port") + cfg.HTTP.Certificate = viper.GetString("server.certificate") + cfg.HTTP.CertificateKey = viper.GetString("server.certificatekey") + + cfg.Log.LogName = viper.GetString("server.logname") + cfg.Log.LogPath = viper.GetString("server.Logpath") + + + cfg.K8s.KubeConfig = viper.GetString("k8s.kubeconfig") + cfg.K8s.InCluster = viper.GetBool("k8s.incluster") + + cfg.Security.JWTSecret = viper.GetString("server.jwtsecret") + cfg.Security.SecretKey = viper.GetString("server.secretkey") + + + exist, err := PathExists(cfg.Log.LogPath) + logrus.Println("日志路径:", cfg.Log.LogPath) + if err != nil { + logrus.Errorf("Get dir error![%v]\n", err) + } + if !exist { + err := os.MkdirAll(cfg.Log.LogPath, 0755) + if err != nil { + logrus.Errorf("MkDirs Failed![%v]\n", err) + } else { + logrus.Info("MkDirs Success!\n") + } + + } + fmt.Println("Incluster status:", cfg.K8s.InCluster) + err = common.InitClient() + if err != nil { + logrus.Panicf("init kube-config fail:%s", err.Error()) + } +} + +func PathExists(path string) (bool, error) { + _, err := os.Stat(path) + if err == nil { + return true, nil + } + if os.IsNotExist(err) { + return false, nil + } + return false, err +} \ No newline at end of file diff --git a/pkg/common/common.go b/src/webshell/common/common.go similarity index 70% rename from pkg/common/common.go rename to src/webshell/common/common.go index 8cf2253..3afab43 100644 --- a/pkg/common/common.go +++ b/src/webshell/common/common.go @@ -2,16 +2,27 @@ package common import ( "io/ioutil" + "sync" - "k8s-webshell/pkg/setting" - "k8s-webshell/pkg/utils" + "webshell/webshell/utils" "k8s.io/client-go/kubernetes" "k8s.io/client-go/rest" "k8s.io/client-go/tools/clientcmd" ) -func InitClient() (clientset *kubernetes.Clientset, err error) { +var ( + once sync.Once + clientSet *kubernetes.Clientset + err error +) + +func GetK8sCli() (*kubernetes.Clientset) { + return clientSet + +} + +func InitClient() (err error) { var ( restConf *rest.Config ) @@ -20,7 +31,7 @@ func InitClient() (clientset *kubernetes.Clientset, err error) { return } - if clientset, err = kubernetes.NewForConfig(restConf); err != nil { + if clientSet, err = kubernetes.NewForConfig(restConf); err != nil { utils.Logger.Info("init k8s client error:", err) goto END } @@ -34,7 +45,7 @@ func GetRestConf() (restConf *rest.Config, err error) { kubeconfig []byte ) - switch setting.InCluster { + switch cfg.K8s.InCluster { case true: utils.Logger.Info("Start run in cluster mode") if restConf, err = rest.InClusterConfig(); err != nil { @@ -45,7 +56,7 @@ func GetRestConf() (restConf *rest.Config, err error) { // 读取kubeconfig文件 //utils.Logger.Info("kubeconfig file ", setting.KubeConfig) - if kubeconfig, err = ioutil.ReadFile(setting.KubeConfig); err != nil { + if kubeconfig, err = ioutil.ReadFile(cfg.K8s.KubeConfig); err != nil { goto END } diff --git a/pkg/e/code.go b/src/webshell/common/e/code.go similarity index 100% rename from pkg/e/code.go rename to src/webshell/common/e/code.go diff --git a/pkg/e/msg.go b/src/webshell/common/e/msg.go similarity index 99% rename from pkg/e/msg.go rename to src/webshell/common/e/msg.go index 202164c..b244780 100644 --- a/pkg/e/msg.go +++ b/src/webshell/common/e/msg.go @@ -17,4 +17,4 @@ func GetMsg(code int) string { } return MsgFlags[ERROR] -} \ No newline at end of file +} diff --git a/pkg/utils/jwt.go b/src/webshell/common/jwt.go similarity index 86% rename from pkg/utils/jwt.go rename to src/webshell/common/jwt.go index 51e62f6..5350cb6 100644 --- a/pkg/utils/jwt.go +++ b/src/webshell/common/jwt.go @@ -1,17 +1,19 @@ -package utils +package common import ( - "k8s-webshell/pkg/setting" "time" + "webshell/webshell/config" + "github.com/dgrijalva/jwt-go" ) -var jwtSecret = []byte(setting.JwtSecret) +var cfg = config.NewConfig() +var jwtSecret = []byte(cfg.Security.JWTSecret) type Claims struct { SecretKey string `json:"secretkey"` - PaasUser string `json:"paasuser` + PaasUser string `json:"paasuser"` PodNs string `json:"podNs"` PodName string `json:"podName"` ContainerName string `json:"containerName"` diff --git a/src/webshell/config/config.go b/src/webshell/config/config.go new file mode 100644 index 0000000..d25bab7 --- /dev/null +++ b/src/webshell/config/config.go @@ -0,0 +1,55 @@ +package config + +import ( + "sync" + "time" +) + +var ( + global *Config + once sync.Once +) + +func NewConfig() *Config { + once.Do(func() { + global = &Config{} + }) + return global +} + +type Config struct { + RunMode string + HTTP HTTP + K8s K8s + Security Security + Log Log +} + +type HTTP struct { + Host string + Port int + ShutdownTimeout int + + Certificate string + CertificateKey string + SSLEnable bool + ReadTimeout time.Duration + WriteTimeout time.Duration +} + +type K8s struct { + KubeConfig string + InCluster bool +} + +type Security struct { + JWTSecret string + SecretKey string +} + +type Log struct { + LogPath string + LogName string + Level int + Format string +} diff --git a/pkg/api/auth.go b/src/webshell/controllers/auth.go similarity index 77% rename from pkg/api/auth.go rename to src/webshell/controllers/auth.go index 52c8e29..040d4e9 100644 --- a/pkg/api/auth.go +++ b/src/webshell/controllers/auth.go @@ -1,13 +1,16 @@ -package api +package controllers import ( "github.com/gin-gonic/gin" - "k8s-webshell/pkg/e" - "k8s-webshell/pkg/setting" - "k8s-webshell/pkg/utils" "net/http" + "webshell/webshell/common" + "webshell/webshell/common/e" + "webshell/webshell/config" + "webshell/webshell/utils" ) +var cfg = config.NewConfig() + type apiAuthInfo struct { SecretKey string `from:"secretKey" binding:"required"` PaasUser string `from:"paasUser" binding:"required"` @@ -32,15 +35,9 @@ func GetAuth(c *gin.Context) { }) return } - //fmt.Println(">>>", apiAuth.SecretKey, - // apiAuth.SecretKey, - // apiAuth.PaasUser, - // apiAuth.PodNs, - // apiAuth.PodName, - // apiAuth.ContainerName) - if apiAuth.SecretKey == setting.SecretKey { - token, err := utils.GenerateToken( + if apiAuth.SecretKey == cfg.Security.SecretKey { + token, err := common.GenerateToken( apiAuth.SecretKey, apiAuth.PaasUser, apiAuth.PodNs, diff --git a/src/webshell/controllers/demo.go b/src/webshell/controllers/demo.go new file mode 100644 index 0000000..d66190c --- /dev/null +++ b/src/webshell/controllers/demo.go @@ -0,0 +1,7 @@ +package controllers + +import "github.com/gin-gonic/gin" + +func demo() { + gin.Logger() +} diff --git a/pkg/api/controller.go b/src/webshell/controllers/ws.go similarity index 85% rename from pkg/api/controller.go rename to src/webshell/controllers/ws.go index 87e0422..7a0af3c 100644 --- a/pkg/api/controller.go +++ b/src/webshell/controllers/ws.go @@ -1,35 +1,36 @@ -package api +package controllers import ( "bytes" + "encoding/json" + "regexp" + + "webshell/webshell/common" + "webshell/webshell/utils" + "webshell/webshell/ws" + "github.com/gin-gonic/gin" "github.com/gorilla/websocket" "github.com/sirupsen/logrus" - "k8s-webshell/pkg/common" - "k8s-webshell/pkg/utils" - "k8s-webshell/pkg/ws" - "k8s.io/api/core/v1" - "k8s.io/apimachinery/pkg/util/json" - "k8s.io/client-go/kubernetes" + v1 "k8s.io/api/core/v1" "k8s.io/client-go/kubernetes/scheme" "k8s.io/client-go/rest" "k8s.io/client-go/tools/remotecommand" - "regexp" -) - -var ( - ClientSet *kubernetes.Clientset - err error ) - -func init() { - - if ClientSet, err = common.InitClient(); err != nil { - utils.Logger.Panic("init k8s client err", err) - - } - -} +// +//var ( +// ClientSet *kubernetes.Clientset +// err error +//) +// +//func init() { +// +// if ClientSet, err = common.InitClient(); err != nil { +// utils.Logger.Panic("init k8s client err", err) +// +// } +// +//} // ssh 流式处理器 type streamHandler struct { @@ -109,7 +110,7 @@ func (handler *streamHandler) RecordCommand(inputString *string) { rightMoveCursor, _ := regexp.MatchString(`\s?\[C`, *inputString) switch { case invalidChart: - utils.Logger.Info("enter >> :", []rune(*inputString)) + //utils.Logger.Info("enter >> :", []rune(*inputString)) case leftMoveCursor: cmdLens := len([]rune(handler.logBuff.String())) @@ -122,27 +123,27 @@ func (handler *streamHandler) RecordCommand(inputString *string) { case []byte(*inputString)[n] == 12: //12 FF (NP form feed, new page) utils.Logger.WithFields(logrus.Fields{ - "PassUser": handler.paasUser, - "PodName": handler.podName, - "NameSpace": handler.podNs, - "serviceName":"k8s-webshell", - "short_message":"k8s-webshell", - "command": "clear screen", + "PassUser": handler.paasUser, + "PodName": handler.podName, + "NameSpace": handler.podNs, + "serviceName": "k8s-webshell", + "short_message": "k8s-webshell", + "command": "clear screen", }).Info("record input") case []byte(*inputString)[n] == 13: // 13 CR (carriage return) - handler.moveCursor = 0 // cursor flag reset + handler.moveCursor = 0 // cursor flag reset if len(*inputString) > 1 { handler.logBuff.WriteString(*inputString) } if len(handler.logBuff.String()) > 0 { utils.Logger.WithFields(logrus.Fields{ - "PassUser": handler.paasUser, - "PodName": handler.podName, - "NameSpace": handler.podNs, - "serviceName": "k8s-webshell", - "short_message":"k8s-webshell", - "command": handler.logBuff.String(), + "PassUser": handler.paasUser, + "PodName": handler.podName, + "NameSpace": handler.podNs, + "serviceName": "k8s-webshell", + "short_message": "k8s-webshell", + "command": handler.logBuff.String(), }).Info("record input") } @@ -158,12 +159,12 @@ func (handler *streamHandler) RecordCommand(inputString *string) { case []byte(*inputString)[n] == 3: utils.Logger.WithFields(logrus.Fields{ - "PassUser": handler.paasUser, - "PodName": handler.podName, - "NameSpace": handler.podNs, - "serviceName": "k8s-webshell", - "short_message":"k8s-webshell", - "command": "ctrl + c", + "PassUser": handler.paasUser, + "PodName": handler.podName, + "NameSpace": handler.podNs, + "serviceName": "k8s-webshell", + "short_message": "k8s-webshell", + "command": "ctrl + c", }).Info("record input") handler.logBuff.Reset() @@ -230,6 +231,7 @@ func WsHandler(c *gin.Context) { handler *streamHandler err error paasUser string + ClientSet = common.GetK8sCli() ) podNs = c.MustGet("podNs").(string) diff --git a/src/webshell/main.go b/src/webshell/main.go new file mode 100644 index 0000000..09a10df --- /dev/null +++ b/src/webshell/main.go @@ -0,0 +1,7 @@ +package main + +import "webshell/webshell/cmd" + +func main() { + cmd.Execute() +} diff --git a/middleware/jwt/jwt.go b/src/webshell/middlewares/jwt/jwt.go similarity index 89% rename from middleware/jwt/jwt.go rename to src/webshell/middlewares/jwt/jwt.go index cd684de..890c7b1 100644 --- a/middleware/jwt/jwt.go +++ b/src/webshell/middlewares/jwt/jwt.go @@ -1,11 +1,12 @@ package jwt import ( + "net/http" + "webshell/webshell/common" + "webshell/webshell/common/e" + "github.com/dgrijalva/jwt-go" "github.com/gin-gonic/gin" - "k8s-webshell/pkg/e" - "k8s-webshell/pkg/utils" - "net/http" ) func JWT() gin.HandlerFunc { @@ -20,7 +21,7 @@ func JWT() gin.HandlerFunc { code = e.INVALID_PARAMS } else { - claims, err := utils.ParseToken(token) + claims, err := common.ParseToken(token) if err != nil { diff --git a/routers/router.go b/src/webshell/router/routers.go similarity index 54% rename from routers/router.go rename to src/webshell/router/routers.go index b7c42e0..ddefef2 100644 --- a/routers/router.go +++ b/src/webshell/router/routers.go @@ -1,34 +1,34 @@ -package routers +package router import ( "time" + "webshell/webshell/config" + "webshell/webshell/controllers" + "webshell/webshell/middlewares/jwt" + "webshell/webshell/utils" + "github.com/gin-gonic/gin" "github.com/prometheus/client_golang/prometheus/promhttp" - - "k8s-webshell/middleware/jwt" - "k8s-webshell/pkg/api" - "k8s-webshell/pkg/setting" - "k8s-webshell/pkg/utils" ) func InitRouter() *gin.Engine { + cfg := config.NewConfig() route := gin.New() - gin.SetMode(setting.RunMode) + gin.SetMode(cfg.RunMode) route.Use(utils.GinRus(utils.Logger, time.RFC3339, false)) route.Use(gin.Recovery()) - route.POST("/auth", api.GetAuth) + route.POST("/auth", controllers.GetAuth) route.GET("/metrics", gin.WrapH(promhttp.Handler())) apiV1 := route.Group("/api") apiV1.Use(jwt.JWT()) { - apiV1.GET("/ws", api.WsHandler) - apiV1.POST("/ws", api.WsHandler) + apiV1.GET("/ws", controllers.WsHandler) + apiV1.POST("/ws", controllers.WsHandler) } - return route } diff --git a/src/webshell/server/server.go b/src/webshell/server/server.go new file mode 100644 index 0000000..f45ba38 --- /dev/null +++ b/src/webshell/server/server.go @@ -0,0 +1,24 @@ +package server + +import ( + "os" + "fmt" + "webshell/webshell/config" + "webshell/webshell/router" + "webshell/webshell/utils" +) + +func Start() { + cfg := config.NewConfig() + fmt.Println("",cfg.Log.LogPath) + ginServer := router.InitRouter() + //ginpprof.Wrapper(ginServer) + utils.Logger.Info("Current ENV: ", os.Getenv("env")) + utils.Logger.Info("Start k8s-webshell on Port: ", cfg.HTTP.Port) + //err := ginServer.RunTLS(":"+ string(cfg.HTTP.Port), cfg.HTTP.Certificate, cfg.HTTP.CertificateKey) + err := ginServer.RunTLS(":"+ "7777", cfg.HTTP.Certificate, cfg.HTTP.CertificateKey) + + if err != nil { + utils.Logger.Fatalf("Gin Start err: %s", err.Error()) + } +} diff --git a/pkg/utils/logger.go b/src/webshell/utils/logger.go similarity index 74% rename from pkg/utils/logger.go rename to src/webshell/utils/logger.go index c8e5070..35f0eb7 100644 --- a/pkg/utils/logger.go +++ b/src/webshell/utils/logger.go @@ -1,20 +1,20 @@ package utils import ( - "os" "path" "time" - "k8s-webshell/pkg/setting" + "webshell/webshell/config" "github.com/gin-gonic/gin" - "github.com/lestrrat/go-file-rotatelogs" + rotatelogs "github.com/lestrrat/go-file-rotatelogs" "github.com/rifflock/lfshook" "github.com/sirupsen/logrus" ) -var Logger *logrus.Logger +var Logger *logrus.Logger +var cfg = config.NewConfig() type loggerEntryWithfields interface { WithFields(fields logrus.Fields) *logrus.Entry } @@ -30,21 +30,8 @@ func init() { //} //Logger.Out = src - exist, err := PathExists(setting.LogPath) - Logger.Println("日志路径:", setting.LogPath) - if err != nil { - logrus.Errorf("Get dir error![%v]\n", err) - } - if !exist { - err := os.MkdirAll(setting.LogPath, 0755) - if err != nil { - logrus.Errorf("MkDirs Failed![%v]\n", err) - } else { - logrus.Info("MkDirs Success!\n") - } - } - LogPath := path.Join(setting.LogPath, setting.LogName) + LogPath := path.Join(cfg.Log.LogPath, cfg.Log.LogName) logWriter, err := rotatelogs.New( LogPath+".%Y-%m-%d-%H-%M.log", @@ -70,16 +57,7 @@ func init() { } -func PathExists(path string) (bool, error) { - _, err := os.Stat(path) - if err == nil { - return true, nil - } - if os.IsNotExist(err) { - return false, nil - } - return false, err -} + func GinRus(logger loggerEntryWithfields, timeFormat string, utc bool) gin.HandlerFunc { return func(c *gin.Context) { diff --git a/pkg/ws/connection.go b/src/webshell/ws/connection.go similarity index 99% rename from pkg/ws/connection.go rename to src/webshell/ws/connection.go index 4c455d7..5255050 100644 --- a/pkg/ws/connection.go +++ b/src/webshell/ws/connection.go @@ -1,9 +1,10 @@ package ws + import ( - "k8s-webshell/pkg/utils" "net/http" "sync" + "webshell/webshell/utils" "github.com/gorilla/websocket" "github.com/pkg/errors" diff --git a/vendor/github.com/beorn7/perks/LICENSE b/vendor/github.com/beorn7/perks/LICENSE deleted file mode 100644 index 339177b..0000000 --- a/vendor/github.com/beorn7/perks/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (C) 2013 Blake Mizerany - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/beorn7/perks/quantile/exampledata.txt b/vendor/github.com/beorn7/perks/quantile/exampledata.txt deleted file mode 100644 index 1602287..0000000 --- a/vendor/github.com/beorn7/perks/quantile/exampledata.txt +++ /dev/null @@ -1,2388 +0,0 @@ -8 -5 -26 -12 -5 -235 -13 -6 -28 -30 -3 -3 -3 -3 -5 -2 -33 -7 -2 -4 -7 -12 -14 -5 -8 -3 -10 -4 -5 -3 -6 -6 -209 -20 -3 -10 -14 -3 -4 -6 -8 -5 -11 -7 -3 -2 -3 -3 -212 -5 -222 -4 -10 -10 -5 -6 -3 -8 -3 -10 -254 -220 -2 -3 -5 -24 -5 -4 -222 -7 -3 -3 -223 -8 -15 -12 -14 -14 -3 -2 -2 -3 -13 -3 -11 -4 -4 -6 -5 -7 -13 -5 -3 -5 -2 -5 -3 -5 -2 -7 -15 -17 -14 -3 -6 -6 -3 -17 -5 -4 -7 -6 -4 -4 -8 -6 -8 -3 -9 -3 -6 -3 -4 -5 -3 -3 -660 -4 -6 -10 -3 -6 -3 -2 -5 -13 -2 -4 -4 -10 -4 -8 -4 -3 -7 -9 -9 -3 -10 -37 -3 -13 -4 -12 -3 -6 -10 -8 -5 -21 -2 -3 -8 -3 -2 -3 -3 -4 -12 -2 -4 -8 -8 -4 -3 -2 -20 -1 -6 -32 -2 -11 -6 -18 -3 -8 -11 -3 -212 -3 -4 -2 -6 -7 -12 -11 -3 -2 -16 -10 -6 -4 -6 -3 -2 -7 -3 -2 -2 -2 -2 -5 -6 -4 -3 -10 -3 -4 -6 -5 -3 -4 -4 -5 -6 -4 -3 -4 -4 -5 -7 -5 -5 -3 -2 -7 -2 -4 -12 -4 -5 -6 -2 -4 -4 -8 -4 -15 -13 -7 -16 -5 -3 -23 -5 -5 -7 -3 -2 -9 -8 -7 -5 -8 -11 -4 -10 -76 -4 -47 -4 -3 -2 -7 -4 -2 -3 -37 -10 -4 -2 -20 -5 -4 -4 -10 -10 -4 -3 -7 -23 -240 -7 -13 -5 -5 -3 -3 -2 -5 -4 -2 -8 -7 -19 -2 -23 -8 -7 -2 -5 -3 -8 -3 -8 -13 -5 -5 -5 -2 -3 -23 -4 -9 -8 -4 -3 -3 -5 -220 -2 -3 -4 -6 -14 -3 -53 -6 -2 -5 -18 -6 -3 -219 -6 -5 -2 -5 -3 -6 -5 -15 -4 -3 -17 -3 -2 -4 -7 -2 -3 -3 -4 -4 -3 -2 -664 -6 -3 -23 -5 -5 -16 -5 -8 -2 -4 -2 -24 -12 -3 -2 -3 -5 -8 -3 -5 -4 -3 -14 -3 -5 -8 -2 -3 -7 -9 -4 -2 -3 -6 -8 -4 -3 -4 -6 -5 -3 -3 -6 -3 -19 -4 -4 -6 -3 -6 -3 -5 -22 -5 -4 -4 -3 -8 -11 -4 -9 -7 -6 -13 -4 -4 -4 -6 -17 -9 -3 -3 -3 -4 -3 -221 -5 -11 -3 -4 -2 -12 -6 -3 -5 -7 -5 -7 -4 -9 -7 -14 -37 -19 -217 -16 -3 -5 -2 -2 -7 -19 -7 -6 -7 -4 -24 -5 -11 -4 -7 -7 -9 -13 -3 -4 -3 -6 -28 -4 -4 -5 -5 -2 -5 -6 -4 -4 -6 -10 -5 -4 -3 -2 -3 -3 -6 -5 -5 -4 -3 -2 -3 -7 -4 -6 -18 -16 -8 -16 -4 -5 -8 -6 -9 -13 -1545 -6 -215 -6 -5 -6 -3 -45 -31 -5 -2 -2 -4 -3 -3 -2 -5 -4 -3 -5 -7 -7 -4 -5 -8 -5 -4 -749 -2 -31 -9 -11 -2 -11 -5 -4 -4 -7 -9 -11 -4 -5 -4 -7 -3 -4 -6 -2 -15 -3 -4 -3 -4 -3 -5 -2 -13 -5 -5 -3 -3 -23 -4 -4 -5 -7 -4 -13 -2 -4 -3 -4 -2 -6 -2 -7 -3 -5 -5 -3 -29 -5 -4 -4 -3 -10 -2 -3 -79 -16 -6 -6 -7 -7 -3 -5 -5 -7 -4 -3 -7 -9 -5 -6 -5 -9 -6 -3 -6 -4 -17 -2 -10 -9 -3 -6 -2 -3 -21 -22 -5 -11 -4 -2 -17 -2 -224 -2 -14 -3 -4 -4 -2 -4 -4 -4 -4 -5 -3 -4 -4 -10 -2 -6 -3 -3 -5 -7 -2 -7 -5 -6 -3 -218 -2 -2 -5 -2 -6 -3 -5 -222 -14 -6 -33 -3 -2 -5 -3 -3 -3 -9 -5 -3 -3 -2 -7 -4 -3 -4 -3 -5 -6 -5 -26 -4 -13 -9 -7 -3 -221 -3 -3 -4 -4 -4 -4 -2 -18 -5 -3 -7 -9 -6 -8 -3 -10 -3 -11 -9 -5 -4 -17 -5 -5 -6 -6 -3 -2 -4 -12 -17 -6 -7 -218 -4 -2 -4 -10 -3 -5 -15 -3 -9 -4 -3 -3 -6 -29 -3 -3 -4 -5 -5 -3 -8 -5 -6 -6 -7 -5 -3 -5 -3 -29 -2 -31 -5 -15 -24 -16 -5 -207 -4 -3 -3 -2 -15 -4 -4 -13 -5 -5 -4 -6 -10 -2 -7 -8 -4 -6 -20 -5 -3 -4 -3 -12 -12 -5 -17 -7 -3 -3 -3 -6 -10 -3 -5 -25 -80 -4 -9 -3 -2 -11 -3 -3 -2 -3 -8 -7 -5 -5 -19 -5 -3 -3 -12 -11 -2 -6 -5 -5 -5 -3 -3 -3 -4 -209 -14 -3 -2 -5 -19 -4 -4 -3 -4 -14 -5 -6 -4 -13 -9 -7 -4 -7 -10 -2 -9 -5 -7 -2 -8 -4 -6 -5 -5 -222 -8 -7 -12 -5 -216 -3 -4 -4 -6 -3 -14 -8 -7 -13 -4 -3 -3 -3 -3 -17 -5 -4 -3 -33 -6 -6 -33 -7 -5 -3 -8 -7 -5 -2 -9 -4 -2 -233 -24 -7 -4 -8 -10 -3 -4 -15 -2 -16 -3 -3 -13 -12 -7 -5 -4 -207 -4 -2 -4 -27 -15 -2 -5 -2 -25 -6 -5 -5 -6 -13 -6 -18 -6 -4 -12 -225 -10 -7 -5 -2 -2 -11 -4 -14 -21 -8 -10 -3 -5 -4 -232 -2 -5 -5 -3 -7 -17 -11 -6 -6 -23 -4 -6 -3 -5 -4 -2 -17 -3 -6 -5 -8 -3 -2 -2 -14 -9 -4 -4 -2 -5 -5 -3 -7 -6 -12 -6 -10 -3 -6 -2 -2 -19 -5 -4 -4 -9 -2 -4 -13 -3 -5 -6 -3 -6 -5 -4 -9 -6 -3 -5 -7 -3 -6 -6 -4 -3 -10 -6 -3 -221 -3 -5 -3 -6 -4 -8 -5 -3 -6 -4 -4 -2 -54 -5 -6 -11 -3 -3 -4 -4 -4 -3 -7 -3 -11 -11 -7 -10 -6 -13 -223 -213 -15 -231 -7 -3 -7 -228 -2 -3 -4 -4 -5 -6 -7 -4 -13 -3 -4 -5 -3 -6 -4 -6 -7 -2 -4 -3 -4 -3 -3 -6 -3 -7 -3 -5 -18 -5 -6 -8 -10 -3 -3 -3 -2 -4 -2 -4 -4 -5 -6 -6 -4 -10 -13 -3 -12 -5 -12 -16 -8 -4 -19 -11 -2 -4 -5 -6 -8 -5 -6 -4 -18 -10 -4 -2 -216 -6 -6 -6 -2 -4 -12 -8 -3 -11 -5 -6 -14 -5 -3 -13 -4 -5 -4 -5 -3 -28 -6 -3 -7 -219 -3 -9 -7 -3 -10 -6 -3 -4 -19 -5 -7 -11 -6 -15 -19 -4 -13 -11 -3 -7 -5 -10 -2 -8 -11 -2 -6 -4 -6 -24 -6 -3 -3 -3 -3 -6 -18 -4 -11 -4 -2 -5 -10 -8 -3 -9 -5 -3 -4 -5 -6 -2 -5 -7 -4 -4 -14 -6 -4 -4 -5 -5 -7 -2 -4 -3 -7 -3 -3 -6 -4 -5 -4 -4 -4 -3 -3 -3 -3 -8 -14 -2 -3 -5 -3 -2 -4 -5 -3 -7 -3 -3 -18 -3 -4 -4 -5 -7 -3 -3 -3 -13 -5 -4 -8 -211 -5 -5 -3 -5 -2 -5 -4 -2 -655 -6 -3 -5 -11 -2 -5 -3 -12 -9 -15 -11 -5 -12 -217 -2 -6 -17 -3 -3 -207 -5 -5 -4 -5 -9 -3 -2 -8 -5 -4 -3 -2 -5 -12 -4 -14 -5 -4 -2 -13 -5 -8 -4 -225 -4 -3 -4 -5 -4 -3 -3 -6 -23 -9 -2 -6 -7 -233 -4 -4 -6 -18 -3 -4 -6 -3 -4 -4 -2 -3 -7 -4 -13 -227 -4 -3 -5 -4 -2 -12 -9 -17 -3 -7 -14 -6 -4 -5 -21 -4 -8 -9 -2 -9 -25 -16 -3 -6 -4 -7 -8 -5 -2 -3 -5 -4 -3 -3 -5 -3 -3 -3 -2 -3 -19 -2 -4 -3 -4 -2 -3 -4 -4 -2 -4 -3 -3 -3 -2 -6 -3 -17 -5 -6 -4 -3 -13 -5 -3 -3 -3 -4 -9 -4 -2 -14 -12 -4 -5 -24 -4 -3 -37 -12 -11 -21 -3 -4 -3 -13 -4 -2 -3 -15 -4 -11 -4 -4 -3 -8 -3 -4 -4 -12 -8 -5 -3 -3 -4 -2 -220 -3 -5 -223 -3 -3 -3 -10 -3 -15 -4 -241 -9 -7 -3 -6 -6 -23 -4 -13 -7 -3 -4 -7 -4 -9 -3 -3 -4 -10 -5 -5 -1 -5 -24 -2 -4 -5 -5 -6 -14 -3 -8 -2 -3 -5 -13 -13 -3 -5 -2 -3 -15 -3 -4 -2 -10 -4 -4 -4 -5 -5 -3 -5 -3 -4 -7 -4 -27 -3 -6 -4 -15 -3 -5 -6 -6 -5 -4 -8 -3 -9 -2 -6 -3 -4 -3 -7 -4 -18 -3 -11 -3 -3 -8 -9 -7 -24 -3 -219 -7 -10 -4 -5 -9 -12 -2 -5 -4 -4 -4 -3 -3 -19 -5 -8 -16 -8 -6 -22 -3 -23 -3 -242 -9 -4 -3 -3 -5 -7 -3 -3 -5 -8 -3 -7 -5 -14 -8 -10 -3 -4 -3 -7 -4 -6 -7 -4 -10 -4 -3 -11 -3 -7 -10 -3 -13 -6 -8 -12 -10 -5 -7 -9 -3 -4 -7 -7 -10 -8 -30 -9 -19 -4 -3 -19 -15 -4 -13 -3 -215 -223 -4 -7 -4 -8 -17 -16 -3 -7 -6 -5 -5 -4 -12 -3 -7 -4 -4 -13 -4 -5 -2 -5 -6 -5 -6 -6 -7 -10 -18 -23 -9 -3 -3 -6 -5 -2 -4 -2 -7 -3 -3 -2 -5 -5 -14 -10 -224 -6 -3 -4 -3 -7 -5 -9 -3 -6 -4 -2 -5 -11 -4 -3 -3 -2 -8 -4 -7 -4 -10 -7 -3 -3 -18 -18 -17 -3 -3 -3 -4 -5 -3 -3 -4 -12 -7 -3 -11 -13 -5 -4 -7 -13 -5 -4 -11 -3 -12 -3 -6 -4 -4 -21 -4 -6 -9 -5 -3 -10 -8 -4 -6 -4 -4 -6 -5 -4 -8 -6 -4 -6 -4 -4 -5 -9 -6 -3 -4 -2 -9 -3 -18 -2 -4 -3 -13 -3 -6 -6 -8 -7 -9 -3 -2 -16 -3 -4 -6 -3 -2 -33 -22 -14 -4 -9 -12 -4 -5 -6 -3 -23 -9 -4 -3 -5 -5 -3 -4 -5 -3 -5 -3 -10 -4 -5 -5 -8 -4 -4 -6 -8 -5 -4 -3 -4 -6 -3 -3 -3 -5 -9 -12 -6 -5 -9 -3 -5 -3 -2 -2 -2 -18 -3 -2 -21 -2 -5 -4 -6 -4 -5 -10 -3 -9 -3 -2 -10 -7 -3 -6 -6 -4 -4 -8 -12 -7 -3 -7 -3 -3 -9 -3 -4 -5 -4 -4 -5 -5 -10 -15 -4 -4 -14 -6 -227 -3 -14 -5 -216 -22 -5 -4 -2 -2 -6 -3 -4 -2 -9 -9 -4 -3 -28 -13 -11 -4 -5 -3 -3 -2 -3 -3 -5 -3 -4 -3 -5 -23 -26 -3 -4 -5 -6 -4 -6 -3 -5 -5 -3 -4 -3 -2 -2 -2 -7 -14 -3 -6 -7 -17 -2 -2 -15 -14 -16 -4 -6 -7 -13 -6 -4 -5 -6 -16 -3 -3 -28 -3 -6 -15 -3 -9 -2 -4 -6 -3 -3 -22 -4 -12 -6 -7 -2 -5 -4 -10 -3 -16 -6 -9 -2 -5 -12 -7 -5 -5 -5 -5 -2 -11 -9 -17 -4 -3 -11 -7 -3 -5 -15 -4 -3 -4 -211 -8 -7 -5 -4 -7 -6 -7 -6 -3 -6 -5 -6 -5 -3 -4 -4 -26 -4 -6 -10 -4 -4 -3 -2 -3 -3 -4 -5 -9 -3 -9 -4 -4 -5 -5 -8 -2 -4 -2 -3 -8 -4 -11 -19 -5 -8 -6 -3 -5 -6 -12 -3 -2 -4 -16 -12 -3 -4 -4 -8 -6 -5 -6 -6 -219 -8 -222 -6 -16 -3 -13 -19 -5 -4 -3 -11 -6 -10 -4 -7 -7 -12 -5 -3 -3 -5 -6 -10 -3 -8 -2 -5 -4 -7 -2 -4 -4 -2 -12 -9 -6 -4 -2 -40 -2 -4 -10 -4 -223 -4 -2 -20 -6 -7 -24 -5 -4 -5 -2 -20 -16 -6 -5 -13 -2 -3 -3 -19 -3 -2 -4 -5 -6 -7 -11 -12 -5 -6 -7 -7 -3 -5 -3 -5 -3 -14 -3 -4 -4 -2 -11 -1 -7 -3 -9 -6 -11 -12 -5 -8 -6 -221 -4 -2 -12 -4 -3 -15 -4 -5 -226 -7 -218 -7 -5 -4 -5 -18 -4 -5 -9 -4 -4 -2 -9 -18 -18 -9 -5 -6 -6 -3 -3 -7 -3 -5 -4 -4 -4 -12 -3 -6 -31 -5 -4 -7 -3 -6 -5 -6 -5 -11 -2 -2 -11 -11 -6 -7 -5 -8 -7 -10 -5 -23 -7 -4 -3 -5 -34 -2 -5 -23 -7 -3 -6 -8 -4 -4 -4 -2 -5 -3 -8 -5 -4 -8 -25 -2 -3 -17 -8 -3 -4 -8 -7 -3 -15 -6 -5 -7 -21 -9 -5 -6 -6 -5 -3 -2 -3 -10 -3 -6 -3 -14 -7 -4 -4 -8 -7 -8 -2 -6 -12 -4 -213 -6 -5 -21 -8 -2 -5 -23 -3 -11 -2 -3 -6 -25 -2 -3 -6 -7 -6 -6 -4 -4 -6 -3 -17 -9 -7 -6 -4 -3 -10 -7 -2 -3 -3 -3 -11 -8 -3 -7 -6 -4 -14 -36 -3 -4 -3 -3 -22 -13 -21 -4 -2 -7 -4 -4 -17 -15 -3 -7 -11 -2 -4 -7 -6 -209 -6 -3 -2 -2 -24 -4 -9 -4 -3 -3 -3 -29 -2 -2 -4 -3 -3 -5 -4 -6 -3 -3 -2 -4 diff --git a/vendor/github.com/beorn7/perks/quantile/stream.go b/vendor/github.com/beorn7/perks/quantile/stream.go deleted file mode 100644 index d7d14f8..0000000 --- a/vendor/github.com/beorn7/perks/quantile/stream.go +++ /dev/null @@ -1,316 +0,0 @@ -// Package quantile computes approximate quantiles over an unbounded data -// stream within low memory and CPU bounds. -// -// A small amount of accuracy is traded to achieve the above properties. -// -// Multiple streams can be merged before calling Query to generate a single set -// of results. This is meaningful when the streams represent the same type of -// data. See Merge and Samples. -// -// For more detailed information about the algorithm used, see: -// -// Effective Computation of Biased Quantiles over Data Streams -// -// http://www.cs.rutgers.edu/~muthu/bquant.pdf -package quantile - -import ( - "math" - "sort" -) - -// Sample holds an observed value and meta information for compression. JSON -// tags have been added for convenience. -type Sample struct { - Value float64 `json:",string"` - Width float64 `json:",string"` - Delta float64 `json:",string"` -} - -// Samples represents a slice of samples. It implements sort.Interface. -type Samples []Sample - -func (a Samples) Len() int { return len(a) } -func (a Samples) Less(i, j int) bool { return a[i].Value < a[j].Value } -func (a Samples) Swap(i, j int) { a[i], a[j] = a[j], a[i] } - -type invariant func(s *stream, r float64) float64 - -// NewLowBiased returns an initialized Stream for low-biased quantiles -// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but -// error guarantees can still be given even for the lower ranks of the data -// distribution. -// -// The provided epsilon is a relative error, i.e. the true quantile of a value -// returned by a query is guaranteed to be within (1±Epsilon)*Quantile. -// -// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error -// properties. -func NewLowBiased(epsilon float64) *Stream { - ƒ := func(s *stream, r float64) float64 { - return 2 * epsilon * r - } - return newStream(ƒ) -} - -// NewHighBiased returns an initialized Stream for high-biased quantiles -// (e.g. 0.01, 0.1, 0.5) where the needed quantiles are not known a priori, but -// error guarantees can still be given even for the higher ranks of the data -// distribution. -// -// The provided epsilon is a relative error, i.e. the true quantile of a value -// returned by a query is guaranteed to be within 1-(1±Epsilon)*(1-Quantile). -// -// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error -// properties. -func NewHighBiased(epsilon float64) *Stream { - ƒ := func(s *stream, r float64) float64 { - return 2 * epsilon * (s.n - r) - } - return newStream(ƒ) -} - -// NewTargeted returns an initialized Stream concerned with a particular set of -// quantile values that are supplied a priori. Knowing these a priori reduces -// space and computation time. The targets map maps the desired quantiles to -// their absolute errors, i.e. the true quantile of a value returned by a query -// is guaranteed to be within (Quantile±Epsilon). -// -// See http://www.cs.rutgers.edu/~muthu/bquant.pdf for time, space, and error properties. -func NewTargeted(targetMap map[float64]float64) *Stream { - // Convert map to slice to avoid slow iterations on a map. - // ƒ is called on the hot path, so converting the map to a slice - // beforehand results in significant CPU savings. - targets := targetMapToSlice(targetMap) - - ƒ := func(s *stream, r float64) float64 { - var m = math.MaxFloat64 - var f float64 - for _, t := range targets { - if t.quantile*s.n <= r { - f = (2 * t.epsilon * r) / t.quantile - } else { - f = (2 * t.epsilon * (s.n - r)) / (1 - t.quantile) - } - if f < m { - m = f - } - } - return m - } - return newStream(ƒ) -} - -type target struct { - quantile float64 - epsilon float64 -} - -func targetMapToSlice(targetMap map[float64]float64) []target { - targets := make([]target, 0, len(targetMap)) - - for quantile, epsilon := range targetMap { - t := target{ - quantile: quantile, - epsilon: epsilon, - } - targets = append(targets, t) - } - - return targets -} - -// Stream computes quantiles for a stream of float64s. It is not thread-safe by -// design. Take care when using across multiple goroutines. -type Stream struct { - *stream - b Samples - sorted bool -} - -func newStream(ƒ invariant) *Stream { - x := &stream{ƒ: ƒ} - return &Stream{x, make(Samples, 0, 500), true} -} - -// Insert inserts v into the stream. -func (s *Stream) Insert(v float64) { - s.insert(Sample{Value: v, Width: 1}) -} - -func (s *Stream) insert(sample Sample) { - s.b = append(s.b, sample) - s.sorted = false - if len(s.b) == cap(s.b) { - s.flush() - } -} - -// Query returns the computed qth percentiles value. If s was created with -// NewTargeted, and q is not in the set of quantiles provided a priori, Query -// will return an unspecified result. -func (s *Stream) Query(q float64) float64 { - if !s.flushed() { - // Fast path when there hasn't been enough data for a flush; - // this also yields better accuracy for small sets of data. - l := len(s.b) - if l == 0 { - return 0 - } - i := int(math.Ceil(float64(l) * q)) - if i > 0 { - i -= 1 - } - s.maybeSort() - return s.b[i].Value - } - s.flush() - return s.stream.query(q) -} - -// Merge merges samples into the underlying streams samples. This is handy when -// merging multiple streams from separate threads, database shards, etc. -// -// ATTENTION: This method is broken and does not yield correct results. The -// underlying algorithm is not capable of merging streams correctly. -func (s *Stream) Merge(samples Samples) { - sort.Sort(samples) - s.stream.merge(samples) -} - -// Reset reinitializes and clears the list reusing the samples buffer memory. -func (s *Stream) Reset() { - s.stream.reset() - s.b = s.b[:0] -} - -// Samples returns stream samples held by s. -func (s *Stream) Samples() Samples { - if !s.flushed() { - return s.b - } - s.flush() - return s.stream.samples() -} - -// Count returns the total number of samples observed in the stream -// since initialization. -func (s *Stream) Count() int { - return len(s.b) + s.stream.count() -} - -func (s *Stream) flush() { - s.maybeSort() - s.stream.merge(s.b) - s.b = s.b[:0] -} - -func (s *Stream) maybeSort() { - if !s.sorted { - s.sorted = true - sort.Sort(s.b) - } -} - -func (s *Stream) flushed() bool { - return len(s.stream.l) > 0 -} - -type stream struct { - n float64 - l []Sample - ƒ invariant -} - -func (s *stream) reset() { - s.l = s.l[:0] - s.n = 0 -} - -func (s *stream) insert(v float64) { - s.merge(Samples{{v, 1, 0}}) -} - -func (s *stream) merge(samples Samples) { - // TODO(beorn7): This tries to merge not only individual samples, but - // whole summaries. The paper doesn't mention merging summaries at - // all. Unittests show that the merging is inaccurate. Find out how to - // do merges properly. - var r float64 - i := 0 - for _, sample := range samples { - for ; i < len(s.l); i++ { - c := s.l[i] - if c.Value > sample.Value { - // Insert at position i. - s.l = append(s.l, Sample{}) - copy(s.l[i+1:], s.l[i:]) - s.l[i] = Sample{ - sample.Value, - sample.Width, - math.Max(sample.Delta, math.Floor(s.ƒ(s, r))-1), - // TODO(beorn7): How to calculate delta correctly? - } - i++ - goto inserted - } - r += c.Width - } - s.l = append(s.l, Sample{sample.Value, sample.Width, 0}) - i++ - inserted: - s.n += sample.Width - r += sample.Width - } - s.compress() -} - -func (s *stream) count() int { - return int(s.n) -} - -func (s *stream) query(q float64) float64 { - t := math.Ceil(q * s.n) - t += math.Ceil(s.ƒ(s, t) / 2) - p := s.l[0] - var r float64 - for _, c := range s.l[1:] { - r += p.Width - if r+c.Width+c.Delta > t { - return p.Value - } - p = c - } - return p.Value -} - -func (s *stream) compress() { - if len(s.l) < 2 { - return - } - x := s.l[len(s.l)-1] - xi := len(s.l) - 1 - r := s.n - 1 - x.Width - - for i := len(s.l) - 2; i >= 0; i-- { - c := s.l[i] - if c.Width+x.Width+x.Delta <= s.ƒ(s, r) { - x.Width += c.Width - s.l[xi] = x - // Remove element at i. - copy(s.l[i:], s.l[i+1:]) - s.l = s.l[:len(s.l)-1] - xi -= 1 - } else { - x = c - xi = i - } - r -= c.Width - } -} - -func (s *stream) samples() Samples { - samples := make(Samples, len(s.l)) - copy(samples, s.l) - return samples -} diff --git a/vendor/github.com/dgrijalva/jwt-go/.gitignore b/vendor/github.com/dgrijalva/jwt-go/.gitignore deleted file mode 100644 index 80bed65..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -.DS_Store -bin - - diff --git a/vendor/github.com/dgrijalva/jwt-go/.travis.yml b/vendor/github.com/dgrijalva/jwt-go/.travis.yml deleted file mode 100644 index 1027f56..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go - -script: - - go vet ./... - - go test -v ./... - -go: - - 1.3 - - 1.4 - - 1.5 - - 1.6 - - 1.7 - - tip diff --git a/vendor/github.com/dgrijalva/jwt-go/LICENSE b/vendor/github.com/dgrijalva/jwt-go/LICENSE deleted file mode 100644 index df83a9c..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/LICENSE +++ /dev/null @@ -1,8 +0,0 @@ -Copyright (c) 2012 Dave Grijalva - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - diff --git a/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md b/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md deleted file mode 100644 index 7fc1f79..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/MIGRATION_GUIDE.md +++ /dev/null @@ -1,97 +0,0 @@ -## Migration Guide from v2 -> v3 - -Version 3 adds several new, frequently requested features. To do so, it introduces a few breaking changes. We've worked to keep these as minimal as possible. This guide explains the breaking changes and how you can quickly update your code. - -### `Token.Claims` is now an interface type - -The most requested feature from the 2.0 verison of this library was the ability to provide a custom type to the JSON parser for claims. This was implemented by introducing a new interface, `Claims`, to replace `map[string]interface{}`. We also included two concrete implementations of `Claims`: `MapClaims` and `StandardClaims`. - -`MapClaims` is an alias for `map[string]interface{}` with built in validation behavior. It is the default claims type when using `Parse`. The usage is unchanged except you must type cast the claims property. - -The old example for parsing a token looked like this.. - -```go - if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { - fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) - } -``` - -is now directly mapped to... - -```go - if token, err := jwt.Parse(tokenString, keyLookupFunc); err == nil { - claims := token.Claims.(jwt.MapClaims) - fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) - } -``` - -`StandardClaims` is designed to be embedded in your custom type. You can supply a custom claims type with the new `ParseWithClaims` function. Here's an example of using a custom claims type. - -```go - type MyCustomClaims struct { - User string - *StandardClaims - } - - if token, err := jwt.ParseWithClaims(tokenString, &MyCustomClaims{}, keyLookupFunc); err == nil { - claims := token.Claims.(*MyCustomClaims) - fmt.Printf("Token for user %v expires %v", claims.User, claims.StandardClaims.ExpiresAt) - } -``` - -### `ParseFromRequest` has been moved - -To keep this library focused on the tokens without becoming overburdened with complex request processing logic, `ParseFromRequest` and its new companion `ParseFromRequestWithClaims` have been moved to a subpackage, `request`. The method signatues have also been augmented to receive a new argument: `Extractor`. - -`Extractors` do the work of picking the token string out of a request. The interface is simple and composable. - -This simple parsing example: - -```go - if token, err := jwt.ParseFromRequest(tokenString, req, keyLookupFunc); err == nil { - fmt.Printf("Token for user %v expires %v", token.Claims["user"], token.Claims["exp"]) - } -``` - -is directly mapped to: - -```go - if token, err := request.ParseFromRequest(req, request.OAuth2Extractor, keyLookupFunc); err == nil { - claims := token.Claims.(jwt.MapClaims) - fmt.Printf("Token for user %v expires %v", claims["user"], claims["exp"]) - } -``` - -There are several concrete `Extractor` types provided for your convenience: - -* `HeaderExtractor` will search a list of headers until one contains content. -* `ArgumentExtractor` will search a list of keys in request query and form arguments until one contains content. -* `MultiExtractor` will try a list of `Extractors` in order until one returns content. -* `AuthorizationHeaderExtractor` will look in the `Authorization` header for a `Bearer` token. -* `OAuth2Extractor` searches the places an OAuth2 token would be specified (per the spec): `Authorization` header and `access_token` argument -* `PostExtractionFilter` wraps an `Extractor`, allowing you to process the content before it's parsed. A simple example is stripping the `Bearer ` text from a header - - -### RSA signing methods no longer accept `[]byte` keys - -Due to a [critical vulnerability](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/), we've decided the convenience of accepting `[]byte` instead of `rsa.PublicKey` or `rsa.PrivateKey` isn't worth the risk of misuse. - -To replace this behavior, we've added two helper methods: `ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error)` and `ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error)`. These are just simple helpers for unpacking PEM encoded PKCS1 and PKCS8 keys. If your keys are encoded any other way, all you need to do is convert them to the `crypto/rsa` package's types. - -```go - func keyLookupFunc(*Token) (interface{}, error) { - // Don't forget to validate the alg is what you expect: - if _, ok := token.Method.(*jwt.SigningMethodRSA); !ok { - return nil, fmt.Errorf("Unexpected signing method: %v", token.Header["alg"]) - } - - // Look up key - key, err := lookupPublicKey(token.Header["kid"]) - if err != nil { - return nil, err - } - - // Unpack key from PEM encoded PKCS8 - return jwt.ParseRSAPublicKeyFromPEM(key) - } -``` diff --git a/vendor/github.com/dgrijalva/jwt-go/README.md b/vendor/github.com/dgrijalva/jwt-go/README.md deleted file mode 100644 index d358d88..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/README.md +++ /dev/null @@ -1,100 +0,0 @@ -# jwt-go - -[![Build Status](https://travis-ci.org/dgrijalva/jwt-go.svg?branch=master)](https://travis-ci.org/dgrijalva/jwt-go) -[![GoDoc](https://godoc.org/github.com/dgrijalva/jwt-go?status.svg)](https://godoc.org/github.com/dgrijalva/jwt-go) - -A [go](http://www.golang.org) (or 'golang' for search engine friendliness) implementation of [JSON Web Tokens](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html) - -**NEW VERSION COMING:** There have been a lot of improvements suggested since the version 3.0.0 released in 2016. I'm working now on cutting two different releases: 3.2.0 will contain any non-breaking changes or enhancements. 4.0.0 will follow shortly which will include breaking changes. See the 4.0.0 milestone to get an idea of what's coming. If you have other ideas, or would like to participate in 4.0.0, now's the time. If you depend on this library and don't want to be interrupted, I recommend you use your dependency mangement tool to pin to version 3. - -**SECURITY NOTICE:** Some older versions of Go have a security issue in the cryotp/elliptic. Recommendation is to upgrade to at least 1.8.3. See issue #216 for more detail. - -**SECURITY NOTICE:** It's important that you [validate the `alg` presented is what you expect](https://auth0.com/blog/2015/03/31/critical-vulnerabilities-in-json-web-token-libraries/). This library attempts to make it easy to do the right thing by requiring key types match the expected alg, but you should take the extra step to verify it in your usage. See the examples provided. - -## What the heck is a JWT? - -JWT.io has [a great introduction](https://jwt.io/introduction) to JSON Web Tokens. - -In short, it's a signed JSON object that does something useful (for example, authentication). It's commonly used for `Bearer` tokens in Oauth 2. A token is made of three parts, separated by `.`'s. The first two parts are JSON objects, that have been [base64url](http://tools.ietf.org/html/rfc4648) encoded. The last part is the signature, encoded the same way. - -The first part is called the header. It contains the necessary information for verifying the last part, the signature. For example, which encryption method was used for signing and what key was used. - -The part in the middle is the interesting bit. It's called the Claims and contains the actual stuff you care about. Refer to [the RFC](http://self-issued.info/docs/draft-jones-json-web-token.html) for information about reserved keys and the proper way to add your own. - -## What's in the box? - -This library supports the parsing and verification as well as the generation and signing of JWTs. Current supported signing algorithms are HMAC SHA, RSA, RSA-PSS, and ECDSA, though hooks are present for adding your own. - -## Examples - -See [the project documentation](https://godoc.org/github.com/dgrijalva/jwt-go) for examples of usage: - -* [Simple example of parsing and validating a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-Parse--Hmac) -* [Simple example of building and signing a token](https://godoc.org/github.com/dgrijalva/jwt-go#example-New--Hmac) -* [Directory of Examples](https://godoc.org/github.com/dgrijalva/jwt-go#pkg-examples) - -## Extensions - -This library publishes all the necessary components for adding your own signing methods. Simply implement the `SigningMethod` interface and register a factory method using `RegisterSigningMethod`. - -Here's an example of an extension that integrates with the Google App Engine signing tools: https://github.com/someone1/gcp-jwt-go - -## Compliance - -This library was last reviewed to comply with [RTF 7519](http://www.rfc-editor.org/info/rfc7519) dated May 2015 with a few notable differences: - -* In order to protect against accidental use of [Unsecured JWTs](http://self-issued.info/docs/draft-ietf-oauth-json-web-token.html#UnsecuredJWT), tokens using `alg=none` will only be accepted if the constant `jwt.UnsafeAllowNoneSignatureType` is provided as the key. - -## Project Status & Versioning - -This library is considered production ready. Feedback and feature requests are appreciated. The API should be considered stable. There should be very few backwards-incompatible changes outside of major version updates (and only with good reason). - -This project uses [Semantic Versioning 2.0.0](http://semver.org). Accepted pull requests will land on `master`. Periodically, versions will be tagged from `master`. You can find all the releases on [the project releases page](https://github.com/dgrijalva/jwt-go/releases). - -While we try to make it obvious when we make breaking changes, there isn't a great mechanism for pushing announcements out to users. You may want to use this alternative package include: `gopkg.in/dgrijalva/jwt-go.v3`. It will do the right thing WRT semantic versioning. - -**BREAKING CHANGES:*** -* Version 3.0.0 includes _a lot_ of changes from the 2.x line, including a few that break the API. We've tried to break as few things as possible, so there should just be a few type signature changes. A full list of breaking changes is available in `VERSION_HISTORY.md`. See `MIGRATION_GUIDE.md` for more information on updating your code. - -## Usage Tips - -### Signing vs Encryption - -A token is simply a JSON object that is signed by its author. this tells you exactly two things about the data: - -* The author of the token was in the possession of the signing secret -* The data has not been modified since it was signed - -It's important to know that JWT does not provide encryption, which means anyone who has access to the token can read its contents. If you need to protect (encrypt) the data, there is a companion spec, `JWE`, that provides this functionality. JWE is currently outside the scope of this library. - -### Choosing a Signing Method - -There are several signing methods available, and you should probably take the time to learn about the various options before choosing one. The principal design decision is most likely going to be symmetric vs asymmetric. - -Symmetric signing methods, such as HSA, use only a single secret. This is probably the simplest signing method to use since any `[]byte` can be used as a valid secret. They are also slightly computationally faster to use, though this rarely is enough to matter. Symmetric signing methods work the best when both producers and consumers of tokens are trusted, or even the same system. Since the same secret is used to both sign and validate tokens, you can't easily distribute the key for validation. - -Asymmetric signing methods, such as RSA, use different keys for signing and verifying tokens. This makes it possible to produce tokens with a private key, and allow any consumer to access the public key for verification. - -### Signing Methods and Key Types - -Each signing method expects a different object type for its signing keys. See the package documentation for details. Here are the most common ones: - -* The [HMAC signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodHMAC) (`HS256`,`HS384`,`HS512`) expect `[]byte` values for signing and validation -* The [RSA signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodRSA) (`RS256`,`RS384`,`RS512`) expect `*rsa.PrivateKey` for signing and `*rsa.PublicKey` for validation -* The [ECDSA signing method](https://godoc.org/github.com/dgrijalva/jwt-go#SigningMethodECDSA) (`ES256`,`ES384`,`ES512`) expect `*ecdsa.PrivateKey` for signing and `*ecdsa.PublicKey` for validation - -### JWT and OAuth - -It's worth mentioning that OAuth and JWT are not the same thing. A JWT token is simply a signed JSON object. It can be used anywhere such a thing is useful. There is some confusion, though, as JWT is the most common type of bearer token used in OAuth2 authentication. - -Without going too far down the rabbit hole, here's a description of the interaction of these technologies: - -* OAuth is a protocol for allowing an identity provider to be separate from the service a user is logging in to. For example, whenever you use Facebook to log into a different service (Yelp, Spotify, etc), you are using OAuth. -* OAuth defines several options for passing around authentication data. One popular method is called a "bearer token". A bearer token is simply a string that _should_ only be held by an authenticated user. Thus, simply presenting this token proves your identity. You can probably derive from here why a JWT might make a good bearer token. -* Because bearer tokens are used for authentication, it's important they're kept secret. This is why transactions that use bearer tokens typically happen over SSL. - -## More - -Documentation can be found [on godoc.org](http://godoc.org/github.com/dgrijalva/jwt-go). - -The command line utility included in this project (cmd/jwt) provides a straightforward example of token creation and parsing as well as a useful tool for debugging your own integration. You'll also find several implementation examples in the documentation. diff --git a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md b/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md deleted file mode 100644 index 6370298..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/VERSION_HISTORY.md +++ /dev/null @@ -1,118 +0,0 @@ -## `jwt-go` Version History - -#### 3.2.0 - -* Added method `ParseUnverified` to allow users to split up the tasks of parsing and validation -* HMAC signing method returns `ErrInvalidKeyType` instead of `ErrInvalidKey` where appropriate -* Added options to `request.ParseFromRequest`, which allows for an arbitrary list of modifiers to parsing behavior. Initial set include `WithClaims` and `WithParser`. Existing usage of this function will continue to work as before. -* Deprecated `ParseFromRequestWithClaims` to simplify API in the future. - -#### 3.1.0 - -* Improvements to `jwt` command line tool -* Added `SkipClaimsValidation` option to `Parser` -* Documentation updates - -#### 3.0.0 - -* **Compatibility Breaking Changes**: See MIGRATION_GUIDE.md for tips on updating your code - * Dropped support for `[]byte` keys when using RSA signing methods. This convenience feature could contribute to security vulnerabilities involving mismatched key types with signing methods. - * `ParseFromRequest` has been moved to `request` subpackage and usage has changed - * The `Claims` property on `Token` is now type `Claims` instead of `map[string]interface{}`. The default value is type `MapClaims`, which is an alias to `map[string]interface{}`. This makes it possible to use a custom type when decoding claims. -* Other Additions and Changes - * Added `Claims` interface type to allow users to decode the claims into a custom type - * Added `ParseWithClaims`, which takes a third argument of type `Claims`. Use this function instead of `Parse` if you have a custom type you'd like to decode into. - * Dramatically improved the functionality and flexibility of `ParseFromRequest`, which is now in the `request` subpackage - * Added `ParseFromRequestWithClaims` which is the `FromRequest` equivalent of `ParseWithClaims` - * Added new interface type `Extractor`, which is used for extracting JWT strings from http requests. Used with `ParseFromRequest` and `ParseFromRequestWithClaims`. - * Added several new, more specific, validation errors to error type bitmask - * Moved examples from README to executable example files - * Signing method registry is now thread safe - * Added new property to `ValidationError`, which contains the raw error returned by calls made by parse/verify (such as those returned by keyfunc or json parser) - -#### 2.7.0 - -This will likely be the last backwards compatible release before 3.0.0, excluding essential bug fixes. - -* Added new option `-show` to the `jwt` command that will just output the decoded token without verifying -* Error text for expired tokens includes how long it's been expired -* Fixed incorrect error returned from `ParseRSAPublicKeyFromPEM` -* Documentation updates - -#### 2.6.0 - -* Exposed inner error within ValidationError -* Fixed validation errors when using UseJSONNumber flag -* Added several unit tests - -#### 2.5.0 - -* Added support for signing method none. You shouldn't use this. The API tries to make this clear. -* Updated/fixed some documentation -* Added more helpful error message when trying to parse tokens that begin with `BEARER ` - -#### 2.4.0 - -* Added new type, Parser, to allow for configuration of various parsing parameters - * You can now specify a list of valid signing methods. Anything outside this set will be rejected. - * You can now opt to use the `json.Number` type instead of `float64` when parsing token JSON -* Added support for [Travis CI](https://travis-ci.org/dgrijalva/jwt-go) -* Fixed some bugs with ECDSA parsing - -#### 2.3.0 - -* Added support for ECDSA signing methods -* Added support for RSA PSS signing methods (requires go v1.4) - -#### 2.2.0 - -* Gracefully handle a `nil` `Keyfunc` being passed to `Parse`. Result will now be the parsed token and an error, instead of a panic. - -#### 2.1.0 - -Backwards compatible API change that was missed in 2.0.0. - -* The `SignedString` method on `Token` now takes `interface{}` instead of `[]byte` - -#### 2.0.0 - -There were two major reasons for breaking backwards compatibility with this update. The first was a refactor required to expand the width of the RSA and HMAC-SHA signing implementations. There will likely be no required code changes to support this change. - -The second update, while unfortunately requiring a small change in integration, is required to open up this library to other signing methods. Not all keys used for all signing methods have a single standard on-disk representation. Requiring `[]byte` as the type for all keys proved too limiting. Additionally, this implementation allows for pre-parsed tokens to be reused, which might matter in an application that parses a high volume of tokens with a small set of keys. Backwards compatibilty has been maintained for passing `[]byte` to the RSA signing methods, but they will also accept `*rsa.PublicKey` and `*rsa.PrivateKey`. - -It is likely the only integration change required here will be to change `func(t *jwt.Token) ([]byte, error)` to `func(t *jwt.Token) (interface{}, error)` when calling `Parse`. - -* **Compatibility Breaking Changes** - * `SigningMethodHS256` is now `*SigningMethodHMAC` instead of `type struct` - * `SigningMethodRS256` is now `*SigningMethodRSA` instead of `type struct` - * `KeyFunc` now returns `interface{}` instead of `[]byte` - * `SigningMethod.Sign` now takes `interface{}` instead of `[]byte` for the key - * `SigningMethod.Verify` now takes `interface{}` instead of `[]byte` for the key -* Renamed type `SigningMethodHS256` to `SigningMethodHMAC`. Specific sizes are now just instances of this type. - * Added public package global `SigningMethodHS256` - * Added public package global `SigningMethodHS384` - * Added public package global `SigningMethodHS512` -* Renamed type `SigningMethodRS256` to `SigningMethodRSA`. Specific sizes are now just instances of this type. - * Added public package global `SigningMethodRS256` - * Added public package global `SigningMethodRS384` - * Added public package global `SigningMethodRS512` -* Moved sample private key for HMAC tests from an inline value to a file on disk. Value is unchanged. -* Refactored the RSA implementation to be easier to read -* Exposed helper methods `ParseRSAPrivateKeyFromPEM` and `ParseRSAPublicKeyFromPEM` - -#### 1.0.2 - -* Fixed bug in parsing public keys from certificates -* Added more tests around the parsing of keys for RS256 -* Code refactoring in RS256 implementation. No functional changes - -#### 1.0.1 - -* Fixed panic if RS256 signing method was passed an invalid key - -#### 1.0.0 - -* First versioned release -* API stabilized -* Supports creating, signing, parsing, and validating JWT tokens -* Supports RS256 and HS256 signing methods \ No newline at end of file diff --git a/vendor/github.com/dgrijalva/jwt-go/claims.go b/vendor/github.com/dgrijalva/jwt-go/claims.go deleted file mode 100644 index f0228f0..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/claims.go +++ /dev/null @@ -1,134 +0,0 @@ -package jwt - -import ( - "crypto/subtle" - "fmt" - "time" -) - -// For a type to be a Claims object, it must just have a Valid method that determines -// if the token is invalid for any supported reason -type Claims interface { - Valid() error -} - -// Structured version of Claims Section, as referenced at -// https://tools.ietf.org/html/rfc7519#section-4.1 -// See examples for how to use this with your own claim types -type StandardClaims struct { - Audience string `json:"aud,omitempty"` - ExpiresAt int64 `json:"exp,omitempty"` - Id string `json:"jti,omitempty"` - IssuedAt int64 `json:"iat,omitempty"` - Issuer string `json:"iss,omitempty"` - NotBefore int64 `json:"nbf,omitempty"` - Subject string `json:"sub,omitempty"` -} - -// Validates time based claims "exp, iat, nbf". -// There is no accounting for clock skew. -// As well, if any of the above claims are not in the token, it will still -// be considered a valid claim. -func (c StandardClaims) Valid() error { - vErr := new(ValidationError) - now := TimeFunc().Unix() - - // The claims below are optional, by default, so if they are set to the - // default value in Go, let's not fail the verification for them. - if c.VerifyExpiresAt(now, false) == false { - delta := time.Unix(now, 0).Sub(time.Unix(c.ExpiresAt, 0)) - vErr.Inner = fmt.Errorf("token is expired by %v", delta) - vErr.Errors |= ValidationErrorExpired - } - - if c.VerifyIssuedAt(now, false) == false { - vErr.Inner = fmt.Errorf("Token used before issued") - vErr.Errors |= ValidationErrorIssuedAt - } - - if c.VerifyNotBefore(now, false) == false { - vErr.Inner = fmt.Errorf("token is not valid yet") - vErr.Errors |= ValidationErrorNotValidYet - } - - if vErr.valid() { - return nil - } - - return vErr -} - -// Compares the aud claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyAudience(cmp string, req bool) bool { - return verifyAud(c.Audience, cmp, req) -} - -// Compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyExpiresAt(cmp int64, req bool) bool { - return verifyExp(c.ExpiresAt, cmp, req) -} - -// Compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyIssuedAt(cmp int64, req bool) bool { - return verifyIat(c.IssuedAt, cmp, req) -} - -// Compares the iss claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyIssuer(cmp string, req bool) bool { - return verifyIss(c.Issuer, cmp, req) -} - -// Compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (c *StandardClaims) VerifyNotBefore(cmp int64, req bool) bool { - return verifyNbf(c.NotBefore, cmp, req) -} - -// ----- helpers - -func verifyAud(aud string, cmp string, required bool) bool { - if aud == "" { - return !required - } - if subtle.ConstantTimeCompare([]byte(aud), []byte(cmp)) != 0 { - return true - } else { - return false - } -} - -func verifyExp(exp int64, now int64, required bool) bool { - if exp == 0 { - return !required - } - return now <= exp -} - -func verifyIat(iat int64, now int64, required bool) bool { - if iat == 0 { - return !required - } - return now >= iat -} - -func verifyIss(iss string, cmp string, required bool) bool { - if iss == "" { - return !required - } - if subtle.ConstantTimeCompare([]byte(iss), []byte(cmp)) != 0 { - return true - } else { - return false - } -} - -func verifyNbf(nbf int64, now int64, required bool) bool { - if nbf == 0 { - return !required - } - return now >= nbf -} diff --git a/vendor/github.com/dgrijalva/jwt-go/doc.go b/vendor/github.com/dgrijalva/jwt-go/doc.go deleted file mode 100644 index a86dc1a..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/doc.go +++ /dev/null @@ -1,4 +0,0 @@ -// Package jwt is a Go implementation of JSON Web Tokens: http://self-issued.info/docs/draft-jones-json-web-token.html -// -// See README.md for more info. -package jwt diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa.go deleted file mode 100644 index f977381..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa.go +++ /dev/null @@ -1,148 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/ecdsa" - "crypto/rand" - "errors" - "math/big" -) - -var ( - // Sadly this is missing from crypto/ecdsa compared to crypto/rsa - ErrECDSAVerification = errors.New("crypto/ecdsa: verification error") -) - -// Implements the ECDSA family of signing methods signing methods -// Expects *ecdsa.PrivateKey for signing and *ecdsa.PublicKey for verification -type SigningMethodECDSA struct { - Name string - Hash crypto.Hash - KeySize int - CurveBits int -} - -// Specific instances for EC256 and company -var ( - SigningMethodES256 *SigningMethodECDSA - SigningMethodES384 *SigningMethodECDSA - SigningMethodES512 *SigningMethodECDSA -) - -func init() { - // ES256 - SigningMethodES256 = &SigningMethodECDSA{"ES256", crypto.SHA256, 32, 256} - RegisterSigningMethod(SigningMethodES256.Alg(), func() SigningMethod { - return SigningMethodES256 - }) - - // ES384 - SigningMethodES384 = &SigningMethodECDSA{"ES384", crypto.SHA384, 48, 384} - RegisterSigningMethod(SigningMethodES384.Alg(), func() SigningMethod { - return SigningMethodES384 - }) - - // ES512 - SigningMethodES512 = &SigningMethodECDSA{"ES512", crypto.SHA512, 66, 521} - RegisterSigningMethod(SigningMethodES512.Alg(), func() SigningMethod { - return SigningMethodES512 - }) -} - -func (m *SigningMethodECDSA) Alg() string { - return m.Name -} - -// Implements the Verify method from SigningMethod -// For this verify method, key must be an ecdsa.PublicKey struct -func (m *SigningMethodECDSA) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - // Get the key - var ecdsaKey *ecdsa.PublicKey - switch k := key.(type) { - case *ecdsa.PublicKey: - ecdsaKey = k - default: - return ErrInvalidKeyType - } - - if len(sig) != 2*m.KeySize { - return ErrECDSAVerification - } - - r := big.NewInt(0).SetBytes(sig[:m.KeySize]) - s := big.NewInt(0).SetBytes(sig[m.KeySize:]) - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Verify the signature - if verifystatus := ecdsa.Verify(ecdsaKey, hasher.Sum(nil), r, s); verifystatus == true { - return nil - } else { - return ErrECDSAVerification - } -} - -// Implements the Sign method from SigningMethod -// For this signing method, key must be an ecdsa.PrivateKey struct -func (m *SigningMethodECDSA) Sign(signingString string, key interface{}) (string, error) { - // Get the key - var ecdsaKey *ecdsa.PrivateKey - switch k := key.(type) { - case *ecdsa.PrivateKey: - ecdsaKey = k - default: - return "", ErrInvalidKeyType - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return r, s - if r, s, err := ecdsa.Sign(rand.Reader, ecdsaKey, hasher.Sum(nil)); err == nil { - curveBits := ecdsaKey.Curve.Params().BitSize - - if m.CurveBits != curveBits { - return "", ErrInvalidKey - } - - keyBytes := curveBits / 8 - if curveBits%8 > 0 { - keyBytes += 1 - } - - // We serialize the outpus (r and s) into big-endian byte arrays and pad - // them with zeros on the left to make sure the sizes work out. Both arrays - // must be keyBytes long, and the output must be 2*keyBytes long. - rBytes := r.Bytes() - rBytesPadded := make([]byte, keyBytes) - copy(rBytesPadded[keyBytes-len(rBytes):], rBytes) - - sBytes := s.Bytes() - sBytesPadded := make([]byte, keyBytes) - copy(sBytesPadded[keyBytes-len(sBytes):], sBytes) - - out := append(rBytesPadded, sBytesPadded...) - - return EncodeSegment(out), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go deleted file mode 100644 index d19624b..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/ecdsa_utils.go +++ /dev/null @@ -1,67 +0,0 @@ -package jwt - -import ( - "crypto/ecdsa" - "crypto/x509" - "encoding/pem" - "errors" -) - -var ( - ErrNotECPublicKey = errors.New("Key is not a valid ECDSA public key") - ErrNotECPrivateKey = errors.New("Key is not a valid ECDSA private key") -) - -// Parse PEM encoded Elliptic Curve Private Key Structure -func ParseECPrivateKeyFromPEM(key []byte) (*ecdsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParseECPrivateKey(block.Bytes); err != nil { - return nil, err - } - - var pkey *ecdsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*ecdsa.PrivateKey); !ok { - return nil, ErrNotECPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 public key -func ParseECPublicKeyFromPEM(key []byte) (*ecdsa.PublicKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { - if cert, err := x509.ParseCertificate(block.Bytes); err == nil { - parsedKey = cert.PublicKey - } else { - return nil, err - } - } - - var pkey *ecdsa.PublicKey - var ok bool - if pkey, ok = parsedKey.(*ecdsa.PublicKey); !ok { - return nil, ErrNotECPublicKey - } - - return pkey, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/errors.go b/vendor/github.com/dgrijalva/jwt-go/errors.go deleted file mode 100644 index 1c93024..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/errors.go +++ /dev/null @@ -1,59 +0,0 @@ -package jwt - -import ( - "errors" -) - -// Error constants -var ( - ErrInvalidKey = errors.New("key is invalid") - ErrInvalidKeyType = errors.New("key is of invalid type") - ErrHashUnavailable = errors.New("the requested hash function is unavailable") -) - -// The errors that might occur when parsing and validating a token -const ( - ValidationErrorMalformed uint32 = 1 << iota // Token is malformed - ValidationErrorUnverifiable // Token could not be verified because of signing problems - ValidationErrorSignatureInvalid // Signature validation failed - - // Standard Claim validation errors - ValidationErrorAudience // AUD validation failed - ValidationErrorExpired // EXP validation failed - ValidationErrorIssuedAt // IAT validation failed - ValidationErrorIssuer // ISS validation failed - ValidationErrorNotValidYet // NBF validation failed - ValidationErrorId // JTI validation failed - ValidationErrorClaimsInvalid // Generic claims validation error -) - -// Helper for constructing a ValidationError with a string error message -func NewValidationError(errorText string, errorFlags uint32) *ValidationError { - return &ValidationError{ - text: errorText, - Errors: errorFlags, - } -} - -// The error from Parse if token is not valid -type ValidationError struct { - Inner error // stores the error returned by external dependencies, i.e.: KeyFunc - Errors uint32 // bitfield. see ValidationError... constants - text string // errors that do not have a valid error just have text -} - -// Validation error is an error type -func (e ValidationError) Error() string { - if e.Inner != nil { - return e.Inner.Error() - } else if e.text != "" { - return e.text - } else { - return "token is invalid" - } -} - -// No errors -func (e *ValidationError) valid() bool { - return e.Errors == 0 -} diff --git a/vendor/github.com/dgrijalva/jwt-go/hmac.go b/vendor/github.com/dgrijalva/jwt-go/hmac.go deleted file mode 100644 index addbe5d..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/hmac.go +++ /dev/null @@ -1,95 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/hmac" - "errors" -) - -// Implements the HMAC-SHA family of signing methods signing methods -// Expects key type of []byte for both signing and validation -type SigningMethodHMAC struct { - Name string - Hash crypto.Hash -} - -// Specific instances for HS256 and company -var ( - SigningMethodHS256 *SigningMethodHMAC - SigningMethodHS384 *SigningMethodHMAC - SigningMethodHS512 *SigningMethodHMAC - ErrSignatureInvalid = errors.New("signature is invalid") -) - -func init() { - // HS256 - SigningMethodHS256 = &SigningMethodHMAC{"HS256", crypto.SHA256} - RegisterSigningMethod(SigningMethodHS256.Alg(), func() SigningMethod { - return SigningMethodHS256 - }) - - // HS384 - SigningMethodHS384 = &SigningMethodHMAC{"HS384", crypto.SHA384} - RegisterSigningMethod(SigningMethodHS384.Alg(), func() SigningMethod { - return SigningMethodHS384 - }) - - // HS512 - SigningMethodHS512 = &SigningMethodHMAC{"HS512", crypto.SHA512} - RegisterSigningMethod(SigningMethodHS512.Alg(), func() SigningMethod { - return SigningMethodHS512 - }) -} - -func (m *SigningMethodHMAC) Alg() string { - return m.Name -} - -// Verify the signature of HSXXX tokens. Returns nil if the signature is valid. -func (m *SigningMethodHMAC) Verify(signingString, signature string, key interface{}) error { - // Verify the key is the right type - keyBytes, ok := key.([]byte) - if !ok { - return ErrInvalidKeyType - } - - // Decode signature, for comparison - sig, err := DecodeSegment(signature) - if err != nil { - return err - } - - // Can we use the specified hashing method? - if !m.Hash.Available() { - return ErrHashUnavailable - } - - // This signing method is symmetric, so we validate the signature - // by reproducing the signature from the signing string and key, then - // comparing that against the provided signature. - hasher := hmac.New(m.Hash.New, keyBytes) - hasher.Write([]byte(signingString)) - if !hmac.Equal(sig, hasher.Sum(nil)) { - return ErrSignatureInvalid - } - - // No validation errors. Signature is good. - return nil -} - -// Implements the Sign method from SigningMethod for this signing method. -// Key must be []byte -func (m *SigningMethodHMAC) Sign(signingString string, key interface{}) (string, error) { - if keyBytes, ok := key.([]byte); ok { - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := hmac.New(m.Hash.New, keyBytes) - hasher.Write([]byte(signingString)) - - return EncodeSegment(hasher.Sum(nil)), nil - } - - return "", ErrInvalidKeyType -} diff --git a/vendor/github.com/dgrijalva/jwt-go/map_claims.go b/vendor/github.com/dgrijalva/jwt-go/map_claims.go deleted file mode 100644 index 291213c..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/map_claims.go +++ /dev/null @@ -1,94 +0,0 @@ -package jwt - -import ( - "encoding/json" - "errors" - // "fmt" -) - -// Claims type that uses the map[string]interface{} for JSON decoding -// This is the default claims type if you don't supply one -type MapClaims map[string]interface{} - -// Compares the aud claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyAudience(cmp string, req bool) bool { - aud, _ := m["aud"].(string) - return verifyAud(aud, cmp, req) -} - -// Compares the exp claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyExpiresAt(cmp int64, req bool) bool { - switch exp := m["exp"].(type) { - case float64: - return verifyExp(int64(exp), cmp, req) - case json.Number: - v, _ := exp.Int64() - return verifyExp(v, cmp, req) - } - return req == false -} - -// Compares the iat claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyIssuedAt(cmp int64, req bool) bool { - switch iat := m["iat"].(type) { - case float64: - return verifyIat(int64(iat), cmp, req) - case json.Number: - v, _ := iat.Int64() - return verifyIat(v, cmp, req) - } - return req == false -} - -// Compares the iss claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyIssuer(cmp string, req bool) bool { - iss, _ := m["iss"].(string) - return verifyIss(iss, cmp, req) -} - -// Compares the nbf claim against cmp. -// If required is false, this method will return true if the value matches or is unset -func (m MapClaims) VerifyNotBefore(cmp int64, req bool) bool { - switch nbf := m["nbf"].(type) { - case float64: - return verifyNbf(int64(nbf), cmp, req) - case json.Number: - v, _ := nbf.Int64() - return verifyNbf(v, cmp, req) - } - return req == false -} - -// Validates time based claims "exp, iat, nbf". -// There is no accounting for clock skew. -// As well, if any of the above claims are not in the token, it will still -// be considered a valid claim. -func (m MapClaims) Valid() error { - vErr := new(ValidationError) - now := TimeFunc().Unix() - - if m.VerifyExpiresAt(now, false) == false { - vErr.Inner = errors.New("Token is expired") - vErr.Errors |= ValidationErrorExpired - } - - if m.VerifyIssuedAt(now, false) == false { - vErr.Inner = errors.New("Token used before issued") - vErr.Errors |= ValidationErrorIssuedAt - } - - if m.VerifyNotBefore(now, false) == false { - vErr.Inner = errors.New("Token is not valid yet") - vErr.Errors |= ValidationErrorNotValidYet - } - - if vErr.valid() { - return nil - } - - return vErr -} diff --git a/vendor/github.com/dgrijalva/jwt-go/none.go b/vendor/github.com/dgrijalva/jwt-go/none.go deleted file mode 100644 index f04d189..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/none.go +++ /dev/null @@ -1,52 +0,0 @@ -package jwt - -// Implements the none signing method. This is required by the spec -// but you probably should never use it. -var SigningMethodNone *signingMethodNone - -const UnsafeAllowNoneSignatureType unsafeNoneMagicConstant = "none signing method allowed" - -var NoneSignatureTypeDisallowedError error - -type signingMethodNone struct{} -type unsafeNoneMagicConstant string - -func init() { - SigningMethodNone = &signingMethodNone{} - NoneSignatureTypeDisallowedError = NewValidationError("'none' signature type is not allowed", ValidationErrorSignatureInvalid) - - RegisterSigningMethod(SigningMethodNone.Alg(), func() SigningMethod { - return SigningMethodNone - }) -} - -func (m *signingMethodNone) Alg() string { - return "none" -} - -// Only allow 'none' alg type if UnsafeAllowNoneSignatureType is specified as the key -func (m *signingMethodNone) Verify(signingString, signature string, key interface{}) (err error) { - // Key must be UnsafeAllowNoneSignatureType to prevent accidentally - // accepting 'none' signing method - if _, ok := key.(unsafeNoneMagicConstant); !ok { - return NoneSignatureTypeDisallowedError - } - // If signing method is none, signature must be an empty string - if signature != "" { - return NewValidationError( - "'none' signing method with non-empty signature", - ValidationErrorSignatureInvalid, - ) - } - - // Accept 'none' signing method. - return nil -} - -// Only allow 'none' signing if UnsafeAllowNoneSignatureType is specified as the key -func (m *signingMethodNone) Sign(signingString string, key interface{}) (string, error) { - if _, ok := key.(unsafeNoneMagicConstant); ok { - return "", nil - } - return "", NoneSignatureTypeDisallowedError -} diff --git a/vendor/github.com/dgrijalva/jwt-go/parser.go b/vendor/github.com/dgrijalva/jwt-go/parser.go deleted file mode 100644 index d6901d9..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/parser.go +++ /dev/null @@ -1,148 +0,0 @@ -package jwt - -import ( - "bytes" - "encoding/json" - "fmt" - "strings" -) - -type Parser struct { - ValidMethods []string // If populated, only these methods will be considered valid - UseJSONNumber bool // Use JSON Number format in JSON decoder - SkipClaimsValidation bool // Skip claims validation during token parsing -} - -// Parse, validate, and return a token. -// keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil -func (p *Parser) Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return p.ParseWithClaims(tokenString, MapClaims{}, keyFunc) -} - -func (p *Parser) ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - token, parts, err := p.ParseUnverified(tokenString, claims) - if err != nil { - return token, err - } - - // Verify signing method is in the required set - if p.ValidMethods != nil { - var signingMethodValid = false - var alg = token.Method.Alg() - for _, m := range p.ValidMethods { - if m == alg { - signingMethodValid = true - break - } - } - if !signingMethodValid { - // signing method is not in the listed set - return token, NewValidationError(fmt.Sprintf("signing method %v is invalid", alg), ValidationErrorSignatureInvalid) - } - } - - // Lookup key - var key interface{} - if keyFunc == nil { - // keyFunc was not provided. short circuiting validation - return token, NewValidationError("no Keyfunc was provided.", ValidationErrorUnverifiable) - } - if key, err = keyFunc(token); err != nil { - // keyFunc returned an error - if ve, ok := err.(*ValidationError); ok { - return token, ve - } - return token, &ValidationError{Inner: err, Errors: ValidationErrorUnverifiable} - } - - vErr := &ValidationError{} - - // Validate Claims - if !p.SkipClaimsValidation { - if err := token.Claims.Valid(); err != nil { - - // If the Claims Valid returned an error, check if it is a validation error, - // If it was another error type, create a ValidationError with a generic ClaimsInvalid flag set - if e, ok := err.(*ValidationError); !ok { - vErr = &ValidationError{Inner: err, Errors: ValidationErrorClaimsInvalid} - } else { - vErr = e - } - } - } - - // Perform validation - token.Signature = parts[2] - if err = token.Method.Verify(strings.Join(parts[0:2], "."), token.Signature, key); err != nil { - vErr.Inner = err - vErr.Errors |= ValidationErrorSignatureInvalid - } - - if vErr.valid() { - token.Valid = true - return token, nil - } - - return token, vErr -} - -// WARNING: Don't use this method unless you know what you're doing -// -// This method parses the token but doesn't validate the signature. It's only -// ever useful in cases where you know the signature is valid (because it has -// been checked previously in the stack) and you want to extract values from -// it. -func (p *Parser) ParseUnverified(tokenString string, claims Claims) (token *Token, parts []string, err error) { - parts = strings.Split(tokenString, ".") - if len(parts) != 3 { - return nil, parts, NewValidationError("token contains an invalid number of segments", ValidationErrorMalformed) - } - - token = &Token{Raw: tokenString} - - // parse Header - var headerBytes []byte - if headerBytes, err = DecodeSegment(parts[0]); err != nil { - if strings.HasPrefix(strings.ToLower(tokenString), "bearer ") { - return token, parts, NewValidationError("tokenstring should not contain 'bearer '", ValidationErrorMalformed) - } - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - if err = json.Unmarshal(headerBytes, &token.Header); err != nil { - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - - // parse Claims - var claimBytes []byte - token.Claims = claims - - if claimBytes, err = DecodeSegment(parts[1]); err != nil { - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - dec := json.NewDecoder(bytes.NewBuffer(claimBytes)) - if p.UseJSONNumber { - dec.UseNumber() - } - // JSON Decode. Special case for map type to avoid weird pointer behavior - if c, ok := token.Claims.(MapClaims); ok { - err = dec.Decode(&c) - } else { - err = dec.Decode(&claims) - } - // Handle decode error - if err != nil { - return token, parts, &ValidationError{Inner: err, Errors: ValidationErrorMalformed} - } - - // Lookup signature method - if method, ok := token.Header["alg"].(string); ok { - if token.Method = GetSigningMethod(method); token.Method == nil { - return token, parts, NewValidationError("signing method (alg) is unavailable.", ValidationErrorUnverifiable) - } - } else { - return token, parts, NewValidationError("signing method (alg) is unspecified.", ValidationErrorUnverifiable) - } - - return token, parts, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa.go b/vendor/github.com/dgrijalva/jwt-go/rsa.go deleted file mode 100644 index e4caf1c..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa.go +++ /dev/null @@ -1,101 +0,0 @@ -package jwt - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" -) - -// Implements the RSA family of signing methods signing methods -// Expects *rsa.PrivateKey for signing and *rsa.PublicKey for validation -type SigningMethodRSA struct { - Name string - Hash crypto.Hash -} - -// Specific instances for RS256 and company -var ( - SigningMethodRS256 *SigningMethodRSA - SigningMethodRS384 *SigningMethodRSA - SigningMethodRS512 *SigningMethodRSA -) - -func init() { - // RS256 - SigningMethodRS256 = &SigningMethodRSA{"RS256", crypto.SHA256} - RegisterSigningMethod(SigningMethodRS256.Alg(), func() SigningMethod { - return SigningMethodRS256 - }) - - // RS384 - SigningMethodRS384 = &SigningMethodRSA{"RS384", crypto.SHA384} - RegisterSigningMethod(SigningMethodRS384.Alg(), func() SigningMethod { - return SigningMethodRS384 - }) - - // RS512 - SigningMethodRS512 = &SigningMethodRSA{"RS512", crypto.SHA512} - RegisterSigningMethod(SigningMethodRS512.Alg(), func() SigningMethod { - return SigningMethodRS512 - }) -} - -func (m *SigningMethodRSA) Alg() string { - return m.Name -} - -// Implements the Verify method from SigningMethod -// For this signing method, must be an *rsa.PublicKey structure. -func (m *SigningMethodRSA) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - var rsaKey *rsa.PublicKey - var ok bool - - if rsaKey, ok = key.(*rsa.PublicKey); !ok { - return ErrInvalidKeyType - } - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Verify the signature - return rsa.VerifyPKCS1v15(rsaKey, m.Hash, hasher.Sum(nil), sig) -} - -// Implements the Sign method from SigningMethod -// For this signing method, must be an *rsa.PrivateKey structure. -func (m *SigningMethodRSA) Sign(signingString string, key interface{}) (string, error) { - var rsaKey *rsa.PrivateKey - var ok bool - - // Validate type of key - if rsaKey, ok = key.(*rsa.PrivateKey); !ok { - return "", ErrInvalidKey - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return the encoded bytes - if sigBytes, err := rsa.SignPKCS1v15(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil)); err == nil { - return EncodeSegment(sigBytes), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go b/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go deleted file mode 100644 index 10ee9db..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_pss.go +++ /dev/null @@ -1,126 +0,0 @@ -// +build go1.4 - -package jwt - -import ( - "crypto" - "crypto/rand" - "crypto/rsa" -) - -// Implements the RSAPSS family of signing methods signing methods -type SigningMethodRSAPSS struct { - *SigningMethodRSA - Options *rsa.PSSOptions -} - -// Specific instances for RS/PS and company -var ( - SigningMethodPS256 *SigningMethodRSAPSS - SigningMethodPS384 *SigningMethodRSAPSS - SigningMethodPS512 *SigningMethodRSAPSS -) - -func init() { - // PS256 - SigningMethodPS256 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS256", - Hash: crypto.SHA256, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA256, - }, - } - RegisterSigningMethod(SigningMethodPS256.Alg(), func() SigningMethod { - return SigningMethodPS256 - }) - - // PS384 - SigningMethodPS384 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS384", - Hash: crypto.SHA384, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA384, - }, - } - RegisterSigningMethod(SigningMethodPS384.Alg(), func() SigningMethod { - return SigningMethodPS384 - }) - - // PS512 - SigningMethodPS512 = &SigningMethodRSAPSS{ - &SigningMethodRSA{ - Name: "PS512", - Hash: crypto.SHA512, - }, - &rsa.PSSOptions{ - SaltLength: rsa.PSSSaltLengthAuto, - Hash: crypto.SHA512, - }, - } - RegisterSigningMethod(SigningMethodPS512.Alg(), func() SigningMethod { - return SigningMethodPS512 - }) -} - -// Implements the Verify method from SigningMethod -// For this verify method, key must be an rsa.PublicKey struct -func (m *SigningMethodRSAPSS) Verify(signingString, signature string, key interface{}) error { - var err error - - // Decode the signature - var sig []byte - if sig, err = DecodeSegment(signature); err != nil { - return err - } - - var rsaKey *rsa.PublicKey - switch k := key.(type) { - case *rsa.PublicKey: - rsaKey = k - default: - return ErrInvalidKey - } - - // Create hasher - if !m.Hash.Available() { - return ErrHashUnavailable - } - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - return rsa.VerifyPSS(rsaKey, m.Hash, hasher.Sum(nil), sig, m.Options) -} - -// Implements the Sign method from SigningMethod -// For this signing method, key must be an rsa.PrivateKey struct -func (m *SigningMethodRSAPSS) Sign(signingString string, key interface{}) (string, error) { - var rsaKey *rsa.PrivateKey - - switch k := key.(type) { - case *rsa.PrivateKey: - rsaKey = k - default: - return "", ErrInvalidKeyType - } - - // Create the hasher - if !m.Hash.Available() { - return "", ErrHashUnavailable - } - - hasher := m.Hash.New() - hasher.Write([]byte(signingString)) - - // Sign the string and return the encoded bytes - if sigBytes, err := rsa.SignPSS(rand.Reader, rsaKey, m.Hash, hasher.Sum(nil), m.Options); err == nil { - return EncodeSegment(sigBytes), nil - } else { - return "", err - } -} diff --git a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go b/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go deleted file mode 100644 index a5ababf..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/rsa_utils.go +++ /dev/null @@ -1,101 +0,0 @@ -package jwt - -import ( - "crypto/rsa" - "crypto/x509" - "encoding/pem" - "errors" -) - -var ( - ErrKeyMustBePEMEncoded = errors.New("Invalid Key: Key must be PEM encoded PKCS1 or PKCS8 private key") - ErrNotRSAPrivateKey = errors.New("Key is not a valid RSA private key") - ErrNotRSAPublicKey = errors.New("Key is not a valid RSA public key") -) - -// Parse PEM encoded PKCS1 or PKCS8 private key -func ParseRSAPrivateKeyFromPEM(key []byte) (*rsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - var parsedKey interface{} - if parsedKey, err = x509.ParsePKCS1PrivateKey(block.Bytes); err != nil { - if parsedKey, err = x509.ParsePKCS8PrivateKey(block.Bytes); err != nil { - return nil, err - } - } - - var pkey *rsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { - return nil, ErrNotRSAPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 private key protected with password -func ParseRSAPrivateKeyFromPEMWithPassword(key []byte, password string) (*rsa.PrivateKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - var parsedKey interface{} - - var blockDecrypted []byte - if blockDecrypted, err = x509.DecryptPEMBlock(block, []byte(password)); err != nil { - return nil, err - } - - if parsedKey, err = x509.ParsePKCS1PrivateKey(blockDecrypted); err != nil { - if parsedKey, err = x509.ParsePKCS8PrivateKey(blockDecrypted); err != nil { - return nil, err - } - } - - var pkey *rsa.PrivateKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PrivateKey); !ok { - return nil, ErrNotRSAPrivateKey - } - - return pkey, nil -} - -// Parse PEM encoded PKCS1 or PKCS8 public key -func ParseRSAPublicKeyFromPEM(key []byte) (*rsa.PublicKey, error) { - var err error - - // Parse PEM block - var block *pem.Block - if block, _ = pem.Decode(key); block == nil { - return nil, ErrKeyMustBePEMEncoded - } - - // Parse the key - var parsedKey interface{} - if parsedKey, err = x509.ParsePKIXPublicKey(block.Bytes); err != nil { - if cert, err := x509.ParseCertificate(block.Bytes); err == nil { - parsedKey = cert.PublicKey - } else { - return nil, err - } - } - - var pkey *rsa.PublicKey - var ok bool - if pkey, ok = parsedKey.(*rsa.PublicKey); !ok { - return nil, ErrNotRSAPublicKey - } - - return pkey, nil -} diff --git a/vendor/github.com/dgrijalva/jwt-go/signing_method.go b/vendor/github.com/dgrijalva/jwt-go/signing_method.go deleted file mode 100644 index ed1f212..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/signing_method.go +++ /dev/null @@ -1,35 +0,0 @@ -package jwt - -import ( - "sync" -) - -var signingMethods = map[string]func() SigningMethod{} -var signingMethodLock = new(sync.RWMutex) - -// Implement SigningMethod to add new methods for signing or verifying tokens. -type SigningMethod interface { - Verify(signingString, signature string, key interface{}) error // Returns nil if signature is valid - Sign(signingString string, key interface{}) (string, error) // Returns encoded signature or error - Alg() string // returns the alg identifier for this method (example: 'HS256') -} - -// Register the "alg" name and a factory function for signing method. -// This is typically done during init() in the method's implementation -func RegisterSigningMethod(alg string, f func() SigningMethod) { - signingMethodLock.Lock() - defer signingMethodLock.Unlock() - - signingMethods[alg] = f -} - -// Get a signing method from an "alg" string -func GetSigningMethod(alg string) (method SigningMethod) { - signingMethodLock.RLock() - defer signingMethodLock.RUnlock() - - if methodF, ok := signingMethods[alg]; ok { - method = methodF() - } - return -} diff --git a/vendor/github.com/dgrijalva/jwt-go/token.go b/vendor/github.com/dgrijalva/jwt-go/token.go deleted file mode 100644 index d637e08..0000000 --- a/vendor/github.com/dgrijalva/jwt-go/token.go +++ /dev/null @@ -1,108 +0,0 @@ -package jwt - -import ( - "encoding/base64" - "encoding/json" - "strings" - "time" -) - -// TimeFunc provides the current time when parsing token to validate "exp" claim (expiration time). -// You can override it to use another time value. This is useful for testing or if your -// server uses a different time zone than your tokens. -var TimeFunc = time.Now - -// Parse methods use this callback function to supply -// the key for verification. The function receives the parsed, -// but unverified Token. This allows you to use properties in the -// Header of the token (such as `kid`) to identify which key to use. -type Keyfunc func(*Token) (interface{}, error) - -// A JWT Token. Different fields will be used depending on whether you're -// creating or parsing/verifying a token. -type Token struct { - Raw string // The raw token. Populated when you Parse a token - Method SigningMethod // The signing method used or to be used - Header map[string]interface{} // The first segment of the token - Claims Claims // The second segment of the token - Signature string // The third segment of the token. Populated when you Parse a token - Valid bool // Is the token valid? Populated when you Parse/Verify a token -} - -// Create a new Token. Takes a signing method -func New(method SigningMethod) *Token { - return NewWithClaims(method, MapClaims{}) -} - -func NewWithClaims(method SigningMethod, claims Claims) *Token { - return &Token{ - Header: map[string]interface{}{ - "typ": "JWT", - "alg": method.Alg(), - }, - Claims: claims, - Method: method, - } -} - -// Get the complete, signed token -func (t *Token) SignedString(key interface{}) (string, error) { - var sig, sstr string - var err error - if sstr, err = t.SigningString(); err != nil { - return "", err - } - if sig, err = t.Method.Sign(sstr, key); err != nil { - return "", err - } - return strings.Join([]string{sstr, sig}, "."), nil -} - -// Generate the signing string. This is the -// most expensive part of the whole deal. Unless you -// need this for something special, just go straight for -// the SignedString. -func (t *Token) SigningString() (string, error) { - var err error - parts := make([]string, 2) - for i, _ := range parts { - var jsonValue []byte - if i == 0 { - if jsonValue, err = json.Marshal(t.Header); err != nil { - return "", err - } - } else { - if jsonValue, err = json.Marshal(t.Claims); err != nil { - return "", err - } - } - - parts[i] = EncodeSegment(jsonValue) - } - return strings.Join(parts, "."), nil -} - -// Parse, validate, and return a token. -// keyFunc will receive the parsed token and should return the key for validating. -// If everything is kosher, err will be nil -func Parse(tokenString string, keyFunc Keyfunc) (*Token, error) { - return new(Parser).Parse(tokenString, keyFunc) -} - -func ParseWithClaims(tokenString string, claims Claims, keyFunc Keyfunc) (*Token, error) { - return new(Parser).ParseWithClaims(tokenString, claims, keyFunc) -} - -// Encode JWT specific base64url encoding with padding stripped -func EncodeSegment(seg []byte) string { - return strings.TrimRight(base64.URLEncoding.EncodeToString(seg), "=") -} - -// Decode JWT specific base64url encoding with padding stripped -func DecodeSegment(seg string) ([]byte, error) { - if l := len(seg) % 4; l > 0 { - seg += strings.Repeat("=", 4-l) - } - - return base64.URLEncoding.DecodeString(seg) -} diff --git a/vendor/github.com/docker/spdystream/CONTRIBUTING.md b/vendor/github.com/docker/spdystream/CONTRIBUTING.md deleted file mode 100644 index d4eddcc..0000000 --- a/vendor/github.com/docker/spdystream/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -# Contributing to SpdyStream - -Want to hack on spdystream? Awesome! Here are instructions to get you -started. - -SpdyStream is a part of the [Docker](https://docker.io) project, and follows -the same rules and principles. If you're already familiar with the way -Docker does things, you'll feel right at home. - -Otherwise, go read -[Docker's contributions guidelines](https://github.com/dotcloud/docker/blob/master/CONTRIBUTING.md). - -Happy hacking! diff --git a/vendor/github.com/docker/spdystream/LICENSE b/vendor/github.com/docker/spdystream/LICENSE deleted file mode 100644 index 9e4bd4d..0000000 --- a/vendor/github.com/docker/spdystream/LICENSE +++ /dev/null @@ -1,191 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - Copyright 2014-2015 Docker, Inc. - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/docker/spdystream/LICENSE.docs b/vendor/github.com/docker/spdystream/LICENSE.docs deleted file mode 100644 index e26cd4f..0000000 --- a/vendor/github.com/docker/spdystream/LICENSE.docs +++ /dev/null @@ -1,425 +0,0 @@ -Attribution-ShareAlike 4.0 International - -======================================================================= - -Creative Commons Corporation ("Creative Commons") is not a law firm and -does not provide legal services or legal advice. Distribution of -Creative Commons public licenses does not create a lawyer-client or -other relationship. Creative Commons makes its licenses and related -information available on an "as-is" basis. Creative Commons gives no -warranties regarding its licenses, any material licensed under their -terms and conditions, or any related information. Creative Commons -disclaims all liability for damages resulting from their use to the -fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and -conditions that creators and other rights holders may use to share -original works of authorship and other material subject to copyright -and certain other rights specified in the public license below. The -following considerations are for informational purposes only, are not -exhaustive, and do not form part of our licenses. - - Considerations for licensors: Our public licenses are - intended for use by those authorized to give the public - permission to use material in ways otherwise restricted by - copyright and certain other rights. Our licenses are - irrevocable. Licensors should read and understand the terms - and conditions of the license they choose before applying it. - Licensors should also secure all rights necessary before - applying our licenses so that the public can reuse the - material as expected. Licensors should clearly mark any - material not subject to the license. This includes other CC- - licensed material, or material used under an exception or - limitation to copyright. More considerations for licensors: - wiki.creativecommons.org/Considerations_for_licensors - - Considerations for the public: By using one of our public - licenses, a licensor grants the public permission to use the - licensed material under specified terms and conditions. If - the licensor's permission is not necessary for any reason--for - example, because of any applicable exception or limitation to - copyright--then that use is not regulated by the license. Our - licenses grant only permissions under copyright and certain - other rights that a licensor has authority to grant. Use of - the licensed material may still be restricted for other - reasons, including because others have copyright or other - rights in the material. A licensor may make special requests, - such as asking that all changes be marked or described. - Although not required by our licenses, you are encouraged to - respect those requests where reasonable. More_considerations - for the public: - wiki.creativecommons.org/Considerations_for_licensees - -======================================================================= - -Creative Commons Attribution-ShareAlike 4.0 International Public -License - -By exercising the Licensed Rights (defined below), You accept and agree -to be bound by the terms and conditions of this Creative Commons -Attribution-ShareAlike 4.0 International Public License ("Public -License"). To the extent this Public License may be interpreted as a -contract, You are granted the Licensed Rights in consideration of Your -acceptance of these terms and conditions, and the Licensor grants You -such rights in consideration of benefits the Licensor receives from -making the Licensed Material available under these terms and -conditions. - - -Section 1 -- Definitions. - - a. Adapted Material means material subject to Copyright and Similar - Rights that is derived from or based upon the Licensed Material - and in which the Licensed Material is translated, altered, - arranged, transformed, or otherwise modified in a manner requiring - permission under the Copyright and Similar Rights held by the - Licensor. For purposes of this Public License, where the Licensed - Material is a musical work, performance, or sound recording, - Adapted Material is always produced where the Licensed Material is - synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright - and Similar Rights in Your contributions to Adapted Material in - accordance with the terms and conditions of this Public License. - - c. BY-SA Compatible License means a license listed at - creativecommons.org/compatiblelicenses, approved by Creative - Commons as essentially the equivalent of this Public License. - - d. Copyright and Similar Rights means copyright and/or similar rights - closely related to copyright including, without limitation, - performance, broadcast, sound recording, and Sui Generis Database - Rights, without regard to how the rights are labeled or - categorized. For purposes of this Public License, the rights - specified in Section 2(b)(1)-(2) are not Copyright and Similar - Rights. - - e. Effective Technological Measures means those measures that, in the - absence of proper authority, may not be circumvented under laws - fulfilling obligations under Article 11 of the WIPO Copyright - Treaty adopted on December 20, 1996, and/or similar international - agreements. - - f. Exceptions and Limitations means fair use, fair dealing, and/or - any other exception or limitation to Copyright and Similar Rights - that applies to Your use of the Licensed Material. - - g. License Elements means the license attributes listed in the name - of a Creative Commons Public License. The License Elements of this - Public License are Attribution and ShareAlike. - - h. Licensed Material means the artistic or literary work, database, - or other material to which the Licensor applied this Public - License. - - i. Licensed Rights means the rights granted to You subject to the - terms and conditions of this Public License, which are limited to - all Copyright and Similar Rights that apply to Your use of the - Licensed Material and that the Licensor has authority to license. - - j. Licensor means the individual(s) or entity(ies) granting rights - under this Public License. - - k. Share means to provide material to the public by any means or - process that requires permission under the Licensed Rights, such - as reproduction, public display, public performance, distribution, - dissemination, communication, or importation, and to make material - available to the public including in ways that members of the - public may access the material from a place and at a time - individually chosen by them. - - l. Sui Generis Database Rights means rights other than copyright - resulting from Directive 96/9/EC of the European Parliament and of - the Council of 11 March 1996 on the legal protection of databases, - as amended and/or succeeded, as well as other essentially - equivalent rights anywhere in the world. - - m. You means the individual or entity exercising the Licensed Rights - under this Public License. Your has a corresponding meaning. - - -Section 2 -- Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, - the Licensor hereby grants You a worldwide, royalty-free, - non-sublicensable, non-exclusive, irrevocable license to - exercise the Licensed Rights in the Licensed Material to: - - a. reproduce and Share the Licensed Material, in whole or - in part; and - - b. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where - Exceptions and Limitations apply to Your use, this Public - License does not apply, and You do not need to comply with - its terms and conditions. - - 3. Term. The term of this Public License is specified in Section - 6(a). - - 4. Media and formats; technical modifications allowed. The - Licensor authorizes You to exercise the Licensed Rights in - all media and formats whether now known or hereafter created, - and to make technical modifications necessary to do so. The - Licensor waives and/or agrees not to assert any right or - authority to forbid You from making technical modifications - necessary to exercise the Licensed Rights, including - technical modifications necessary to circumvent Effective - Technological Measures. For purposes of this Public License, - simply making modifications authorized by this Section 2(a) - (4) never produces Adapted Material. - - 5. Downstream recipients. - - a. Offer from the Licensor -- Licensed Material. Every - recipient of the Licensed Material automatically - receives an offer from the Licensor to exercise the - Licensed Rights under the terms and conditions of this - Public License. - - b. Additional offer from the Licensor -- Adapted Material. - Every recipient of Adapted Material from You - automatically receives an offer from the Licensor to - exercise the Licensed Rights in the Adapted Material - under the conditions of the Adapter's License You apply. - - c. No downstream restrictions. You may not offer or impose - any additional or different terms or conditions on, or - apply any Effective Technological Measures to, the - Licensed Material if doing so restricts exercise of the - Licensed Rights by any recipient of the Licensed - Material. - - 6. No endorsement. Nothing in this Public License constitutes or - may be construed as permission to assert or imply that You - are, or that Your use of the Licensed Material is, connected - with, or sponsored, endorsed, or granted official status by, - the Licensor or others designated to receive attribution as - provided in Section 3(a)(1)(A)(i). - - b. Other rights. - - 1. Moral rights, such as the right of integrity, are not - licensed under this Public License, nor are publicity, - privacy, and/or other similar personality rights; however, to - the extent possible, the Licensor waives and/or agrees not to - assert any such rights held by the Licensor to the limited - extent necessary to allow You to exercise the Licensed - Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this - Public License. - - 3. To the extent possible, the Licensor waives any right to - collect royalties from You for the exercise of the Licensed - Rights, whether directly or through a collecting society - under any voluntary or waivable statutory or compulsory - licensing scheme. In all other cases the Licensor expressly - reserves any right to collect such royalties. - - -Section 3 -- License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the -following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified - form), You must: - - a. retain the following if it is supplied by the Licensor - with the Licensed Material: - - i. identification of the creator(s) of the Licensed - Material and any others designated to receive - attribution, in any reasonable manner requested by - the Licensor (including by pseudonym if - designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of - warranties; - - v. a URI or hyperlink to the Licensed Material to the - extent reasonably practicable; - - b. indicate if You modified the Licensed Material and - retain an indication of any previous modifications; and - - c. indicate the Licensed Material is licensed under this - Public License, and include the text of, or the URI or - hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any - reasonable manner based on the medium, means, and context in - which You Share the Licensed Material. For example, it may be - reasonable to satisfy the conditions by providing a URI or - hyperlink to a resource that includes the required - information. - - 3. If requested by the Licensor, You must remove any of the - information required by Section 3(a)(1)(A) to the extent - reasonably practicable. - - b. ShareAlike. - - In addition to the conditions in Section 3(a), if You Share - Adapted Material You produce, the following conditions also apply. - - 1. The Adapter's License You apply must be a Creative Commons - license with the same License Elements, this version or - later, or a BY-SA Compatible License. - - 2. You must include the text of, or the URI or hyperlink to, the - Adapter's License You apply. You may satisfy this condition - in any reasonable manner based on the medium, means, and - context in which You Share Adapted Material. - - 3. You may not offer or impose any additional or different terms - or conditions on, or apply any Effective Technological - Measures to, Adapted Material that restrict exercise of the - rights granted under the Adapter's License You apply. - - -Section 4 -- Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that -apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right - to extract, reuse, reproduce, and Share all or a substantial - portion of the contents of the database; - - b. if You include all or a substantial portion of the database - contents in a database in which You have Sui Generis Database - Rights, then the database in which You have Sui Generis Database - Rights (but not its individual contents) is Adapted Material, - - including for purposes of Section 3(b); and - c. You must comply with the conditions in Section 3(a) if You Share - all or a substantial portion of the contents of the database. - -For the avoidance of doubt, this Section 4 supplements and does not -replace Your obligations under this Public License where the Licensed -Rights include other Copyright and Similar Rights. - - -Section 5 -- Disclaimer of Warranties and Limitation of Liability. - - a. UNLESS OTHERWISE SEPARATELY UNDERTAKEN BY THE LICENSOR, TO THE - EXTENT POSSIBLE, THE LICENSOR OFFERS THE LICENSED MATERIAL AS-IS - AND AS-AVAILABLE, AND MAKES NO REPRESENTATIONS OR WARRANTIES OF - ANY KIND CONCERNING THE LICENSED MATERIAL, WHETHER EXPRESS, - IMPLIED, STATUTORY, OR OTHER. THIS INCLUDES, WITHOUT LIMITATION, - WARRANTIES OF TITLE, MERCHANTABILITY, FITNESS FOR A PARTICULAR - PURPOSE, NON-INFRINGEMENT, ABSENCE OF LATENT OR OTHER DEFECTS, - ACCURACY, OR THE PRESENCE OR ABSENCE OF ERRORS, WHETHER OR NOT - KNOWN OR DISCOVERABLE. WHERE DISCLAIMERS OF WARRANTIES ARE NOT - ALLOWED IN FULL OR IN PART, THIS DISCLAIMER MAY NOT APPLY TO YOU. - - b. TO THE EXTENT POSSIBLE, IN NO EVENT WILL THE LICENSOR BE LIABLE - TO YOU ON ANY LEGAL THEORY (INCLUDING, WITHOUT LIMITATION, - NEGLIGENCE) OR OTHERWISE FOR ANY DIRECT, SPECIAL, INDIRECT, - INCIDENTAL, CONSEQUENTIAL, PUNITIVE, EXEMPLARY, OR OTHER LOSSES, - COSTS, EXPENSES, OR DAMAGES ARISING OUT OF THIS PUBLIC LICENSE OR - USE OF THE LICENSED MATERIAL, EVEN IF THE LICENSOR HAS BEEN - ADVISED OF THE POSSIBILITY OF SUCH LOSSES, COSTS, EXPENSES, OR - DAMAGES. WHERE A LIMITATION OF LIABILITY IS NOT ALLOWED IN FULL OR - IN PART, THIS LIMITATION MAY NOT APPLY TO YOU. - - c. The disclaimer of warranties and limitation of liability provided - above shall be interpreted in a manner that, to the extent - possible, most closely approximates an absolute disclaimer and - waiver of all liability. - - -Section 6 -- Term and Termination. - - a. This Public License applies for the term of the Copyright and - Similar Rights licensed here. However, if You fail to comply with - this Public License, then Your rights under this Public License - terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under - Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided - it is cured within 30 days of Your discovery of the - violation; or - - 2. upon express reinstatement by the Licensor. - - For the avoidance of doubt, this Section 6(b) does not affect any - right the Licensor may have to seek remedies for Your violations - of this Public License. - - c. For the avoidance of doubt, the Licensor may also offer the - Licensed Material under separate terms or conditions or stop - distributing the Licensed Material at any time; however, doing so - will not terminate this Public License. - - d. Sections 1, 5, 6, 7, and 8 survive termination of this Public - License. - - -Section 7 -- Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different - terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the - Licensed Material not stated herein are separate from and - independent of the terms and conditions of this Public License. - - -Section 8 -- Interpretation. - - a. For the avoidance of doubt, this Public License does not, and - shall not be interpreted to, reduce, limit, restrict, or impose - conditions on any use of the Licensed Material that could lawfully - be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is - deemed unenforceable, it shall be automatically reformed to the - minimum extent necessary to make it enforceable. If the provision - cannot be reformed, it shall be severed from this Public License - without affecting the enforceability of the remaining terms and - conditions. - - c. No term or condition of this Public License will be waived and no - failure to comply consented to unless expressly agreed to by the - Licensor. - - d. Nothing in this Public License constitutes or may be interpreted - as a limitation upon, or waiver of, any privileges and immunities - that apply to the Licensor or You, including from the legal - processes of any jurisdiction or authority. - - -======================================================================= - -Creative Commons is not a party to its public licenses. -Notwithstanding, Creative Commons may elect to apply one of its public -licenses to material it publishes and in those instances will be -considered the "Licensor." Except for the limited purpose of indicating -that material is shared under a Creative Commons public license or as -otherwise permitted by the Creative Commons policies published at -creativecommons.org/policies, Creative Commons does not authorize the -use of the trademark "Creative Commons" or any other trademark or logo -of Creative Commons without its prior written consent including, -without limitation, in connection with any unauthorized modifications -to any of its public licenses or any other arrangements, -understandings, or agreements concerning use of licensed material. For -the avoidance of doubt, this paragraph does not form part of the public -licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/vendor/github.com/docker/spdystream/MAINTAINERS b/vendor/github.com/docker/spdystream/MAINTAINERS deleted file mode 100644 index 14e2633..0000000 --- a/vendor/github.com/docker/spdystream/MAINTAINERS +++ /dev/null @@ -1,28 +0,0 @@ -# Spdystream maintainers file -# -# This file describes who runs the docker/spdystream project and how. -# This is a living document - if you see something out of date or missing, speak up! -# -# It is structured to be consumable by both humans and programs. -# To extract its contents programmatically, use any TOML-compliant parser. -# -# This file is compiled into the MAINTAINERS file in docker/opensource. -# -[Org] - [Org."Core maintainers"] - people = [ - "dmcgowan", - ] - -[people] - -# A reference list of all people associated with the project. -# All other sections should refer to people by their canonical key -# in the people section. - - # ADD YOURSELF HERE IN ALPHABETICAL ORDER - - [people.dmcgowan] - Name = "Derek McGowan" - Email = "derek@docker.com" - GitHub = "dmcgowan" diff --git a/vendor/github.com/docker/spdystream/README.md b/vendor/github.com/docker/spdystream/README.md deleted file mode 100644 index 11cccd0..0000000 --- a/vendor/github.com/docker/spdystream/README.md +++ /dev/null @@ -1,77 +0,0 @@ -# SpdyStream - -A multiplexed stream library using spdy - -## Usage - -Client example (connecting to mirroring server without auth) - -```go -package main - -import ( - "fmt" - "github.com/docker/spdystream" - "net" - "net/http" -) - -func main() { - conn, err := net.Dial("tcp", "localhost:8080") - if err != nil { - panic(err) - } - spdyConn, err := spdystream.NewConnection(conn, false) - if err != nil { - panic(err) - } - go spdyConn.Serve(spdystream.NoOpStreamHandler) - stream, err := spdyConn.CreateStream(http.Header{}, nil, false) - if err != nil { - panic(err) - } - - stream.Wait() - - fmt.Fprint(stream, "Writing to stream") - - buf := make([]byte, 25) - stream.Read(buf) - fmt.Println(string(buf)) - - stream.Close() -} -``` - -Server example (mirroring server without auth) - -```go -package main - -import ( - "github.com/docker/spdystream" - "net" -) - -func main() { - listener, err := net.Listen("tcp", "localhost:8080") - if err != nil { - panic(err) - } - for { - conn, err := listener.Accept() - if err != nil { - panic(err) - } - spdyConn, err := spdystream.NewConnection(conn, true) - if err != nil { - panic(err) - } - go spdyConn.Serve(spdystream.MirrorStreamHandler) - } -} -``` - -## Copyright and license - -Copyright © 2014-2015 Docker, Inc. All rights reserved, except as follows. Code is released under the Apache 2.0 license. The README.md file, and files in the "docs" folder are licensed under the Creative Commons Attribution 4.0 International License under the terms and conditions set forth in the file "LICENSE.docs". You may obtain a duplicate copy of the same license, titled CC-BY-SA-4.0, at http://creativecommons.org/licenses/by/4.0/. diff --git a/vendor/github.com/docker/spdystream/connection.go b/vendor/github.com/docker/spdystream/connection.go deleted file mode 100644 index 6031a0d..0000000 --- a/vendor/github.com/docker/spdystream/connection.go +++ /dev/null @@ -1,958 +0,0 @@ -package spdystream - -import ( - "errors" - "fmt" - "io" - "net" - "net/http" - "sync" - "time" - - "github.com/docker/spdystream/spdy" -) - -var ( - ErrInvalidStreamId = errors.New("Invalid stream id") - ErrTimeout = errors.New("Timeout occured") - ErrReset = errors.New("Stream reset") - ErrWriteClosedStream = errors.New("Write on closed stream") -) - -const ( - FRAME_WORKERS = 5 - QUEUE_SIZE = 50 -) - -type StreamHandler func(stream *Stream) - -type AuthHandler func(header http.Header, slot uint8, parent uint32) bool - -type idleAwareFramer struct { - f *spdy.Framer - conn *Connection - writeLock sync.Mutex - resetChan chan struct{} - setTimeoutLock sync.Mutex - setTimeoutChan chan time.Duration - timeout time.Duration -} - -func newIdleAwareFramer(framer *spdy.Framer) *idleAwareFramer { - iaf := &idleAwareFramer{ - f: framer, - resetChan: make(chan struct{}, 2), - // setTimeoutChan needs to be buffered to avoid deadlocks when calling setIdleTimeout at about - // the same time the connection is being closed - setTimeoutChan: make(chan time.Duration, 1), - } - return iaf -} - -func (i *idleAwareFramer) monitor() { - var ( - timer *time.Timer - expired <-chan time.Time - resetChan = i.resetChan - setTimeoutChan = i.setTimeoutChan - ) -Loop: - for { - select { - case timeout := <-i.setTimeoutChan: - i.timeout = timeout - if timeout == 0 { - if timer != nil { - timer.Stop() - } - } else { - if timer == nil { - timer = time.NewTimer(timeout) - expired = timer.C - } else { - timer.Reset(timeout) - } - } - case <-resetChan: - if timer != nil && i.timeout > 0 { - timer.Reset(i.timeout) - } - case <-expired: - i.conn.streamCond.L.Lock() - streams := i.conn.streams - i.conn.streams = make(map[spdy.StreamId]*Stream) - i.conn.streamCond.Broadcast() - i.conn.streamCond.L.Unlock() - go func() { - for _, stream := range streams { - stream.resetStream() - } - i.conn.Close() - }() - case <-i.conn.closeChan: - if timer != nil { - timer.Stop() - } - - // Start a goroutine to drain resetChan. This is needed because we've seen - // some unit tests with large numbers of goroutines get into a situation - // where resetChan fills up, at least 1 call to Write() is still trying to - // send to resetChan, the connection gets closed, and this case statement - // attempts to grab the write lock that Write() already has, causing a - // deadlock. - // - // See https://github.com/docker/spdystream/issues/49 for more details. - go func() { - for _ = range resetChan { - } - }() - - go func() { - for _ = range setTimeoutChan { - } - }() - - i.writeLock.Lock() - close(resetChan) - i.resetChan = nil - i.writeLock.Unlock() - - i.setTimeoutLock.Lock() - close(i.setTimeoutChan) - i.setTimeoutChan = nil - i.setTimeoutLock.Unlock() - - break Loop - } - } - - // Drain resetChan - for _ = range resetChan { - } -} - -func (i *idleAwareFramer) WriteFrame(frame spdy.Frame) error { - i.writeLock.Lock() - defer i.writeLock.Unlock() - if i.resetChan == nil { - return io.EOF - } - err := i.f.WriteFrame(frame) - if err != nil { - return err - } - - i.resetChan <- struct{}{} - - return nil -} - -func (i *idleAwareFramer) ReadFrame() (spdy.Frame, error) { - frame, err := i.f.ReadFrame() - if err != nil { - return nil, err - } - - // resetChan should never be closed since it is only closed - // when the connection has closed its closeChan. This closure - // only occurs after all Reads have finished - // TODO (dmcgowan): refactor relationship into connection - i.resetChan <- struct{}{} - - return frame, nil -} - -func (i *idleAwareFramer) setIdleTimeout(timeout time.Duration) { - i.setTimeoutLock.Lock() - defer i.setTimeoutLock.Unlock() - - if i.setTimeoutChan == nil { - return - } - - i.setTimeoutChan <- timeout -} - -type Connection struct { - conn net.Conn - framer *idleAwareFramer - - closeChan chan bool - goneAway bool - lastStreamChan chan<- *Stream - goAwayTimeout time.Duration - closeTimeout time.Duration - - streamLock *sync.RWMutex - streamCond *sync.Cond - streams map[spdy.StreamId]*Stream - - nextIdLock sync.Mutex - receiveIdLock sync.Mutex - nextStreamId spdy.StreamId - receivedStreamId spdy.StreamId - - pingIdLock sync.Mutex - pingId uint32 - pingChans map[uint32]chan error - - shutdownLock sync.Mutex - shutdownChan chan error - hasShutdown bool - - // for testing https://github.com/docker/spdystream/pull/56 - dataFrameHandler func(*spdy.DataFrame) error -} - -// NewConnection creates a new spdy connection from an existing -// network connection. -func NewConnection(conn net.Conn, server bool) (*Connection, error) { - framer, framerErr := spdy.NewFramer(conn, conn) - if framerErr != nil { - return nil, framerErr - } - idleAwareFramer := newIdleAwareFramer(framer) - var sid spdy.StreamId - var rid spdy.StreamId - var pid uint32 - if server { - sid = 2 - rid = 1 - pid = 2 - } else { - sid = 1 - rid = 2 - pid = 1 - } - - streamLock := new(sync.RWMutex) - streamCond := sync.NewCond(streamLock) - - session := &Connection{ - conn: conn, - framer: idleAwareFramer, - - closeChan: make(chan bool), - goAwayTimeout: time.Duration(0), - closeTimeout: time.Duration(0), - - streamLock: streamLock, - streamCond: streamCond, - streams: make(map[spdy.StreamId]*Stream), - nextStreamId: sid, - receivedStreamId: rid, - - pingId: pid, - pingChans: make(map[uint32]chan error), - - shutdownChan: make(chan error), - } - session.dataFrameHandler = session.handleDataFrame - idleAwareFramer.conn = session - go idleAwareFramer.monitor() - - return session, nil -} - -// Ping sends a ping frame across the connection and -// returns the response time -func (s *Connection) Ping() (time.Duration, error) { - pid := s.pingId - s.pingIdLock.Lock() - if s.pingId > 0x7ffffffe { - s.pingId = s.pingId - 0x7ffffffe - } else { - s.pingId = s.pingId + 2 - } - s.pingIdLock.Unlock() - pingChan := make(chan error) - s.pingChans[pid] = pingChan - defer delete(s.pingChans, pid) - - frame := &spdy.PingFrame{Id: pid} - startTime := time.Now() - writeErr := s.framer.WriteFrame(frame) - if writeErr != nil { - return time.Duration(0), writeErr - } - select { - case <-s.closeChan: - return time.Duration(0), errors.New("connection closed") - case err, ok := <-pingChan: - if ok && err != nil { - return time.Duration(0), err - } - break - } - return time.Now().Sub(startTime), nil -} - -// Serve handles frames sent from the server, including reply frames -// which are needed to fully initiate connections. Both clients and servers -// should call Serve in a separate goroutine before creating streams. -func (s *Connection) Serve(newHandler StreamHandler) { - // use a WaitGroup to wait for all frames to be drained after receiving - // go-away. - var wg sync.WaitGroup - - // Parition queues to ensure stream frames are handled - // by the same worker, ensuring order is maintained - frameQueues := make([]*PriorityFrameQueue, FRAME_WORKERS) - for i := 0; i < FRAME_WORKERS; i++ { - frameQueues[i] = NewPriorityFrameQueue(QUEUE_SIZE) - - // Ensure frame queue is drained when connection is closed - go func(frameQueue *PriorityFrameQueue) { - <-s.closeChan - frameQueue.Drain() - }(frameQueues[i]) - - wg.Add(1) - go func(frameQueue *PriorityFrameQueue) { - // let the WaitGroup know this worker is done - defer wg.Done() - - s.frameHandler(frameQueue, newHandler) - }(frameQueues[i]) - } - - var ( - partitionRoundRobin int - goAwayFrame *spdy.GoAwayFrame - ) -Loop: - for { - readFrame, err := s.framer.ReadFrame() - if err != nil { - if err != io.EOF { - fmt.Errorf("frame read error: %s", err) - } else { - debugMessage("(%p) EOF received", s) - } - break - } - var priority uint8 - var partition int - switch frame := readFrame.(type) { - case *spdy.SynStreamFrame: - if s.checkStreamFrame(frame) { - priority = frame.Priority - partition = int(frame.StreamId % FRAME_WORKERS) - debugMessage("(%p) Add stream frame: %d ", s, frame.StreamId) - s.addStreamFrame(frame) - } else { - debugMessage("(%p) Rejected stream frame: %d ", s, frame.StreamId) - continue - } - case *spdy.SynReplyFrame: - priority = s.getStreamPriority(frame.StreamId) - partition = int(frame.StreamId % FRAME_WORKERS) - case *spdy.DataFrame: - priority = s.getStreamPriority(frame.StreamId) - partition = int(frame.StreamId % FRAME_WORKERS) - case *spdy.RstStreamFrame: - priority = s.getStreamPriority(frame.StreamId) - partition = int(frame.StreamId % FRAME_WORKERS) - case *spdy.HeadersFrame: - priority = s.getStreamPriority(frame.StreamId) - partition = int(frame.StreamId % FRAME_WORKERS) - case *spdy.PingFrame: - priority = 0 - partition = partitionRoundRobin - partitionRoundRobin = (partitionRoundRobin + 1) % FRAME_WORKERS - case *spdy.GoAwayFrame: - // hold on to the go away frame and exit the loop - goAwayFrame = frame - break Loop - default: - priority = 7 - partition = partitionRoundRobin - partitionRoundRobin = (partitionRoundRobin + 1) % FRAME_WORKERS - } - frameQueues[partition].Push(readFrame, priority) - } - close(s.closeChan) - - // wait for all frame handler workers to indicate they've drained their queues - // before handling the go away frame - wg.Wait() - - if goAwayFrame != nil { - s.handleGoAwayFrame(goAwayFrame) - } - - // now it's safe to close remote channels and empty s.streams - s.streamCond.L.Lock() - // notify streams that they're now closed, which will - // unblock any stream Read() calls - for _, stream := range s.streams { - stream.closeRemoteChannels() - } - s.streams = make(map[spdy.StreamId]*Stream) - s.streamCond.Broadcast() - s.streamCond.L.Unlock() -} - -func (s *Connection) frameHandler(frameQueue *PriorityFrameQueue, newHandler StreamHandler) { - for { - popFrame := frameQueue.Pop() - if popFrame == nil { - return - } - - var frameErr error - switch frame := popFrame.(type) { - case *spdy.SynStreamFrame: - frameErr = s.handleStreamFrame(frame, newHandler) - case *spdy.SynReplyFrame: - frameErr = s.handleReplyFrame(frame) - case *spdy.DataFrame: - frameErr = s.dataFrameHandler(frame) - case *spdy.RstStreamFrame: - frameErr = s.handleResetFrame(frame) - case *spdy.HeadersFrame: - frameErr = s.handleHeaderFrame(frame) - case *spdy.PingFrame: - frameErr = s.handlePingFrame(frame) - case *spdy.GoAwayFrame: - frameErr = s.handleGoAwayFrame(frame) - default: - frameErr = fmt.Errorf("unhandled frame type: %T", frame) - } - - if frameErr != nil { - fmt.Errorf("frame handling error: %s", frameErr) - } - } -} - -func (s *Connection) getStreamPriority(streamId spdy.StreamId) uint8 { - stream, streamOk := s.getStream(streamId) - if !streamOk { - return 7 - } - return stream.priority -} - -func (s *Connection) addStreamFrame(frame *spdy.SynStreamFrame) { - var parent *Stream - if frame.AssociatedToStreamId != spdy.StreamId(0) { - parent, _ = s.getStream(frame.AssociatedToStreamId) - } - - stream := &Stream{ - streamId: frame.StreamId, - parent: parent, - conn: s, - startChan: make(chan error), - headers: frame.Headers, - finished: (frame.CFHeader.Flags & spdy.ControlFlagUnidirectional) != 0x00, - replyCond: sync.NewCond(new(sync.Mutex)), - dataChan: make(chan []byte), - headerChan: make(chan http.Header), - closeChan: make(chan bool), - } - if frame.CFHeader.Flags&spdy.ControlFlagFin != 0x00 { - stream.closeRemoteChannels() - } - - s.addStream(stream) -} - -// checkStreamFrame checks to see if a stream frame is allowed. -// If the stream is invalid, then a reset frame with protocol error -// will be returned. -func (s *Connection) checkStreamFrame(frame *spdy.SynStreamFrame) bool { - s.receiveIdLock.Lock() - defer s.receiveIdLock.Unlock() - if s.goneAway { - return false - } - validationErr := s.validateStreamId(frame.StreamId) - if validationErr != nil { - go func() { - resetErr := s.sendResetFrame(spdy.ProtocolError, frame.StreamId) - if resetErr != nil { - fmt.Errorf("reset error: %s", resetErr) - } - }() - return false - } - return true -} - -func (s *Connection) handleStreamFrame(frame *spdy.SynStreamFrame, newHandler StreamHandler) error { - stream, ok := s.getStream(frame.StreamId) - if !ok { - return fmt.Errorf("Missing stream: %d", frame.StreamId) - } - - newHandler(stream) - - return nil -} - -func (s *Connection) handleReplyFrame(frame *spdy.SynReplyFrame) error { - debugMessage("(%p) Reply frame received for %d", s, frame.StreamId) - stream, streamOk := s.getStream(frame.StreamId) - if !streamOk { - debugMessage("Reply frame gone away for %d", frame.StreamId) - // Stream has already gone away - return nil - } - if stream.replied { - // Stream has already received reply - return nil - } - stream.replied = true - - // TODO Check for error - if (frame.CFHeader.Flags & spdy.ControlFlagFin) != 0x00 { - s.remoteStreamFinish(stream) - } - - close(stream.startChan) - - return nil -} - -func (s *Connection) handleResetFrame(frame *spdy.RstStreamFrame) error { - stream, streamOk := s.getStream(frame.StreamId) - if !streamOk { - // Stream has already been removed - return nil - } - s.removeStream(stream) - stream.closeRemoteChannels() - - if !stream.replied { - stream.replied = true - stream.startChan <- ErrReset - close(stream.startChan) - } - - stream.finishLock.Lock() - stream.finished = true - stream.finishLock.Unlock() - - return nil -} - -func (s *Connection) handleHeaderFrame(frame *spdy.HeadersFrame) error { - stream, streamOk := s.getStream(frame.StreamId) - if !streamOk { - // Stream has already gone away - return nil - } - if !stream.replied { - // No reply received...Protocol error? - return nil - } - - // TODO limit headers while not blocking (use buffered chan or goroutine?) - select { - case <-stream.closeChan: - return nil - case stream.headerChan <- frame.Headers: - } - - if (frame.CFHeader.Flags & spdy.ControlFlagFin) != 0x00 { - s.remoteStreamFinish(stream) - } - - return nil -} - -func (s *Connection) handleDataFrame(frame *spdy.DataFrame) error { - debugMessage("(%p) Data frame received for %d", s, frame.StreamId) - stream, streamOk := s.getStream(frame.StreamId) - if !streamOk { - debugMessage("(%p) Data frame gone away for %d", s, frame.StreamId) - // Stream has already gone away - return nil - } - if !stream.replied { - debugMessage("(%p) Data frame not replied %d", s, frame.StreamId) - // No reply received...Protocol error? - return nil - } - - debugMessage("(%p) (%d) Data frame handling", stream, stream.streamId) - if len(frame.Data) > 0 { - stream.dataLock.RLock() - select { - case <-stream.closeChan: - debugMessage("(%p) (%d) Data frame not sent (stream shut down)", stream, stream.streamId) - case stream.dataChan <- frame.Data: - debugMessage("(%p) (%d) Data frame sent", stream, stream.streamId) - } - stream.dataLock.RUnlock() - } - if (frame.Flags & spdy.DataFlagFin) != 0x00 { - s.remoteStreamFinish(stream) - } - return nil -} - -func (s *Connection) handlePingFrame(frame *spdy.PingFrame) error { - if s.pingId&0x01 != frame.Id&0x01 { - return s.framer.WriteFrame(frame) - } - pingChan, pingOk := s.pingChans[frame.Id] - if pingOk { - close(pingChan) - } - return nil -} - -func (s *Connection) handleGoAwayFrame(frame *spdy.GoAwayFrame) error { - debugMessage("(%p) Go away received", s) - s.receiveIdLock.Lock() - if s.goneAway { - s.receiveIdLock.Unlock() - return nil - } - s.goneAway = true - s.receiveIdLock.Unlock() - - if s.lastStreamChan != nil { - stream, _ := s.getStream(frame.LastGoodStreamId) - go func() { - s.lastStreamChan <- stream - }() - } - - // Do not block frame handler waiting for closure - go s.shutdown(s.goAwayTimeout) - - return nil -} - -func (s *Connection) remoteStreamFinish(stream *Stream) { - stream.closeRemoteChannels() - - stream.finishLock.Lock() - if stream.finished { - // Stream is fully closed, cleanup - s.removeStream(stream) - } - stream.finishLock.Unlock() -} - -// CreateStream creates a new spdy stream using the parameters for -// creating the stream frame. The stream frame will be sent upon -// calling this function, however this function does not wait for -// the reply frame. If waiting for the reply is desired, use -// the stream Wait or WaitTimeout function on the stream returned -// by this function. -func (s *Connection) CreateStream(headers http.Header, parent *Stream, fin bool) (*Stream, error) { - // MUST synchronize stream creation (all the way to writing the frame) - // as stream IDs **MUST** increase monotonically. - s.nextIdLock.Lock() - defer s.nextIdLock.Unlock() - - streamId := s.getNextStreamId() - if streamId == 0 { - return nil, fmt.Errorf("Unable to get new stream id") - } - - stream := &Stream{ - streamId: streamId, - parent: parent, - conn: s, - startChan: make(chan error), - headers: headers, - dataChan: make(chan []byte), - headerChan: make(chan http.Header), - closeChan: make(chan bool), - } - - debugMessage("(%p) (%p) Create stream", s, stream) - - s.addStream(stream) - - return stream, s.sendStream(stream, fin) -} - -func (s *Connection) shutdown(closeTimeout time.Duration) { - // TODO Ensure this isn't called multiple times - s.shutdownLock.Lock() - if s.hasShutdown { - s.shutdownLock.Unlock() - return - } - s.hasShutdown = true - s.shutdownLock.Unlock() - - var timeout <-chan time.Time - if closeTimeout > time.Duration(0) { - timeout = time.After(closeTimeout) - } - streamsClosed := make(chan bool) - - go func() { - s.streamCond.L.Lock() - for len(s.streams) > 0 { - debugMessage("Streams opened: %d, %#v", len(s.streams), s.streams) - s.streamCond.Wait() - } - s.streamCond.L.Unlock() - close(streamsClosed) - }() - - var err error - select { - case <-streamsClosed: - // No active streams, close should be safe - err = s.conn.Close() - case <-timeout: - // Force ungraceful close - err = s.conn.Close() - // Wait for cleanup to clear active streams - <-streamsClosed - } - - if err != nil { - duration := 10 * time.Minute - time.AfterFunc(duration, func() { - select { - case err, ok := <-s.shutdownChan: - if ok { - fmt.Errorf("Unhandled close error after %s: %s", duration, err) - } - default: - } - }) - s.shutdownChan <- err - } - close(s.shutdownChan) - - return -} - -// Closes spdy connection by sending GoAway frame and initiating shutdown -func (s *Connection) Close() error { - s.receiveIdLock.Lock() - if s.goneAway { - s.receiveIdLock.Unlock() - return nil - } - s.goneAway = true - s.receiveIdLock.Unlock() - - var lastStreamId spdy.StreamId - if s.receivedStreamId > 2 { - lastStreamId = s.receivedStreamId - 2 - } - - goAwayFrame := &spdy.GoAwayFrame{ - LastGoodStreamId: lastStreamId, - Status: spdy.GoAwayOK, - } - - err := s.framer.WriteFrame(goAwayFrame) - if err != nil { - return err - } - - go s.shutdown(s.closeTimeout) - - return nil -} - -// CloseWait closes the connection and waits for shutdown -// to finish. Note the underlying network Connection -// is not closed until the end of shutdown. -func (s *Connection) CloseWait() error { - closeErr := s.Close() - if closeErr != nil { - return closeErr - } - shutdownErr, ok := <-s.shutdownChan - if ok { - return shutdownErr - } - return nil -} - -// Wait waits for the connection to finish shutdown or for -// the wait timeout duration to expire. This needs to be -// called either after Close has been called or the GOAWAYFRAME -// has been received. If the wait timeout is 0, this function -// will block until shutdown finishes. If wait is never called -// and a shutdown error occurs, that error will be logged as an -// unhandled error. -func (s *Connection) Wait(waitTimeout time.Duration) error { - var timeout <-chan time.Time - if waitTimeout > time.Duration(0) { - timeout = time.After(waitTimeout) - } - - select { - case err, ok := <-s.shutdownChan: - if ok { - return err - } - case <-timeout: - return ErrTimeout - } - return nil -} - -// NotifyClose registers a channel to be called when the remote -// peer inidicates connection closure. The last stream to be -// received by the remote will be sent on the channel. The notify -// timeout will determine the duration between go away received -// and the connection being closed. -func (s *Connection) NotifyClose(c chan<- *Stream, timeout time.Duration) { - s.goAwayTimeout = timeout - s.lastStreamChan = c -} - -// SetCloseTimeout sets the amount of time close will wait for -// streams to finish before terminating the underlying network -// connection. Setting the timeout to 0 will cause close to -// wait forever, which is the default. -func (s *Connection) SetCloseTimeout(timeout time.Duration) { - s.closeTimeout = timeout -} - -// SetIdleTimeout sets the amount of time the connection may sit idle before -// it is forcefully terminated. -func (s *Connection) SetIdleTimeout(timeout time.Duration) { - s.framer.setIdleTimeout(timeout) -} - -func (s *Connection) sendHeaders(headers http.Header, stream *Stream, fin bool) error { - var flags spdy.ControlFlags - if fin { - flags = spdy.ControlFlagFin - } - - headerFrame := &spdy.HeadersFrame{ - StreamId: stream.streamId, - Headers: headers, - CFHeader: spdy.ControlFrameHeader{Flags: flags}, - } - - return s.framer.WriteFrame(headerFrame) -} - -func (s *Connection) sendReply(headers http.Header, stream *Stream, fin bool) error { - var flags spdy.ControlFlags - if fin { - flags = spdy.ControlFlagFin - } - - replyFrame := &spdy.SynReplyFrame{ - StreamId: stream.streamId, - Headers: headers, - CFHeader: spdy.ControlFrameHeader{Flags: flags}, - } - - return s.framer.WriteFrame(replyFrame) -} - -func (s *Connection) sendResetFrame(status spdy.RstStreamStatus, streamId spdy.StreamId) error { - resetFrame := &spdy.RstStreamFrame{ - StreamId: streamId, - Status: status, - } - - return s.framer.WriteFrame(resetFrame) -} - -func (s *Connection) sendReset(status spdy.RstStreamStatus, stream *Stream) error { - return s.sendResetFrame(status, stream.streamId) -} - -func (s *Connection) sendStream(stream *Stream, fin bool) error { - var flags spdy.ControlFlags - if fin { - flags = spdy.ControlFlagFin - stream.finished = true - } - - var parentId spdy.StreamId - if stream.parent != nil { - parentId = stream.parent.streamId - } - - streamFrame := &spdy.SynStreamFrame{ - StreamId: spdy.StreamId(stream.streamId), - AssociatedToStreamId: spdy.StreamId(parentId), - Headers: stream.headers, - CFHeader: spdy.ControlFrameHeader{Flags: flags}, - } - - return s.framer.WriteFrame(streamFrame) -} - -// getNextStreamId returns the next sequential id -// every call should produce a unique value or an error -func (s *Connection) getNextStreamId() spdy.StreamId { - sid := s.nextStreamId - if sid > 0x7fffffff { - return 0 - } - s.nextStreamId = s.nextStreamId + 2 - return sid -} - -// PeekNextStreamId returns the next sequential id and keeps the next id untouched -func (s *Connection) PeekNextStreamId() spdy.StreamId { - sid := s.nextStreamId - return sid -} - -func (s *Connection) validateStreamId(rid spdy.StreamId) error { - if rid > 0x7fffffff || rid < s.receivedStreamId { - return ErrInvalidStreamId - } - s.receivedStreamId = rid + 2 - return nil -} - -func (s *Connection) addStream(stream *Stream) { - s.streamCond.L.Lock() - s.streams[stream.streamId] = stream - debugMessage("(%p) (%p) Stream added, broadcasting: %d", s, stream, stream.streamId) - s.streamCond.Broadcast() - s.streamCond.L.Unlock() -} - -func (s *Connection) removeStream(stream *Stream) { - s.streamCond.L.Lock() - delete(s.streams, stream.streamId) - debugMessage("(%p) (%p) Stream removed, broadcasting: %d", s, stream, stream.streamId) - s.streamCond.Broadcast() - s.streamCond.L.Unlock() -} - -func (s *Connection) getStream(streamId spdy.StreamId) (stream *Stream, ok bool) { - s.streamLock.RLock() - stream, ok = s.streams[streamId] - s.streamLock.RUnlock() - return -} - -// FindStream looks up the given stream id and either waits for the -// stream to be found or returns nil if the stream id is no longer -// valid. -func (s *Connection) FindStream(streamId uint32) *Stream { - var stream *Stream - var ok bool - s.streamCond.L.Lock() - stream, ok = s.streams[spdy.StreamId(streamId)] - debugMessage("(%p) Found stream %d? %t", s, spdy.StreamId(streamId), ok) - for !ok && streamId >= uint32(s.receivedStreamId) { - s.streamCond.Wait() - stream, ok = s.streams[spdy.StreamId(streamId)] - } - s.streamCond.L.Unlock() - return stream -} - -func (s *Connection) CloseChan() <-chan bool { - return s.closeChan -} diff --git a/vendor/github.com/docker/spdystream/handlers.go b/vendor/github.com/docker/spdystream/handlers.go deleted file mode 100644 index b59fa5f..0000000 --- a/vendor/github.com/docker/spdystream/handlers.go +++ /dev/null @@ -1,38 +0,0 @@ -package spdystream - -import ( - "io" - "net/http" -) - -// MirrorStreamHandler mirrors all streams. -func MirrorStreamHandler(stream *Stream) { - replyErr := stream.SendReply(http.Header{}, false) - if replyErr != nil { - return - } - - go func() { - io.Copy(stream, stream) - stream.Close() - }() - go func() { - for { - header, receiveErr := stream.ReceiveHeader() - if receiveErr != nil { - return - } - sendErr := stream.SendHeader(header, false) - if sendErr != nil { - return - } - } - }() -} - -// NoopStreamHandler does nothing when stream connects, most -// likely used with RejectAuthHandler which will not allow any -// streams to make it to the stream handler. -func NoOpStreamHandler(stream *Stream) { - stream.SendReply(http.Header{}, false) -} diff --git a/vendor/github.com/docker/spdystream/priority.go b/vendor/github.com/docker/spdystream/priority.go deleted file mode 100644 index fc8582b..0000000 --- a/vendor/github.com/docker/spdystream/priority.go +++ /dev/null @@ -1,98 +0,0 @@ -package spdystream - -import ( - "container/heap" - "sync" - - "github.com/docker/spdystream/spdy" -) - -type prioritizedFrame struct { - frame spdy.Frame - priority uint8 - insertId uint64 -} - -type frameQueue []*prioritizedFrame - -func (fq frameQueue) Len() int { - return len(fq) -} - -func (fq frameQueue) Less(i, j int) bool { - if fq[i].priority == fq[j].priority { - return fq[i].insertId < fq[j].insertId - } - return fq[i].priority < fq[j].priority -} - -func (fq frameQueue) Swap(i, j int) { - fq[i], fq[j] = fq[j], fq[i] -} - -func (fq *frameQueue) Push(x interface{}) { - *fq = append(*fq, x.(*prioritizedFrame)) -} - -func (fq *frameQueue) Pop() interface{} { - old := *fq - n := len(old) - *fq = old[0 : n-1] - return old[n-1] -} - -type PriorityFrameQueue struct { - queue *frameQueue - c *sync.Cond - size int - nextInsertId uint64 - drain bool -} - -func NewPriorityFrameQueue(size int) *PriorityFrameQueue { - queue := make(frameQueue, 0, size) - heap.Init(&queue) - - return &PriorityFrameQueue{ - queue: &queue, - size: size, - c: sync.NewCond(&sync.Mutex{}), - } -} - -func (q *PriorityFrameQueue) Push(frame spdy.Frame, priority uint8) { - q.c.L.Lock() - defer q.c.L.Unlock() - for q.queue.Len() >= q.size { - q.c.Wait() - } - pFrame := &prioritizedFrame{ - frame: frame, - priority: priority, - insertId: q.nextInsertId, - } - q.nextInsertId = q.nextInsertId + 1 - heap.Push(q.queue, pFrame) - q.c.Signal() -} - -func (q *PriorityFrameQueue) Pop() spdy.Frame { - q.c.L.Lock() - defer q.c.L.Unlock() - for q.queue.Len() == 0 { - if q.drain { - return nil - } - q.c.Wait() - } - frame := heap.Pop(q.queue).(*prioritizedFrame).frame - q.c.Signal() - return frame -} - -func (q *PriorityFrameQueue) Drain() { - q.c.L.Lock() - defer q.c.L.Unlock() - q.drain = true - q.c.Broadcast() -} diff --git a/vendor/github.com/docker/spdystream/spdy/dictionary.go b/vendor/github.com/docker/spdystream/spdy/dictionary.go deleted file mode 100644 index 5a5ff0e..0000000 --- a/vendor/github.com/docker/spdystream/spdy/dictionary.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package spdy - -// headerDictionary is the dictionary sent to the zlib compressor/decompressor. -var headerDictionary = []byte{ - 0x00, 0x00, 0x00, 0x07, 0x6f, 0x70, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x00, 0x00, 0x00, 0x04, 0x68, - 0x65, 0x61, 0x64, 0x00, 0x00, 0x00, 0x04, 0x70, - 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x03, 0x70, - 0x75, 0x74, 0x00, 0x00, 0x00, 0x06, 0x64, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x00, 0x00, 0x00, 0x05, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x00, 0x00, 0x00, - 0x06, 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x00, - 0x00, 0x00, 0x0e, 0x61, 0x63, 0x63, 0x65, 0x70, - 0x74, 0x2d, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x00, 0x00, 0x00, 0x0f, 0x61, 0x63, 0x63, - 0x65, 0x70, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x0f, - 0x61, 0x63, 0x63, 0x65, 0x70, 0x74, 0x2d, 0x6c, - 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, 0x00, - 0x00, 0x00, 0x0d, 0x61, 0x63, 0x63, 0x65, 0x70, - 0x74, 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x00, 0x00, 0x00, 0x03, 0x61, 0x67, 0x65, 0x00, - 0x00, 0x00, 0x05, 0x61, 0x6c, 0x6c, 0x6f, 0x77, - 0x00, 0x00, 0x00, 0x0d, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x00, 0x00, 0x00, 0x0d, 0x63, 0x61, 0x63, - 0x68, 0x65, 0x2d, 0x63, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x00, 0x00, 0x00, 0x0a, 0x63, 0x6f, - 0x6e, 0x6e, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x00, 0x00, 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x2d, 0x62, 0x61, 0x73, 0x65, - 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x2d, 0x65, 0x6e, 0x63, 0x6f, - 0x64, 0x69, 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, - 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, - 0x6c, 0x61, 0x6e, 0x67, 0x75, 0x61, 0x67, 0x65, - 0x00, 0x00, 0x00, 0x0e, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x65, 0x6e, 0x67, - 0x74, 0x68, 0x00, 0x00, 0x00, 0x10, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x6e, 0x74, 0x2d, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, - 0x00, 0x0b, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x2d, 0x6d, 0x64, 0x35, 0x00, 0x00, 0x00, - 0x0d, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, 0x74, - 0x2d, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, - 0x00, 0x0c, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x6e, - 0x74, 0x2d, 0x74, 0x79, 0x70, 0x65, 0x00, 0x00, - 0x00, 0x04, 0x64, 0x61, 0x74, 0x65, 0x00, 0x00, - 0x00, 0x04, 0x65, 0x74, 0x61, 0x67, 0x00, 0x00, - 0x00, 0x06, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, - 0x00, 0x00, 0x00, 0x07, 0x65, 0x78, 0x70, 0x69, - 0x72, 0x65, 0x73, 0x00, 0x00, 0x00, 0x04, 0x66, - 0x72, 0x6f, 0x6d, 0x00, 0x00, 0x00, 0x04, 0x68, - 0x6f, 0x73, 0x74, 0x00, 0x00, 0x00, 0x08, 0x69, - 0x66, 0x2d, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, - 0x00, 0x00, 0x11, 0x69, 0x66, 0x2d, 0x6d, 0x6f, - 0x64, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2d, 0x73, - 0x69, 0x6e, 0x63, 0x65, 0x00, 0x00, 0x00, 0x0d, - 0x69, 0x66, 0x2d, 0x6e, 0x6f, 0x6e, 0x65, 0x2d, - 0x6d, 0x61, 0x74, 0x63, 0x68, 0x00, 0x00, 0x00, - 0x08, 0x69, 0x66, 0x2d, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x00, 0x00, 0x00, 0x13, 0x69, 0x66, 0x2d, - 0x75, 0x6e, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x2d, 0x73, 0x69, 0x6e, 0x63, 0x65, - 0x00, 0x00, 0x00, 0x0d, 0x6c, 0x61, 0x73, 0x74, - 0x2d, 0x6d, 0x6f, 0x64, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x00, 0x00, 0x00, 0x08, 0x6c, 0x6f, 0x63, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, - 0x0c, 0x6d, 0x61, 0x78, 0x2d, 0x66, 0x6f, 0x72, - 0x77, 0x61, 0x72, 0x64, 0x73, 0x00, 0x00, 0x00, - 0x06, 0x70, 0x72, 0x61, 0x67, 0x6d, 0x61, 0x00, - 0x00, 0x00, 0x12, 0x70, 0x72, 0x6f, 0x78, 0x79, - 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, - 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, 0x00, - 0x13, 0x70, 0x72, 0x6f, 0x78, 0x79, 0x2d, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x00, 0x00, 0x00, 0x05, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x00, 0x00, 0x00, - 0x07, 0x72, 0x65, 0x66, 0x65, 0x72, 0x65, 0x72, - 0x00, 0x00, 0x00, 0x0b, 0x72, 0x65, 0x74, 0x72, - 0x79, 0x2d, 0x61, 0x66, 0x74, 0x65, 0x72, 0x00, - 0x00, 0x00, 0x06, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x00, 0x00, 0x00, 0x02, 0x74, 0x65, 0x00, - 0x00, 0x00, 0x07, 0x74, 0x72, 0x61, 0x69, 0x6c, - 0x65, 0x72, 0x00, 0x00, 0x00, 0x11, 0x74, 0x72, - 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x2d, 0x65, - 0x6e, 0x63, 0x6f, 0x64, 0x69, 0x6e, 0x67, 0x00, - 0x00, 0x00, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x00, 0x00, 0x00, 0x0a, 0x75, 0x73, - 0x65, 0x72, 0x2d, 0x61, 0x67, 0x65, 0x6e, 0x74, - 0x00, 0x00, 0x00, 0x04, 0x76, 0x61, 0x72, 0x79, - 0x00, 0x00, 0x00, 0x03, 0x76, 0x69, 0x61, 0x00, - 0x00, 0x00, 0x07, 0x77, 0x61, 0x72, 0x6e, 0x69, - 0x6e, 0x67, 0x00, 0x00, 0x00, 0x10, 0x77, 0x77, - 0x77, 0x2d, 0x61, 0x75, 0x74, 0x68, 0x65, 0x6e, - 0x74, 0x69, 0x63, 0x61, 0x74, 0x65, 0x00, 0x00, - 0x00, 0x06, 0x6d, 0x65, 0x74, 0x68, 0x6f, 0x64, - 0x00, 0x00, 0x00, 0x03, 0x67, 0x65, 0x74, 0x00, - 0x00, 0x00, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x00, 0x00, 0x00, 0x06, 0x32, 0x30, 0x30, - 0x20, 0x4f, 0x4b, 0x00, 0x00, 0x00, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x00, 0x00, - 0x00, 0x08, 0x48, 0x54, 0x54, 0x50, 0x2f, 0x31, - 0x2e, 0x31, 0x00, 0x00, 0x00, 0x03, 0x75, 0x72, - 0x6c, 0x00, 0x00, 0x00, 0x06, 0x70, 0x75, 0x62, - 0x6c, 0x69, 0x63, 0x00, 0x00, 0x00, 0x0a, 0x73, - 0x65, 0x74, 0x2d, 0x63, 0x6f, 0x6f, 0x6b, 0x69, - 0x65, 0x00, 0x00, 0x00, 0x0a, 0x6b, 0x65, 0x65, - 0x70, 0x2d, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x00, - 0x00, 0x00, 0x06, 0x6f, 0x72, 0x69, 0x67, 0x69, - 0x6e, 0x31, 0x30, 0x30, 0x31, 0x30, 0x31, 0x32, - 0x30, 0x31, 0x32, 0x30, 0x32, 0x32, 0x30, 0x35, - 0x32, 0x30, 0x36, 0x33, 0x30, 0x30, 0x33, 0x30, - 0x32, 0x33, 0x30, 0x33, 0x33, 0x30, 0x34, 0x33, - 0x30, 0x35, 0x33, 0x30, 0x36, 0x33, 0x30, 0x37, - 0x34, 0x30, 0x32, 0x34, 0x30, 0x35, 0x34, 0x30, - 0x36, 0x34, 0x30, 0x37, 0x34, 0x30, 0x38, 0x34, - 0x30, 0x39, 0x34, 0x31, 0x30, 0x34, 0x31, 0x31, - 0x34, 0x31, 0x32, 0x34, 0x31, 0x33, 0x34, 0x31, - 0x34, 0x34, 0x31, 0x35, 0x34, 0x31, 0x36, 0x34, - 0x31, 0x37, 0x35, 0x30, 0x32, 0x35, 0x30, 0x34, - 0x35, 0x30, 0x35, 0x32, 0x30, 0x33, 0x20, 0x4e, - 0x6f, 0x6e, 0x2d, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x74, 0x61, 0x74, 0x69, 0x76, 0x65, - 0x20, 0x49, 0x6e, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x32, 0x30, 0x34, 0x20, - 0x4e, 0x6f, 0x20, 0x43, 0x6f, 0x6e, 0x74, 0x65, - 0x6e, 0x74, 0x33, 0x30, 0x31, 0x20, 0x4d, 0x6f, - 0x76, 0x65, 0x64, 0x20, 0x50, 0x65, 0x72, 0x6d, - 0x61, 0x6e, 0x65, 0x6e, 0x74, 0x6c, 0x79, 0x34, - 0x30, 0x30, 0x20, 0x42, 0x61, 0x64, 0x20, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x34, 0x30, - 0x31, 0x20, 0x55, 0x6e, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x34, 0x30, - 0x33, 0x20, 0x46, 0x6f, 0x72, 0x62, 0x69, 0x64, - 0x64, 0x65, 0x6e, 0x34, 0x30, 0x34, 0x20, 0x4e, - 0x6f, 0x74, 0x20, 0x46, 0x6f, 0x75, 0x6e, 0x64, - 0x35, 0x30, 0x30, 0x20, 0x49, 0x6e, 0x74, 0x65, - 0x72, 0x6e, 0x61, 0x6c, 0x20, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x20, 0x45, 0x72, 0x72, 0x6f, - 0x72, 0x35, 0x30, 0x31, 0x20, 0x4e, 0x6f, 0x74, - 0x20, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65, - 0x6e, 0x74, 0x65, 0x64, 0x35, 0x30, 0x33, 0x20, - 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x20, - 0x55, 0x6e, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, - 0x62, 0x6c, 0x65, 0x4a, 0x61, 0x6e, 0x20, 0x46, - 0x65, 0x62, 0x20, 0x4d, 0x61, 0x72, 0x20, 0x41, - 0x70, 0x72, 0x20, 0x4d, 0x61, 0x79, 0x20, 0x4a, - 0x75, 0x6e, 0x20, 0x4a, 0x75, 0x6c, 0x20, 0x41, - 0x75, 0x67, 0x20, 0x53, 0x65, 0x70, 0x74, 0x20, - 0x4f, 0x63, 0x74, 0x20, 0x4e, 0x6f, 0x76, 0x20, - 0x44, 0x65, 0x63, 0x20, 0x30, 0x30, 0x3a, 0x30, - 0x30, 0x3a, 0x30, 0x30, 0x20, 0x4d, 0x6f, 0x6e, - 0x2c, 0x20, 0x54, 0x75, 0x65, 0x2c, 0x20, 0x57, - 0x65, 0x64, 0x2c, 0x20, 0x54, 0x68, 0x75, 0x2c, - 0x20, 0x46, 0x72, 0x69, 0x2c, 0x20, 0x53, 0x61, - 0x74, 0x2c, 0x20, 0x53, 0x75, 0x6e, 0x2c, 0x20, - 0x47, 0x4d, 0x54, 0x63, 0x68, 0x75, 0x6e, 0x6b, - 0x65, 0x64, 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, - 0x68, 0x74, 0x6d, 0x6c, 0x2c, 0x69, 0x6d, 0x61, - 0x67, 0x65, 0x2f, 0x70, 0x6e, 0x67, 0x2c, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x6a, 0x70, 0x67, - 0x2c, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x2f, 0x67, - 0x69, 0x66, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, - 0x6d, 0x6c, 0x2c, 0x61, 0x70, 0x70, 0x6c, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x78, - 0x68, 0x74, 0x6d, 0x6c, 0x2b, 0x78, 0x6d, 0x6c, - 0x2c, 0x74, 0x65, 0x78, 0x74, 0x2f, 0x70, 0x6c, - 0x61, 0x69, 0x6e, 0x2c, 0x74, 0x65, 0x78, 0x74, - 0x2f, 0x6a, 0x61, 0x76, 0x61, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x2c, 0x70, 0x75, 0x62, 0x6c, - 0x69, 0x63, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x6d, 0x61, 0x78, 0x2d, 0x61, 0x67, 0x65, - 0x3d, 0x67, 0x7a, 0x69, 0x70, 0x2c, 0x64, 0x65, - 0x66, 0x6c, 0x61, 0x74, 0x65, 0x2c, 0x73, 0x64, - 0x63, 0x68, 0x63, 0x68, 0x61, 0x72, 0x73, 0x65, - 0x74, 0x3d, 0x75, 0x74, 0x66, 0x2d, 0x38, 0x63, - 0x68, 0x61, 0x72, 0x73, 0x65, 0x74, 0x3d, 0x69, - 0x73, 0x6f, 0x2d, 0x38, 0x38, 0x35, 0x39, 0x2d, - 0x31, 0x2c, 0x75, 0x74, 0x66, 0x2d, 0x2c, 0x2a, - 0x2c, 0x65, 0x6e, 0x71, 0x3d, 0x30, 0x2e, -} diff --git a/vendor/github.com/docker/spdystream/spdy/read.go b/vendor/github.com/docker/spdystream/spdy/read.go deleted file mode 100644 index 9359a95..0000000 --- a/vendor/github.com/docker/spdystream/spdy/read.go +++ /dev/null @@ -1,348 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package spdy - -import ( - "compress/zlib" - "encoding/binary" - "io" - "net/http" - "strings" -) - -func (frame *SynStreamFrame) read(h ControlFrameHeader, f *Framer) error { - return f.readSynStreamFrame(h, frame) -} - -func (frame *SynReplyFrame) read(h ControlFrameHeader, f *Framer) error { - return f.readSynReplyFrame(h, frame) -} - -func (frame *RstStreamFrame) read(h ControlFrameHeader, f *Framer) error { - frame.CFHeader = h - if err := binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil { - return err - } - if err := binary.Read(f.r, binary.BigEndian, &frame.Status); err != nil { - return err - } - if frame.Status == 0 { - return &Error{InvalidControlFrame, frame.StreamId} - } - if frame.StreamId == 0 { - return &Error{ZeroStreamId, 0} - } - return nil -} - -func (frame *SettingsFrame) read(h ControlFrameHeader, f *Framer) error { - frame.CFHeader = h - var numSettings uint32 - if err := binary.Read(f.r, binary.BigEndian, &numSettings); err != nil { - return err - } - frame.FlagIdValues = make([]SettingsFlagIdValue, numSettings) - for i := uint32(0); i < numSettings; i++ { - if err := binary.Read(f.r, binary.BigEndian, &frame.FlagIdValues[i].Id); err != nil { - return err - } - frame.FlagIdValues[i].Flag = SettingsFlag((frame.FlagIdValues[i].Id & 0xff000000) >> 24) - frame.FlagIdValues[i].Id &= 0xffffff - if err := binary.Read(f.r, binary.BigEndian, &frame.FlagIdValues[i].Value); err != nil { - return err - } - } - return nil -} - -func (frame *PingFrame) read(h ControlFrameHeader, f *Framer) error { - frame.CFHeader = h - if err := binary.Read(f.r, binary.BigEndian, &frame.Id); err != nil { - return err - } - if frame.Id == 0 { - return &Error{ZeroStreamId, 0} - } - if frame.CFHeader.Flags != 0 { - return &Error{InvalidControlFrame, StreamId(frame.Id)} - } - return nil -} - -func (frame *GoAwayFrame) read(h ControlFrameHeader, f *Framer) error { - frame.CFHeader = h - if err := binary.Read(f.r, binary.BigEndian, &frame.LastGoodStreamId); err != nil { - return err - } - if frame.CFHeader.Flags != 0 { - return &Error{InvalidControlFrame, frame.LastGoodStreamId} - } - if frame.CFHeader.length != 8 { - return &Error{InvalidControlFrame, frame.LastGoodStreamId} - } - if err := binary.Read(f.r, binary.BigEndian, &frame.Status); err != nil { - return err - } - return nil -} - -func (frame *HeadersFrame) read(h ControlFrameHeader, f *Framer) error { - return f.readHeadersFrame(h, frame) -} - -func (frame *WindowUpdateFrame) read(h ControlFrameHeader, f *Framer) error { - frame.CFHeader = h - if err := binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil { - return err - } - if frame.CFHeader.Flags != 0 { - return &Error{InvalidControlFrame, frame.StreamId} - } - if frame.CFHeader.length != 8 { - return &Error{InvalidControlFrame, frame.StreamId} - } - if err := binary.Read(f.r, binary.BigEndian, &frame.DeltaWindowSize); err != nil { - return err - } - return nil -} - -func newControlFrame(frameType ControlFrameType) (controlFrame, error) { - ctor, ok := cframeCtor[frameType] - if !ok { - return nil, &Error{Err: InvalidControlFrame} - } - return ctor(), nil -} - -var cframeCtor = map[ControlFrameType]func() controlFrame{ - TypeSynStream: func() controlFrame { return new(SynStreamFrame) }, - TypeSynReply: func() controlFrame { return new(SynReplyFrame) }, - TypeRstStream: func() controlFrame { return new(RstStreamFrame) }, - TypeSettings: func() controlFrame { return new(SettingsFrame) }, - TypePing: func() controlFrame { return new(PingFrame) }, - TypeGoAway: func() controlFrame { return new(GoAwayFrame) }, - TypeHeaders: func() controlFrame { return new(HeadersFrame) }, - TypeWindowUpdate: func() controlFrame { return new(WindowUpdateFrame) }, -} - -func (f *Framer) uncorkHeaderDecompressor(payloadSize int64) error { - if f.headerDecompressor != nil { - f.headerReader.N = payloadSize - return nil - } - f.headerReader = io.LimitedReader{R: f.r, N: payloadSize} - decompressor, err := zlib.NewReaderDict(&f.headerReader, []byte(headerDictionary)) - if err != nil { - return err - } - f.headerDecompressor = decompressor - return nil -} - -// ReadFrame reads SPDY encoded data and returns a decompressed Frame. -func (f *Framer) ReadFrame() (Frame, error) { - var firstWord uint32 - if err := binary.Read(f.r, binary.BigEndian, &firstWord); err != nil { - return nil, err - } - if firstWord&0x80000000 != 0 { - frameType := ControlFrameType(firstWord & 0xffff) - version := uint16(firstWord >> 16 & 0x7fff) - return f.parseControlFrame(version, frameType) - } - return f.parseDataFrame(StreamId(firstWord & 0x7fffffff)) -} - -func (f *Framer) parseControlFrame(version uint16, frameType ControlFrameType) (Frame, error) { - var length uint32 - if err := binary.Read(f.r, binary.BigEndian, &length); err != nil { - return nil, err - } - flags := ControlFlags((length & 0xff000000) >> 24) - length &= 0xffffff - header := ControlFrameHeader{version, frameType, flags, length} - cframe, err := newControlFrame(frameType) - if err != nil { - return nil, err - } - if err = cframe.read(header, f); err != nil { - return nil, err - } - return cframe, nil -} - -func parseHeaderValueBlock(r io.Reader, streamId StreamId) (http.Header, error) { - var numHeaders uint32 - if err := binary.Read(r, binary.BigEndian, &numHeaders); err != nil { - return nil, err - } - var e error - h := make(http.Header, int(numHeaders)) - for i := 0; i < int(numHeaders); i++ { - var length uint32 - if err := binary.Read(r, binary.BigEndian, &length); err != nil { - return nil, err - } - nameBytes := make([]byte, length) - if _, err := io.ReadFull(r, nameBytes); err != nil { - return nil, err - } - name := string(nameBytes) - if name != strings.ToLower(name) { - e = &Error{UnlowercasedHeaderName, streamId} - name = strings.ToLower(name) - } - if h[name] != nil { - e = &Error{DuplicateHeaders, streamId} - } - if err := binary.Read(r, binary.BigEndian, &length); err != nil { - return nil, err - } - value := make([]byte, length) - if _, err := io.ReadFull(r, value); err != nil { - return nil, err - } - valueList := strings.Split(string(value), headerValueSeparator) - for _, v := range valueList { - h.Add(name, v) - } - } - if e != nil { - return h, e - } - return h, nil -} - -func (f *Framer) readSynStreamFrame(h ControlFrameHeader, frame *SynStreamFrame) error { - frame.CFHeader = h - var err error - if err = binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil { - return err - } - if err = binary.Read(f.r, binary.BigEndian, &frame.AssociatedToStreamId); err != nil { - return err - } - if err = binary.Read(f.r, binary.BigEndian, &frame.Priority); err != nil { - return err - } - frame.Priority >>= 5 - if err = binary.Read(f.r, binary.BigEndian, &frame.Slot); err != nil { - return err - } - reader := f.r - if !f.headerCompressionDisabled { - err := f.uncorkHeaderDecompressor(int64(h.length - 10)) - if err != nil { - return err - } - reader = f.headerDecompressor - } - frame.Headers, err = parseHeaderValueBlock(reader, frame.StreamId) - if !f.headerCompressionDisabled && (err == io.EOF && f.headerReader.N == 0 || f.headerReader.N != 0) { - err = &Error{WrongCompressedPayloadSize, 0} - } - if err != nil { - return err - } - for h := range frame.Headers { - if invalidReqHeaders[h] { - return &Error{InvalidHeaderPresent, frame.StreamId} - } - } - if frame.StreamId == 0 { - return &Error{ZeroStreamId, 0} - } - return nil -} - -func (f *Framer) readSynReplyFrame(h ControlFrameHeader, frame *SynReplyFrame) error { - frame.CFHeader = h - var err error - if err = binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil { - return err - } - reader := f.r - if !f.headerCompressionDisabled { - err := f.uncorkHeaderDecompressor(int64(h.length - 4)) - if err != nil { - return err - } - reader = f.headerDecompressor - } - frame.Headers, err = parseHeaderValueBlock(reader, frame.StreamId) - if !f.headerCompressionDisabled && (err == io.EOF && f.headerReader.N == 0 || f.headerReader.N != 0) { - err = &Error{WrongCompressedPayloadSize, 0} - } - if err != nil { - return err - } - for h := range frame.Headers { - if invalidRespHeaders[h] { - return &Error{InvalidHeaderPresent, frame.StreamId} - } - } - if frame.StreamId == 0 { - return &Error{ZeroStreamId, 0} - } - return nil -} - -func (f *Framer) readHeadersFrame(h ControlFrameHeader, frame *HeadersFrame) error { - frame.CFHeader = h - var err error - if err = binary.Read(f.r, binary.BigEndian, &frame.StreamId); err != nil { - return err - } - reader := f.r - if !f.headerCompressionDisabled { - err := f.uncorkHeaderDecompressor(int64(h.length - 4)) - if err != nil { - return err - } - reader = f.headerDecompressor - } - frame.Headers, err = parseHeaderValueBlock(reader, frame.StreamId) - if !f.headerCompressionDisabled && (err == io.EOF && f.headerReader.N == 0 || f.headerReader.N != 0) { - err = &Error{WrongCompressedPayloadSize, 0} - } - if err != nil { - return err - } - var invalidHeaders map[string]bool - if frame.StreamId%2 == 0 { - invalidHeaders = invalidReqHeaders - } else { - invalidHeaders = invalidRespHeaders - } - for h := range frame.Headers { - if invalidHeaders[h] { - return &Error{InvalidHeaderPresent, frame.StreamId} - } - } - if frame.StreamId == 0 { - return &Error{ZeroStreamId, 0} - } - return nil -} - -func (f *Framer) parseDataFrame(streamId StreamId) (*DataFrame, error) { - var length uint32 - if err := binary.Read(f.r, binary.BigEndian, &length); err != nil { - return nil, err - } - var frame DataFrame - frame.StreamId = streamId - frame.Flags = DataFlags(length >> 24) - length &= 0xffffff - frame.Data = make([]byte, length) - if _, err := io.ReadFull(f.r, frame.Data); err != nil { - return nil, err - } - if frame.StreamId == 0 { - return nil, &Error{ZeroStreamId, 0} - } - return &frame, nil -} diff --git a/vendor/github.com/docker/spdystream/spdy/types.go b/vendor/github.com/docker/spdystream/spdy/types.go deleted file mode 100644 index 7b6ee9c..0000000 --- a/vendor/github.com/docker/spdystream/spdy/types.go +++ /dev/null @@ -1,275 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package spdy implements the SPDY protocol (currently SPDY/3), described in -// http://www.chromium.org/spdy/spdy-protocol/spdy-protocol-draft3. -package spdy - -import ( - "bytes" - "compress/zlib" - "io" - "net/http" -) - -// Version is the protocol version number that this package implements. -const Version = 3 - -// ControlFrameType stores the type field in a control frame header. -type ControlFrameType uint16 - -const ( - TypeSynStream ControlFrameType = 0x0001 - TypeSynReply = 0x0002 - TypeRstStream = 0x0003 - TypeSettings = 0x0004 - TypePing = 0x0006 - TypeGoAway = 0x0007 - TypeHeaders = 0x0008 - TypeWindowUpdate = 0x0009 -) - -// ControlFlags are the flags that can be set on a control frame. -type ControlFlags uint8 - -const ( - ControlFlagFin ControlFlags = 0x01 - ControlFlagUnidirectional = 0x02 - ControlFlagSettingsClearSettings = 0x01 -) - -// DataFlags are the flags that can be set on a data frame. -type DataFlags uint8 - -const ( - DataFlagFin DataFlags = 0x01 -) - -// MaxDataLength is the maximum number of bytes that can be stored in one frame. -const MaxDataLength = 1<<24 - 1 - -// headerValueSepator separates multiple header values. -const headerValueSeparator = "\x00" - -// Frame is a single SPDY frame in its unpacked in-memory representation. Use -// Framer to read and write it. -type Frame interface { - write(f *Framer) error -} - -// ControlFrameHeader contains all the fields in a control frame header, -// in its unpacked in-memory representation. -type ControlFrameHeader struct { - // Note, high bit is the "Control" bit. - version uint16 // spdy version number - frameType ControlFrameType - Flags ControlFlags - length uint32 // length of data field -} - -type controlFrame interface { - Frame - read(h ControlFrameHeader, f *Framer) error -} - -// StreamId represents a 31-bit value identifying the stream. -type StreamId uint32 - -// SynStreamFrame is the unpacked, in-memory representation of a SYN_STREAM -// frame. -type SynStreamFrame struct { - CFHeader ControlFrameHeader - StreamId StreamId - AssociatedToStreamId StreamId // stream id for a stream which this stream is associated to - Priority uint8 // priority of this frame (3-bit) - Slot uint8 // index in the server's credential vector of the client certificate - Headers http.Header -} - -// SynReplyFrame is the unpacked, in-memory representation of a SYN_REPLY frame. -type SynReplyFrame struct { - CFHeader ControlFrameHeader - StreamId StreamId - Headers http.Header -} - -// RstStreamStatus represents the status that led to a RST_STREAM. -type RstStreamStatus uint32 - -const ( - ProtocolError RstStreamStatus = iota + 1 - InvalidStream - RefusedStream - UnsupportedVersion - Cancel - InternalError - FlowControlError - StreamInUse - StreamAlreadyClosed - InvalidCredentials - FrameTooLarge -) - -// RstStreamFrame is the unpacked, in-memory representation of a RST_STREAM -// frame. -type RstStreamFrame struct { - CFHeader ControlFrameHeader - StreamId StreamId - Status RstStreamStatus -} - -// SettingsFlag represents a flag in a SETTINGS frame. -type SettingsFlag uint8 - -const ( - FlagSettingsPersistValue SettingsFlag = 0x1 - FlagSettingsPersisted = 0x2 -) - -// SettingsFlag represents the id of an id/value pair in a SETTINGS frame. -type SettingsId uint32 - -const ( - SettingsUploadBandwidth SettingsId = iota + 1 - SettingsDownloadBandwidth - SettingsRoundTripTime - SettingsMaxConcurrentStreams - SettingsCurrentCwnd - SettingsDownloadRetransRate - SettingsInitialWindowSize - SettingsClientCretificateVectorSize -) - -// SettingsFlagIdValue is the unpacked, in-memory representation of the -// combined flag/id/value for a setting in a SETTINGS frame. -type SettingsFlagIdValue struct { - Flag SettingsFlag - Id SettingsId - Value uint32 -} - -// SettingsFrame is the unpacked, in-memory representation of a SPDY -// SETTINGS frame. -type SettingsFrame struct { - CFHeader ControlFrameHeader - FlagIdValues []SettingsFlagIdValue -} - -// PingFrame is the unpacked, in-memory representation of a PING frame. -type PingFrame struct { - CFHeader ControlFrameHeader - Id uint32 // unique id for this ping, from server is even, from client is odd. -} - -// GoAwayStatus represents the status in a GoAwayFrame. -type GoAwayStatus uint32 - -const ( - GoAwayOK GoAwayStatus = iota - GoAwayProtocolError - GoAwayInternalError -) - -// GoAwayFrame is the unpacked, in-memory representation of a GOAWAY frame. -type GoAwayFrame struct { - CFHeader ControlFrameHeader - LastGoodStreamId StreamId // last stream id which was accepted by sender - Status GoAwayStatus -} - -// HeadersFrame is the unpacked, in-memory representation of a HEADERS frame. -type HeadersFrame struct { - CFHeader ControlFrameHeader - StreamId StreamId - Headers http.Header -} - -// WindowUpdateFrame is the unpacked, in-memory representation of a -// WINDOW_UPDATE frame. -type WindowUpdateFrame struct { - CFHeader ControlFrameHeader - StreamId StreamId - DeltaWindowSize uint32 // additional number of bytes to existing window size -} - -// TODO: Implement credential frame and related methods. - -// DataFrame is the unpacked, in-memory representation of a DATA frame. -type DataFrame struct { - // Note, high bit is the "Control" bit. Should be 0 for data frames. - StreamId StreamId - Flags DataFlags - Data []byte // payload data of this frame -} - -// A SPDY specific error. -type ErrorCode string - -const ( - UnlowercasedHeaderName ErrorCode = "header was not lowercased" - DuplicateHeaders = "multiple headers with same name" - WrongCompressedPayloadSize = "compressed payload size was incorrect" - UnknownFrameType = "unknown frame type" - InvalidControlFrame = "invalid control frame" - InvalidDataFrame = "invalid data frame" - InvalidHeaderPresent = "frame contained invalid header" - ZeroStreamId = "stream id zero is disallowed" -) - -// Error contains both the type of error and additional values. StreamId is 0 -// if Error is not associated with a stream. -type Error struct { - Err ErrorCode - StreamId StreamId -} - -func (e *Error) Error() string { - return string(e.Err) -} - -var invalidReqHeaders = map[string]bool{ - "Connection": true, - "Host": true, - "Keep-Alive": true, - "Proxy-Connection": true, - "Transfer-Encoding": true, -} - -var invalidRespHeaders = map[string]bool{ - "Connection": true, - "Keep-Alive": true, - "Proxy-Connection": true, - "Transfer-Encoding": true, -} - -// Framer handles serializing/deserializing SPDY frames, including compressing/ -// decompressing payloads. -type Framer struct { - headerCompressionDisabled bool - w io.Writer - headerBuf *bytes.Buffer - headerCompressor *zlib.Writer - r io.Reader - headerReader io.LimitedReader - headerDecompressor io.ReadCloser -} - -// NewFramer allocates a new Framer for a given SPDY connection, represented by -// a io.Writer and io.Reader. Note that Framer will read and write individual fields -// from/to the Reader and Writer, so the caller should pass in an appropriately -// buffered implementation to optimize performance. -func NewFramer(w io.Writer, r io.Reader) (*Framer, error) { - compressBuf := new(bytes.Buffer) - compressor, err := zlib.NewWriterLevelDict(compressBuf, zlib.BestCompression, []byte(headerDictionary)) - if err != nil { - return nil, err - } - framer := &Framer{ - w: w, - headerBuf: compressBuf, - headerCompressor: compressor, - r: r, - } - return framer, nil -} diff --git a/vendor/github.com/docker/spdystream/spdy/write.go b/vendor/github.com/docker/spdystream/spdy/write.go deleted file mode 100644 index b212f66..0000000 --- a/vendor/github.com/docker/spdystream/spdy/write.go +++ /dev/null @@ -1,318 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package spdy - -import ( - "encoding/binary" - "io" - "net/http" - "strings" -) - -func (frame *SynStreamFrame) write(f *Framer) error { - return f.writeSynStreamFrame(frame) -} - -func (frame *SynReplyFrame) write(f *Framer) error { - return f.writeSynReplyFrame(frame) -} - -func (frame *RstStreamFrame) write(f *Framer) (err error) { - if frame.StreamId == 0 { - return &Error{ZeroStreamId, 0} - } - frame.CFHeader.version = Version - frame.CFHeader.frameType = TypeRstStream - frame.CFHeader.Flags = 0 - frame.CFHeader.length = 8 - - // Serialize frame to Writer. - if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { - return - } - if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { - return - } - if frame.Status == 0 { - return &Error{InvalidControlFrame, frame.StreamId} - } - if err = binary.Write(f.w, binary.BigEndian, frame.Status); err != nil { - return - } - return -} - -func (frame *SettingsFrame) write(f *Framer) (err error) { - frame.CFHeader.version = Version - frame.CFHeader.frameType = TypeSettings - frame.CFHeader.length = uint32(len(frame.FlagIdValues)*8 + 4) - - // Serialize frame to Writer. - if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { - return - } - if err = binary.Write(f.w, binary.BigEndian, uint32(len(frame.FlagIdValues))); err != nil { - return - } - for _, flagIdValue := range frame.FlagIdValues { - flagId := uint32(flagIdValue.Flag)<<24 | uint32(flagIdValue.Id) - if err = binary.Write(f.w, binary.BigEndian, flagId); err != nil { - return - } - if err = binary.Write(f.w, binary.BigEndian, flagIdValue.Value); err != nil { - return - } - } - return -} - -func (frame *PingFrame) write(f *Framer) (err error) { - if frame.Id == 0 { - return &Error{ZeroStreamId, 0} - } - frame.CFHeader.version = Version - frame.CFHeader.frameType = TypePing - frame.CFHeader.Flags = 0 - frame.CFHeader.length = 4 - - // Serialize frame to Writer. - if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { - return - } - if err = binary.Write(f.w, binary.BigEndian, frame.Id); err != nil { - return - } - return -} - -func (frame *GoAwayFrame) write(f *Framer) (err error) { - frame.CFHeader.version = Version - frame.CFHeader.frameType = TypeGoAway - frame.CFHeader.Flags = 0 - frame.CFHeader.length = 8 - - // Serialize frame to Writer. - if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { - return - } - if err = binary.Write(f.w, binary.BigEndian, frame.LastGoodStreamId); err != nil { - return - } - if err = binary.Write(f.w, binary.BigEndian, frame.Status); err != nil { - return - } - return nil -} - -func (frame *HeadersFrame) write(f *Framer) error { - return f.writeHeadersFrame(frame) -} - -func (frame *WindowUpdateFrame) write(f *Framer) (err error) { - frame.CFHeader.version = Version - frame.CFHeader.frameType = TypeWindowUpdate - frame.CFHeader.Flags = 0 - frame.CFHeader.length = 8 - - // Serialize frame to Writer. - if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { - return - } - if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { - return - } - if err = binary.Write(f.w, binary.BigEndian, frame.DeltaWindowSize); err != nil { - return - } - return nil -} - -func (frame *DataFrame) write(f *Framer) error { - return f.writeDataFrame(frame) -} - -// WriteFrame writes a frame. -func (f *Framer) WriteFrame(frame Frame) error { - return frame.write(f) -} - -func writeControlFrameHeader(w io.Writer, h ControlFrameHeader) error { - if err := binary.Write(w, binary.BigEndian, 0x8000|h.version); err != nil { - return err - } - if err := binary.Write(w, binary.BigEndian, h.frameType); err != nil { - return err - } - flagsAndLength := uint32(h.Flags)<<24 | h.length - if err := binary.Write(w, binary.BigEndian, flagsAndLength); err != nil { - return err - } - return nil -} - -func writeHeaderValueBlock(w io.Writer, h http.Header) (n int, err error) { - n = 0 - if err = binary.Write(w, binary.BigEndian, uint32(len(h))); err != nil { - return - } - n += 2 - for name, values := range h { - if err = binary.Write(w, binary.BigEndian, uint32(len(name))); err != nil { - return - } - n += 2 - name = strings.ToLower(name) - if _, err = io.WriteString(w, name); err != nil { - return - } - n += len(name) - v := strings.Join(values, headerValueSeparator) - if err = binary.Write(w, binary.BigEndian, uint32(len(v))); err != nil { - return - } - n += 2 - if _, err = io.WriteString(w, v); err != nil { - return - } - n += len(v) - } - return -} - -func (f *Framer) writeSynStreamFrame(frame *SynStreamFrame) (err error) { - if frame.StreamId == 0 { - return &Error{ZeroStreamId, 0} - } - // Marshal the headers. - var writer io.Writer = f.headerBuf - if !f.headerCompressionDisabled { - writer = f.headerCompressor - } - if _, err = writeHeaderValueBlock(writer, frame.Headers); err != nil { - return - } - if !f.headerCompressionDisabled { - f.headerCompressor.Flush() - } - - // Set ControlFrameHeader. - frame.CFHeader.version = Version - frame.CFHeader.frameType = TypeSynStream - frame.CFHeader.length = uint32(len(f.headerBuf.Bytes()) + 10) - - // Serialize frame to Writer. - if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { - return err - } - if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { - return err - } - if err = binary.Write(f.w, binary.BigEndian, frame.AssociatedToStreamId); err != nil { - return err - } - if err = binary.Write(f.w, binary.BigEndian, frame.Priority<<5); err != nil { - return err - } - if err = binary.Write(f.w, binary.BigEndian, frame.Slot); err != nil { - return err - } - if _, err = f.w.Write(f.headerBuf.Bytes()); err != nil { - return err - } - f.headerBuf.Reset() - return nil -} - -func (f *Framer) writeSynReplyFrame(frame *SynReplyFrame) (err error) { - if frame.StreamId == 0 { - return &Error{ZeroStreamId, 0} - } - // Marshal the headers. - var writer io.Writer = f.headerBuf - if !f.headerCompressionDisabled { - writer = f.headerCompressor - } - if _, err = writeHeaderValueBlock(writer, frame.Headers); err != nil { - return - } - if !f.headerCompressionDisabled { - f.headerCompressor.Flush() - } - - // Set ControlFrameHeader. - frame.CFHeader.version = Version - frame.CFHeader.frameType = TypeSynReply - frame.CFHeader.length = uint32(len(f.headerBuf.Bytes()) + 4) - - // Serialize frame to Writer. - if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { - return - } - if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { - return - } - if _, err = f.w.Write(f.headerBuf.Bytes()); err != nil { - return - } - f.headerBuf.Reset() - return -} - -func (f *Framer) writeHeadersFrame(frame *HeadersFrame) (err error) { - if frame.StreamId == 0 { - return &Error{ZeroStreamId, 0} - } - // Marshal the headers. - var writer io.Writer = f.headerBuf - if !f.headerCompressionDisabled { - writer = f.headerCompressor - } - if _, err = writeHeaderValueBlock(writer, frame.Headers); err != nil { - return - } - if !f.headerCompressionDisabled { - f.headerCompressor.Flush() - } - - // Set ControlFrameHeader. - frame.CFHeader.version = Version - frame.CFHeader.frameType = TypeHeaders - frame.CFHeader.length = uint32(len(f.headerBuf.Bytes()) + 4) - - // Serialize frame to Writer. - if err = writeControlFrameHeader(f.w, frame.CFHeader); err != nil { - return - } - if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { - return - } - if _, err = f.w.Write(f.headerBuf.Bytes()); err != nil { - return - } - f.headerBuf.Reset() - return -} - -func (f *Framer) writeDataFrame(frame *DataFrame) (err error) { - if frame.StreamId == 0 { - return &Error{ZeroStreamId, 0} - } - if frame.StreamId&0x80000000 != 0 || len(frame.Data) > MaxDataLength { - return &Error{InvalidDataFrame, frame.StreamId} - } - - // Serialize frame to Writer. - if err = binary.Write(f.w, binary.BigEndian, frame.StreamId); err != nil { - return - } - flagsAndLength := uint32(frame.Flags)<<24 | uint32(len(frame.Data)) - if err = binary.Write(f.w, binary.BigEndian, flagsAndLength); err != nil { - return - } - if _, err = f.w.Write(frame.Data); err != nil { - return - } - return nil -} diff --git a/vendor/github.com/docker/spdystream/stream.go b/vendor/github.com/docker/spdystream/stream.go deleted file mode 100644 index f9e9ee2..0000000 --- a/vendor/github.com/docker/spdystream/stream.go +++ /dev/null @@ -1,327 +0,0 @@ -package spdystream - -import ( - "errors" - "fmt" - "io" - "net" - "net/http" - "sync" - "time" - - "github.com/docker/spdystream/spdy" -) - -var ( - ErrUnreadPartialData = errors.New("unread partial data") -) - -type Stream struct { - streamId spdy.StreamId - parent *Stream - conn *Connection - startChan chan error - - dataLock sync.RWMutex - dataChan chan []byte - unread []byte - - priority uint8 - headers http.Header - headerChan chan http.Header - finishLock sync.Mutex - finished bool - replyCond *sync.Cond - replied bool - closeLock sync.Mutex - closeChan chan bool -} - -// WriteData writes data to stream, sending a dataframe per call -func (s *Stream) WriteData(data []byte, fin bool) error { - s.waitWriteReply() - var flags spdy.DataFlags - - if fin { - flags = spdy.DataFlagFin - s.finishLock.Lock() - if s.finished { - s.finishLock.Unlock() - return ErrWriteClosedStream - } - s.finished = true - s.finishLock.Unlock() - } - - dataFrame := &spdy.DataFrame{ - StreamId: s.streamId, - Flags: flags, - Data: data, - } - - debugMessage("(%p) (%d) Writing data frame", s, s.streamId) - return s.conn.framer.WriteFrame(dataFrame) -} - -// Write writes bytes to a stream, calling write data for each call. -func (s *Stream) Write(data []byte) (n int, err error) { - err = s.WriteData(data, false) - if err == nil { - n = len(data) - } - return -} - -// Read reads bytes from a stream, a single read will never get more -// than what is sent on a single data frame, but a multiple calls to -// read may get data from the same data frame. -func (s *Stream) Read(p []byte) (n int, err error) { - if s.unread == nil { - select { - case <-s.closeChan: - return 0, io.EOF - case read, ok := <-s.dataChan: - if !ok { - return 0, io.EOF - } - s.unread = read - } - } - n = copy(p, s.unread) - if n < len(s.unread) { - s.unread = s.unread[n:] - } else { - s.unread = nil - } - return -} - -// ReadData reads an entire data frame and returns the byte array -// from the data frame. If there is unread data from the result -// of a Read call, this function will return an ErrUnreadPartialData. -func (s *Stream) ReadData() ([]byte, error) { - debugMessage("(%p) Reading data from %d", s, s.streamId) - if s.unread != nil { - return nil, ErrUnreadPartialData - } - select { - case <-s.closeChan: - return nil, io.EOF - case read, ok := <-s.dataChan: - if !ok { - return nil, io.EOF - } - return read, nil - } -} - -func (s *Stream) waitWriteReply() { - if s.replyCond != nil { - s.replyCond.L.Lock() - for !s.replied { - s.replyCond.Wait() - } - s.replyCond.L.Unlock() - } -} - -// Wait waits for the stream to receive a reply. -func (s *Stream) Wait() error { - return s.WaitTimeout(time.Duration(0)) -} - -// WaitTimeout waits for the stream to receive a reply or for timeout. -// When the timeout is reached, ErrTimeout will be returned. -func (s *Stream) WaitTimeout(timeout time.Duration) error { - var timeoutChan <-chan time.Time - if timeout > time.Duration(0) { - timeoutChan = time.After(timeout) - } - - select { - case err := <-s.startChan: - if err != nil { - return err - } - break - case <-timeoutChan: - return ErrTimeout - } - return nil -} - -// Close closes the stream by sending an empty data frame with the -// finish flag set, indicating this side is finished with the stream. -func (s *Stream) Close() error { - select { - case <-s.closeChan: - // Stream is now fully closed - s.conn.removeStream(s) - default: - break - } - return s.WriteData([]byte{}, true) -} - -// Reset sends a reset frame, putting the stream into the fully closed state. -func (s *Stream) Reset() error { - s.conn.removeStream(s) - return s.resetStream() -} - -func (s *Stream) resetStream() error { - // Always call closeRemoteChannels, even if s.finished is already true. - // This makes it so that stream.Close() followed by stream.Reset() allows - // stream.Read() to unblock. - s.closeRemoteChannels() - - s.finishLock.Lock() - if s.finished { - s.finishLock.Unlock() - return nil - } - s.finished = true - s.finishLock.Unlock() - - resetFrame := &spdy.RstStreamFrame{ - StreamId: s.streamId, - Status: spdy.Cancel, - } - return s.conn.framer.WriteFrame(resetFrame) -} - -// CreateSubStream creates a stream using the current as the parent -func (s *Stream) CreateSubStream(headers http.Header, fin bool) (*Stream, error) { - return s.conn.CreateStream(headers, s, fin) -} - -// SetPriority sets the stream priority, does not affect the -// remote priority of this stream after Open has been called. -// Valid values are 0 through 7, 0 being the highest priority -// and 7 the lowest. -func (s *Stream) SetPriority(priority uint8) { - s.priority = priority -} - -// SendHeader sends a header frame across the stream -func (s *Stream) SendHeader(headers http.Header, fin bool) error { - return s.conn.sendHeaders(headers, s, fin) -} - -// SendReply sends a reply on a stream, only valid to be called once -// when handling a new stream -func (s *Stream) SendReply(headers http.Header, fin bool) error { - if s.replyCond == nil { - return errors.New("cannot reply on initiated stream") - } - s.replyCond.L.Lock() - defer s.replyCond.L.Unlock() - if s.replied { - return nil - } - - err := s.conn.sendReply(headers, s, fin) - if err != nil { - return err - } - - s.replied = true - s.replyCond.Broadcast() - return nil -} - -// Refuse sends a reset frame with the status refuse, only -// valid to be called once when handling a new stream. This -// may be used to indicate that a stream is not allowed -// when http status codes are not being used. -func (s *Stream) Refuse() error { - if s.replied { - return nil - } - s.replied = true - return s.conn.sendReset(spdy.RefusedStream, s) -} - -// Cancel sends a reset frame with the status canceled. This -// can be used at any time by the creator of the Stream to -// indicate the stream is no longer needed. -func (s *Stream) Cancel() error { - return s.conn.sendReset(spdy.Cancel, s) -} - -// ReceiveHeader receives a header sent on the other side -// of the stream. This function will block until a header -// is received or stream is closed. -func (s *Stream) ReceiveHeader() (http.Header, error) { - select { - case <-s.closeChan: - break - case header, ok := <-s.headerChan: - if !ok { - return nil, fmt.Errorf("header chan closed") - } - return header, nil - } - return nil, fmt.Errorf("stream closed") -} - -// Parent returns the parent stream -func (s *Stream) Parent() *Stream { - return s.parent -} - -// Headers returns the headers used to create the stream -func (s *Stream) Headers() http.Header { - return s.headers -} - -// String returns the string version of stream using the -// streamId to uniquely identify the stream -func (s *Stream) String() string { - return fmt.Sprintf("stream:%d", s.streamId) -} - -// Identifier returns a 32 bit identifier for the stream -func (s *Stream) Identifier() uint32 { - return uint32(s.streamId) -} - -// IsFinished returns whether the stream has finished -// sending data -func (s *Stream) IsFinished() bool { - return s.finished -} - -// Implement net.Conn interface - -func (s *Stream) LocalAddr() net.Addr { - return s.conn.conn.LocalAddr() -} - -func (s *Stream) RemoteAddr() net.Addr { - return s.conn.conn.RemoteAddr() -} - -// TODO set per stream values instead of connection-wide - -func (s *Stream) SetDeadline(t time.Time) error { - return s.conn.conn.SetDeadline(t) -} - -func (s *Stream) SetReadDeadline(t time.Time) error { - return s.conn.conn.SetReadDeadline(t) -} - -func (s *Stream) SetWriteDeadline(t time.Time) error { - return s.conn.conn.SetWriteDeadline(t) -} - -func (s *Stream) closeRemoteChannels() { - s.closeLock.Lock() - defer s.closeLock.Unlock() - select { - case <-s.closeChan: - default: - close(s.closeChan) - } -} diff --git a/vendor/github.com/docker/spdystream/utils.go b/vendor/github.com/docker/spdystream/utils.go deleted file mode 100644 index 1b2c199..0000000 --- a/vendor/github.com/docker/spdystream/utils.go +++ /dev/null @@ -1,16 +0,0 @@ -package spdystream - -import ( - "log" - "os" -) - -var ( - DEBUG = os.Getenv("DEBUG") -) - -func debugMessage(fmt string, args ...interface{}) { - if DEBUG != "" { - log.Printf(fmt, args...) - } -} diff --git a/vendor/github.com/fsnotify/fsnotify/.editorconfig b/vendor/github.com/fsnotify/fsnotify/.editorconfig deleted file mode 100644 index ba49e3c..0000000 --- a/vendor/github.com/fsnotify/fsnotify/.editorconfig +++ /dev/null @@ -1,5 +0,0 @@ -root = true - -[*] -indent_style = tab -indent_size = 4 diff --git a/vendor/github.com/fsnotify/fsnotify/.gitignore b/vendor/github.com/fsnotify/fsnotify/.gitignore deleted file mode 100644 index 4cd0cba..0000000 --- a/vendor/github.com/fsnotify/fsnotify/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -# Setup a Global .gitignore for OS and editor generated files: -# https://help.github.com/articles/ignoring-files -# git config --global core.excludesfile ~/.gitignore_global - -.vagrant -*.sublime-project diff --git a/vendor/github.com/fsnotify/fsnotify/.travis.yml b/vendor/github.com/fsnotify/fsnotify/.travis.yml deleted file mode 100644 index 981d1bb..0000000 --- a/vendor/github.com/fsnotify/fsnotify/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -sudo: false -language: go - -go: - - 1.8.x - - 1.9.x - - tip - -matrix: - allow_failures: - - go: tip - fast_finish: true - -before_script: - - go get -u github.com/golang/lint/golint - -script: - - go test -v --race ./... - -after_script: - - test -z "$(gofmt -s -l -w . | tee /dev/stderr)" - - test -z "$(golint ./... | tee /dev/stderr)" - - go vet ./... - -os: - - linux - - osx - -notifications: - email: false diff --git a/vendor/github.com/fsnotify/fsnotify/AUTHORS b/vendor/github.com/fsnotify/fsnotify/AUTHORS deleted file mode 100644 index 5ab5d41..0000000 --- a/vendor/github.com/fsnotify/fsnotify/AUTHORS +++ /dev/null @@ -1,52 +0,0 @@ -# Names should be added to this file as -# Name or Organization -# The email address is not required for organizations. - -# You can update this list using the following command: -# -# $ git shortlog -se | awk '{print $2 " " $3 " " $4}' - -# Please keep the list sorted. - -Aaron L -Adrien Bustany -Amit Krishnan -Anmol Sethi -Bjørn Erik Pedersen -Bruno Bigras -Caleb Spare -Case Nelson -Chris Howey -Christoffer Buchholz -Daniel Wagner-Hall -Dave Cheney -Evan Phoenix -Francisco Souza -Hari haran -John C Barstow -Kelvin Fo -Ken-ichirou MATSUZAWA -Matt Layher -Nathan Youngman -Nickolai Zeldovich -Patrick -Paul Hammond -Pawel Knap -Pieter Droogendijk -Pursuit92 -Riku Voipio -Rob Figueiredo -Rodrigo Chiossi -Slawek Ligus -Soge Zhang -Tiffany Jernigan -Tilak Sharma -Tom Payne -Travis Cline -Tudor Golubenco -Vahe Khachikyan -Yukang -bronze1man -debrando -henrikedwards -铁哥 diff --git a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md b/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md deleted file mode 100644 index be4d7ea..0000000 --- a/vendor/github.com/fsnotify/fsnotify/CHANGELOG.md +++ /dev/null @@ -1,317 +0,0 @@ -# Changelog - -## v1.4.7 / 2018-01-09 - -* BSD/macOS: Fix possible deadlock on closing the watcher on kqueue (thanks @nhooyr and @glycerine) -* Tests: Fix missing verb on format string (thanks @rchiossi) -* Linux: Fix deadlock in Remove (thanks @aarondl) -* Linux: Watch.Add improvements (avoid race, fix consistency, reduce garbage) (thanks @twpayne) -* Docs: Moved FAQ into the README (thanks @vahe) -* Linux: Properly handle inotify's IN_Q_OVERFLOW event (thanks @zeldovich) -* Docs: replace references to OS X with macOS - -## v1.4.2 / 2016-10-10 - -* Linux: use InotifyInit1 with IN_CLOEXEC to stop leaking a file descriptor to a child process when using fork/exec [#178](https://github.com/fsnotify/fsnotify/pull/178) (thanks @pattyshack) - -## v1.4.1 / 2016-10-04 - -* Fix flaky inotify stress test on Linux [#177](https://github.com/fsnotify/fsnotify/pull/177) (thanks @pattyshack) - -## v1.4.0 / 2016-10-01 - -* add a String() method to Event.Op [#165](https://github.com/fsnotify/fsnotify/pull/165) (thanks @oozie) - -## v1.3.1 / 2016-06-28 - -* Windows: fix for double backslash when watching the root of a drive [#151](https://github.com/fsnotify/fsnotify/issues/151) (thanks @brunoqc) - -## v1.3.0 / 2016-04-19 - -* Support linux/arm64 by [patching](https://go-review.googlesource.com/#/c/21971/) x/sys/unix and switching to to it from syscall (thanks @suihkulokki) [#135](https://github.com/fsnotify/fsnotify/pull/135) - -## v1.2.10 / 2016-03-02 - -* Fix golint errors in windows.go [#121](https://github.com/fsnotify/fsnotify/pull/121) (thanks @tiffanyfj) - -## v1.2.9 / 2016-01-13 - -kqueue: Fix logic for CREATE after REMOVE [#111](https://github.com/fsnotify/fsnotify/pull/111) (thanks @bep) - -## v1.2.8 / 2015-12-17 - -* kqueue: fix race condition in Close [#105](https://github.com/fsnotify/fsnotify/pull/105) (thanks @djui for reporting the issue and @ppknap for writing a failing test) -* inotify: fix race in test -* enable race detection for continuous integration (Linux, Mac, Windows) - -## v1.2.5 / 2015-10-17 - -* inotify: use epoll_create1 for arm64 support (requires Linux 2.6.27 or later) [#100](https://github.com/fsnotify/fsnotify/pull/100) (thanks @suihkulokki) -* inotify: fix path leaks [#73](https://github.com/fsnotify/fsnotify/pull/73) (thanks @chamaken) -* kqueue: watch for rename events on subdirectories [#83](https://github.com/fsnotify/fsnotify/pull/83) (thanks @guotie) -* kqueue: avoid infinite loops from symlinks cycles [#101](https://github.com/fsnotify/fsnotify/pull/101) (thanks @illicitonion) - -## v1.2.1 / 2015-10-14 - -* kqueue: don't watch named pipes [#98](https://github.com/fsnotify/fsnotify/pull/98) (thanks @evanphx) - -## v1.2.0 / 2015-02-08 - -* inotify: use epoll to wake up readEvents [#66](https://github.com/fsnotify/fsnotify/pull/66) (thanks @PieterD) -* inotify: closing watcher should now always shut down goroutine [#63](https://github.com/fsnotify/fsnotify/pull/63) (thanks @PieterD) -* kqueue: close kqueue after removing watches, fixes [#59](https://github.com/fsnotify/fsnotify/issues/59) - -## v1.1.1 / 2015-02-05 - -* inotify: Retry read on EINTR [#61](https://github.com/fsnotify/fsnotify/issues/61) (thanks @PieterD) - -## v1.1.0 / 2014-12-12 - -* kqueue: rework internals [#43](https://github.com/fsnotify/fsnotify/pull/43) - * add low-level functions - * only need to store flags on directories - * less mutexes [#13](https://github.com/fsnotify/fsnotify/issues/13) - * done can be an unbuffered channel - * remove calls to os.NewSyscallError -* More efficient string concatenation for Event.String() [#52](https://github.com/fsnotify/fsnotify/pull/52) (thanks @mdlayher) -* kqueue: fix regression in rework causing subdirectories to be watched [#48](https://github.com/fsnotify/fsnotify/issues/48) -* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) - -## v1.0.4 / 2014-09-07 - -* kqueue: add dragonfly to the build tags. -* Rename source code files, rearrange code so exported APIs are at the top. -* Add done channel to example code. [#37](https://github.com/fsnotify/fsnotify/pull/37) (thanks @chenyukang) - -## v1.0.3 / 2014-08-19 - -* [Fix] Windows MOVED_TO now translates to Create like on BSD and Linux. [#36](https://github.com/fsnotify/fsnotify/issues/36) - -## v1.0.2 / 2014-08-17 - -* [Fix] Missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) -* [Fix] Make ./path and path equivalent. (thanks @zhsso) - -## v1.0.0 / 2014-08-15 - -* [API] Remove AddWatch on Windows, use Add. -* Improve documentation for exported identifiers. [#30](https://github.com/fsnotify/fsnotify/issues/30) -* Minor updates based on feedback from golint. - -## dev / 2014-07-09 - -* Moved to [github.com/fsnotify/fsnotify](https://github.com/fsnotify/fsnotify). -* Use os.NewSyscallError instead of returning errno (thanks @hariharan-uno) - -## dev / 2014-07-04 - -* kqueue: fix incorrect mutex used in Close() -* Update example to demonstrate usage of Op. - -## dev / 2014-06-28 - -* [API] Don't set the Write Op for attribute notifications [#4](https://github.com/fsnotify/fsnotify/issues/4) -* Fix for String() method on Event (thanks Alex Brainman) -* Don't build on Plan 9 or Solaris (thanks @4ad) - -## dev / 2014-06-21 - -* Events channel of type Event rather than *Event. -* [internal] use syscall constants directly for inotify and kqueue. -* [internal] kqueue: rename events to kevents and fileEvent to event. - -## dev / 2014-06-19 - -* Go 1.3+ required on Windows (uses syscall.ERROR_MORE_DATA internally). -* [internal] remove cookie from Event struct (unused). -* [internal] Event struct has the same definition across every OS. -* [internal] remove internal watch and removeWatch methods. - -## dev / 2014-06-12 - -* [API] Renamed Watch() to Add() and RemoveWatch() to Remove(). -* [API] Pluralized channel names: Events and Errors. -* [API] Renamed FileEvent struct to Event. -* [API] Op constants replace methods like IsCreate(). - -## dev / 2014-06-12 - -* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) - -## dev / 2014-05-23 - -* [API] Remove current implementation of WatchFlags. - * current implementation doesn't take advantage of OS for efficiency - * provides little benefit over filtering events as they are received, but has extra bookkeeping and mutexes - * no tests for the current implementation - * not fully implemented on Windows [#93](https://github.com/howeyc/fsnotify/issues/93#issuecomment-39285195) - -## v0.9.3 / 2014-12-31 - -* kqueue: cleanup internal watch before sending remove event [#51](https://github.com/fsnotify/fsnotify/issues/51) - -## v0.9.2 / 2014-08-17 - -* [Backport] Fix missing create events on macOS. [#14](https://github.com/fsnotify/fsnotify/issues/14) (thanks @zhsso) - -## v0.9.1 / 2014-06-12 - -* Fix data race on kevent buffer (thanks @tilaks) [#98](https://github.com/howeyc/fsnotify/pull/98) - -## v0.9.0 / 2014-01-17 - -* IsAttrib() for events that only concern a file's metadata [#79][] (thanks @abustany) -* [Fix] kqueue: fix deadlock [#77][] (thanks @cespare) -* [NOTICE] Development has moved to `code.google.com/p/go.exp/fsnotify` in preparation for inclusion in the Go standard library. - -## v0.8.12 / 2013-11-13 - -* [API] Remove FD_SET and friends from Linux adapter - -## v0.8.11 / 2013-11-02 - -* [Doc] Add Changelog [#72][] (thanks @nathany) -* [Doc] Spotlight and double modify events on macOS [#62][] (reported by @paulhammond) - -## v0.8.10 / 2013-10-19 - -* [Fix] kqueue: remove file watches when parent directory is removed [#71][] (reported by @mdwhatcott) -* [Fix] kqueue: race between Close and readEvents [#70][] (reported by @bernerdschaefer) -* [Doc] specify OS-specific limits in README (thanks @debrando) - -## v0.8.9 / 2013-09-08 - -* [Doc] Contributing (thanks @nathany) -* [Doc] update package path in example code [#63][] (thanks @paulhammond) -* [Doc] GoCI badge in README (Linux only) [#60][] -* [Doc] Cross-platform testing with Vagrant [#59][] (thanks @nathany) - -## v0.8.8 / 2013-06-17 - -* [Fix] Windows: handle `ERROR_MORE_DATA` on Windows [#49][] (thanks @jbowtie) - -## v0.8.7 / 2013-06-03 - -* [API] Make syscall flags internal -* [Fix] inotify: ignore event changes -* [Fix] race in symlink test [#45][] (reported by @srid) -* [Fix] tests on Windows -* lower case error messages - -## v0.8.6 / 2013-05-23 - -* kqueue: Use EVT_ONLY flag on Darwin -* [Doc] Update README with full example - -## v0.8.5 / 2013-05-09 - -* [Fix] inotify: allow monitoring of "broken" symlinks (thanks @tsg) - -## v0.8.4 / 2013-04-07 - -* [Fix] kqueue: watch all file events [#40][] (thanks @ChrisBuchholz) - -## v0.8.3 / 2013-03-13 - -* [Fix] inoitfy/kqueue memory leak [#36][] (reported by @nbkolchin) -* [Fix] kqueue: use fsnFlags for watching a directory [#33][] (reported by @nbkolchin) - -## v0.8.2 / 2013-02-07 - -* [Doc] add Authors -* [Fix] fix data races for map access [#29][] (thanks @fsouza) - -## v0.8.1 / 2013-01-09 - -* [Fix] Windows path separators -* [Doc] BSD License - -## v0.8.0 / 2012-11-09 - -* kqueue: directory watching improvements (thanks @vmirage) -* inotify: add `IN_MOVED_TO` [#25][] (requested by @cpisto) -* [Fix] kqueue: deleting watched directory [#24][] (reported by @jakerr) - -## v0.7.4 / 2012-10-09 - -* [Fix] inotify: fixes from https://codereview.appspot.com/5418045/ (ugorji) -* [Fix] kqueue: preserve watch flags when watching for delete [#21][] (reported by @robfig) -* [Fix] kqueue: watch the directory even if it isn't a new watch (thanks @robfig) -* [Fix] kqueue: modify after recreation of file - -## v0.7.3 / 2012-09-27 - -* [Fix] kqueue: watch with an existing folder inside the watched folder (thanks @vmirage) -* [Fix] kqueue: no longer get duplicate CREATE events - -## v0.7.2 / 2012-09-01 - -* kqueue: events for created directories - -## v0.7.1 / 2012-07-14 - -* [Fix] for renaming files - -## v0.7.0 / 2012-07-02 - -* [Feature] FSNotify flags -* [Fix] inotify: Added file name back to event path - -## v0.6.0 / 2012-06-06 - -* kqueue: watch files after directory created (thanks @tmc) - -## v0.5.1 / 2012-05-22 - -* [Fix] inotify: remove all watches before Close() - -## v0.5.0 / 2012-05-03 - -* [API] kqueue: return errors during watch instead of sending over channel -* kqueue: match symlink behavior on Linux -* inotify: add `DELETE_SELF` (requested by @taralx) -* [Fix] kqueue: handle EINTR (reported by @robfig) -* [Doc] Godoc example [#1][] (thanks @davecheney) - -## v0.4.0 / 2012-03-30 - -* Go 1 released: build with go tool -* [Feature] Windows support using winfsnotify -* Windows does not have attribute change notifications -* Roll attribute notifications into IsModify - -## v0.3.0 / 2012-02-19 - -* kqueue: add files when watch directory - -## v0.2.0 / 2011-12-30 - -* update to latest Go weekly code - -## v0.1.0 / 2011-10-19 - -* kqueue: add watch on file creation to match inotify -* kqueue: create file event -* inotify: ignore `IN_IGNORED` events -* event String() -* linux: common FileEvent functions -* initial commit - -[#79]: https://github.com/howeyc/fsnotify/pull/79 -[#77]: https://github.com/howeyc/fsnotify/pull/77 -[#72]: https://github.com/howeyc/fsnotify/issues/72 -[#71]: https://github.com/howeyc/fsnotify/issues/71 -[#70]: https://github.com/howeyc/fsnotify/issues/70 -[#63]: https://github.com/howeyc/fsnotify/issues/63 -[#62]: https://github.com/howeyc/fsnotify/issues/62 -[#60]: https://github.com/howeyc/fsnotify/issues/60 -[#59]: https://github.com/howeyc/fsnotify/issues/59 -[#49]: https://github.com/howeyc/fsnotify/issues/49 -[#45]: https://github.com/howeyc/fsnotify/issues/45 -[#40]: https://github.com/howeyc/fsnotify/issues/40 -[#36]: https://github.com/howeyc/fsnotify/issues/36 -[#33]: https://github.com/howeyc/fsnotify/issues/33 -[#29]: https://github.com/howeyc/fsnotify/issues/29 -[#25]: https://github.com/howeyc/fsnotify/issues/25 -[#24]: https://github.com/howeyc/fsnotify/issues/24 -[#21]: https://github.com/howeyc/fsnotify/issues/21 diff --git a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md b/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md deleted file mode 100644 index 828a60b..0000000 --- a/vendor/github.com/fsnotify/fsnotify/CONTRIBUTING.md +++ /dev/null @@ -1,77 +0,0 @@ -# Contributing - -## Issues - -* Request features and report bugs using the [GitHub Issue Tracker](https://github.com/fsnotify/fsnotify/issues). -* Please indicate the platform you are using fsnotify on. -* A code example to reproduce the problem is appreciated. - -## Pull Requests - -### Contributor License Agreement - -fsnotify is derived from code in the [golang.org/x/exp](https://godoc.org/golang.org/x/exp) package and it may be included [in the standard library](https://github.com/fsnotify/fsnotify/issues/1) in the future. Therefore fsnotify carries the same [LICENSE](https://github.com/fsnotify/fsnotify/blob/master/LICENSE) as Go. Contributors retain their copyright, so you need to fill out a short form before we can accept your contribution: [Google Individual Contributor License Agreement](https://developers.google.com/open-source/cla/individual). - -Please indicate that you have signed the CLA in your pull request. - -### How fsnotify is Developed - -* Development is done on feature branches. -* Tests are run on BSD, Linux, macOS and Windows. -* Pull requests are reviewed and [applied to master][am] using [hub][]. - * Maintainers may modify or squash commits rather than asking contributors to. -* To issue a new release, the maintainers will: - * Update the CHANGELOG - * Tag a version, which will become available through gopkg.in. - -### How to Fork - -For smooth sailing, always use the original import path. Installing with `go get` makes this easy. - -1. Install from GitHub (`go get -u github.com/fsnotify/fsnotify`) -2. Create your feature branch (`git checkout -b my-new-feature`) -3. Ensure everything works and the tests pass (see below) -4. Commit your changes (`git commit -am 'Add some feature'`) - -Contribute upstream: - -1. Fork fsnotify on GitHub -2. Add your remote (`git remote add fork git@github.com:mycompany/repo.git`) -3. Push to the branch (`git push fork my-new-feature`) -4. Create a new Pull Request on GitHub - -This workflow is [thoroughly explained by Katrina Owen](https://splice.com/blog/contributing-open-source-git-repositories-go/). - -### Testing - -fsnotify uses build tags to compile different code on Linux, BSD, macOS, and Windows. - -Before doing a pull request, please do your best to test your changes on multiple platforms, and list which platforms you were able/unable to test on. - -To aid in cross-platform testing there is a Vagrantfile for Linux and BSD. - -* Install [Vagrant](http://www.vagrantup.com/) and [VirtualBox](https://www.virtualbox.org/) -* Setup [Vagrant Gopher](https://github.com/nathany/vagrant-gopher) in your `src` folder. -* Run `vagrant up` from the project folder. You can also setup just one box with `vagrant up linux` or `vagrant up bsd` (note: the BSD box doesn't support Windows hosts at this time, and NFS may prompt for your host OS password) -* Once setup, you can run the test suite on a given OS with a single command `vagrant ssh linux -c 'cd fsnotify/fsnotify; go test'`. -* When you're done, you will want to halt or destroy the Vagrant boxes. - -Notice: fsnotify file system events won't trigger in shared folders. The tests get around this limitation by using the /tmp directory. - -Right now there is no equivalent solution for Windows and macOS, but there are Windows VMs [freely available from Microsoft](http://www.modern.ie/en-us/virtualization-tools#downloads). - -### Maintainers - -Help maintaining fsnotify is welcome. To be a maintainer: - -* Submit a pull request and sign the CLA as above. -* You must be able to run the test suite on Mac, Windows, Linux and BSD. - -To keep master clean, the fsnotify project uses the "apply mail" workflow outlined in Nathaniel Talbott's post ["Merge pull request" Considered Harmful][am]. This requires installing [hub][]. - -All code changes should be internal pull requests. - -Releases are tagged using [Semantic Versioning](http://semver.org/). - -[hub]: https://github.com/github/hub -[am]: http://blog.spreedly.com/2014/06/24/merge-pull-request-considered-harmful/#.VGa5yZPF_Zs diff --git a/vendor/github.com/fsnotify/fsnotify/LICENSE b/vendor/github.com/fsnotify/fsnotify/LICENSE deleted file mode 100644 index f21e540..0000000 --- a/vendor/github.com/fsnotify/fsnotify/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2012 The Go Authors. All rights reserved. -Copyright (c) 2012 fsnotify Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/fsnotify/fsnotify/README.md b/vendor/github.com/fsnotify/fsnotify/README.md deleted file mode 100644 index 3993207..0000000 --- a/vendor/github.com/fsnotify/fsnotify/README.md +++ /dev/null @@ -1,79 +0,0 @@ -# File system notifications for Go - -[![GoDoc](https://godoc.org/github.com/fsnotify/fsnotify?status.svg)](https://godoc.org/github.com/fsnotify/fsnotify) [![Go Report Card](https://goreportcard.com/badge/github.com/fsnotify/fsnotify)](https://goreportcard.com/report/github.com/fsnotify/fsnotify) - -fsnotify utilizes [golang.org/x/sys](https://godoc.org/golang.org/x/sys) rather than `syscall` from the standard library. Ensure you have the latest version installed by running: - -```console -go get -u golang.org/x/sys/... -``` - -Cross platform: Windows, Linux, BSD and macOS. - -|Adapter |OS |Status | -|----------|----------|----------| -|inotify |Linux 2.6.27 or later, Android\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| -|kqueue |BSD, macOS, iOS\*|Supported [![Build Status](https://travis-ci.org/fsnotify/fsnotify.svg?branch=master)](https://travis-ci.org/fsnotify/fsnotify)| -|ReadDirectoryChangesW|Windows|Supported [![Build status](https://ci.appveyor.com/api/projects/status/ivwjubaih4r0udeh/branch/master?svg=true)](https://ci.appveyor.com/project/NathanYoungman/fsnotify/branch/master)| -|FSEvents |macOS |[Planned](https://github.com/fsnotify/fsnotify/issues/11)| -|FEN |Solaris 11 |[In Progress](https://github.com/fsnotify/fsnotify/issues/12)| -|fanotify |Linux 2.6.37+ | | -|USN Journals |Windows |[Maybe](https://github.com/fsnotify/fsnotify/issues/53)| -|Polling |*All* |[Maybe](https://github.com/fsnotify/fsnotify/issues/9)| - -\* Android and iOS are untested. - -Please see [the documentation](https://godoc.org/github.com/fsnotify/fsnotify) and consult the [FAQ](#faq) for usage information. - -## API stability - -fsnotify is a fork of [howeyc/fsnotify](https://godoc.org/github.com/howeyc/fsnotify) with a new API as of v1.0. The API is based on [this design document](http://goo.gl/MrYxyA). - -All [releases](https://github.com/fsnotify/fsnotify/releases) are tagged based on [Semantic Versioning](http://semver.org/). Further API changes are [planned](https://github.com/fsnotify/fsnotify/milestones), and will be tagged with a new major revision number. - -Go 1.6 supports dependencies located in the `vendor/` folder. Unless you are creating a library, it is recommended that you copy fsnotify into `vendor/github.com/fsnotify/fsnotify` within your project, and likewise for `golang.org/x/sys`. - -## Contributing - -Please refer to [CONTRIBUTING][] before opening an issue or pull request. - -## Example - -See [example_test.go](https://github.com/fsnotify/fsnotify/blob/master/example_test.go). - -## FAQ - -**When a file is moved to another directory is it still being watched?** - -No (it shouldn't be, unless you are watching where it was moved to). - -**When I watch a directory, are all subdirectories watched as well?** - -No, you must add watches for any directory you want to watch (a recursive watcher is on the roadmap [#18][]). - -**Do I have to watch the Error and Event channels in a separate goroutine?** - -As of now, yes. Looking into making this single-thread friendly (see [howeyc #7][#7]) - -**Why am I receiving multiple events for the same file on OS X?** - -Spotlight indexing on OS X can result in multiple events (see [howeyc #62][#62]). A temporary workaround is to add your folder(s) to the *Spotlight Privacy settings* until we have a native FSEvents implementation (see [#11][]). - -**How many files can be watched at once?** - -There are OS-specific limits as to how many watches can be created: -* Linux: /proc/sys/fs/inotify/max_user_watches contains the limit, reaching this limit results in a "no space left on device" error. -* BSD / OSX: sysctl variables "kern.maxfiles" and "kern.maxfilesperproc", reaching these limits results in a "too many open files" error. - -[#62]: https://github.com/howeyc/fsnotify/issues/62 -[#18]: https://github.com/fsnotify/fsnotify/issues/18 -[#11]: https://github.com/fsnotify/fsnotify/issues/11 -[#7]: https://github.com/howeyc/fsnotify/issues/7 - -[contributing]: https://github.com/fsnotify/fsnotify/blob/master/CONTRIBUTING.md - -## Related Projects - -* [notify](https://github.com/rjeczalik/notify) -* [fsevents](https://github.com/fsnotify/fsevents) - diff --git a/vendor/github.com/fsnotify/fsnotify/fen.go b/vendor/github.com/fsnotify/fsnotify/fen.go deleted file mode 100644 index ced39cb..0000000 --- a/vendor/github.com/fsnotify/fsnotify/fen.go +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build solaris - -package fsnotify - -import ( - "errors" -) - -// Watcher watches a set of files, delivering events to a channel. -type Watcher struct { - Events chan Event - Errors chan error -} - -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. -func NewWatcher() (*Watcher, error) { - return nil, errors.New("FEN based watcher not yet supported for fsnotify\n") -} - -// Close removes all watches and closes the events channel. -func (w *Watcher) Close() error { - return nil -} - -// Add starts watching the named file or directory (non-recursively). -func (w *Watcher) Add(name string) error { - return nil -} - -// Remove stops watching the the named file or directory (non-recursively). -func (w *Watcher) Remove(name string) error { - return nil -} diff --git a/vendor/github.com/fsnotify/fsnotify/fsnotify.go b/vendor/github.com/fsnotify/fsnotify/fsnotify.go deleted file mode 100644 index 190bf0d..0000000 --- a/vendor/github.com/fsnotify/fsnotify/fsnotify.go +++ /dev/null @@ -1,66 +0,0 @@ -// Copyright 2012 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !plan9 - -// Package fsnotify provides a platform-independent interface for file system notifications. -package fsnotify - -import ( - "bytes" - "errors" - "fmt" -) - -// Event represents a single file system notification. -type Event struct { - Name string // Relative path to the file or directory. - Op Op // File operation that triggered the event. -} - -// Op describes a set of file operations. -type Op uint32 - -// These are the generalized file operations that can trigger a notification. -const ( - Create Op = 1 << iota - Write - Remove - Rename - Chmod -) - -func (op Op) String() string { - // Use a buffer for efficient string concatenation - var buffer bytes.Buffer - - if op&Create == Create { - buffer.WriteString("|CREATE") - } - if op&Remove == Remove { - buffer.WriteString("|REMOVE") - } - if op&Write == Write { - buffer.WriteString("|WRITE") - } - if op&Rename == Rename { - buffer.WriteString("|RENAME") - } - if op&Chmod == Chmod { - buffer.WriteString("|CHMOD") - } - if buffer.Len() == 0 { - return "" - } - return buffer.String()[1:] // Strip leading pipe -} - -// String returns a string representation of the event in the form -// "file: REMOVE|WRITE|..." -func (e Event) String() string { - return fmt.Sprintf("%q: %s", e.Name, e.Op.String()) -} - -// Common errors that can be reported by a watcher -var ErrEventOverflow = errors.New("fsnotify queue overflow") diff --git a/vendor/github.com/fsnotify/fsnotify/inotify.go b/vendor/github.com/fsnotify/fsnotify/inotify.go deleted file mode 100644 index d9fd1b8..0000000 --- a/vendor/github.com/fsnotify/fsnotify/inotify.go +++ /dev/null @@ -1,337 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build linux - -package fsnotify - -import ( - "errors" - "fmt" - "io" - "os" - "path/filepath" - "strings" - "sync" - "unsafe" - - "golang.org/x/sys/unix" -) - -// Watcher watches a set of files, delivering events to a channel. -type Watcher struct { - Events chan Event - Errors chan error - mu sync.Mutex // Map access - fd int - poller *fdPoller - watches map[string]*watch // Map of inotify watches (key: path) - paths map[int]string // Map of watched paths (key: watch descriptor) - done chan struct{} // Channel for sending a "quit message" to the reader goroutine - doneResp chan struct{} // Channel to respond to Close -} - -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. -func NewWatcher() (*Watcher, error) { - // Create inotify fd - fd, errno := unix.InotifyInit1(unix.IN_CLOEXEC) - if fd == -1 { - return nil, errno - } - // Create epoll - poller, err := newFdPoller(fd) - if err != nil { - unix.Close(fd) - return nil, err - } - w := &Watcher{ - fd: fd, - poller: poller, - watches: make(map[string]*watch), - paths: make(map[int]string), - Events: make(chan Event), - Errors: make(chan error), - done: make(chan struct{}), - doneResp: make(chan struct{}), - } - - go w.readEvents() - return w, nil -} - -func (w *Watcher) isClosed() bool { - select { - case <-w.done: - return true - default: - return false - } -} - -// Close removes all watches and closes the events channel. -func (w *Watcher) Close() error { - if w.isClosed() { - return nil - } - - // Send 'close' signal to goroutine, and set the Watcher to closed. - close(w.done) - - // Wake up goroutine - w.poller.wake() - - // Wait for goroutine to close - <-w.doneResp - - return nil -} - -// Add starts watching the named file or directory (non-recursively). -func (w *Watcher) Add(name string) error { - name = filepath.Clean(name) - if w.isClosed() { - return errors.New("inotify instance already closed") - } - - const agnosticEvents = unix.IN_MOVED_TO | unix.IN_MOVED_FROM | - unix.IN_CREATE | unix.IN_ATTRIB | unix.IN_MODIFY | - unix.IN_MOVE_SELF | unix.IN_DELETE | unix.IN_DELETE_SELF - - var flags uint32 = agnosticEvents - - w.mu.Lock() - defer w.mu.Unlock() - watchEntry := w.watches[name] - if watchEntry != nil { - flags |= watchEntry.flags | unix.IN_MASK_ADD - } - wd, errno := unix.InotifyAddWatch(w.fd, name, flags) - if wd == -1 { - return errno - } - - if watchEntry == nil { - w.watches[name] = &watch{wd: uint32(wd), flags: flags} - w.paths[wd] = name - } else { - watchEntry.wd = uint32(wd) - watchEntry.flags = flags - } - - return nil -} - -// Remove stops watching the named file or directory (non-recursively). -func (w *Watcher) Remove(name string) error { - name = filepath.Clean(name) - - // Fetch the watch. - w.mu.Lock() - defer w.mu.Unlock() - watch, ok := w.watches[name] - - // Remove it from inotify. - if !ok { - return fmt.Errorf("can't remove non-existent inotify watch for: %s", name) - } - - // We successfully removed the watch if InotifyRmWatch doesn't return an - // error, we need to clean up our internal state to ensure it matches - // inotify's kernel state. - delete(w.paths, int(watch.wd)) - delete(w.watches, name) - - // inotify_rm_watch will return EINVAL if the file has been deleted; - // the inotify will already have been removed. - // watches and pathes are deleted in ignoreLinux() implicitly and asynchronously - // by calling inotify_rm_watch() below. e.g. readEvents() goroutine receives IN_IGNORE - // so that EINVAL means that the wd is being rm_watch()ed or its file removed - // by another thread and we have not received IN_IGNORE event. - success, errno := unix.InotifyRmWatch(w.fd, watch.wd) - if success == -1 { - // TODO: Perhaps it's not helpful to return an error here in every case. - // the only two possible errors are: - // EBADF, which happens when w.fd is not a valid file descriptor of any kind. - // EINVAL, which is when fd is not an inotify descriptor or wd is not a valid watch descriptor. - // Watch descriptors are invalidated when they are removed explicitly or implicitly; - // explicitly by inotify_rm_watch, implicitly when the file they are watching is deleted. - return errno - } - - return nil -} - -type watch struct { - wd uint32 // Watch descriptor (as returned by the inotify_add_watch() syscall) - flags uint32 // inotify flags of this watch (see inotify(7) for the list of valid flags) -} - -// readEvents reads from the inotify file descriptor, converts the -// received events into Event objects and sends them via the Events channel -func (w *Watcher) readEvents() { - var ( - buf [unix.SizeofInotifyEvent * 4096]byte // Buffer for a maximum of 4096 raw events - n int // Number of bytes read with read() - errno error // Syscall errno - ok bool // For poller.wait - ) - - defer close(w.doneResp) - defer close(w.Errors) - defer close(w.Events) - defer unix.Close(w.fd) - defer w.poller.close() - - for { - // See if we have been closed. - if w.isClosed() { - return - } - - ok, errno = w.poller.wait() - if errno != nil { - select { - case w.Errors <- errno: - case <-w.done: - return - } - continue - } - - if !ok { - continue - } - - n, errno = unix.Read(w.fd, buf[:]) - // If a signal interrupted execution, see if we've been asked to close, and try again. - // http://man7.org/linux/man-pages/man7/signal.7.html : - // "Before Linux 3.8, reads from an inotify(7) file descriptor were not restartable" - if errno == unix.EINTR { - continue - } - - // unix.Read might have been woken up by Close. If so, we're done. - if w.isClosed() { - return - } - - if n < unix.SizeofInotifyEvent { - var err error - if n == 0 { - // If EOF is received. This should really never happen. - err = io.EOF - } else if n < 0 { - // If an error occurred while reading. - err = errno - } else { - // Read was too short. - err = errors.New("notify: short read in readEvents()") - } - select { - case w.Errors <- err: - case <-w.done: - return - } - continue - } - - var offset uint32 - // We don't know how many events we just read into the buffer - // While the offset points to at least one whole event... - for offset <= uint32(n-unix.SizeofInotifyEvent) { - // Point "raw" to the event in the buffer - raw := (*unix.InotifyEvent)(unsafe.Pointer(&buf[offset])) - - mask := uint32(raw.Mask) - nameLen := uint32(raw.Len) - - if mask&unix.IN_Q_OVERFLOW != 0 { - select { - case w.Errors <- ErrEventOverflow: - case <-w.done: - return - } - } - - // If the event happened to the watched directory or the watched file, the kernel - // doesn't append the filename to the event, but we would like to always fill the - // the "Name" field with a valid filename. We retrieve the path of the watch from - // the "paths" map. - w.mu.Lock() - name, ok := w.paths[int(raw.Wd)] - // IN_DELETE_SELF occurs when the file/directory being watched is removed. - // This is a sign to clean up the maps, otherwise we are no longer in sync - // with the inotify kernel state which has already deleted the watch - // automatically. - if ok && mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF { - delete(w.paths, int(raw.Wd)) - delete(w.watches, name) - } - w.mu.Unlock() - - if nameLen > 0 { - // Point "bytes" at the first byte of the filename - bytes := (*[unix.PathMax]byte)(unsafe.Pointer(&buf[offset+unix.SizeofInotifyEvent])) - // The filename is padded with NULL bytes. TrimRight() gets rid of those. - name += "/" + strings.TrimRight(string(bytes[0:nameLen]), "\000") - } - - event := newEvent(name, mask) - - // Send the events that are not ignored on the events channel - if !event.ignoreLinux(mask) { - select { - case w.Events <- event: - case <-w.done: - return - } - } - - // Move to the next event in the buffer - offset += unix.SizeofInotifyEvent + nameLen - } - } -} - -// Certain types of events can be "ignored" and not sent over the Events -// channel. Such as events marked ignore by the kernel, or MODIFY events -// against files that do not exist. -func (e *Event) ignoreLinux(mask uint32) bool { - // Ignore anything the inotify API says to ignore - if mask&unix.IN_IGNORED == unix.IN_IGNORED { - return true - } - - // If the event is not a DELETE or RENAME, the file must exist. - // Otherwise the event is ignored. - // *Note*: this was put in place because it was seen that a MODIFY - // event was sent after the DELETE. This ignores that MODIFY and - // assumes a DELETE will come or has come if the file doesn't exist. - if !(e.Op&Remove == Remove || e.Op&Rename == Rename) { - _, statErr := os.Lstat(e.Name) - return os.IsNotExist(statErr) - } - return false -} - -// newEvent returns an platform-independent Event based on an inotify mask. -func newEvent(name string, mask uint32) Event { - e := Event{Name: name} - if mask&unix.IN_CREATE == unix.IN_CREATE || mask&unix.IN_MOVED_TO == unix.IN_MOVED_TO { - e.Op |= Create - } - if mask&unix.IN_DELETE_SELF == unix.IN_DELETE_SELF || mask&unix.IN_DELETE == unix.IN_DELETE { - e.Op |= Remove - } - if mask&unix.IN_MODIFY == unix.IN_MODIFY { - e.Op |= Write - } - if mask&unix.IN_MOVE_SELF == unix.IN_MOVE_SELF || mask&unix.IN_MOVED_FROM == unix.IN_MOVED_FROM { - e.Op |= Rename - } - if mask&unix.IN_ATTRIB == unix.IN_ATTRIB { - e.Op |= Chmod - } - return e -} diff --git a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go b/vendor/github.com/fsnotify/fsnotify/inotify_poller.go deleted file mode 100644 index cc7db4b..0000000 --- a/vendor/github.com/fsnotify/fsnotify/inotify_poller.go +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright 2015 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build linux - -package fsnotify - -import ( - "errors" - - "golang.org/x/sys/unix" -) - -type fdPoller struct { - fd int // File descriptor (as returned by the inotify_init() syscall) - epfd int // Epoll file descriptor - pipe [2]int // Pipe for waking up -} - -func emptyPoller(fd int) *fdPoller { - poller := new(fdPoller) - poller.fd = fd - poller.epfd = -1 - poller.pipe[0] = -1 - poller.pipe[1] = -1 - return poller -} - -// Create a new inotify poller. -// This creates an inotify handler, and an epoll handler. -func newFdPoller(fd int) (*fdPoller, error) { - var errno error - poller := emptyPoller(fd) - defer func() { - if errno != nil { - poller.close() - } - }() - poller.fd = fd - - // Create epoll fd - poller.epfd, errno = unix.EpollCreate1(0) - if poller.epfd == -1 { - return nil, errno - } - // Create pipe; pipe[0] is the read end, pipe[1] the write end. - errno = unix.Pipe2(poller.pipe[:], unix.O_NONBLOCK) - if errno != nil { - return nil, errno - } - - // Register inotify fd with epoll - event := unix.EpollEvent{ - Fd: int32(poller.fd), - Events: unix.EPOLLIN, - } - errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.fd, &event) - if errno != nil { - return nil, errno - } - - // Register pipe fd with epoll - event = unix.EpollEvent{ - Fd: int32(poller.pipe[0]), - Events: unix.EPOLLIN, - } - errno = unix.EpollCtl(poller.epfd, unix.EPOLL_CTL_ADD, poller.pipe[0], &event) - if errno != nil { - return nil, errno - } - - return poller, nil -} - -// Wait using epoll. -// Returns true if something is ready to be read, -// false if there is not. -func (poller *fdPoller) wait() (bool, error) { - // 3 possible events per fd, and 2 fds, makes a maximum of 6 events. - // I don't know whether epoll_wait returns the number of events returned, - // or the total number of events ready. - // I decided to catch both by making the buffer one larger than the maximum. - events := make([]unix.EpollEvent, 7) - for { - n, errno := unix.EpollWait(poller.epfd, events, -1) - if n == -1 { - if errno == unix.EINTR { - continue - } - return false, errno - } - if n == 0 { - // If there are no events, try again. - continue - } - if n > 6 { - // This should never happen. More events were returned than should be possible. - return false, errors.New("epoll_wait returned more events than I know what to do with") - } - ready := events[:n] - epollhup := false - epollerr := false - epollin := false - for _, event := range ready { - if event.Fd == int32(poller.fd) { - if event.Events&unix.EPOLLHUP != 0 { - // This should not happen, but if it does, treat it as a wakeup. - epollhup = true - } - if event.Events&unix.EPOLLERR != 0 { - // If an error is waiting on the file descriptor, we should pretend - // something is ready to read, and let unix.Read pick up the error. - epollerr = true - } - if event.Events&unix.EPOLLIN != 0 { - // There is data to read. - epollin = true - } - } - if event.Fd == int32(poller.pipe[0]) { - if event.Events&unix.EPOLLHUP != 0 { - // Write pipe descriptor was closed, by us. This means we're closing down the - // watcher, and we should wake up. - } - if event.Events&unix.EPOLLERR != 0 { - // If an error is waiting on the pipe file descriptor. - // This is an absolute mystery, and should never ever happen. - return false, errors.New("Error on the pipe descriptor.") - } - if event.Events&unix.EPOLLIN != 0 { - // This is a regular wakeup, so we have to clear the buffer. - err := poller.clearWake() - if err != nil { - return false, err - } - } - } - } - - if epollhup || epollerr || epollin { - return true, nil - } - return false, nil - } -} - -// Close the write end of the poller. -func (poller *fdPoller) wake() error { - buf := make([]byte, 1) - n, errno := unix.Write(poller.pipe[1], buf) - if n == -1 { - if errno == unix.EAGAIN { - // Buffer is full, poller will wake. - return nil - } - return errno - } - return nil -} - -func (poller *fdPoller) clearWake() error { - // You have to be woken up a LOT in order to get to 100! - buf := make([]byte, 100) - n, errno := unix.Read(poller.pipe[0], buf) - if n == -1 { - if errno == unix.EAGAIN { - // Buffer is empty, someone else cleared our wake. - return nil - } - return errno - } - return nil -} - -// Close all poller file descriptors, but not the one passed to it. -func (poller *fdPoller) close() { - if poller.pipe[1] != -1 { - unix.Close(poller.pipe[1]) - } - if poller.pipe[0] != -1 { - unix.Close(poller.pipe[0]) - } - if poller.epfd != -1 { - unix.Close(poller.epfd) - } -} diff --git a/vendor/github.com/fsnotify/fsnotify/kqueue.go b/vendor/github.com/fsnotify/fsnotify/kqueue.go deleted file mode 100644 index 86e76a3..0000000 --- a/vendor/github.com/fsnotify/fsnotify/kqueue.go +++ /dev/null @@ -1,521 +0,0 @@ -// Copyright 2010 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build freebsd openbsd netbsd dragonfly darwin - -package fsnotify - -import ( - "errors" - "fmt" - "io/ioutil" - "os" - "path/filepath" - "sync" - "time" - - "golang.org/x/sys/unix" -) - -// Watcher watches a set of files, delivering events to a channel. -type Watcher struct { - Events chan Event - Errors chan error - done chan struct{} // Channel for sending a "quit message" to the reader goroutine - - kq int // File descriptor (as returned by the kqueue() syscall). - - mu sync.Mutex // Protects access to watcher data - watches map[string]int // Map of watched file descriptors (key: path). - externalWatches map[string]bool // Map of watches added by user of the library. - dirFlags map[string]uint32 // Map of watched directories to fflags used in kqueue. - paths map[int]pathInfo // Map file descriptors to path names for processing kqueue events. - fileExists map[string]bool // Keep track of if we know this file exists (to stop duplicate create events). - isClosed bool // Set to true when Close() is first called -} - -type pathInfo struct { - name string - isDir bool -} - -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. -func NewWatcher() (*Watcher, error) { - kq, err := kqueue() - if err != nil { - return nil, err - } - - w := &Watcher{ - kq: kq, - watches: make(map[string]int), - dirFlags: make(map[string]uint32), - paths: make(map[int]pathInfo), - fileExists: make(map[string]bool), - externalWatches: make(map[string]bool), - Events: make(chan Event), - Errors: make(chan error), - done: make(chan struct{}), - } - - go w.readEvents() - return w, nil -} - -// Close removes all watches and closes the events channel. -func (w *Watcher) Close() error { - w.mu.Lock() - if w.isClosed { - w.mu.Unlock() - return nil - } - w.isClosed = true - - // copy paths to remove while locked - var pathsToRemove = make([]string, 0, len(w.watches)) - for name := range w.watches { - pathsToRemove = append(pathsToRemove, name) - } - w.mu.Unlock() - // unlock before calling Remove, which also locks - - for _, name := range pathsToRemove { - w.Remove(name) - } - - // send a "quit" message to the reader goroutine - close(w.done) - - return nil -} - -// Add starts watching the named file or directory (non-recursively). -func (w *Watcher) Add(name string) error { - w.mu.Lock() - w.externalWatches[name] = true - w.mu.Unlock() - _, err := w.addWatch(name, noteAllEvents) - return err -} - -// Remove stops watching the the named file or directory (non-recursively). -func (w *Watcher) Remove(name string) error { - name = filepath.Clean(name) - w.mu.Lock() - watchfd, ok := w.watches[name] - w.mu.Unlock() - if !ok { - return fmt.Errorf("can't remove non-existent kevent watch for: %s", name) - } - - const registerRemove = unix.EV_DELETE - if err := register(w.kq, []int{watchfd}, registerRemove, 0); err != nil { - return err - } - - unix.Close(watchfd) - - w.mu.Lock() - isDir := w.paths[watchfd].isDir - delete(w.watches, name) - delete(w.paths, watchfd) - delete(w.dirFlags, name) - w.mu.Unlock() - - // Find all watched paths that are in this directory that are not external. - if isDir { - var pathsToRemove []string - w.mu.Lock() - for _, path := range w.paths { - wdir, _ := filepath.Split(path.name) - if filepath.Clean(wdir) == name { - if !w.externalWatches[path.name] { - pathsToRemove = append(pathsToRemove, path.name) - } - } - } - w.mu.Unlock() - for _, name := range pathsToRemove { - // Since these are internal, not much sense in propagating error - // to the user, as that will just confuse them with an error about - // a path they did not explicitly watch themselves. - w.Remove(name) - } - } - - return nil -} - -// Watch all events (except NOTE_EXTEND, NOTE_LINK, NOTE_REVOKE) -const noteAllEvents = unix.NOTE_DELETE | unix.NOTE_WRITE | unix.NOTE_ATTRIB | unix.NOTE_RENAME - -// keventWaitTime to block on each read from kevent -var keventWaitTime = durationToTimespec(100 * time.Millisecond) - -// addWatch adds name to the watched file set. -// The flags are interpreted as described in kevent(2). -// Returns the real path to the file which was added, if any, which may be different from the one passed in the case of symlinks. -func (w *Watcher) addWatch(name string, flags uint32) (string, error) { - var isDir bool - // Make ./name and name equivalent - name = filepath.Clean(name) - - w.mu.Lock() - if w.isClosed { - w.mu.Unlock() - return "", errors.New("kevent instance already closed") - } - watchfd, alreadyWatching := w.watches[name] - // We already have a watch, but we can still override flags. - if alreadyWatching { - isDir = w.paths[watchfd].isDir - } - w.mu.Unlock() - - if !alreadyWatching { - fi, err := os.Lstat(name) - if err != nil { - return "", err - } - - // Don't watch sockets. - if fi.Mode()&os.ModeSocket == os.ModeSocket { - return "", nil - } - - // Don't watch named pipes. - if fi.Mode()&os.ModeNamedPipe == os.ModeNamedPipe { - return "", nil - } - - // Follow Symlinks - // Unfortunately, Linux can add bogus symlinks to watch list without - // issue, and Windows can't do symlinks period (AFAIK). To maintain - // consistency, we will act like everything is fine. There will simply - // be no file events for broken symlinks. - // Hence the returns of nil on errors. - if fi.Mode()&os.ModeSymlink == os.ModeSymlink { - name, err = filepath.EvalSymlinks(name) - if err != nil { - return "", nil - } - - w.mu.Lock() - _, alreadyWatching = w.watches[name] - w.mu.Unlock() - - if alreadyWatching { - return name, nil - } - - fi, err = os.Lstat(name) - if err != nil { - return "", nil - } - } - - watchfd, err = unix.Open(name, openMode, 0700) - if watchfd == -1 { - return "", err - } - - isDir = fi.IsDir() - } - - const registerAdd = unix.EV_ADD | unix.EV_CLEAR | unix.EV_ENABLE - if err := register(w.kq, []int{watchfd}, registerAdd, flags); err != nil { - unix.Close(watchfd) - return "", err - } - - if !alreadyWatching { - w.mu.Lock() - w.watches[name] = watchfd - w.paths[watchfd] = pathInfo{name: name, isDir: isDir} - w.mu.Unlock() - } - - if isDir { - // Watch the directory if it has not been watched before, - // or if it was watched before, but perhaps only a NOTE_DELETE (watchDirectoryFiles) - w.mu.Lock() - - watchDir := (flags&unix.NOTE_WRITE) == unix.NOTE_WRITE && - (!alreadyWatching || (w.dirFlags[name]&unix.NOTE_WRITE) != unix.NOTE_WRITE) - // Store flags so this watch can be updated later - w.dirFlags[name] = flags - w.mu.Unlock() - - if watchDir { - if err := w.watchDirectoryFiles(name); err != nil { - return "", err - } - } - } - return name, nil -} - -// readEvents reads from kqueue and converts the received kevents into -// Event values that it sends down the Events channel. -func (w *Watcher) readEvents() { - eventBuffer := make([]unix.Kevent_t, 10) - -loop: - for { - // See if there is a message on the "done" channel - select { - case <-w.done: - break loop - default: - } - - // Get new events - kevents, err := read(w.kq, eventBuffer, &keventWaitTime) - // EINTR is okay, the syscall was interrupted before timeout expired. - if err != nil && err != unix.EINTR { - select { - case w.Errors <- err: - case <-w.done: - break loop - } - continue - } - - // Flush the events we received to the Events channel - for len(kevents) > 0 { - kevent := &kevents[0] - watchfd := int(kevent.Ident) - mask := uint32(kevent.Fflags) - w.mu.Lock() - path := w.paths[watchfd] - w.mu.Unlock() - event := newEvent(path.name, mask) - - if path.isDir && !(event.Op&Remove == Remove) { - // Double check to make sure the directory exists. This can happen when - // we do a rm -fr on a recursively watched folders and we receive a - // modification event first but the folder has been deleted and later - // receive the delete event - if _, err := os.Lstat(event.Name); os.IsNotExist(err) { - // mark is as delete event - event.Op |= Remove - } - } - - if event.Op&Rename == Rename || event.Op&Remove == Remove { - w.Remove(event.Name) - w.mu.Lock() - delete(w.fileExists, event.Name) - w.mu.Unlock() - } - - if path.isDir && event.Op&Write == Write && !(event.Op&Remove == Remove) { - w.sendDirectoryChangeEvents(event.Name) - } else { - // Send the event on the Events channel. - select { - case w.Events <- event: - case <-w.done: - break loop - } - } - - if event.Op&Remove == Remove { - // Look for a file that may have overwritten this. - // For example, mv f1 f2 will delete f2, then create f2. - if path.isDir { - fileDir := filepath.Clean(event.Name) - w.mu.Lock() - _, found := w.watches[fileDir] - w.mu.Unlock() - if found { - // make sure the directory exists before we watch for changes. When we - // do a recursive watch and perform rm -fr, the parent directory might - // have gone missing, ignore the missing directory and let the - // upcoming delete event remove the watch from the parent directory. - if _, err := os.Lstat(fileDir); err == nil { - w.sendDirectoryChangeEvents(fileDir) - } - } - } else { - filePath := filepath.Clean(event.Name) - if fileInfo, err := os.Lstat(filePath); err == nil { - w.sendFileCreatedEventIfNew(filePath, fileInfo) - } - } - } - - // Move to next event - kevents = kevents[1:] - } - } - - // cleanup - err := unix.Close(w.kq) - if err != nil { - // only way the previous loop breaks is if w.done was closed so we need to async send to w.Errors. - select { - case w.Errors <- err: - default: - } - } - close(w.Events) - close(w.Errors) -} - -// newEvent returns an platform-independent Event based on kqueue Fflags. -func newEvent(name string, mask uint32) Event { - e := Event{Name: name} - if mask&unix.NOTE_DELETE == unix.NOTE_DELETE { - e.Op |= Remove - } - if mask&unix.NOTE_WRITE == unix.NOTE_WRITE { - e.Op |= Write - } - if mask&unix.NOTE_RENAME == unix.NOTE_RENAME { - e.Op |= Rename - } - if mask&unix.NOTE_ATTRIB == unix.NOTE_ATTRIB { - e.Op |= Chmod - } - return e -} - -func newCreateEvent(name string) Event { - return Event{Name: name, Op: Create} -} - -// watchDirectoryFiles to mimic inotify when adding a watch on a directory -func (w *Watcher) watchDirectoryFiles(dirPath string) error { - // Get all files - files, err := ioutil.ReadDir(dirPath) - if err != nil { - return err - } - - for _, fileInfo := range files { - filePath := filepath.Join(dirPath, fileInfo.Name()) - filePath, err = w.internalWatch(filePath, fileInfo) - if err != nil { - return err - } - - w.mu.Lock() - w.fileExists[filePath] = true - w.mu.Unlock() - } - - return nil -} - -// sendDirectoryEvents searches the directory for newly created files -// and sends them over the event channel. This functionality is to have -// the BSD version of fsnotify match Linux inotify which provides a -// create event for files created in a watched directory. -func (w *Watcher) sendDirectoryChangeEvents(dirPath string) { - // Get all files - files, err := ioutil.ReadDir(dirPath) - if err != nil { - select { - case w.Errors <- err: - case <-w.done: - return - } - } - - // Search for new files - for _, fileInfo := range files { - filePath := filepath.Join(dirPath, fileInfo.Name()) - err := w.sendFileCreatedEventIfNew(filePath, fileInfo) - - if err != nil { - return - } - } -} - -// sendFileCreatedEvent sends a create event if the file isn't already being tracked. -func (w *Watcher) sendFileCreatedEventIfNew(filePath string, fileInfo os.FileInfo) (err error) { - w.mu.Lock() - _, doesExist := w.fileExists[filePath] - w.mu.Unlock() - if !doesExist { - // Send create event - select { - case w.Events <- newCreateEvent(filePath): - case <-w.done: - return - } - } - - // like watchDirectoryFiles (but without doing another ReadDir) - filePath, err = w.internalWatch(filePath, fileInfo) - if err != nil { - return err - } - - w.mu.Lock() - w.fileExists[filePath] = true - w.mu.Unlock() - - return nil -} - -func (w *Watcher) internalWatch(name string, fileInfo os.FileInfo) (string, error) { - if fileInfo.IsDir() { - // mimic Linux providing delete events for subdirectories - // but preserve the flags used if currently watching subdirectory - w.mu.Lock() - flags := w.dirFlags[name] - w.mu.Unlock() - - flags |= unix.NOTE_DELETE | unix.NOTE_RENAME - return w.addWatch(name, flags) - } - - // watch file to mimic Linux inotify - return w.addWatch(name, noteAllEvents) -} - -// kqueue creates a new kernel event queue and returns a descriptor. -func kqueue() (kq int, err error) { - kq, err = unix.Kqueue() - if kq == -1 { - return kq, err - } - return kq, nil -} - -// register events with the queue -func register(kq int, fds []int, flags int, fflags uint32) error { - changes := make([]unix.Kevent_t, len(fds)) - - for i, fd := range fds { - // SetKevent converts int to the platform-specific types: - unix.SetKevent(&changes[i], fd, unix.EVFILT_VNODE, flags) - changes[i].Fflags = fflags - } - - // register the events - success, err := unix.Kevent(kq, changes, nil, nil) - if success == -1 { - return err - } - return nil -} - -// read retrieves pending events, or waits until an event occurs. -// A timeout of nil blocks indefinitely, while 0 polls the queue. -func read(kq int, events []unix.Kevent_t, timeout *unix.Timespec) ([]unix.Kevent_t, error) { - n, err := unix.Kevent(kq, nil, events, timeout) - if err != nil { - return nil, err - } - return events[0:n], nil -} - -// durationToTimespec prepares a timeout value -func durationToTimespec(d time.Duration) unix.Timespec { - return unix.NsecToTimespec(d.Nanoseconds()) -} diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go b/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go deleted file mode 100644 index 7d8de14..0000000 --- a/vendor/github.com/fsnotify/fsnotify/open_mode_bsd.go +++ /dev/null @@ -1,11 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build freebsd openbsd netbsd dragonfly - -package fsnotify - -import "golang.org/x/sys/unix" - -const openMode = unix.O_NONBLOCK | unix.O_RDONLY diff --git a/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go b/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go deleted file mode 100644 index 9139e17..0000000 --- a/vendor/github.com/fsnotify/fsnotify/open_mode_darwin.go +++ /dev/null @@ -1,12 +0,0 @@ -// Copyright 2013 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build darwin - -package fsnotify - -import "golang.org/x/sys/unix" - -// note: this constant is not defined on BSD -const openMode = unix.O_EVTONLY diff --git a/vendor/github.com/fsnotify/fsnotify/windows.go b/vendor/github.com/fsnotify/fsnotify/windows.go deleted file mode 100644 index 09436f3..0000000 --- a/vendor/github.com/fsnotify/fsnotify/windows.go +++ /dev/null @@ -1,561 +0,0 @@ -// Copyright 2011 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build windows - -package fsnotify - -import ( - "errors" - "fmt" - "os" - "path/filepath" - "runtime" - "sync" - "syscall" - "unsafe" -) - -// Watcher watches a set of files, delivering events to a channel. -type Watcher struct { - Events chan Event - Errors chan error - isClosed bool // Set to true when Close() is first called - mu sync.Mutex // Map access - port syscall.Handle // Handle to completion port - watches watchMap // Map of watches (key: i-number) - input chan *input // Inputs to the reader are sent on this channel - quit chan chan<- error -} - -// NewWatcher establishes a new watcher with the underlying OS and begins waiting for events. -func NewWatcher() (*Watcher, error) { - port, e := syscall.CreateIoCompletionPort(syscall.InvalidHandle, 0, 0, 0) - if e != nil { - return nil, os.NewSyscallError("CreateIoCompletionPort", e) - } - w := &Watcher{ - port: port, - watches: make(watchMap), - input: make(chan *input, 1), - Events: make(chan Event, 50), - Errors: make(chan error), - quit: make(chan chan<- error, 1), - } - go w.readEvents() - return w, nil -} - -// Close removes all watches and closes the events channel. -func (w *Watcher) Close() error { - if w.isClosed { - return nil - } - w.isClosed = true - - // Send "quit" message to the reader goroutine - ch := make(chan error) - w.quit <- ch - if err := w.wakeupReader(); err != nil { - return err - } - return <-ch -} - -// Add starts watching the named file or directory (non-recursively). -func (w *Watcher) Add(name string) error { - if w.isClosed { - return errors.New("watcher already closed") - } - in := &input{ - op: opAddWatch, - path: filepath.Clean(name), - flags: sysFSALLEVENTS, - reply: make(chan error), - } - w.input <- in - if err := w.wakeupReader(); err != nil { - return err - } - return <-in.reply -} - -// Remove stops watching the the named file or directory (non-recursively). -func (w *Watcher) Remove(name string) error { - in := &input{ - op: opRemoveWatch, - path: filepath.Clean(name), - reply: make(chan error), - } - w.input <- in - if err := w.wakeupReader(); err != nil { - return err - } - return <-in.reply -} - -const ( - // Options for AddWatch - sysFSONESHOT = 0x80000000 - sysFSONLYDIR = 0x1000000 - - // Events - sysFSACCESS = 0x1 - sysFSALLEVENTS = 0xfff - sysFSATTRIB = 0x4 - sysFSCLOSE = 0x18 - sysFSCREATE = 0x100 - sysFSDELETE = 0x200 - sysFSDELETESELF = 0x400 - sysFSMODIFY = 0x2 - sysFSMOVE = 0xc0 - sysFSMOVEDFROM = 0x40 - sysFSMOVEDTO = 0x80 - sysFSMOVESELF = 0x800 - - // Special events - sysFSIGNORED = 0x8000 - sysFSQOVERFLOW = 0x4000 -) - -func newEvent(name string, mask uint32) Event { - e := Event{Name: name} - if mask&sysFSCREATE == sysFSCREATE || mask&sysFSMOVEDTO == sysFSMOVEDTO { - e.Op |= Create - } - if mask&sysFSDELETE == sysFSDELETE || mask&sysFSDELETESELF == sysFSDELETESELF { - e.Op |= Remove - } - if mask&sysFSMODIFY == sysFSMODIFY { - e.Op |= Write - } - if mask&sysFSMOVE == sysFSMOVE || mask&sysFSMOVESELF == sysFSMOVESELF || mask&sysFSMOVEDFROM == sysFSMOVEDFROM { - e.Op |= Rename - } - if mask&sysFSATTRIB == sysFSATTRIB { - e.Op |= Chmod - } - return e -} - -const ( - opAddWatch = iota - opRemoveWatch -) - -const ( - provisional uint64 = 1 << (32 + iota) -) - -type input struct { - op int - path string - flags uint32 - reply chan error -} - -type inode struct { - handle syscall.Handle - volume uint32 - index uint64 -} - -type watch struct { - ov syscall.Overlapped - ino *inode // i-number - path string // Directory path - mask uint64 // Directory itself is being watched with these notify flags - names map[string]uint64 // Map of names being watched and their notify flags - rename string // Remembers the old name while renaming a file - buf [4096]byte -} - -type indexMap map[uint64]*watch -type watchMap map[uint32]indexMap - -func (w *Watcher) wakeupReader() error { - e := syscall.PostQueuedCompletionStatus(w.port, 0, 0, nil) - if e != nil { - return os.NewSyscallError("PostQueuedCompletionStatus", e) - } - return nil -} - -func getDir(pathname string) (dir string, err error) { - attr, e := syscall.GetFileAttributes(syscall.StringToUTF16Ptr(pathname)) - if e != nil { - return "", os.NewSyscallError("GetFileAttributes", e) - } - if attr&syscall.FILE_ATTRIBUTE_DIRECTORY != 0 { - dir = pathname - } else { - dir, _ = filepath.Split(pathname) - dir = filepath.Clean(dir) - } - return -} - -func getIno(path string) (ino *inode, err error) { - h, e := syscall.CreateFile(syscall.StringToUTF16Ptr(path), - syscall.FILE_LIST_DIRECTORY, - syscall.FILE_SHARE_READ|syscall.FILE_SHARE_WRITE|syscall.FILE_SHARE_DELETE, - nil, syscall.OPEN_EXISTING, - syscall.FILE_FLAG_BACKUP_SEMANTICS|syscall.FILE_FLAG_OVERLAPPED, 0) - if e != nil { - return nil, os.NewSyscallError("CreateFile", e) - } - var fi syscall.ByHandleFileInformation - if e = syscall.GetFileInformationByHandle(h, &fi); e != nil { - syscall.CloseHandle(h) - return nil, os.NewSyscallError("GetFileInformationByHandle", e) - } - ino = &inode{ - handle: h, - volume: fi.VolumeSerialNumber, - index: uint64(fi.FileIndexHigh)<<32 | uint64(fi.FileIndexLow), - } - return ino, nil -} - -// Must run within the I/O thread. -func (m watchMap) get(ino *inode) *watch { - if i := m[ino.volume]; i != nil { - return i[ino.index] - } - return nil -} - -// Must run within the I/O thread. -func (m watchMap) set(ino *inode, watch *watch) { - i := m[ino.volume] - if i == nil { - i = make(indexMap) - m[ino.volume] = i - } - i[ino.index] = watch -} - -// Must run within the I/O thread. -func (w *Watcher) addWatch(pathname string, flags uint64) error { - dir, err := getDir(pathname) - if err != nil { - return err - } - if flags&sysFSONLYDIR != 0 && pathname != dir { - return nil - } - ino, err := getIno(dir) - if err != nil { - return err - } - w.mu.Lock() - watchEntry := w.watches.get(ino) - w.mu.Unlock() - if watchEntry == nil { - if _, e := syscall.CreateIoCompletionPort(ino.handle, w.port, 0, 0); e != nil { - syscall.CloseHandle(ino.handle) - return os.NewSyscallError("CreateIoCompletionPort", e) - } - watchEntry = &watch{ - ino: ino, - path: dir, - names: make(map[string]uint64), - } - w.mu.Lock() - w.watches.set(ino, watchEntry) - w.mu.Unlock() - flags |= provisional - } else { - syscall.CloseHandle(ino.handle) - } - if pathname == dir { - watchEntry.mask |= flags - } else { - watchEntry.names[filepath.Base(pathname)] |= flags - } - if err = w.startRead(watchEntry); err != nil { - return err - } - if pathname == dir { - watchEntry.mask &= ^provisional - } else { - watchEntry.names[filepath.Base(pathname)] &= ^provisional - } - return nil -} - -// Must run within the I/O thread. -func (w *Watcher) remWatch(pathname string) error { - dir, err := getDir(pathname) - if err != nil { - return err - } - ino, err := getIno(dir) - if err != nil { - return err - } - w.mu.Lock() - watch := w.watches.get(ino) - w.mu.Unlock() - if watch == nil { - return fmt.Errorf("can't remove non-existent watch for: %s", pathname) - } - if pathname == dir { - w.sendEvent(watch.path, watch.mask&sysFSIGNORED) - watch.mask = 0 - } else { - name := filepath.Base(pathname) - w.sendEvent(filepath.Join(watch.path, name), watch.names[name]&sysFSIGNORED) - delete(watch.names, name) - } - return w.startRead(watch) -} - -// Must run within the I/O thread. -func (w *Watcher) deleteWatch(watch *watch) { - for name, mask := range watch.names { - if mask&provisional == 0 { - w.sendEvent(filepath.Join(watch.path, name), mask&sysFSIGNORED) - } - delete(watch.names, name) - } - if watch.mask != 0 { - if watch.mask&provisional == 0 { - w.sendEvent(watch.path, watch.mask&sysFSIGNORED) - } - watch.mask = 0 - } -} - -// Must run within the I/O thread. -func (w *Watcher) startRead(watch *watch) error { - if e := syscall.CancelIo(watch.ino.handle); e != nil { - w.Errors <- os.NewSyscallError("CancelIo", e) - w.deleteWatch(watch) - } - mask := toWindowsFlags(watch.mask) - for _, m := range watch.names { - mask |= toWindowsFlags(m) - } - if mask == 0 { - if e := syscall.CloseHandle(watch.ino.handle); e != nil { - w.Errors <- os.NewSyscallError("CloseHandle", e) - } - w.mu.Lock() - delete(w.watches[watch.ino.volume], watch.ino.index) - w.mu.Unlock() - return nil - } - e := syscall.ReadDirectoryChanges(watch.ino.handle, &watch.buf[0], - uint32(unsafe.Sizeof(watch.buf)), false, mask, nil, &watch.ov, 0) - if e != nil { - err := os.NewSyscallError("ReadDirectoryChanges", e) - if e == syscall.ERROR_ACCESS_DENIED && watch.mask&provisional == 0 { - // Watched directory was probably removed - if w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) { - if watch.mask&sysFSONESHOT != 0 { - watch.mask = 0 - } - } - err = nil - } - w.deleteWatch(watch) - w.startRead(watch) - return err - } - return nil -} - -// readEvents reads from the I/O completion port, converts the -// received events into Event objects and sends them via the Events channel. -// Entry point to the I/O thread. -func (w *Watcher) readEvents() { - var ( - n, key uint32 - ov *syscall.Overlapped - ) - runtime.LockOSThread() - - for { - e := syscall.GetQueuedCompletionStatus(w.port, &n, &key, &ov, syscall.INFINITE) - watch := (*watch)(unsafe.Pointer(ov)) - - if watch == nil { - select { - case ch := <-w.quit: - w.mu.Lock() - var indexes []indexMap - for _, index := range w.watches { - indexes = append(indexes, index) - } - w.mu.Unlock() - for _, index := range indexes { - for _, watch := range index { - w.deleteWatch(watch) - w.startRead(watch) - } - } - var err error - if e := syscall.CloseHandle(w.port); e != nil { - err = os.NewSyscallError("CloseHandle", e) - } - close(w.Events) - close(w.Errors) - ch <- err - return - case in := <-w.input: - switch in.op { - case opAddWatch: - in.reply <- w.addWatch(in.path, uint64(in.flags)) - case opRemoveWatch: - in.reply <- w.remWatch(in.path) - } - default: - } - continue - } - - switch e { - case syscall.ERROR_MORE_DATA: - if watch == nil { - w.Errors <- errors.New("ERROR_MORE_DATA has unexpectedly null lpOverlapped buffer") - } else { - // The i/o succeeded but the buffer is full. - // In theory we should be building up a full packet. - // In practice we can get away with just carrying on. - n = uint32(unsafe.Sizeof(watch.buf)) - } - case syscall.ERROR_ACCESS_DENIED: - // Watched directory was probably removed - w.sendEvent(watch.path, watch.mask&sysFSDELETESELF) - w.deleteWatch(watch) - w.startRead(watch) - continue - case syscall.ERROR_OPERATION_ABORTED: - // CancelIo was called on this handle - continue - default: - w.Errors <- os.NewSyscallError("GetQueuedCompletionPort", e) - continue - case nil: - } - - var offset uint32 - for { - if n == 0 { - w.Events <- newEvent("", sysFSQOVERFLOW) - w.Errors <- errors.New("short read in readEvents()") - break - } - - // Point "raw" to the event in the buffer - raw := (*syscall.FileNotifyInformation)(unsafe.Pointer(&watch.buf[offset])) - buf := (*[syscall.MAX_PATH]uint16)(unsafe.Pointer(&raw.FileName)) - name := syscall.UTF16ToString(buf[:raw.FileNameLength/2]) - fullname := filepath.Join(watch.path, name) - - var mask uint64 - switch raw.Action { - case syscall.FILE_ACTION_REMOVED: - mask = sysFSDELETESELF - case syscall.FILE_ACTION_MODIFIED: - mask = sysFSMODIFY - case syscall.FILE_ACTION_RENAMED_OLD_NAME: - watch.rename = name - case syscall.FILE_ACTION_RENAMED_NEW_NAME: - if watch.names[watch.rename] != 0 { - watch.names[name] |= watch.names[watch.rename] - delete(watch.names, watch.rename) - mask = sysFSMOVESELF - } - } - - sendNameEvent := func() { - if w.sendEvent(fullname, watch.names[name]&mask) { - if watch.names[name]&sysFSONESHOT != 0 { - delete(watch.names, name) - } - } - } - if raw.Action != syscall.FILE_ACTION_RENAMED_NEW_NAME { - sendNameEvent() - } - if raw.Action == syscall.FILE_ACTION_REMOVED { - w.sendEvent(fullname, watch.names[name]&sysFSIGNORED) - delete(watch.names, name) - } - if w.sendEvent(fullname, watch.mask&toFSnotifyFlags(raw.Action)) { - if watch.mask&sysFSONESHOT != 0 { - watch.mask = 0 - } - } - if raw.Action == syscall.FILE_ACTION_RENAMED_NEW_NAME { - fullname = filepath.Join(watch.path, watch.rename) - sendNameEvent() - } - - // Move to the next event in the buffer - if raw.NextEntryOffset == 0 { - break - } - offset += raw.NextEntryOffset - - // Error! - if offset >= n { - w.Errors <- errors.New("Windows system assumed buffer larger than it is, events have likely been missed.") - break - } - } - - if err := w.startRead(watch); err != nil { - w.Errors <- err - } - } -} - -func (w *Watcher) sendEvent(name string, mask uint64) bool { - if mask == 0 { - return false - } - event := newEvent(name, uint32(mask)) - select { - case ch := <-w.quit: - w.quit <- ch - case w.Events <- event: - } - return true -} - -func toWindowsFlags(mask uint64) uint32 { - var m uint32 - if mask&sysFSACCESS != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_LAST_ACCESS - } - if mask&sysFSMODIFY != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_LAST_WRITE - } - if mask&sysFSATTRIB != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_ATTRIBUTES - } - if mask&(sysFSMOVE|sysFSCREATE|sysFSDELETE) != 0 { - m |= syscall.FILE_NOTIFY_CHANGE_FILE_NAME | syscall.FILE_NOTIFY_CHANGE_DIR_NAME - } - return m -} - -func toFSnotifyFlags(action uint32) uint64 { - switch action { - case syscall.FILE_ACTION_ADDED: - return sysFSCREATE - case syscall.FILE_ACTION_REMOVED: - return sysFSDELETE - case syscall.FILE_ACTION_MODIFIED: - return sysFSMODIFY - case syscall.FILE_ACTION_RENAMED_OLD_NAME: - return sysFSMOVEDFROM - case syscall.FILE_ACTION_RENAMED_NEW_NAME: - return sysFSMOVEDTO - } - return 0 -} diff --git a/vendor/github.com/gin-contrib/sse/.travis.yml b/vendor/github.com/gin-contrib/sse/.travis.yml deleted file mode 100644 index a556ac0..0000000 --- a/vendor/github.com/gin-contrib/sse/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -language: go -sudo: false -go: - - 1.6.4 - - 1.7.4 - - tip - -git: - depth: 3 - -script: - - go test -v -covermode=count -coverprofile=coverage.out - -after_success: - - bash <(curl -s https://codecov.io/bash) \ No newline at end of file diff --git a/vendor/github.com/gin-contrib/sse/LICENSE b/vendor/github.com/gin-contrib/sse/LICENSE deleted file mode 100644 index 1ff7f37..0000000 --- a/vendor/github.com/gin-contrib/sse/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Manuel Martínez-Almeida - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/github.com/gin-contrib/sse/README.md b/vendor/github.com/gin-contrib/sse/README.md deleted file mode 100644 index c9c49cf..0000000 --- a/vendor/github.com/gin-contrib/sse/README.md +++ /dev/null @@ -1,58 +0,0 @@ -# Server-Sent Events - -[![GoDoc](https://godoc.org/github.com/gin-contrib/sse?status.svg)](https://godoc.org/github.com/gin-contrib/sse) -[![Build Status](https://travis-ci.org/gin-contrib/sse.svg)](https://travis-ci.org/gin-contrib/sse) -[![codecov](https://codecov.io/gh/gin-contrib/sse/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-contrib/sse) -[![Go Report Card](https://goreportcard.com/badge/github.com/gin-contrib/sse)](https://goreportcard.com/report/github.com/gin-contrib/sse) - -Server-sent events (SSE) is a technology where a browser receives automatic updates from a server via HTTP connection. The Server-Sent Events EventSource API is [standardized as part of HTML5[1] by the W3C](http://www.w3.org/TR/2009/WD-eventsource-20091029/). - -- [Read this great SSE introduction by the HTML5Rocks guys](http://www.html5rocks.com/en/tutorials/eventsource/basics/) -- [Browser support](http://caniuse.com/#feat=eventsource) - -## Sample code - -```go -import "github.com/gin-contrib/sse" - -func httpHandler(w http.ResponseWriter, req *http.Request) { - // data can be a primitive like a string, an integer or a float - sse.Encode(w, sse.Event{ - Event: "message", - Data: "some data\nmore data", - }) - - // also a complex type, like a map, a struct or a slice - sse.Encode(w, sse.Event{ - Id: "124", - Event: "message", - Data: map[string]interface{}{ - "user": "manu", - "date": time.Now().Unix(), - "content": "hi!", - }, - }) -} -``` -``` -event: message -data: some data\\nmore data - -id: 124 -event: message -data: {"content":"hi!","date":1431540810,"user":"manu"} - -``` - -## Content-Type - -```go -fmt.Println(sse.ContentType) -``` -``` -text/event-stream -``` - -## Decoding support - -There is a client-side implementation of SSE coming soon. diff --git a/vendor/github.com/gin-contrib/sse/sse-decoder.go b/vendor/github.com/gin-contrib/sse/sse-decoder.go deleted file mode 100644 index fd49b9c..0000000 --- a/vendor/github.com/gin-contrib/sse/sse-decoder.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package sse - -import ( - "bytes" - "io" - "io/ioutil" -) - -type decoder struct { - events []Event -} - -func Decode(r io.Reader) ([]Event, error) { - var dec decoder - return dec.decode(r) -} - -func (d *decoder) dispatchEvent(event Event, data string) { - dataLength := len(data) - if dataLength > 0 { - //If the data buffer's last character is a U+000A LINE FEED (LF) character, then remove the last character from the data buffer. - data = data[:dataLength-1] - dataLength-- - } - if dataLength == 0 && event.Event == "" { - return - } - if event.Event == "" { - event.Event = "message" - } - event.Data = data - d.events = append(d.events, event) -} - -func (d *decoder) decode(r io.Reader) ([]Event, error) { - buf, err := ioutil.ReadAll(r) - if err != nil { - return nil, err - } - - var currentEvent Event - var dataBuffer *bytes.Buffer = new(bytes.Buffer) - // TODO (and unit tests) - // Lines must be separated by either a U+000D CARRIAGE RETURN U+000A LINE FEED (CRLF) character pair, - // a single U+000A LINE FEED (LF) character, - // or a single U+000D CARRIAGE RETURN (CR) character. - lines := bytes.Split(buf, []byte{'\n'}) - for _, line := range lines { - if len(line) == 0 { - // If the line is empty (a blank line). Dispatch the event. - d.dispatchEvent(currentEvent, dataBuffer.String()) - - // reset current event and data buffer - currentEvent = Event{} - dataBuffer.Reset() - continue - } - if line[0] == byte(':') { - // If the line starts with a U+003A COLON character (:), ignore the line. - continue - } - - var field, value []byte - colonIndex := bytes.IndexRune(line, ':') - if colonIndex != -1 { - // If the line contains a U+003A COLON character character (:) - // Collect the characters on the line before the first U+003A COLON character (:), - // and let field be that string. - field = line[:colonIndex] - // Collect the characters on the line after the first U+003A COLON character (:), - // and let value be that string. - value = line[colonIndex+1:] - // If value starts with a single U+0020 SPACE character, remove it from value. - if len(value) > 0 && value[0] == ' ' { - value = value[1:] - } - } else { - // Otherwise, the string is not empty but does not contain a U+003A COLON character character (:) - // Use the whole line as the field name, and the empty string as the field value. - field = line - value = []byte{} - } - // The steps to process the field given a field name and a field value depend on the field name, - // as given in the following list. Field names must be compared literally, - // with no case folding performed. - switch string(field) { - case "event": - // Set the event name buffer to field value. - currentEvent.Event = string(value) - case "id": - // Set the event stream's last event ID to the field value. - currentEvent.Id = string(value) - case "retry": - // If the field value consists of only characters in the range U+0030 DIGIT ZERO (0) to U+0039 DIGIT NINE (9), - // then interpret the field value as an integer in base ten, and set the event stream's reconnection time to that integer. - // Otherwise, ignore the field. - currentEvent.Id = string(value) - case "data": - // Append the field value to the data buffer, - dataBuffer.Write(value) - // then append a single U+000A LINE FEED (LF) character to the data buffer. - dataBuffer.WriteString("\n") - default: - //Otherwise. The field is ignored. - continue - } - } - // Once the end of the file is reached, the user agent must dispatch the event one final time. - d.dispatchEvent(currentEvent, dataBuffer.String()) - - return d.events, nil -} diff --git a/vendor/github.com/gin-contrib/sse/sse-encoder.go b/vendor/github.com/gin-contrib/sse/sse-encoder.go deleted file mode 100644 index f9c8087..0000000 --- a/vendor/github.com/gin-contrib/sse/sse-encoder.go +++ /dev/null @@ -1,110 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package sse - -import ( - "encoding/json" - "fmt" - "io" - "net/http" - "reflect" - "strconv" - "strings" -) - -// Server-Sent Events -// W3C Working Draft 29 October 2009 -// http://www.w3.org/TR/2009/WD-eventsource-20091029/ - -const ContentType = "text/event-stream" - -var contentType = []string{ContentType} -var noCache = []string{"no-cache"} - -var fieldReplacer = strings.NewReplacer( - "\n", "\\n", - "\r", "\\r") - -var dataReplacer = strings.NewReplacer( - "\n", "\ndata:", - "\r", "\\r") - -type Event struct { - Event string - Id string - Retry uint - Data interface{} -} - -func Encode(writer io.Writer, event Event) error { - w := checkWriter(writer) - writeId(w, event.Id) - writeEvent(w, event.Event) - writeRetry(w, event.Retry) - return writeData(w, event.Data) -} - -func writeId(w stringWriter, id string) { - if len(id) > 0 { - w.WriteString("id:") - fieldReplacer.WriteString(w, id) - w.WriteString("\n") - } -} - -func writeEvent(w stringWriter, event string) { - if len(event) > 0 { - w.WriteString("event:") - fieldReplacer.WriteString(w, event) - w.WriteString("\n") - } -} - -func writeRetry(w stringWriter, retry uint) { - if retry > 0 { - w.WriteString("retry:") - w.WriteString(strconv.FormatUint(uint64(retry), 10)) - w.WriteString("\n") - } -} - -func writeData(w stringWriter, data interface{}) error { - w.WriteString("data:") - switch kindOfData(data) { - case reflect.Struct, reflect.Slice, reflect.Map: - err := json.NewEncoder(w).Encode(data) - if err != nil { - return err - } - w.WriteString("\n") - default: - dataReplacer.WriteString(w, fmt.Sprint(data)) - w.WriteString("\n\n") - } - return nil -} - -func (r Event) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - return Encode(w, r) -} - -func (r Event) WriteContentType(w http.ResponseWriter) { - header := w.Header() - header["Content-Type"] = contentType - - if _, exist := header["Cache-Control"]; !exist { - header["Cache-Control"] = noCache - } -} - -func kindOfData(data interface{}) reflect.Kind { - value := reflect.ValueOf(data) - valueType := value.Kind() - if valueType == reflect.Ptr { - valueType = value.Elem().Kind() - } - return valueType -} diff --git a/vendor/github.com/gin-contrib/sse/writer.go b/vendor/github.com/gin-contrib/sse/writer.go deleted file mode 100644 index 6f9806c..0000000 --- a/vendor/github.com/gin-contrib/sse/writer.go +++ /dev/null @@ -1,24 +0,0 @@ -package sse - -import "io" - -type stringWriter interface { - io.Writer - WriteString(string) (int, error) -} - -type stringWrapper struct { - io.Writer -} - -func (w stringWrapper) WriteString(str string) (int, error) { - return w.Writer.Write([]byte(str)) -} - -func checkWriter(writer io.Writer) stringWriter { - if w, ok := writer.(stringWriter); ok { - return w - } else { - return stringWrapper{writer} - } -} diff --git a/vendor/github.com/gin-gonic/gin/.gitignore b/vendor/github.com/gin-gonic/gin/.gitignore deleted file mode 100644 index bdd50c9..0000000 --- a/vendor/github.com/gin-gonic/gin/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -vendor/* -!vendor/vendor.json -coverage.out -count.out -test -profile.out -tmp.out diff --git a/vendor/github.com/gin-gonic/gin/.travis.yml b/vendor/github.com/gin-gonic/gin/.travis.yml deleted file mode 100644 index f6ec8a8..0000000 --- a/vendor/github.com/gin-gonic/gin/.travis.yml +++ /dev/null @@ -1,44 +0,0 @@ -language: go - -matrix: - fast_finish: true - include: - - go: 1.8.x - - go: 1.9.x - - go: 1.10.x - - go: 1.11.x - env: GO111MODULE=on - - go: 1.12.x - env: GO111MODULE=on - - go: master - env: GO111MODULE=on - -git: - depth: 10 - -before_install: - - if [[ "${GO111MODULE}" = "on" ]]; then mkdir "${HOME}/go"; export GOPATH="${HOME}/go"; fi - -install: - - if [[ "${GO111MODULE}" = "on" ]]; then go mod download; else make install; fi - - if [[ "${GO111MODULE}" = "on" ]]; then export PATH="${GOPATH}/bin:${GOROOT}/bin:${PATH}"; fi - - if [[ "${GO111MODULE}" = "on" ]]; then make tools; fi - -go_import_path: github.com/gin-gonic/gin - -script: - - make vet - - make fmt-check - - make misspell-check - - make test - -after_success: - - bash <(curl -s https://codecov.io/bash) - -notifications: - webhooks: - urls: - - https://webhooks.gitter.im/e/7f95bf605c4d356372f4 - on_success: change # options: [always|never|change] default: always - on_failure: always # options: [always|never|change] default: always - on_start: false # default: false diff --git a/vendor/github.com/gin-gonic/gin/AUTHORS.md b/vendor/github.com/gin-gonic/gin/AUTHORS.md deleted file mode 100644 index dda19bc..0000000 --- a/vendor/github.com/gin-gonic/gin/AUTHORS.md +++ /dev/null @@ -1,231 +0,0 @@ -List of all the awesome people working to make Gin the best Web Framework in Go. - -## gin 1.x series authors - -**Gin Core Team:** Bo-Yi Wu (@appleboy), 田欧 (@thinkerou), Javier Provecho (@javierprovecho) - -## gin 0.x series authors - -**Maintainers:** Manu Martinez-Almeida (@manucorporat), Javier Provecho (@javierprovecho) - -People and companies, who have contributed, in alphabetical order. - -**@858806258 (杰哥)** -- Fix typo in example - - -**@achedeuzot (Klemen Sever)** -- Fix newline debug printing - - -**@adammck (Adam Mckaig)** -- Add MIT license - - -**@AlexanderChen1989 (Alexander)** -- Typos in README - - -**@alexanderdidenko (Aleksandr Didenko)** -- Add support multipart/form-data - - -**@alexandernyquist (Alexander Nyquist)** -- Using template.Must to fix multiple return issue -- ★ Added support for OPTIONS verb -- ★ Setting response headers before calling WriteHeader -- Improved documentation for model binding -- ★ Added Content.Redirect() -- ★ Added tons of Unit tests - - -**@austinheap (Austin Heap)** -- Added travis CI integration - - -**@andredublin (Andre Dublin)** -- Fix typo in comment - - -**@bredov (Ludwig Valda Vasquez)** -- Fix html templating in debug mode - - -**@bluele (Jun Kimura)** -- Fixes code examples in README - - -**@chad-russell** -- ★ Support for serializing gin.H into XML - - -**@dickeyxxx (Jeff Dickey)** -- Typos in README -- Add example about serving static files - - -**@donileo (Adonis)** -- Add NoMethod handler - - -**@dutchcoders (DutchCoders)** -- ★ Fix security bug that allows client to spoof ip -- Fix typo. r.HTMLTemplates -> SetHTMLTemplate - - -**@el3ctro- (Joshua Loper)** -- Fix typo in example - - -**@ethankan (Ethan Kan)** -- Unsigned integers in binding - - -**(Evgeny Persienko)** -- Validate sub structures - - -**@frankbille (Frank Bille)** -- Add support for HTTP Realm Auth - - -**@fmd (Fareed Dudhia)** -- Fix typo. SetHTTPTemplate -> SetHTMLTemplate - - -**@ironiridis (Christopher Harrington)** -- Remove old reference - - -**@jammie-stackhouse (Jamie Stackhouse)** -- Add more shortcuts for router methods - - -**@jasonrhansen** -- Fix spelling and grammar errors in documentation - - -**@JasonSoft (Jason Lee)** -- Fix typo in comment - - -**@joiggama (Ignacio Galindo)** -- Add utf-8 charset header on renders - - -**@julienschmidt (Julien Schmidt)** -- gofmt the code examples - - -**@kelcecil (Kel Cecil)** -- Fix readme typo - - -**@kyledinh (Kyle Dinh)** -- Adds RunTLS() - - -**@LinusU (Linus Unnebäck)** -- Small fixes in README - - -**@loongmxbt (Saint Asky)** -- Fix typo in example - - -**@lucas-clemente (Lucas Clemente)** -- ★ work around path.Join removing trailing slashes from routes - - -**@mattn (Yasuhiro Matsumoto)** -- Improve color logger - - -**@mdigger (Dmitry Sedykh)** -- Fixes Form binding when content-type is x-www-form-urlencoded -- No repeat call c.Writer.Status() in gin.Logger -- Fixes Content-Type for json render - - -**@mirzac (Mirza Ceric)** -- Fix debug printing - - -**@mopemope (Yutaka Matsubara)** -- ★ Adds Godep support (Dependencies Manager) -- Fix variadic parameter in the flexible render API -- Fix Corrupted plain render -- Add Pluggable View Renderer Example - - -**@msemenistyi (Mykyta Semenistyi)** -- update Readme.md. Add code to String method - - -**@msoedov (Sasha Myasoedov)** -- ★ Adds tons of unit tests. - - -**@ngerakines (Nick Gerakines)** -- ★ Improves API, c.GET() doesn't panic -- Adds MustGet() method - - -**@r8k (Rajiv Kilaparti)** -- Fix Port usage in README. - - -**@rayrod2030 (Ray Rodriguez)** -- Fix typo in example - - -**@rns** -- Fix typo in example - - -**@RobAWilkinson (Robert Wilkinson)** -- Add example of forms and params - - -**@rogierlommers (Rogier Lommers)** -- Add updated static serve example - - -**@se77en (Damon Zhao)** -- Improve color logging - - -**@silasb (Silas Baronda)** -- Fixing quotes in README - - -**@SkuliOskarsson (Skuli Oskarsson)** -- Fixes some texts in README II - - -**@slimmy (Jimmy Pettersson)** -- Added messages for required bindings - - -**@smira (Andrey Smirnov)** -- Add support for ignored/unexported fields in binding - - -**@superalsrk (SRK.Lyu)** -- Update httprouter godeps - - -**@tebeka (Miki Tebeka)** -- Use net/http constants instead of numeric values - - -**@techjanitor** -- Update context.go reserved IPs - - -**@yosssi (Keiji Yoshida)** -- Fix link in README - - -**@yuyabee** -- Fixed README diff --git a/vendor/github.com/gin-gonic/gin/BENCHMARKS.md b/vendor/github.com/gin-gonic/gin/BENCHMARKS.md deleted file mode 100644 index 9a7df86..0000000 --- a/vendor/github.com/gin-gonic/gin/BENCHMARKS.md +++ /dev/null @@ -1,604 +0,0 @@ - -## Benchmark System - -**VM HOST:** DigitalOcean -**Machine:** 4 CPU, 8 GB RAM. Ubuntu 16.04.2 x64 -**Date:** July 19th, 2017 -**Go Version:** 1.8.3 linux/amd64 -**Source:** [Go HTTP Router Benchmark](https://github.com/julienschmidt/go-http-routing-benchmark) - -## Static Routes: 157 - -``` -Gin: 30512 Bytes - -HttpServeMux: 17344 Bytes -Ace: 30080 Bytes -Bear: 30472 Bytes -Beego: 96408 Bytes -Bone: 37904 Bytes -Denco: 10464 Bytes -Echo: 73680 Bytes -GocraftWeb: 55720 Bytes -Goji: 27200 Bytes -Gojiv2: 104464 Bytes -GoJsonRest: 136472 Bytes -GoRestful: 914904 Bytes -GorillaMux: 675568 Bytes -HttpRouter: 21128 Bytes -HttpTreeMux: 73448 Bytes -Kocha: 115072 Bytes -LARS: 30120 Bytes -Macaron: 37984 Bytes -Martini: 310832 Bytes -Pat: 20464 Bytes -Possum: 91328 Bytes -R2router: 23712 Bytes -Rivet: 23880 Bytes -Tango: 28008 Bytes -TigerTonic: 80368 Bytes -Traffic: 626480 Bytes -Vulcan: 369064 Bytes -``` - -## GithubAPI Routes: 203 - -``` -Gin: 52672 Bytes - -Ace: 48992 Bytes -Bear: 161592 Bytes -Beego: 147992 Bytes -Bone: 97728 Bytes -Denco: 36440 Bytes -Echo: 95672 Bytes -GocraftWeb: 95640 Bytes -Goji: 86088 Bytes -Gojiv2: 144392 Bytes -GoJsonRest: 134648 Bytes -GoRestful: 1410760 Bytes -GorillaMux: 1509488 Bytes -HttpRouter: 37464 Bytes -HttpTreeMux: 78800 Bytes -Kocha: 785408 Bytes -LARS: 49032 Bytes -Macaron: 132712 Bytes -Martini: 564352 Bytes -Pat: 21200 Bytes -Possum: 83888 Bytes -R2router: 47104 Bytes -Rivet: 42840 Bytes -Tango: 54584 Bytes -TigerTonic: 96384 Bytes -Traffic: 1061920 Bytes -Vulcan: 465296 Bytes -``` - -## GPlusAPI Routes: 13 - -``` -Gin: 3968 Bytes - -Ace: 3600 Bytes -Bear: 7112 Bytes -Beego: 10048 Bytes -Bone: 6480 Bytes -Denco: 3256 Bytes -Echo: 9000 Bytes -GocraftWeb: 7496 Bytes -Goji: 2912 Bytes -Gojiv2: 7376 Bytes -GoJsonRest: 11544 Bytes -GoRestful: 88776 Bytes -GorillaMux: 71488 Bytes -HttpRouter: 2712 Bytes -HttpTreeMux: 7440 Bytes -Kocha: 128880 Bytes -LARS: 3640 Bytes -Macaron: 8656 Bytes -Martini: 23936 Bytes -Pat: 1856 Bytes -Possum: 7248 Bytes -R2router: 3928 Bytes -Rivet: 3064 Bytes -Tango: 4912 Bytes -TigerTonic: 9408 Bytes -Traffic: 49472 Bytes -Vulcan: 25496 Bytes -``` - -## ParseAPI Routes: 26 - -``` -Gin: 6928 Bytes - -Ace: 6592 Bytes -Bear: 12320 Bytes -Beego: 18960 Bytes -Bone: 11024 Bytes -Denco: 4184 Bytes -Echo: 11168 Bytes -GocraftWeb: 12800 Bytes -Goji: 5232 Bytes -Gojiv2: 14464 Bytes -GoJsonRest: 14216 Bytes -GoRestful: 127368 Bytes -GorillaMux: 123016 Bytes -HttpRouter: 4976 Bytes -HttpTreeMux: 7848 Bytes -Kocha: 181712 Bytes -LARS: 6632 Bytes -Macaron: 13648 Bytes -Martini: 45952 Bytes -Pat: 2560 Bytes -Possum: 9200 Bytes -R2router: 7056 Bytes -Rivet: 5680 Bytes -Tango: 8664 Bytes -TigerTonic: 9840 Bytes -Traffic: 93480 Bytes -Vulcan: 44504 Bytes -``` - -## Static Routes - -``` -BenchmarkGin_StaticAll 50000 34506 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_StaticAll 30000 49657 ns/op 0 B/op 0 allocs/op -BenchmarkHttpServeMux_StaticAll 2000 1183737 ns/op 96 B/op 8 allocs/op -BenchmarkBeego_StaticAll 5000 412621 ns/op 57776 B/op 628 allocs/op -BenchmarkBear_StaticAll 10000 149242 ns/op 20336 B/op 461 allocs/op -BenchmarkBone_StaticAll 10000 118583 ns/op 0 B/op 0 allocs/op -BenchmarkDenco_StaticAll 100000 13247 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_StaticAll 20000 79914 ns/op 5024 B/op 157 allocs/op -BenchmarkGocraftWeb_StaticAll 10000 211823 ns/op 46440 B/op 785 allocs/op -BenchmarkGoji_StaticAll 10000 109390 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_StaticAll 3000 415533 ns/op 145696 B/op 1099 allocs/op -BenchmarkGoJsonRest_StaticAll 5000 364403 ns/op 51653 B/op 1727 allocs/op -BenchmarkGoRestful_StaticAll 500 2578579 ns/op 314936 B/op 3144 allocs/op -BenchmarkGorillaMux_StaticAll 500 2704856 ns/op 115648 B/op 1578 allocs/op -BenchmarkHttpRouter_StaticAll 100000 18541 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_StaticAll 100000 22332 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_StaticAll 50000 31176 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_StaticAll 50000 40840 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_StaticAll 5000 517656 ns/op 120576 B/op 1413 allocs/op -BenchmarkMartini_StaticAll 300 4462289 ns/op 125442 B/op 1717 allocs/op -BenchmarkPat_StaticAll 500 2157275 ns/op 533904 B/op 11123 allocs/op -BenchmarkPossum_StaticAll 10000 254701 ns/op 65312 B/op 471 allocs/op -BenchmarkR2router_StaticAll 10000 133956 ns/op 22608 B/op 628 allocs/op -BenchmarkRivet_StaticAll 30000 46812 ns/op 0 B/op 0 allocs/op -BenchmarkTango_StaticAll 5000 390613 ns/op 39225 B/op 1256 allocs/op -BenchmarkTigerTonic_StaticAll 20000 88060 ns/op 7504 B/op 157 allocs/op -BenchmarkTraffic_StaticAll 500 2910236 ns/op 729736 B/op 14287 allocs/op -BenchmarkVulcan_StaticAll 5000 277366 ns/op 15386 B/op 471 allocs/op -``` - -## Micro Benchmarks - -``` -BenchmarkGin_Param 20000000 113 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_Param 5000000 375 ns/op 32 B/op 1 allocs/op -BenchmarkBear_Param 1000000 1709 ns/op 456 B/op 5 allocs/op -BenchmarkBeego_Param 1000000 2484 ns/op 368 B/op 4 allocs/op -BenchmarkBone_Param 1000000 2391 ns/op 688 B/op 5 allocs/op -BenchmarkDenco_Param 10000000 240 ns/op 32 B/op 1 allocs/op -BenchmarkEcho_Param 5000000 366 ns/op 32 B/op 1 allocs/op -BenchmarkGocraftWeb_Param 1000000 2343 ns/op 648 B/op 8 allocs/op -BenchmarkGoji_Param 1000000 1197 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_Param 1000000 2771 ns/op 944 B/op 8 allocs/op -BenchmarkGoJsonRest_Param 1000000 2993 ns/op 649 B/op 13 allocs/op -BenchmarkGoRestful_Param 200000 8860 ns/op 2296 B/op 21 allocs/op -BenchmarkGorillaMux_Param 500000 4461 ns/op 1056 B/op 11 allocs/op -BenchmarkHttpRouter_Param 10000000 175 ns/op 32 B/op 1 allocs/op -BenchmarkHttpTreeMux_Param 1000000 1167 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_Param 3000000 429 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_Param 10000000 134 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Param 500000 4635 ns/op 1056 B/op 10 allocs/op -BenchmarkMartini_Param 200000 9933 ns/op 1072 B/op 10 allocs/op -BenchmarkPat_Param 1000000 2929 ns/op 648 B/op 12 allocs/op -BenchmarkPossum_Param 1000000 2503 ns/op 560 B/op 6 allocs/op -BenchmarkR2router_Param 1000000 1507 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_Param 5000000 297 ns/op 48 B/op 1 allocs/op -BenchmarkTango_Param 1000000 1862 ns/op 248 B/op 8 allocs/op -BenchmarkTigerTonic_Param 500000 5660 ns/op 992 B/op 17 allocs/op -BenchmarkTraffic_Param 200000 8408 ns/op 1960 B/op 21 allocs/op -BenchmarkVulcan_Param 2000000 963 ns/op 98 B/op 3 allocs/op -BenchmarkAce_Param5 2000000 740 ns/op 160 B/op 1 allocs/op -BenchmarkBear_Param5 1000000 2777 ns/op 501 B/op 5 allocs/op -BenchmarkBeego_Param5 1000000 3740 ns/op 368 B/op 4 allocs/op -BenchmarkBone_Param5 1000000 2950 ns/op 736 B/op 5 allocs/op -BenchmarkDenco_Param5 2000000 644 ns/op 160 B/op 1 allocs/op -BenchmarkEcho_Param5 3000000 558 ns/op 32 B/op 1 allocs/op -BenchmarkGin_Param5 10000000 198 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_Param5 500000 3870 ns/op 920 B/op 11 allocs/op -BenchmarkGoji_Param5 1000000 1746 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_Param5 1000000 3214 ns/op 1008 B/op 8 allocs/op -BenchmarkGoJsonRest_Param5 500000 5509 ns/op 1097 B/op 16 allocs/op -BenchmarkGoRestful_Param5 200000 11232 ns/op 2392 B/op 21 allocs/op -BenchmarkGorillaMux_Param5 300000 7777 ns/op 1184 B/op 11 allocs/op -BenchmarkHttpRouter_Param5 3000000 631 ns/op 160 B/op 1 allocs/op -BenchmarkHttpTreeMux_Param5 1000000 2800 ns/op 576 B/op 6 allocs/op -BenchmarkKocha_Param5 1000000 2053 ns/op 440 B/op 10 allocs/op -BenchmarkLARS_Param5 10000000 232 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Param5 500000 5888 ns/op 1056 B/op 10 allocs/op -BenchmarkMartini_Param5 200000 12807 ns/op 1232 B/op 11 allocs/op -BenchmarkPat_Param5 300000 7320 ns/op 964 B/op 32 allocs/op -BenchmarkPossum_Param5 1000000 2495 ns/op 560 B/op 6 allocs/op -BenchmarkR2router_Param5 1000000 1844 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_Param5 2000000 935 ns/op 240 B/op 1 allocs/op -BenchmarkTango_Param5 1000000 2327 ns/op 360 B/op 8 allocs/op -BenchmarkTigerTonic_Param5 100000 18514 ns/op 2551 B/op 43 allocs/op -BenchmarkTraffic_Param5 200000 11997 ns/op 2248 B/op 25 allocs/op -BenchmarkVulcan_Param5 1000000 1333 ns/op 98 B/op 3 allocs/op -BenchmarkAce_Param20 1000000 2031 ns/op 640 B/op 1 allocs/op -BenchmarkBear_Param20 200000 7285 ns/op 1664 B/op 5 allocs/op -BenchmarkBeego_Param20 300000 6224 ns/op 368 B/op 4 allocs/op -BenchmarkBone_Param20 200000 8023 ns/op 1903 B/op 5 allocs/op -BenchmarkDenco_Param20 1000000 2262 ns/op 640 B/op 1 allocs/op -BenchmarkEcho_Param20 1000000 1387 ns/op 32 B/op 1 allocs/op -BenchmarkGin_Param20 3000000 503 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_Param20 100000 14408 ns/op 3795 B/op 15 allocs/op -BenchmarkGoji_Param20 500000 5272 ns/op 1247 B/op 2 allocs/op -BenchmarkGojiv2_Param20 1000000 4163 ns/op 1248 B/op 8 allocs/op -BenchmarkGoJsonRest_Param20 100000 17866 ns/op 4485 B/op 20 allocs/op -BenchmarkGoRestful_Param20 100000 21022 ns/op 4724 B/op 23 allocs/op -BenchmarkGorillaMux_Param20 100000 17055 ns/op 3547 B/op 13 allocs/op -BenchmarkHttpRouter_Param20 1000000 1748 ns/op 640 B/op 1 allocs/op -BenchmarkHttpTreeMux_Param20 200000 12246 ns/op 3196 B/op 10 allocs/op -BenchmarkKocha_Param20 300000 6861 ns/op 1808 B/op 27 allocs/op -BenchmarkLARS_Param20 3000000 526 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Param20 100000 13069 ns/op 2906 B/op 12 allocs/op -BenchmarkMartini_Param20 100000 23602 ns/op 3597 B/op 13 allocs/op -BenchmarkPat_Param20 50000 32143 ns/op 4688 B/op 111 allocs/op -BenchmarkPossum_Param20 1000000 2396 ns/op 560 B/op 6 allocs/op -BenchmarkR2router_Param20 200000 8907 ns/op 2283 B/op 7 allocs/op -BenchmarkRivet_Param20 1000000 3280 ns/op 1024 B/op 1 allocs/op -BenchmarkTango_Param20 500000 4640 ns/op 856 B/op 8 allocs/op -BenchmarkTigerTonic_Param20 20000 67581 ns/op 10532 B/op 138 allocs/op -BenchmarkTraffic_Param20 50000 40313 ns/op 7941 B/op 45 allocs/op -BenchmarkVulcan_Param20 1000000 2264 ns/op 98 B/op 3 allocs/op -BenchmarkAce_ParamWrite 3000000 532 ns/op 40 B/op 2 allocs/op -BenchmarkBear_ParamWrite 1000000 1778 ns/op 456 B/op 5 allocs/op -BenchmarkBeego_ParamWrite 1000000 2596 ns/op 376 B/op 5 allocs/op -BenchmarkBone_ParamWrite 1000000 2519 ns/op 688 B/op 5 allocs/op -BenchmarkDenco_ParamWrite 5000000 411 ns/op 32 B/op 1 allocs/op -BenchmarkEcho_ParamWrite 2000000 718 ns/op 40 B/op 2 allocs/op -BenchmarkGin_ParamWrite 5000000 283 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_ParamWrite 1000000 2561 ns/op 656 B/op 9 allocs/op -BenchmarkGoji_ParamWrite 1000000 1378 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_ParamWrite 1000000 3128 ns/op 976 B/op 10 allocs/op -BenchmarkGoJsonRest_ParamWrite 500000 4446 ns/op 1128 B/op 18 allocs/op -BenchmarkGoRestful_ParamWrite 200000 10291 ns/op 2304 B/op 22 allocs/op -BenchmarkGorillaMux_ParamWrite 500000 5153 ns/op 1064 B/op 12 allocs/op -BenchmarkHttpRouter_ParamWrite 5000000 263 ns/op 32 B/op 1 allocs/op -BenchmarkHttpTreeMux_ParamWrite 1000000 1351 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_ParamWrite 3000000 538 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_ParamWrite 5000000 316 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParamWrite 500000 5756 ns/op 1160 B/op 14 allocs/op -BenchmarkMartini_ParamWrite 200000 13097 ns/op 1176 B/op 14 allocs/op -BenchmarkPat_ParamWrite 500000 4954 ns/op 1072 B/op 17 allocs/op -BenchmarkPossum_ParamWrite 1000000 2499 ns/op 560 B/op 6 allocs/op -BenchmarkR2router_ParamWrite 1000000 1531 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_ParamWrite 3000000 570 ns/op 112 B/op 2 allocs/op -BenchmarkTango_ParamWrite 2000000 957 ns/op 136 B/op 4 allocs/op -BenchmarkTigerTonic_ParamWrite 200000 7025 ns/op 1424 B/op 23 allocs/op -BenchmarkTraffic_ParamWrite 200000 10112 ns/op 2384 B/op 25 allocs/op -BenchmarkVulcan_ParamWrite 1000000 1006 ns/op 98 B/op 3 allocs/op -``` - -## GitHub - -``` -BenchmarkGin_GithubStatic 10000000 156 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_GithubStatic 5000000 294 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GithubStatic 2000000 893 ns/op 120 B/op 3 allocs/op -BenchmarkBeego_GithubStatic 1000000 2491 ns/op 368 B/op 4 allocs/op -BenchmarkBone_GithubStatic 50000 25300 ns/op 2880 B/op 60 allocs/op -BenchmarkDenco_GithubStatic 20000000 76.0 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_GithubStatic 2000000 516 ns/op 32 B/op 1 allocs/op -BenchmarkGocraftWeb_GithubStatic 1000000 1448 ns/op 296 B/op 5 allocs/op -BenchmarkGoji_GithubStatic 3000000 496 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_GithubStatic 1000000 2941 ns/op 928 B/op 7 allocs/op -BenchmarkGoRestful_GithubStatic 100000 27256 ns/op 3224 B/op 22 allocs/op -BenchmarkGoJsonRest_GithubStatic 1000000 2196 ns/op 329 B/op 11 allocs/op -BenchmarkGorillaMux_GithubStatic 50000 31617 ns/op 736 B/op 10 allocs/op -BenchmarkHttpRouter_GithubStatic 20000000 88.4 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_GithubStatic 10000000 134 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_GithubStatic 20000000 113 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_GithubStatic 10000000 195 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GithubStatic 500000 3740 ns/op 768 B/op 9 allocs/op -BenchmarkMartini_GithubStatic 50000 27673 ns/op 768 B/op 9 allocs/op -BenchmarkPat_GithubStatic 100000 19470 ns/op 3648 B/op 76 allocs/op -BenchmarkPossum_GithubStatic 1000000 1729 ns/op 416 B/op 3 allocs/op -BenchmarkR2router_GithubStatic 2000000 879 ns/op 144 B/op 4 allocs/op -BenchmarkRivet_GithubStatic 10000000 231 ns/op 0 B/op 0 allocs/op -BenchmarkTango_GithubStatic 1000000 2325 ns/op 248 B/op 8 allocs/op -BenchmarkTigerTonic_GithubStatic 3000000 610 ns/op 48 B/op 1 allocs/op -BenchmarkTraffic_GithubStatic 20000 62973 ns/op 18904 B/op 148 allocs/op -BenchmarkVulcan_GithubStatic 1000000 1447 ns/op 98 B/op 3 allocs/op -BenchmarkAce_GithubParam 2000000 686 ns/op 96 B/op 1 allocs/op -BenchmarkBear_GithubParam 1000000 2155 ns/op 496 B/op 5 allocs/op -BenchmarkBeego_GithubParam 1000000 2713 ns/op 368 B/op 4 allocs/op -BenchmarkBone_GithubParam 100000 15088 ns/op 1760 B/op 18 allocs/op -BenchmarkDenco_GithubParam 2000000 629 ns/op 128 B/op 1 allocs/op -BenchmarkEcho_GithubParam 2000000 653 ns/op 32 B/op 1 allocs/op -BenchmarkGin_GithubParam 5000000 255 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GithubParam 1000000 3145 ns/op 712 B/op 9 allocs/op -BenchmarkGoji_GithubParam 1000000 1916 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_GithubParam 1000000 3975 ns/op 1024 B/op 10 allocs/op -BenchmarkGoJsonRest_GithubParam 300000 4134 ns/op 713 B/op 14 allocs/op -BenchmarkGoRestful_GithubParam 50000 30782 ns/op 2360 B/op 21 allocs/op -BenchmarkGorillaMux_GithubParam 100000 17148 ns/op 1088 B/op 11 allocs/op -BenchmarkHttpRouter_GithubParam 3000000 523 ns/op 96 B/op 1 allocs/op -BenchmarkHttpTreeMux_GithubParam 1000000 1671 ns/op 384 B/op 4 allocs/op -BenchmarkKocha_GithubParam 1000000 1021 ns/op 128 B/op 5 allocs/op -BenchmarkLARS_GithubParam 5000000 283 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GithubParam 500000 4270 ns/op 1056 B/op 10 allocs/op -BenchmarkMartini_GithubParam 100000 21728 ns/op 1152 B/op 11 allocs/op -BenchmarkPat_GithubParam 200000 11208 ns/op 2464 B/op 48 allocs/op -BenchmarkPossum_GithubParam 1000000 2334 ns/op 560 B/op 6 allocs/op -BenchmarkR2router_GithubParam 1000000 1487 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_GithubParam 2000000 782 ns/op 96 B/op 1 allocs/op -BenchmarkTango_GithubParam 1000000 2653 ns/op 344 B/op 8 allocs/op -BenchmarkTigerTonic_GithubParam 300000 14073 ns/op 1440 B/op 24 allocs/op -BenchmarkTraffic_GithubParam 50000 29164 ns/op 5992 B/op 52 allocs/op -BenchmarkVulcan_GithubParam 1000000 2529 ns/op 98 B/op 3 allocs/op -BenchmarkAce_GithubAll 10000 134059 ns/op 13792 B/op 167 allocs/op -BenchmarkBear_GithubAll 5000 534445 ns/op 86448 B/op 943 allocs/op -BenchmarkBeego_GithubAll 3000 592444 ns/op 74705 B/op 812 allocs/op -BenchmarkBone_GithubAll 200 6957308 ns/op 698784 B/op 8453 allocs/op -BenchmarkDenco_GithubAll 10000 158819 ns/op 20224 B/op 167 allocs/op -BenchmarkEcho_GithubAll 10000 154700 ns/op 6496 B/op 203 allocs/op -BenchmarkGin_GithubAll 30000 48375 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GithubAll 3000 570806 ns/op 131656 B/op 1686 allocs/op -BenchmarkGoji_GithubAll 2000 818034 ns/op 56112 B/op 334 allocs/op -BenchmarkGojiv2_GithubAll 2000 1213973 ns/op 274768 B/op 3712 allocs/op -BenchmarkGoJsonRest_GithubAll 2000 785796 ns/op 134371 B/op 2737 allocs/op -BenchmarkGoRestful_GithubAll 300 5238188 ns/op 689672 B/op 4519 allocs/op -BenchmarkGorillaMux_GithubAll 100 10257726 ns/op 211840 B/op 2272 allocs/op -BenchmarkHttpRouter_GithubAll 20000 105414 ns/op 13792 B/op 167 allocs/op -BenchmarkHttpTreeMux_GithubAll 10000 319934 ns/op 65856 B/op 671 allocs/op -BenchmarkKocha_GithubAll 10000 209442 ns/op 23304 B/op 843 allocs/op -BenchmarkLARS_GithubAll 20000 62565 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GithubAll 2000 1161270 ns/op 204194 B/op 2000 allocs/op -BenchmarkMartini_GithubAll 200 9991713 ns/op 226549 B/op 2325 allocs/op -BenchmarkPat_GithubAll 200 5590793 ns/op 1499568 B/op 27435 allocs/op -BenchmarkPossum_GithubAll 10000 319768 ns/op 84448 B/op 609 allocs/op -BenchmarkR2router_GithubAll 10000 305134 ns/op 77328 B/op 979 allocs/op -BenchmarkRivet_GithubAll 10000 132134 ns/op 16272 B/op 167 allocs/op -BenchmarkTango_GithubAll 3000 552754 ns/op 63826 B/op 1618 allocs/op -BenchmarkTigerTonic_GithubAll 1000 1439483 ns/op 239104 B/op 5374 allocs/op -BenchmarkTraffic_GithubAll 100 11383067 ns/op 2659329 B/op 21848 allocs/op -BenchmarkVulcan_GithubAll 5000 394253 ns/op 19894 B/op 609 allocs/op -``` - -## Google+ - -``` -BenchmarkGin_GPlusStatic 10000000 183 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_GPlusStatic 5000000 276 ns/op 0 B/op 0 allocs/op -BenchmarkBear_GPlusStatic 2000000 652 ns/op 104 B/op 3 allocs/op -BenchmarkBeego_GPlusStatic 1000000 2239 ns/op 368 B/op 4 allocs/op -BenchmarkBone_GPlusStatic 5000000 380 ns/op 32 B/op 1 allocs/op -BenchmarkDenco_GPlusStatic 30000000 45.8 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_GPlusStatic 5000000 338 ns/op 32 B/op 1 allocs/op -BenchmarkGocraftWeb_GPlusStatic 1000000 1158 ns/op 280 B/op 5 allocs/op -BenchmarkGoji_GPlusStatic 5000000 331 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_GPlusStatic 1000000 2106 ns/op 928 B/op 7 allocs/op -BenchmarkGoJsonRest_GPlusStatic 1000000 1626 ns/op 329 B/op 11 allocs/op -BenchmarkGoRestful_GPlusStatic 300000 7598 ns/op 1976 B/op 20 allocs/op -BenchmarkGorillaMux_GPlusStatic 1000000 2629 ns/op 736 B/op 10 allocs/op -BenchmarkHttpRouter_GPlusStatic 30000000 52.5 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_GPlusStatic 20000000 85.8 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_GPlusStatic 20000000 89.2 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_GPlusStatic 10000000 162 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlusStatic 500000 3479 ns/op 768 B/op 9 allocs/op -BenchmarkMartini_GPlusStatic 200000 9092 ns/op 768 B/op 9 allocs/op -BenchmarkPat_GPlusStatic 3000000 493 ns/op 96 B/op 2 allocs/op -BenchmarkPossum_GPlusStatic 1000000 1467 ns/op 416 B/op 3 allocs/op -BenchmarkR2router_GPlusStatic 2000000 788 ns/op 144 B/op 4 allocs/op -BenchmarkRivet_GPlusStatic 20000000 114 ns/op 0 B/op 0 allocs/op -BenchmarkTango_GPlusStatic 1000000 1534 ns/op 200 B/op 8 allocs/op -BenchmarkTigerTonic_GPlusStatic 5000000 282 ns/op 32 B/op 1 allocs/op -BenchmarkTraffic_GPlusStatic 500000 3798 ns/op 1192 B/op 15 allocs/op -BenchmarkVulcan_GPlusStatic 2000000 1125 ns/op 98 B/op 3 allocs/op -BenchmarkAce_GPlusParam 3000000 528 ns/op 64 B/op 1 allocs/op -BenchmarkBear_GPlusParam 1000000 1570 ns/op 480 B/op 5 allocs/op -BenchmarkBeego_GPlusParam 1000000 2369 ns/op 368 B/op 4 allocs/op -BenchmarkBone_GPlusParam 1000000 2028 ns/op 688 B/op 5 allocs/op -BenchmarkDenco_GPlusParam 5000000 385 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_GPlusParam 3000000 441 ns/op 32 B/op 1 allocs/op -BenchmarkGin_GPlusParam 10000000 174 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GPlusParam 1000000 2033 ns/op 648 B/op 8 allocs/op -BenchmarkGoji_GPlusParam 1000000 1399 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_GPlusParam 1000000 2641 ns/op 944 B/op 8 allocs/op -BenchmarkGoJsonRest_GPlusParam 1000000 2824 ns/op 649 B/op 13 allocs/op -BenchmarkGoRestful_GPlusParam 200000 8875 ns/op 2296 B/op 21 allocs/op -BenchmarkGorillaMux_GPlusParam 200000 6291 ns/op 1056 B/op 11 allocs/op -BenchmarkHttpRouter_GPlusParam 5000000 316 ns/op 64 B/op 1 allocs/op -BenchmarkHttpTreeMux_GPlusParam 1000000 1129 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_GPlusParam 3000000 538 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_GPlusParam 10000000 198 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlusParam 500000 3554 ns/op 1056 B/op 10 allocs/op -BenchmarkMartini_GPlusParam 200000 9831 ns/op 1072 B/op 10 allocs/op -BenchmarkPat_GPlusParam 1000000 2706 ns/op 688 B/op 12 allocs/op -BenchmarkPossum_GPlusParam 1000000 2297 ns/op 560 B/op 6 allocs/op -BenchmarkR2router_GPlusParam 1000000 1318 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_GPlusParam 5000000 399 ns/op 48 B/op 1 allocs/op -BenchmarkTango_GPlusParam 1000000 2070 ns/op 264 B/op 8 allocs/op -BenchmarkTigerTonic_GPlusParam 500000 4853 ns/op 1056 B/op 17 allocs/op -BenchmarkTraffic_GPlusParam 200000 8278 ns/op 1976 B/op 21 allocs/op -BenchmarkVulcan_GPlusParam 1000000 1243 ns/op 98 B/op 3 allocs/op -BenchmarkAce_GPlus2Params 3000000 549 ns/op 64 B/op 1 allocs/op -BenchmarkBear_GPlus2Params 1000000 2112 ns/op 496 B/op 5 allocs/op -BenchmarkBeego_GPlus2Params 500000 2750 ns/op 368 B/op 4 allocs/op -BenchmarkBone_GPlus2Params 300000 7032 ns/op 1040 B/op 9 allocs/op -BenchmarkDenco_GPlus2Params 3000000 502 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_GPlus2Params 3000000 641 ns/op 32 B/op 1 allocs/op -BenchmarkGin_GPlus2Params 5000000 250 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GPlus2Params 1000000 2681 ns/op 712 B/op 9 allocs/op -BenchmarkGoji_GPlus2Params 1000000 1926 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_GPlus2Params 500000 3996 ns/op 1024 B/op 11 allocs/op -BenchmarkGoJsonRest_GPlus2Params 500000 3886 ns/op 713 B/op 14 allocs/op -BenchmarkGoRestful_GPlus2Params 200000 10376 ns/op 2360 B/op 21 allocs/op -BenchmarkGorillaMux_GPlus2Params 100000 14162 ns/op 1088 B/op 11 allocs/op -BenchmarkHttpRouter_GPlus2Params 5000000 336 ns/op 64 B/op 1 allocs/op -BenchmarkHttpTreeMux_GPlus2Params 1000000 1523 ns/op 384 B/op 4 allocs/op -BenchmarkKocha_GPlus2Params 2000000 970 ns/op 128 B/op 5 allocs/op -BenchmarkLARS_GPlus2Params 5000000 238 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlus2Params 500000 4016 ns/op 1056 B/op 10 allocs/op -BenchmarkMartini_GPlus2Params 100000 21253 ns/op 1200 B/op 13 allocs/op -BenchmarkPat_GPlus2Params 200000 8632 ns/op 2256 B/op 34 allocs/op -BenchmarkPossum_GPlus2Params 1000000 2171 ns/op 560 B/op 6 allocs/op -BenchmarkR2router_GPlus2Params 1000000 1340 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_GPlus2Params 3000000 557 ns/op 96 B/op 1 allocs/op -BenchmarkTango_GPlus2Params 1000000 2186 ns/op 344 B/op 8 allocs/op -BenchmarkTigerTonic_GPlus2Params 200000 9060 ns/op 1488 B/op 24 allocs/op -BenchmarkTraffic_GPlus2Params 100000 20324 ns/op 3272 B/op 31 allocs/op -BenchmarkVulcan_GPlus2Params 1000000 2039 ns/op 98 B/op 3 allocs/op -BenchmarkAce_GPlusAll 300000 6603 ns/op 640 B/op 11 allocs/op -BenchmarkBear_GPlusAll 100000 22363 ns/op 5488 B/op 61 allocs/op -BenchmarkBeego_GPlusAll 50000 38757 ns/op 4784 B/op 52 allocs/op -BenchmarkBone_GPlusAll 20000 54916 ns/op 10336 B/op 98 allocs/op -BenchmarkDenco_GPlusAll 300000 4959 ns/op 672 B/op 11 allocs/op -BenchmarkEcho_GPlusAll 200000 6558 ns/op 416 B/op 13 allocs/op -BenchmarkGin_GPlusAll 500000 2757 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_GPlusAll 50000 34615 ns/op 8040 B/op 103 allocs/op -BenchmarkGoji_GPlusAll 100000 16002 ns/op 3696 B/op 22 allocs/op -BenchmarkGojiv2_GPlusAll 50000 35060 ns/op 12624 B/op 115 allocs/op -BenchmarkGoJsonRest_GPlusAll 50000 41479 ns/op 8117 B/op 170 allocs/op -BenchmarkGoRestful_GPlusAll 10000 131653 ns/op 32024 B/op 275 allocs/op -BenchmarkGorillaMux_GPlusAll 10000 101380 ns/op 13296 B/op 142 allocs/op -BenchmarkHttpRouter_GPlusAll 500000 3711 ns/op 640 B/op 11 allocs/op -BenchmarkHttpTreeMux_GPlusAll 100000 14438 ns/op 4032 B/op 38 allocs/op -BenchmarkKocha_GPlusAll 200000 8039 ns/op 976 B/op 43 allocs/op -BenchmarkLARS_GPlusAll 500000 2630 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_GPlusAll 30000 51123 ns/op 13152 B/op 128 allocs/op -BenchmarkMartini_GPlusAll 10000 176157 ns/op 14016 B/op 145 allocs/op -BenchmarkPat_GPlusAll 20000 69911 ns/op 16576 B/op 298 allocs/op -BenchmarkPossum_GPlusAll 100000 20716 ns/op 5408 B/op 39 allocs/op -BenchmarkR2router_GPlusAll 100000 17463 ns/op 5040 B/op 63 allocs/op -BenchmarkRivet_GPlusAll 300000 5142 ns/op 768 B/op 11 allocs/op -BenchmarkTango_GPlusAll 50000 27321 ns/op 3656 B/op 104 allocs/op -BenchmarkTigerTonic_GPlusAll 20000 77597 ns/op 14512 B/op 288 allocs/op -BenchmarkTraffic_GPlusAll 10000 151406 ns/op 37360 B/op 392 allocs/op -BenchmarkVulcan_GPlusAll 100000 18555 ns/op 1274 B/op 39 allocs/op -``` - -## Parse.com - -``` -BenchmarkGin_ParseStatic 10000000 133 ns/op 0 B/op 0 allocs/op - -BenchmarkAce_ParseStatic 5000000 241 ns/op 0 B/op 0 allocs/op -BenchmarkBear_ParseStatic 2000000 728 ns/op 120 B/op 3 allocs/op -BenchmarkBeego_ParseStatic 1000000 2623 ns/op 368 B/op 4 allocs/op -BenchmarkBone_ParseStatic 1000000 1285 ns/op 144 B/op 3 allocs/op -BenchmarkDenco_ParseStatic 30000000 57.8 ns/op 0 B/op 0 allocs/op -BenchmarkEcho_ParseStatic 5000000 342 ns/op 32 B/op 1 allocs/op -BenchmarkGocraftWeb_ParseStatic 1000000 1478 ns/op 296 B/op 5 allocs/op -BenchmarkGoji_ParseStatic 3000000 415 ns/op 0 B/op 0 allocs/op -BenchmarkGojiv2_ParseStatic 1000000 2087 ns/op 928 B/op 7 allocs/op -BenchmarkGoJsonRest_ParseStatic 1000000 1712 ns/op 329 B/op 11 allocs/op -BenchmarkGoRestful_ParseStatic 200000 11072 ns/op 3224 B/op 22 allocs/op -BenchmarkGorillaMux_ParseStatic 500000 4129 ns/op 752 B/op 11 allocs/op -BenchmarkHttpRouter_ParseStatic 30000000 52.4 ns/op 0 B/op 0 allocs/op -BenchmarkHttpTreeMux_ParseStatic 20000000 109 ns/op 0 B/op 0 allocs/op -BenchmarkKocha_ParseStatic 20000000 81.8 ns/op 0 B/op 0 allocs/op -BenchmarkLARS_ParseStatic 10000000 150 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParseStatic 1000000 3288 ns/op 768 B/op 9 allocs/op -BenchmarkMartini_ParseStatic 200000 9110 ns/op 768 B/op 9 allocs/op -BenchmarkPat_ParseStatic 1000000 1135 ns/op 240 B/op 5 allocs/op -BenchmarkPossum_ParseStatic 1000000 1557 ns/op 416 B/op 3 allocs/op -BenchmarkR2router_ParseStatic 2000000 730 ns/op 144 B/op 4 allocs/op -BenchmarkRivet_ParseStatic 10000000 121 ns/op 0 B/op 0 allocs/op -BenchmarkTango_ParseStatic 1000000 1688 ns/op 248 B/op 8 allocs/op -BenchmarkTigerTonic_ParseStatic 3000000 427 ns/op 48 B/op 1 allocs/op -BenchmarkTraffic_ParseStatic 500000 5962 ns/op 1816 B/op 20 allocs/op -BenchmarkVulcan_ParseStatic 2000000 969 ns/op 98 B/op 3 allocs/op -BenchmarkAce_ParseParam 3000000 497 ns/op 64 B/op 1 allocs/op -BenchmarkBear_ParseParam 1000000 1473 ns/op 467 B/op 5 allocs/op -BenchmarkBeego_ParseParam 1000000 2384 ns/op 368 B/op 4 allocs/op -BenchmarkBone_ParseParam 1000000 2513 ns/op 768 B/op 6 allocs/op -BenchmarkDenco_ParseParam 5000000 364 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_ParseParam 5000000 418 ns/op 32 B/op 1 allocs/op -BenchmarkGin_ParseParam 10000000 163 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_ParseParam 1000000 2361 ns/op 664 B/op 8 allocs/op -BenchmarkGoji_ParseParam 1000000 1590 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_ParseParam 1000000 2851 ns/op 976 B/op 9 allocs/op -BenchmarkGoJsonRest_ParseParam 1000000 2965 ns/op 649 B/op 13 allocs/op -BenchmarkGoRestful_ParseParam 200000 12207 ns/op 3544 B/op 23 allocs/op -BenchmarkGorillaMux_ParseParam 500000 5187 ns/op 1088 B/op 12 allocs/op -BenchmarkHttpRouter_ParseParam 5000000 275 ns/op 64 B/op 1 allocs/op -BenchmarkHttpTreeMux_ParseParam 1000000 1108 ns/op 352 B/op 3 allocs/op -BenchmarkKocha_ParseParam 3000000 495 ns/op 56 B/op 3 allocs/op -BenchmarkLARS_ParseParam 10000000 192 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParseParam 500000 4103 ns/op 1056 B/op 10 allocs/op -BenchmarkMartini_ParseParam 200000 9878 ns/op 1072 B/op 10 allocs/op -BenchmarkPat_ParseParam 500000 3657 ns/op 1120 B/op 17 allocs/op -BenchmarkPossum_ParseParam 1000000 2084 ns/op 560 B/op 6 allocs/op -BenchmarkR2router_ParseParam 1000000 1251 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_ParseParam 5000000 335 ns/op 48 B/op 1 allocs/op -BenchmarkTango_ParseParam 1000000 1854 ns/op 280 B/op 8 allocs/op -BenchmarkTigerTonic_ParseParam 500000 4582 ns/op 1008 B/op 17 allocs/op -BenchmarkTraffic_ParseParam 200000 8125 ns/op 2248 B/op 23 allocs/op -BenchmarkVulcan_ParseParam 1000000 1148 ns/op 98 B/op 3 allocs/op -BenchmarkAce_Parse2Params 3000000 539 ns/op 64 B/op 1 allocs/op -BenchmarkBear_Parse2Params 1000000 1778 ns/op 496 B/op 5 allocs/op -BenchmarkBeego_Parse2Params 1000000 2519 ns/op 368 B/op 4 allocs/op -BenchmarkBone_Parse2Params 1000000 2596 ns/op 720 B/op 5 allocs/op -BenchmarkDenco_Parse2Params 3000000 492 ns/op 64 B/op 1 allocs/op -BenchmarkEcho_Parse2Params 3000000 484 ns/op 32 B/op 1 allocs/op -BenchmarkGin_Parse2Params 10000000 193 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_Parse2Params 1000000 2575 ns/op 712 B/op 9 allocs/op -BenchmarkGoji_Parse2Params 1000000 1373 ns/op 336 B/op 2 allocs/op -BenchmarkGojiv2_Parse2Params 500000 2416 ns/op 960 B/op 8 allocs/op -BenchmarkGoJsonRest_Parse2Params 300000 3452 ns/op 713 B/op 14 allocs/op -BenchmarkGoRestful_Parse2Params 100000 17719 ns/op 6008 B/op 25 allocs/op -BenchmarkGorillaMux_Parse2Params 300000 5102 ns/op 1088 B/op 11 allocs/op -BenchmarkHttpRouter_Parse2Params 5000000 303 ns/op 64 B/op 1 allocs/op -BenchmarkHttpTreeMux_Parse2Params 1000000 1372 ns/op 384 B/op 4 allocs/op -BenchmarkKocha_Parse2Params 2000000 874 ns/op 128 B/op 5 allocs/op -BenchmarkLARS_Parse2Params 10000000 192 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_Parse2Params 500000 3871 ns/op 1056 B/op 10 allocs/op -BenchmarkMartini_Parse2Params 200000 9954 ns/op 1152 B/op 11 allocs/op -BenchmarkPat_Parse2Params 500000 4194 ns/op 832 B/op 17 allocs/op -BenchmarkPossum_Parse2Params 1000000 2121 ns/op 560 B/op 6 allocs/op -BenchmarkR2router_Parse2Params 1000000 1415 ns/op 432 B/op 5 allocs/op -BenchmarkRivet_Parse2Params 3000000 457 ns/op 96 B/op 1 allocs/op -BenchmarkTango_Parse2Params 1000000 1914 ns/op 312 B/op 8 allocs/op -BenchmarkTigerTonic_Parse2Params 300000 6895 ns/op 1408 B/op 24 allocs/op -BenchmarkTraffic_Parse2Params 200000 8317 ns/op 2040 B/op 22 allocs/op -BenchmarkVulcan_Parse2Params 1000000 1274 ns/op 98 B/op 3 allocs/op -BenchmarkAce_ParseAll 200000 10401 ns/op 640 B/op 16 allocs/op -BenchmarkBear_ParseAll 50000 37743 ns/op 8928 B/op 110 allocs/op -BenchmarkBeego_ParseAll 20000 63193 ns/op 9568 B/op 104 allocs/op -BenchmarkBone_ParseAll 20000 61767 ns/op 14160 B/op 131 allocs/op -BenchmarkDenco_ParseAll 300000 7036 ns/op 928 B/op 16 allocs/op -BenchmarkEcho_ParseAll 200000 11824 ns/op 832 B/op 26 allocs/op -BenchmarkGin_ParseAll 300000 4199 ns/op 0 B/op 0 allocs/op -BenchmarkGocraftWeb_ParseAll 30000 51758 ns/op 13728 B/op 181 allocs/op -BenchmarkGoji_ParseAll 50000 29614 ns/op 5376 B/op 32 allocs/op -BenchmarkGojiv2_ParseAll 20000 68676 ns/op 24464 B/op 199 allocs/op -BenchmarkGoJsonRest_ParseAll 20000 76135 ns/op 13866 B/op 321 allocs/op -BenchmarkGoRestful_ParseAll 5000 389487 ns/op 110928 B/op 600 allocs/op -BenchmarkGorillaMux_ParseAll 10000 221250 ns/op 24864 B/op 292 allocs/op -BenchmarkHttpRouter_ParseAll 200000 6444 ns/op 640 B/op 16 allocs/op -BenchmarkHttpTreeMux_ParseAll 50000 30702 ns/op 5728 B/op 51 allocs/op -BenchmarkKocha_ParseAll 200000 13712 ns/op 1112 B/op 54 allocs/op -BenchmarkLARS_ParseAll 300000 6925 ns/op 0 B/op 0 allocs/op -BenchmarkMacaron_ParseAll 20000 96278 ns/op 24576 B/op 250 allocs/op -BenchmarkMartini_ParseAll 5000 271352 ns/op 25072 B/op 253 allocs/op -BenchmarkPat_ParseAll 20000 74941 ns/op 17264 B/op 343 allocs/op -BenchmarkPossum_ParseAll 50000 39947 ns/op 10816 B/op 78 allocs/op -BenchmarkR2router_ParseAll 50000 42479 ns/op 8352 B/op 120 allocs/op -BenchmarkRivet_ParseAll 200000 7726 ns/op 912 B/op 16 allocs/op -BenchmarkTango_ParseAll 30000 50014 ns/op 7168 B/op 208 allocs/op -BenchmarkTigerTonic_ParseAll 10000 106550 ns/op 19728 B/op 379 allocs/op -BenchmarkTraffic_ParseAll 10000 216037 ns/op 57776 B/op 642 allocs/op -BenchmarkVulcan_ParseAll 50000 34379 ns/op 2548 B/op 78 allocs/op -``` diff --git a/vendor/github.com/gin-gonic/gin/CHANGELOG.md b/vendor/github.com/gin-gonic/gin/CHANGELOG.md deleted file mode 100644 index 8ea2495..0000000 --- a/vendor/github.com/gin-gonic/gin/CHANGELOG.md +++ /dev/null @@ -1,269 +0,0 @@ - -### Gin 1.4.0 - -- [NEW] Support for [Go Modules](https://github.com/golang/go/wiki/Modules) [#1569](https://github.com/gin-gonic/gin/pull/1569) -- [NEW] Refactor of form mapping multipart requesta [#1829](https://github.com/gin-gonic/gin/pull/1829) -- [FIX] Truncate Latency precision in long running request [#1830](https://github.com/gin-gonic/gin/pull/1830) -- [FIX] IsTerm flag should not be affected by DisableConsoleColor method. [#1802](https://github.com/gin-gonic/gin/pull/1802) -- [NEW] Supporting file binding [#1264](https://github.com/gin-gonic/gin/pull/1264) -- [NEW] Add support for mapping arrays [#1797](https://github.com/gin-gonic/gin/pull/1797) -- [FIX] Readme updates [#1793](https://github.com/gin-gonic/gin/pull/1793) [#1788](https://github.com/gin-gonic/gin/pull/1788) [1789](https://github.com/gin-gonic/gin/pull/1789) -- [FIX] StaticFS: Fixed Logging two log lines on 404. [#1805](https://github.com/gin-gonic/gin/pull/1805), [#1804](https://github.com/gin-gonic/gin/pull/1804) -- [NEW] Make context.Keys available as LogFormatterParams [#1779](https://github.com/gin-gonic/gin/pull/1779) -- [NEW] Use internal/json for Marshal/Unmarshal [#1791](https://github.com/gin-gonic/gin/pull/1791) -- [NEW] Support mapping time.Duration [#1794](https://github.com/gin-gonic/gin/pull/1794) -- [NEW] Refactor form mappings [#1749](https://github.com/gin-gonic/gin/pull/1749) -- [NEW] Added flag to context.Stream indicates if client disconnected in middle of stream [#1252](https://github.com/gin-gonic/gin/pull/1252) -- [FIX] Moved [examples](https://github.com/gin-gonic/examples) to stand alone Repo [#1775](https://github.com/gin-gonic/gin/pull/1775) -- [NEW] Extend context.File to allow for the content-dispositon attachments via a new method context.Attachment [#1260](https://github.com/gin-gonic/gin/pull/1260) -- [FIX] Support HTTP content negotiation wildcards [#1112](https://github.com/gin-gonic/gin/pull/1112) -- [NEW] Add prefix from X-Forwarded-Prefix in redirectTrailingSlash [#1238](https://github.com/gin-gonic/gin/pull/1238) -- [FIX] context.Copy() race condition [#1020](https://github.com/gin-gonic/gin/pull/1020) -- [NEW] Add context.HandlerNames() [#1729](https://github.com/gin-gonic/gin/pull/1729) -- [FIX] Change color methods to public in the defaultLogger. [#1771](https://github.com/gin-gonic/gin/pull/1771) -- [FIX] Update writeHeaders method to use http.Header.Set [#1722](https://github.com/gin-gonic/gin/pull/1722) -- [NEW] Add response size to LogFormatterParams [#1752](https://github.com/gin-gonic/gin/pull/1752) -- [NEW] Allow ignoring field on form mapping [#1733](https://github.com/gin-gonic/gin/pull/1733) -- [NEW] Add a function to force color in console output. [#1724](https://github.com/gin-gonic/gin/pull/1724) -- [FIX] Context.Next() - recheck len of handlers on every iteration. [#1745](https://github.com/gin-gonic/gin/pull/1745) -- [FIX] Fix all errcheck warnings [#1739](https://github.com/gin-gonic/gin/pull/1739) [#1653](https://github.com/gin-gonic/gin/pull/1653) -- [NEW] context: inherits context cancellation and deadline from http.Request context for Go>=1.7 [#1690](https://github.com/gin-gonic/gin/pull/1690) -- [NEW] Binding for URL Params [#1694](https://github.com/gin-gonic/gin/pull/1694) -- [NEW] Add LoggerWithFormatter method [#1677](https://github.com/gin-gonic/gin/pull/1677) -- [FIX] CI testing updates [#1671](https://github.com/gin-gonic/gin/pull/1671) [#1670](https://github.com/gin-gonic/gin/pull/1670) [#1682](https://github.com/gin-gonic/gin/pull/1682) [#1669](https://github.com/gin-gonic/gin/pull/1669) -- [FIX] StaticFS(): Send 404 when path does not exist [#1663](https://github.com/gin-gonic/gin/pull/1663) -- [FIX] Handle nil body for JSON binding [#1638](https://github.com/gin-gonic/gin/pull/1638) -- [FIX] Support bind uri param [#1612](https://github.com/gin-gonic/gin/pull/1612) -- [FIX] recovery: fix issue with syscall import on google app engine [#1640](https://github.com/gin-gonic/gin/pull/1640) -- [FIX] Make sure the debug log contains line breaks [#1650](https://github.com/gin-gonic/gin/pull/1650) -- [FIX] Panic stack trace being printed during recovery of broken pipe [#1089](https://github.com/gin-gonic/gin/pull/1089) [#1259](https://github.com/gin-gonic/gin/pull/1259) -- [NEW] RunFd method to run http.Server through a file descriptor [#1609](https://github.com/gin-gonic/gin/pull/1609) -- [NEW] Yaml binding support [#1618](https://github.com/gin-gonic/gin/pull/1618) -- [FIX] Pass MaxMultipartMemory when FormFile is called [#1600](https://github.com/gin-gonic/gin/pull/1600) -- [FIX] LoadHTML* tests [#1559](https://github.com/gin-gonic/gin/pull/1559) -- [FIX] Removed use of sync.pool from HandleContext [#1565](https://github.com/gin-gonic/gin/pull/1565) -- [FIX] Format output log to os.Stderr [#1571](https://github.com/gin-gonic/gin/pull/1571) -- [FIX] Make logger use a yellow background and a darkgray text for legibility [#1570](https://github.com/gin-gonic/gin/pull/1570) -- [FIX] Remove sensitive request information from panic log. [#1370](https://github.com/gin-gonic/gin/pull/1370) -- [FIX] log.Println() does not print timestamp [#829](https://github.com/gin-gonic/gin/pull/829) [#1560](https://github.com/gin-gonic/gin/pull/1560) -- [NEW] Add PureJSON renderer [#694](https://github.com/gin-gonic/gin/pull/694) -- [FIX] Add missing copyright and update if/else [#1497](https://github.com/gin-gonic/gin/pull/1497) -- [FIX] Update msgpack usage [#1498](https://github.com/gin-gonic/gin/pull/1498) -- [FIX] Use protobuf on render [#1496](https://github.com/gin-gonic/gin/pull/1496) -- [FIX] Add support for Protobuf format response [#1479](https://github.com/gin-gonic/gin/pull/1479) -- [NEW] Set default time format in form binding [#1487](https://github.com/gin-gonic/gin/pull/1487) -- [FIX] Add BindXML and ShouldBindXML [#1485](https://github.com/gin-gonic/gin/pull/1485) -- [NEW] Upgrade dependency libraries [#1491](https://github.com/gin-gonic/gin/pull/1491) - - -### Gin 1.3.0 - -- [NEW] Add [`func (*Context) QueryMap`](https://godoc.org/github.com/gin-gonic/gin#Context.QueryMap), [`func (*Context) GetQueryMap`](https://godoc.org/github.com/gin-gonic/gin#Context.GetQueryMap), [`func (*Context) PostFormMap`](https://godoc.org/github.com/gin-gonic/gin#Context.PostFormMap) and [`func (*Context) GetPostFormMap`](https://godoc.org/github.com/gin-gonic/gin#Context.GetPostFormMap) to support `type map[string]string` as query string or form parameters, see [#1383](https://github.com/gin-gonic/gin/pull/1383) -- [NEW] Add [`func (*Context) AsciiJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.AsciiJSON), see [#1358](https://github.com/gin-gonic/gin/pull/1358) -- [NEW] Add `Pusher()` in [`type ResponseWriter`](https://godoc.org/github.com/gin-gonic/gin#ResponseWriter) for supporting http2 push, see [#1273](https://github.com/gin-gonic/gin/pull/1273) -- [NEW] Add [`func (*Context) DataFromReader`](https://godoc.org/github.com/gin-gonic/gin#Context.DataFromReader) for serving dynamic data, see [#1304](https://github.com/gin-gonic/gin/pull/1304) -- [NEW] Add [`func (*Context) ShouldBindBodyWith`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindBodyWith) allowing to call binding multiple times, see [#1341](https://github.com/gin-gonic/gin/pull/1341) -- [NEW] Support pointers in form binding, see [#1336](https://github.com/gin-gonic/gin/pull/1336) -- [NEW] Add [`func (*Context) JSONP`](https://godoc.org/github.com/gin-gonic/gin#Context.JSONP), see [#1333](https://github.com/gin-gonic/gin/pull/1333) -- [NEW] Support default value in form binding, see [#1138](https://github.com/gin-gonic/gin/pull/1138) -- [NEW] Expose validator engine in [`type StructValidator`](https://godoc.org/github.com/gin-gonic/gin/binding#StructValidator), see [#1277](https://github.com/gin-gonic/gin/pull/1277) -- [NEW] Add [`func (*Context) ShouldBind`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBind), [`func (*Context) ShouldBindQuery`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindQuery) and [`func (*Context) ShouldBindJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.ShouldBindJSON), see [#1047](https://github.com/gin-gonic/gin/pull/1047) -- [NEW] Add support for `time.Time` location in form binding, see [#1117](https://github.com/gin-gonic/gin/pull/1117) -- [NEW] Add [`func (*Context) BindQuery`](https://godoc.org/github.com/gin-gonic/gin#Context.BindQuery), see [#1029](https://github.com/gin-gonic/gin/pull/1029) -- [NEW] Make [jsonite](https://github.com/json-iterator/go) optional with build tags, see [#1026](https://github.com/gin-gonic/gin/pull/1026) -- [NEW] Show query string in logger, see [#999](https://github.com/gin-gonic/gin/pull/999) -- [NEW] Add [`func (*Context) SecureJSON`](https://godoc.org/github.com/gin-gonic/gin#Context.SecureJSON), see [#987](https://github.com/gin-gonic/gin/pull/987) and [#993](https://github.com/gin-gonic/gin/pull/993) -- [DEPRECATE] `func (*Context) GetCookie` for [`func (*Context) Cookie`](https://godoc.org/github.com/gin-gonic/gin#Context.Cookie) -- [FIX] Don't display color tags if [`func DisableConsoleColor`](https://godoc.org/github.com/gin-gonic/gin#DisableConsoleColor) called, see [#1072](https://github.com/gin-gonic/gin/pull/1072) -- [FIX] Gin Mode `""` when calling [`func Mode`](https://godoc.org/github.com/gin-gonic/gin#Mode) now returns `const DebugMode`, see [#1250](https://github.com/gin-gonic/gin/pull/1250) -- [FIX] `Flush()` now doesn't overwrite `responseWriter` status code, see [#1460](https://github.com/gin-gonic/gin/pull/1460) - -### Gin 1.2.0 - -- [NEW] Switch from godeps to govendor -- [NEW] Add support for Let's Encrypt via gin-gonic/autotls -- [NEW] Improve README examples and add extra at examples folder -- [NEW] Improved support with App Engine -- [NEW] Add custom template delimiters, see #860 -- [NEW] Add Template Func Maps, see #962 -- [NEW] Add \*context.Handler(), see #928 -- [NEW] Add \*context.GetRawData() -- [NEW] Add \*context.GetHeader() (request) -- [NEW] Add \*context.AbortWithStatusJSON() (JSON content type) -- [NEW] Add \*context.Keys type cast helpers -- [NEW] Add \*context.ShouldBindWith() -- [NEW] Add \*context.MustBindWith() -- [NEW] Add \*engine.SetFuncMap() -- [DEPRECATE] On next release: \*context.BindWith(), see #855 -- [FIX] Refactor render -- [FIX] Reworked tests -- [FIX] logger now supports cygwin -- [FIX] Use X-Forwarded-For before X-Real-Ip -- [FIX] time.Time binding (#904) - -### Gin 1.1.4 - -- [NEW] Support google appengine for IsTerminal func - -### Gin 1.1.3 - -- [FIX] Reverted Logger: skip ANSI color commands - -### Gin 1.1 - -- [NEW] Implement QueryArray and PostArray methods -- [NEW] Refactor GetQuery and GetPostForm -- [NEW] Add contribution guide -- [FIX] Corrected typos in README -- [FIX] Removed additional Iota -- [FIX] Changed imports to gopkg instead of github in README (#733) -- [FIX] Logger: skip ANSI color commands if output is not a tty - -### Gin 1.0rc2 (...) - -- [PERFORMANCE] Fast path for writing Content-Type. -- [PERFORMANCE] Much faster 404 routing -- [PERFORMANCE] Allocation optimizations -- [PERFORMANCE] Faster root tree lookup -- [PERFORMANCE] Zero overhead, String() and JSON() rendering. -- [PERFORMANCE] Faster ClientIP parsing -- [PERFORMANCE] Much faster SSE implementation -- [NEW] Benchmarks suite -- [NEW] Bind validation can be disabled and replaced with custom validators. -- [NEW] More flexible HTML render -- [NEW] Multipart and PostForm bindings -- [NEW] Adds method to return all the registered routes -- [NEW] Context.HandlerName() returns the main handler's name -- [NEW] Adds Error.IsType() helper -- [FIX] Binding multipart form -- [FIX] Integration tests -- [FIX] Crash when binding non struct object in Context. -- [FIX] RunTLS() implementation -- [FIX] Logger() unit tests -- [FIX] Adds SetHTMLTemplate() warning -- [FIX] Context.IsAborted() -- [FIX] More unit tests -- [FIX] JSON, XML, HTML renders accept custom content-types -- [FIX] gin.AbortIndex is unexported -- [FIX] Better approach to avoid directory listing in StaticFS() -- [FIX] Context.ClientIP() always returns the IP with trimmed spaces. -- [FIX] Better warning when running in debug mode. -- [FIX] Google App Engine integration. debugPrint does not use os.Stdout -- [FIX] Fixes integer overflow in error type -- [FIX] Error implements the json.Marshaller interface -- [FIX] MIT license in every file - - -### Gin 1.0rc1 (May 22, 2015) - -- [PERFORMANCE] Zero allocation router -- [PERFORMANCE] Faster JSON, XML and text rendering -- [PERFORMANCE] Custom hand optimized HttpRouter for Gin -- [PERFORMANCE] Misc code optimizations. Inlining, tail call optimizations -- [NEW] Built-in support for golang.org/x/net/context -- [NEW] Any(path, handler). Create a route that matches any path -- [NEW] Refactored rendering pipeline (faster and static typeded) -- [NEW] Refactored errors API -- [NEW] IndentedJSON() prints pretty JSON -- [NEW] Added gin.DefaultWriter -- [NEW] UNIX socket support -- [NEW] RouterGroup.BasePath is exposed -- [NEW] JSON validation using go-validate-yourself (very powerful options) -- [NEW] Completed suite of unit tests -- [NEW] HTTP streaming with c.Stream() -- [NEW] StaticFile() creates a router for serving just one file. -- [NEW] StaticFS() has an option to disable directory listing. -- [NEW] StaticFS() for serving static files through virtual filesystems -- [NEW] Server-Sent Events native support -- [NEW] WrapF() and WrapH() helpers for wrapping http.HandlerFunc and http.Handler -- [NEW] Added LoggerWithWriter() middleware -- [NEW] Added RecoveryWithWriter() middleware -- [NEW] Added DefaultPostFormValue() -- [NEW] Added DefaultFormValue() -- [NEW] Added DefaultParamValue() -- [FIX] BasicAuth() when using custom realm -- [FIX] Bug when serving static files in nested routing group -- [FIX] Redirect using built-in http.Redirect() -- [FIX] Logger when printing the requested path -- [FIX] Documentation typos -- [FIX] Context.Engine renamed to Context.engine -- [FIX] Better debugging messages -- [FIX] ErrorLogger -- [FIX] Debug HTTP render -- [FIX] Refactored binding and render modules -- [FIX] Refactored Context initialization -- [FIX] Refactored BasicAuth() -- [FIX] NoMethod/NoRoute handlers -- [FIX] Hijacking http -- [FIX] Better support for Google App Engine (using log instead of fmt) - - -### Gin 0.6 (Mar 9, 2015) - -- [NEW] Support multipart/form-data -- [NEW] NoMethod handler -- [NEW] Validate sub structures -- [NEW] Support for HTTP Realm Auth -- [FIX] Unsigned integers in binding -- [FIX] Improve color logger - - -### Gin 0.5 (Feb 7, 2015) - -- [NEW] Content Negotiation -- [FIX] Solved security bug that allow a client to spoof ip -- [FIX] Fix unexported/ignored fields in binding - - -### Gin 0.4 (Aug 21, 2014) - -- [NEW] Development mode -- [NEW] Unit tests -- [NEW] Add Content.Redirect() -- [FIX] Deferring WriteHeader() -- [FIX] Improved documentation for model binding - - -### Gin 0.3 (Jul 18, 2014) - -- [PERFORMANCE] Normal log and error log are printed in the same call. -- [PERFORMANCE] Improve performance of NoRouter() -- [PERFORMANCE] Improve context's memory locality, reduce CPU cache faults. -- [NEW] Flexible rendering API -- [NEW] Add Context.File() -- [NEW] Add shorcut RunTLS() for http.ListenAndServeTLS -- [FIX] Rename NotFound404() to NoRoute() -- [FIX] Errors in context are purged -- [FIX] Adds HEAD method in Static file serving -- [FIX] Refactors Static() file serving -- [FIX] Using keyed initialization to fix app-engine integration -- [FIX] Can't unmarshal JSON array, #63 -- [FIX] Renaming Context.Req to Context.Request -- [FIX] Check application/x-www-form-urlencoded when parsing form - - -### Gin 0.2b (Jul 08, 2014) -- [PERFORMANCE] Using sync.Pool to allocatio/gc overhead -- [NEW] Travis CI integration -- [NEW] Completely new logger -- [NEW] New API for serving static files. gin.Static() -- [NEW] gin.H() can be serialized into XML -- [NEW] Typed errors. Errors can be typed. Internet/external/custom. -- [NEW] Support for Godeps -- [NEW] Travis/Godocs badges in README -- [NEW] New Bind() and BindWith() methods for parsing request body. -- [NEW] Add Content.Copy() -- [NEW] Add context.LastError() -- [NEW] Add shorcut for OPTIONS HTTP method -- [FIX] Tons of README fixes -- [FIX] Header is written before body -- [FIX] BasicAuth() and changes API a little bit -- [FIX] Recovery() middleware only prints panics -- [FIX] Context.Get() does not panic anymore. Use MustGet() instead. -- [FIX] Multiple http.WriteHeader() in NotFound handlers -- [FIX] Engine.Run() panics if http server can't be setted up -- [FIX] Crash when route path doesn't start with '/' -- [FIX] Do not update header when status code is negative -- [FIX] Setting response headers before calling WriteHeader in context.String() -- [FIX] Add MIT license -- [FIX] Changes behaviour of ErrorLogger() and Logger() diff --git a/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md b/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md deleted file mode 100644 index 4ea14f3..0000000 --- a/vendor/github.com/gin-gonic/gin/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at teamgingonic@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md b/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md deleted file mode 100644 index 547b777..0000000 --- a/vendor/github.com/gin-gonic/gin/CONTRIBUTING.md +++ /dev/null @@ -1,13 +0,0 @@ -## Contributing - -- With issues: - - Use the search tool before opening a new issue. - - Please provide source code and commit sha if you found a bug. - - Review existing issues and provide feedback or react to them. - -- With pull requests: - - Open your pull request against `master` - - Your pull request should have no more than two commits, if not you should squash them. - - It should pass all tests in the available continuous integrations systems such as TravisCI. - - You should add/modify tests to cover your proposed code changes. - - If your pull request contains a new feature, please document it on the README. diff --git a/vendor/github.com/gin-gonic/gin/LICENSE b/vendor/github.com/gin-gonic/gin/LICENSE deleted file mode 100644 index 1ff7f37..0000000 --- a/vendor/github.com/gin-gonic/gin/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014 Manuel Martínez-Almeida - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. diff --git a/vendor/github.com/gin-gonic/gin/Makefile b/vendor/github.com/gin-gonic/gin/Makefile deleted file mode 100644 index 51a6b91..0000000 --- a/vendor/github.com/gin-gonic/gin/Makefile +++ /dev/null @@ -1,80 +0,0 @@ -GO ?= go -GOFMT ?= gofmt "-s" -PACKAGES ?= $(shell $(GO) list ./... | grep -v /vendor/) -VETPACKAGES ?= $(shell $(GO) list ./... | grep -v /vendor/ | grep -v /examples/) -GOFILES := $(shell find . -name "*.go" -type f -not -path "./vendor/*") -TESTFOLDER := $(shell $(GO) list ./... | grep -E 'gin$$|binding$$|render$$' | grep -v examples) - -all: install - -install: deps - govendor sync - -.PHONY: test -test: - echo "mode: count" > coverage.out - for d in $(TESTFOLDER); do \ - $(GO) test -v -covermode=count -coverprofile=profile.out $$d > tmp.out; \ - cat tmp.out; \ - if grep -q "^--- FAIL" tmp.out; then \ - rm tmp.out; \ - exit 1; \ - elif grep -q "build failed" tmp.out; then \ - rm tmp.out; \ - exit 1; \ - elif grep -q "setup failed" tmp.out; then \ - rm tmp.out; \ - exit 1; \ - fi; \ - if [ -f profile.out ]; then \ - cat profile.out | grep -v "mode:" >> coverage.out; \ - rm profile.out; \ - fi; \ - done - -.PHONY: fmt -fmt: - $(GOFMT) -w $(GOFILES) - -.PHONY: fmt-check -fmt-check: - @diff=$$($(GOFMT) -d $(GOFILES)); \ - if [ -n "$$diff" ]; then \ - echo "Please run 'make fmt' and commit the result:"; \ - echo "$${diff}"; \ - exit 1; \ - fi; - -vet: - $(GO) vet $(VETPACKAGES) - -deps: - @hash govendor > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/kardianos/govendor; \ - fi - -.PHONY: lint -lint: - @hash golint > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u golang.org/x/lint/golint; \ - fi - for PKG in $(PACKAGES); do golint -set_exit_status $$PKG || exit 1; done; - -.PHONY: misspell-check -misspell-check: - @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/client9/misspell/cmd/misspell; \ - fi - misspell -error $(GOFILES) - -.PHONY: misspell -misspell: - @hash misspell > /dev/null 2>&1; if [ $$? -ne 0 ]; then \ - $(GO) get -u github.com/client9/misspell/cmd/misspell; \ - fi - misspell -w $(GOFILES) - -.PHONY: tools -tools: - go install golang.org/x/lint/golint; \ - go install github.com/client9/misspell/cmd/misspell; diff --git a/vendor/github.com/gin-gonic/gin/README.md b/vendor/github.com/gin-gonic/gin/README.md deleted file mode 100644 index 3e817a7..0000000 --- a/vendor/github.com/gin-gonic/gin/README.md +++ /dev/null @@ -1,2070 +0,0 @@ -# Gin Web Framework - - - -[![Build Status](https://travis-ci.org/gin-gonic/gin.svg)](https://travis-ci.org/gin-gonic/gin) -[![codecov](https://codecov.io/gh/gin-gonic/gin/branch/master/graph/badge.svg)](https://codecov.io/gh/gin-gonic/gin) -[![Go Report Card](https://goreportcard.com/badge/github.com/gin-gonic/gin)](https://goreportcard.com/report/github.com/gin-gonic/gin) -[![GoDoc](https://godoc.org/github.com/gin-gonic/gin?status.svg)](https://godoc.org/github.com/gin-gonic/gin) -[![Join the chat at https://gitter.im/gin-gonic/gin](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/gin-gonic/gin?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) -[![Sourcegraph](https://sourcegraph.com/github.com/gin-gonic/gin/-/badge.svg)](https://sourcegraph.com/github.com/gin-gonic/gin?badge) -[![Open Source Helpers](https://www.codetriage.com/gin-gonic/gin/badges/users.svg)](https://www.codetriage.com/gin-gonic/gin) -[![Release](https://img.shields.io/github/release/gin-gonic/gin.svg?style=flat-square)](https://github.com/gin-gonic/gin/releases) - -Gin is a web framework written in Go (Golang). It features a martini-like API with much better performance, up to 40 times faster thanks to [httprouter](https://github.com/julienschmidt/httprouter). If you need performance and good productivity, you will love Gin. - - -## Contents - -- [Installation](#installation) -- [Prerequisite](#prerequisite) -- [Quick start](#quick-start) -- [Benchmarks](#benchmarks) -- [Gin v1.stable](#gin-v1-stable) -- [Build with jsoniter](#build-with-jsoniter) -- [API Examples](#api-examples) - - [Using GET,POST,PUT,PATCH,DELETE and OPTIONS](#using-get-post-put-patch-delete-and-options) - - [Parameters in path](#parameters-in-path) - - [Querystring parameters](#querystring-parameters) - - [Multipart/Urlencoded Form](#multiparturlencoded-form) - - [Another example: query + post form](#another-example-query--post-form) - - [Map as querystring or postform parameters](#map-as-querystring-or-postform-parameters) - - [Upload files](#upload-files) - - [Grouping routes](#grouping-routes) - - [Blank Gin without middleware by default](#blank-gin-without-middleware-by-default) - - [Using middleware](#using-middleware) - - [How to write log file](#how-to-write-log-file) - - [Custom Log Format](#custom-log-format) - - [Model binding and validation](#model-binding-and-validation) - - [Custom Validators](#custom-validators) - - [Only Bind Query String](#only-bind-query-string) - - [Bind Query String or Post Data](#bind-query-string-or-post-data) - - [Bind Uri](#bind-uri) - - [Bind HTML checkboxes](#bind-html-checkboxes) - - [Multipart/Urlencoded binding](#multiparturlencoded-binding) - - [XML, JSON, YAML and ProtoBuf rendering](#xml-json-yaml-and-protobuf-rendering) - - [JSONP rendering](#jsonp) - - [Serving static files](#serving-static-files) - - [Serving data from reader](#serving-data-from-reader) - - [HTML rendering](#html-rendering) - - [Multitemplate](#multitemplate) - - [Redirects](#redirects) - - [Custom Middleware](#custom-middleware) - - [Using BasicAuth() middleware](#using-basicauth-middleware) - - [Goroutines inside a middleware](#goroutines-inside-a-middleware) - - [Custom HTTP configuration](#custom-http-configuration) - - [Support Let's Encrypt](#support-lets-encrypt) - - [Run multiple service using Gin](#run-multiple-service-using-gin) - - [Graceful restart or stop](#graceful-restart-or-stop) - - [Build a single binary with templates](#build-a-single-binary-with-templates) - - [Bind form-data request with custom struct](#bind-form-data-request-with-custom-struct) - - [Try to bind body into different structs](#try-to-bind-body-into-different-structs) - - [http2 server push](#http2-server-push) - - [Define format for the log of routes](#define-format-for-the-log-of-routes) - - [Set and get a cookie](#set-and-get-a-cookie) -- [Testing](#testing) -- [Users](#users) - -## Installation - -To install Gin package, you need to install Go and set your Go workspace first. - -1. The first need [Go](https://golang.org/) installed (**version 1.8+ is required**), then you can use the below Go command to install Gin. - -```sh -$ go get -u github.com/gin-gonic/gin -``` - -2. Import it in your code: - -```go -import "github.com/gin-gonic/gin" -``` - -3. (Optional) Import `net/http`. This is required for example if using constants such as `http.StatusOK`. - -```go -import "net/http" -``` - -### Use a vendor tool like [Govendor](https://github.com/kardianos/govendor) - -1. `go get` govendor - -```sh -$ go get github.com/kardianos/govendor -``` -2. Create your project folder and `cd` inside - -```sh -$ mkdir -p $GOPATH/src/github.com/myusername/project && cd "$_" -``` - -3. Vendor init your project and add gin - -```sh -$ govendor init -$ govendor fetch github.com/gin-gonic/gin@v1.3 -``` - -4. Copy a starting template inside your project - -```sh -$ curl https://raw.githubusercontent.com/gin-gonic/examples/master/basic/main.go > main.go -``` - -5. Run your project - -```sh -$ go run main.go -``` - -## Prerequisite - -Now Gin requires Go 1.6 or later and Go 1.7 will be required soon. - -## Quick start - -```sh -# assume the following codes in example.go file -$ cat example.go -``` - -```go -package main - -import "github.com/gin-gonic/gin" - -func main() { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { - c.JSON(200, gin.H{ - "message": "pong", - }) - }) - r.Run() // listen and serve on 0.0.0.0:8080 -} -``` - -``` -# run example.go and visit 0.0.0.0:8080/ping on browser -$ go run example.go -``` - -## Benchmarks - -Gin uses a custom version of [HttpRouter](https://github.com/julienschmidt/httprouter) - -[See all benchmarks](/BENCHMARKS.md) - -Benchmark name | (1) | (2) | (3) | (4) ---------------------------------------------|-----------:|------------:|-----------:|---------: -**BenchmarkGin_GithubAll** | **30000** | **48375** | **0** | **0** -BenchmarkAce_GithubAll | 10000 | 134059 | 13792 | 167 -BenchmarkBear_GithubAll | 5000 | 534445 | 86448 | 943 -BenchmarkBeego_GithubAll | 3000 | 592444 | 74705 | 812 -BenchmarkBone_GithubAll | 200 | 6957308 | 698784 | 8453 -BenchmarkDenco_GithubAll | 10000 | 158819 | 20224 | 167 -BenchmarkEcho_GithubAll | 10000 | 154700 | 6496 | 203 -BenchmarkGocraftWeb_GithubAll | 3000 | 570806 | 131656 | 1686 -BenchmarkGoji_GithubAll | 2000 | 818034 | 56112 | 334 -BenchmarkGojiv2_GithubAll | 2000 | 1213973 | 274768 | 3712 -BenchmarkGoJsonRest_GithubAll | 2000 | 785796 | 134371 | 2737 -BenchmarkGoRestful_GithubAll | 300 | 5238188 | 689672 | 4519 -BenchmarkGorillaMux_GithubAll | 100 | 10257726 | 211840 | 2272 -BenchmarkHttpRouter_GithubAll | 20000 | 105414 | 13792 | 167 -BenchmarkHttpTreeMux_GithubAll | 10000 | 319934 | 65856 | 671 -BenchmarkKocha_GithubAll | 10000 | 209442 | 23304 | 843 -BenchmarkLARS_GithubAll | 20000 | 62565 | 0 | 0 -BenchmarkMacaron_GithubAll | 2000 | 1161270 | 204194 | 2000 -BenchmarkMartini_GithubAll | 200 | 9991713 | 226549 | 2325 -BenchmarkPat_GithubAll | 200 | 5590793 | 1499568 | 27435 -BenchmarkPossum_GithubAll | 10000 | 319768 | 84448 | 609 -BenchmarkR2router_GithubAll | 10000 | 305134 | 77328 | 979 -BenchmarkRivet_GithubAll | 10000 | 132134 | 16272 | 167 -BenchmarkTango_GithubAll | 3000 | 552754 | 63826 | 1618 -BenchmarkTigerTonic_GithubAll | 1000 | 1439483 | 239104 | 5374 -BenchmarkTraffic_GithubAll | 100 | 11383067 | 2659329 | 21848 -BenchmarkVulcan_GithubAll | 5000 | 394253 | 19894 | 609 - -- (1): Total Repetitions achieved in constant time, higher means more confident result -- (2): Single Repetition Duration (ns/op), lower is better -- (3): Heap Memory (B/op), lower is better -- (4): Average Allocations per Repetition (allocs/op), lower is better - -## Gin v1. stable - -- [x] Zero allocation router. -- [x] Still the fastest http router and framework. From routing to writing. -- [x] Complete suite of unit tests -- [x] Battle tested -- [x] API frozen, new releases will not break your code. - -## Build with [jsoniter](https://github.com/json-iterator/go) - -Gin uses `encoding/json` as default json package but you can change to [jsoniter](https://github.com/json-iterator/go) by build from other tags. - -```sh -$ go build -tags=jsoniter . -``` - -## API Examples - -You can find a number of ready-to-run examples at [Gin examples repository](https://github.com/gin-gonic/examples). - -### Using GET, POST, PUT, PATCH, DELETE and OPTIONS - -```go -func main() { - // Creates a gin router with default middleware: - // logger and recovery (crash-free) middleware - router := gin.Default() - - router.GET("/someGet", getting) - router.POST("/somePost", posting) - router.PUT("/somePut", putting) - router.DELETE("/someDelete", deleting) - router.PATCH("/somePatch", patching) - router.HEAD("/someHead", head) - router.OPTIONS("/someOptions", options) - - // By default it serves on :8080 unless a - // PORT environment variable was defined. - router.Run() - // router.Run(":3000") for a hard coded port -} -``` - -### Parameters in path - -```go -func main() { - router := gin.Default() - - // This handler will match /user/john but will not match /user/ or /user - router.GET("/user/:name", func(c *gin.Context) { - name := c.Param("name") - c.String(http.StatusOK, "Hello %s", name) - }) - - // However, this one will match /user/john/ and also /user/john/send - // If no other routers match /user/john, it will redirect to /user/john/ - router.GET("/user/:name/*action", func(c *gin.Context) { - name := c.Param("name") - action := c.Param("action") - message := name + " is " + action - c.String(http.StatusOK, message) - }) - - router.Run(":8080") -} -``` - -### Querystring parameters - -```go -func main() { - router := gin.Default() - - // Query string parameters are parsed using the existing underlying request object. - // The request responds to a url matching: /welcome?firstname=Jane&lastname=Doe - router.GET("/welcome", func(c *gin.Context) { - firstname := c.DefaultQuery("firstname", "Guest") - lastname := c.Query("lastname") // shortcut for c.Request.URL.Query().Get("lastname") - - c.String(http.StatusOK, "Hello %s %s", firstname, lastname) - }) - router.Run(":8080") -} -``` - -### Multipart/Urlencoded Form - -```go -func main() { - router := gin.Default() - - router.POST("/form_post", func(c *gin.Context) { - message := c.PostForm("message") - nick := c.DefaultPostForm("nick", "anonymous") - - c.JSON(200, gin.H{ - "status": "posted", - "message": message, - "nick": nick, - }) - }) - router.Run(":8080") -} -``` - -### Another example: query + post form - -``` -POST /post?id=1234&page=1 HTTP/1.1 -Content-Type: application/x-www-form-urlencoded - -name=manu&message=this_is_great -``` - -```go -func main() { - router := gin.Default() - - router.POST("/post", func(c *gin.Context) { - - id := c.Query("id") - page := c.DefaultQuery("page", "0") - name := c.PostForm("name") - message := c.PostForm("message") - - fmt.Printf("id: %s; page: %s; name: %s; message: %s", id, page, name, message) - }) - router.Run(":8080") -} -``` - -``` -id: 1234; page: 1; name: manu; message: this_is_great -``` - -### Map as querystring or postform parameters - -``` -POST /post?ids[a]=1234&ids[b]=hello HTTP/1.1 -Content-Type: application/x-www-form-urlencoded - -names[first]=thinkerou&names[second]=tianou -``` - -```go -func main() { - router := gin.Default() - - router.POST("/post", func(c *gin.Context) { - - ids := c.QueryMap("ids") - names := c.PostFormMap("names") - - fmt.Printf("ids: %v; names: %v", ids, names) - }) - router.Run(":8080") -} -``` - -``` -ids: map[b:hello a:1234], names: map[second:tianou first:thinkerou] -``` - -### Upload files - -#### Single file - -References issue [#774](https://github.com/gin-gonic/gin/issues/774) and detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/single). - -`file.Filename` **SHOULD NOT** be trusted. See [`Content-Disposition` on MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition#Directives) and [#1693](https://github.com/gin-gonic/gin/issues/1693) - -> The filename is always optional and must not be used blindly by the application: path information should be stripped, and conversion to the server file system rules should be done. - -```go -func main() { - router := gin.Default() - // Set a lower memory limit for multipart forms (default is 32 MiB) - // router.MaxMultipartMemory = 8 << 20 // 8 MiB - router.POST("/upload", func(c *gin.Context) { - // single file - file, _ := c.FormFile("file") - log.Println(file.Filename) - - // Upload the file to specific dst. - // c.SaveUploadedFile(file, dst) - - c.String(http.StatusOK, fmt.Sprintf("'%s' uploaded!", file.Filename)) - }) - router.Run(":8080") -} -``` - -How to `curl`: - -```bash -curl -X POST http://localhost:8080/upload \ - -F "file=@/Users/appleboy/test.zip" \ - -H "Content-Type: multipart/form-data" -``` - -#### Multiple files - -See the detail [example code](https://github.com/gin-gonic/examples/tree/master/upload-file/multiple). - -```go -func main() { - router := gin.Default() - // Set a lower memory limit for multipart forms (default is 32 MiB) - // router.MaxMultipartMemory = 8 << 20 // 8 MiB - router.POST("/upload", func(c *gin.Context) { - // Multipart form - form, _ := c.MultipartForm() - files := form.File["upload[]"] - - for _, file := range files { - log.Println(file.Filename) - - // Upload the file to specific dst. - // c.SaveUploadedFile(file, dst) - } - c.String(http.StatusOK, fmt.Sprintf("%d files uploaded!", len(files))) - }) - router.Run(":8080") -} -``` - -How to `curl`: - -```bash -curl -X POST http://localhost:8080/upload \ - -F "upload[]=@/Users/appleboy/test1.zip" \ - -F "upload[]=@/Users/appleboy/test2.zip" \ - -H "Content-Type: multipart/form-data" -``` - -### Grouping routes - -```go -func main() { - router := gin.Default() - - // Simple group: v1 - v1 := router.Group("/v1") - { - v1.POST("/login", loginEndpoint) - v1.POST("/submit", submitEndpoint) - v1.POST("/read", readEndpoint) - } - - // Simple group: v2 - v2 := router.Group("/v2") - { - v2.POST("/login", loginEndpoint) - v2.POST("/submit", submitEndpoint) - v2.POST("/read", readEndpoint) - } - - router.Run(":8080") -} -``` - -### Blank Gin without middleware by default - -Use - -```go -r := gin.New() -``` - -instead of - -```go -// Default With the Logger and Recovery middleware already attached -r := gin.Default() -``` - - -### Using middleware -```go -func main() { - // Creates a router without any middleware by default - r := gin.New() - - // Global middleware - // Logger middleware will write the logs to gin.DefaultWriter even if you set with GIN_MODE=release. - // By default gin.DefaultWriter = os.Stdout - r.Use(gin.Logger()) - - // Recovery middleware recovers from any panics and writes a 500 if there was one. - r.Use(gin.Recovery()) - - // Per route middleware, you can add as many as you desire. - r.GET("/benchmark", MyBenchLogger(), benchEndpoint) - - // Authorization group - // authorized := r.Group("/", AuthRequired()) - // exactly the same as: - authorized := r.Group("/") - // per group middleware! in this case we use the custom created - // AuthRequired() middleware just in the "authorized" group. - authorized.Use(AuthRequired()) - { - authorized.POST("/login", loginEndpoint) - authorized.POST("/submit", submitEndpoint) - authorized.POST("/read", readEndpoint) - - // nested group - testing := authorized.Group("testing") - testing.GET("/analytics", analyticsEndpoint) - } - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### How to write log file -```go -func main() { - // Disable Console Color, you don't need console color when writing the logs to file. - gin.DisableConsoleColor() - - // Logging to a file. - f, _ := os.Create("gin.log") - gin.DefaultWriter = io.MultiWriter(f) - - // Use the following code if you need to write the logs to file and console at the same time. - // gin.DefaultWriter = io.MultiWriter(f, os.Stdout) - - router := gin.Default() - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - -    router.Run(":8080") -} -``` - -### Custom Log Format -```go -func main() { - router := gin.New() - - // LoggerWithFormatter middleware will write the logs to gin.DefaultWriter - // By default gin.DefaultWriter = os.Stdout - router.Use(gin.LoggerWithFormatter(func(param gin.LogFormatterParams) string { - - // your custom format - return fmt.Sprintf("%s - [%s] \"%s %s %s %d %s \"%s\" %s\"\n", - param.ClientIP, - param.TimeStamp.Format(time.RFC1123), - param.Method, - param.Path, - param.Request.Proto, - param.StatusCode, - param.Latency, - param.Request.UserAgent(), - param.ErrorMessage, - ) - })) - router.Use(gin.Recovery()) - - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - router.Run(":8080") -} -``` - -**Sample Output** -``` -::1 - [Fri, 07 Dec 2018 17:04:38 JST] "GET /ping HTTP/1.1 200 122.767µs "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.80 Safari/537.36" " -``` - -### Controlling Log output coloring - -By default, logs output on console should be colorized depending on the detected TTY. - -Never colorize logs: - -```go -func main() { - // Disable log's color - gin.DisableConsoleColor() - - // Creates a gin router with default middleware: - // logger and recovery (crash-free) middleware - router := gin.Default() - - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - router.Run(":8080") -} -``` - -Always colorize logs: - -```go -func main() { - // Force log's color - gin.ForceConsoleColor() - - // Creates a gin router with default middleware: - // logger and recovery (crash-free) middleware - router := gin.Default() - - router.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - router.Run(":8080") -} -``` - -### Model binding and validation - -To bind a request body into a type, use model binding. We currently support binding of JSON, XML, YAML and standard form values (foo=bar&boo=baz). - -Gin uses [**go-playground/validator.v8**](https://github.com/go-playground/validator) for validation. Check the full docs on tags usage [here](http://godoc.org/gopkg.in/go-playground/validator.v8#hdr-Baked_In_Validators_and_Tags). - -Note that you need to set the corresponding binding tag on all fields you want to bind. For example, when binding from JSON, set `json:"fieldname"`. - -Also, Gin provides two sets of methods for binding: -- **Type** - Must bind - - **Methods** - `Bind`, `BindJSON`, `BindXML`, `BindQuery`, `BindYAML` - - **Behavior** - These methods use `MustBindWith` under the hood. If there is a binding error, the request is aborted with `c.AbortWithError(400, err).SetType(ErrorTypeBind)`. This sets the response status code to 400 and the `Content-Type` header is set to `text/plain; charset=utf-8`. Note that if you try to set the response code after this, it will result in a warning `[GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 422`. If you wish to have greater control over the behavior, consider using the `ShouldBind` equivalent method. -- **Type** - Should bind - - **Methods** - `ShouldBind`, `ShouldBindJSON`, `ShouldBindXML`, `ShouldBindQuery`, `ShouldBindYAML` - - **Behavior** - These methods use `ShouldBindWith` under the hood. If there is a binding error, the error is returned and it is the developer's responsibility to handle the request and error appropriately. - -When using the Bind-method, Gin tries to infer the binder depending on the Content-Type header. If you are sure what you are binding, you can use `MustBindWith` or `ShouldBindWith`. - -You can also specify that specific fields are required. If a field is decorated with `binding:"required"` and has a empty value when binding, an error will be returned. - -```go -// Binding from JSON -type Login struct { - User string `form:"user" json:"user" xml:"user" binding:"required"` - Password string `form:"password" json:"password" xml:"password" binding:"required"` -} - -func main() { - router := gin.Default() - - // Example for binding JSON ({"user": "manu", "password": "123"}) - router.POST("/loginJSON", func(c *gin.Context) { - var json Login - if err := c.ShouldBindJSON(&json); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - if json.User != "manu" || json.Password != "123" { - c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) - return - } - - c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) - }) - - // Example for binding XML ( - // - // - // user - // 123 - // ) - router.POST("/loginXML", func(c *gin.Context) { - var xml Login - if err := c.ShouldBindXML(&xml); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - if xml.User != "manu" || xml.Password != "123" { - c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) - return - } - - c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) - }) - - // Example for binding a HTML form (user=manu&password=123) - router.POST("/loginForm", func(c *gin.Context) { - var form Login - // This will infer what binder to use depending on the content-type header. - if err := c.ShouldBind(&form); err != nil { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - return - } - - if form.User != "manu" || form.Password != "123" { - c.JSON(http.StatusUnauthorized, gin.H{"status": "unauthorized"}) - return - } - - c.JSON(http.StatusOK, gin.H{"status": "you are logged in"}) - }) - - // Listen and serve on 0.0.0.0:8080 - router.Run(":8080") -} -``` - -**Sample request** -```shell -$ curl -v -X POST \ - http://localhost:8080/loginJSON \ - -H 'content-type: application/json' \ - -d '{ "user": "manu" }' -> POST /loginJSON HTTP/1.1 -> Host: localhost:8080 -> User-Agent: curl/7.51.0 -> Accept: */* -> content-type: application/json -> Content-Length: 18 -> -* upload completely sent off: 18 out of 18 bytes -< HTTP/1.1 400 Bad Request -< Content-Type: application/json; charset=utf-8 -< Date: Fri, 04 Aug 2017 03:51:31 GMT -< Content-Length: 100 -< -{"error":"Key: 'Login.Password' Error:Field validation for 'Password' failed on the 'required' tag"} -``` - -**Skip validate** - -When running the above example using the above the `curl` command, it returns error. Because the example use `binding:"required"` for `Password`. If use `binding:"-"` for `Password`, then it will not return error when running the above example again. - -### Custom Validators - -It is also possible to register custom validators. See the [example code](https://github.com/gin-gonic/examples/tree/master/custom-validation/server.go). - -```go -package main - -import ( - "net/http" - "reflect" - "time" - - "github.com/gin-gonic/gin" - "github.com/gin-gonic/gin/binding" - "gopkg.in/go-playground/validator.v8" -) - -// Booking contains binded and validated data. -type Booking struct { - CheckIn time.Time `form:"check_in" binding:"required,bookabledate" time_format:"2006-01-02"` - CheckOut time.Time `form:"check_out" binding:"required,gtfield=CheckIn" time_format:"2006-01-02"` -} - -func bookableDate( - v *validator.Validate, topStruct reflect.Value, currentStructOrField reflect.Value, - field reflect.Value, fieldType reflect.Type, fieldKind reflect.Kind, param string, -) bool { - if date, ok := field.Interface().(time.Time); ok { - today := time.Now() - if today.Year() > date.Year() || today.YearDay() > date.YearDay() { - return false - } - } - return true -} - -func main() { - route := gin.Default() - - if v, ok := binding.Validator.Engine().(*validator.Validate); ok { - v.RegisterValidation("bookabledate", bookableDate) - } - - route.GET("/bookable", getBookable) - route.Run(":8085") -} - -func getBookable(c *gin.Context) { - var b Booking - if err := c.ShouldBindWith(&b, binding.Query); err == nil { - c.JSON(http.StatusOK, gin.H{"message": "Booking dates are valid!"}) - } else { - c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()}) - } -} -``` - -```console -$ curl "localhost:8085/bookable?check_in=2018-04-16&check_out=2018-04-17" -{"message":"Booking dates are valid!"} - -$ curl "localhost:8085/bookable?check_in=2018-03-08&check_out=2018-03-09" -{"error":"Key: 'Booking.CheckIn' Error:Field validation for 'CheckIn' failed on the 'bookabledate' tag"} -``` - -[Struct level validations](https://github.com/go-playground/validator/releases/tag/v8.7) can also be registered this way. -See the [struct-lvl-validation example](https://github.com/gin-gonic/examples/tree/master/struct-lvl-validations) to learn more. - -### Only Bind Query String - -`ShouldBindQuery` function only binds the query params and not the post data. See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-315953017). - -```go -package main - -import ( - "log" - - "github.com/gin-gonic/gin" -) - -type Person struct { - Name string `form:"name"` - Address string `form:"address"` -} - -func main() { - route := gin.Default() - route.Any("/testing", startPage) - route.Run(":8085") -} - -func startPage(c *gin.Context) { - var person Person - if c.ShouldBindQuery(&person) == nil { - log.Println("====== Only Bind By Query String ======") - log.Println(person.Name) - log.Println(person.Address) - } - c.String(200, "Success") -} - -``` - -### Bind Query String or Post Data - -See the [detail information](https://github.com/gin-gonic/gin/issues/742#issuecomment-264681292). - -```go -package main - -import ( - "log" - "time" - - "github.com/gin-gonic/gin" -) - -type Person struct { - Name string `form:"name"` - Address string `form:"address"` - Birthday time.Time `form:"birthday" time_format:"2006-01-02" time_utc:"1"` -} - -func main() { - route := gin.Default() - route.GET("/testing", startPage) - route.Run(":8085") -} - -func startPage(c *gin.Context) { - var person Person - // If `GET`, only `Form` binding engine (`query`) used. - // If `POST`, first checks the `content-type` for `JSON` or `XML`, then uses `Form` (`form-data`). - // See more at https://github.com/gin-gonic/gin/blob/master/binding/binding.go#L48 - if c.ShouldBind(&person) == nil { - log.Println(person.Name) - log.Println(person.Address) - log.Println(person.Birthday) - } - - c.String(200, "Success") -} -``` - -Test it with: -```sh -$ curl -X GET "localhost:8085/testing?name=appleboy&address=xyz&birthday=1992-03-15" -``` - -### Bind Uri - -See the [detail information](https://github.com/gin-gonic/gin/issues/846). - -```go -package main - -import "github.com/gin-gonic/gin" - -type Person struct { - ID string `uri:"id" binding:"required,uuid"` - Name string `uri:"name" binding:"required"` -} - -func main() { - route := gin.Default() - route.GET("/:name/:id", func(c *gin.Context) { - var person Person - if err := c.ShouldBindUri(&person); err != nil { - c.JSON(400, gin.H{"msg": err}) - return - } - c.JSON(200, gin.H{"name": person.Name, "uuid": person.ID}) - }) - route.Run(":8088") -} -``` - -Test it with: -```sh -$ curl -v localhost:8088/thinkerou/987fbc97-4bed-5078-9f07-9141ba07c9f3 -$ curl -v localhost:8088/thinkerou/not-uuid -``` - -### Bind HTML checkboxes - -See the [detail information](https://github.com/gin-gonic/gin/issues/129#issuecomment-124260092) - -main.go - -```go -... - -type myForm struct { - Colors []string `form:"colors[]"` -} - -... - -func formHandler(c *gin.Context) { - var fakeForm myForm - c.ShouldBind(&fakeForm) - c.JSON(200, gin.H{"color": fakeForm.Colors}) -} - -... - -``` - -form.html - -```html -

-

Check some colors

- - - - - - - - -``` - -result: - -``` -{"color":["red","green","blue"]} -``` - -### Multipart/Urlencoded binding - -```go -package main - -import ( - "github.com/gin-gonic/gin" -) - -type LoginForm struct { - User string `form:"user" binding:"required"` - Password string `form:"password" binding:"required"` -} - -func main() { - router := gin.Default() - router.POST("/login", func(c *gin.Context) { - // you can bind multipart form with explicit binding declaration: - // c.ShouldBindWith(&form, binding.Form) - // or you can simply use autobinding with ShouldBind method: - var form LoginForm - // in this case proper binding will be automatically selected - if c.ShouldBind(&form) == nil { - if form.User == "user" && form.Password == "password" { - c.JSON(200, gin.H{"status": "you are logged in"}) - } else { - c.JSON(401, gin.H{"status": "unauthorized"}) - } - } - }) - router.Run(":8080") -} -``` - -Test it with: -```sh -$ curl -v --form user=user --form password=password http://localhost:8080/login -``` - -### XML, JSON, YAML and ProtoBuf rendering - -```go -func main() { - r := gin.Default() - - // gin.H is a shortcut for map[string]interface{} - r.GET("/someJSON", func(c *gin.Context) { - c.JSON(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) - }) - - r.GET("/moreJSON", func(c *gin.Context) { - // You also can use a struct - var msg struct { - Name string `json:"user"` - Message string - Number int - } - msg.Name = "Lena" - msg.Message = "hey" - msg.Number = 123 - // Note that msg.Name becomes "user" in the JSON - // Will output : {"user": "Lena", "Message": "hey", "Number": 123} - c.JSON(http.StatusOK, msg) - }) - - r.GET("/someXML", func(c *gin.Context) { - c.XML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) - }) - - r.GET("/someYAML", func(c *gin.Context) { - c.YAML(http.StatusOK, gin.H{"message": "hey", "status": http.StatusOK}) - }) - - r.GET("/someProtoBuf", func(c *gin.Context) { - reps := []int64{int64(1), int64(2)} - label := "test" - // The specific definition of protobuf is written in the testdata/protoexample file. - data := &protoexample.Test{ - Label: &label, - Reps: reps, - } - // Note that data becomes binary data in the response - // Will output protoexample.Test protobuf serialized data - c.ProtoBuf(http.StatusOK, data) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -#### SecureJSON - -Using SecureJSON to prevent json hijacking. Default prepends `"while(1),"` to response body if the given struct is array values. - -```go -func main() { - r := gin.Default() - - // You can also use your own secure json prefix - // r.SecureJsonPrefix(")]}',\n") - - r.GET("/someJSON", func(c *gin.Context) { - names := []string{"lena", "austin", "foo"} - - // Will output : while(1);["lena","austin","foo"] - c.SecureJSON(http.StatusOK, names) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` -#### JSONP - -Using JSONP to request data from a server in a different domain. Add callback to response body if the query parameter callback exists. - -```go -func main() { - r := gin.Default() - - r.GET("/JSONP?callback=x", func(c *gin.Context) { - data := map[string]interface{}{ - "foo": "bar", - } - - //callback is x - // Will output : x({\"foo\":\"bar\"}) - c.JSONP(http.StatusOK, data) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -#### AsciiJSON - -Using AsciiJSON to Generates ASCII-only JSON with escaped non-ASCII chracters. - -```go -func main() { - r := gin.Default() - - r.GET("/someJSON", func(c *gin.Context) { - data := map[string]interface{}{ - "lang": "GO语言", - "tag": "
", - } - - // will output : {"lang":"GO\u8bed\u8a00","tag":"\u003cbr\u003e"} - c.AsciiJSON(http.StatusOK, data) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -#### PureJSON - -Normally, JSON replaces special HTML characters with their unicode entities, e.g. `<` becomes `\u003c`. If you want to encode such characters literally, you can use PureJSON instead. -This feature is unavailable in Go 1.6 and lower. - -```go -func main() { - r := gin.Default() - - // Serves unicode entities - r.GET("/json", func(c *gin.Context) { - c.JSON(200, gin.H{ - "html": "Hello, world!", - }) - }) - - // Serves literal characters - r.GET("/purejson", func(c *gin.Context) { - c.PureJSON(200, gin.H{ - "html": "Hello, world!", - }) - }) - - // listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Serving static files - -```go -func main() { - router := gin.Default() - router.Static("/assets", "./assets") - router.StaticFS("/more_static", http.Dir("my_file_system")) - router.StaticFile("/favicon.ico", "./resources/favicon.ico") - - // Listen and serve on 0.0.0.0:8080 - router.Run(":8080") -} -``` - -### Serving data from reader - -```go -func main() { - router := gin.Default() - router.GET("/someDataFromReader", func(c *gin.Context) { - response, err := http.Get("https://raw.githubusercontent.com/gin-gonic/logo/master/color.png") - if err != nil || response.StatusCode != http.StatusOK { - c.Status(http.StatusServiceUnavailable) - return - } - - reader := response.Body - contentLength := response.ContentLength - contentType := response.Header.Get("Content-Type") - - extraHeaders := map[string]string{ - "Content-Disposition": `attachment; filename="gopher.png"`, - } - - c.DataFromReader(http.StatusOK, contentLength, contentType, reader, extraHeaders) - }) - router.Run(":8080") -} -``` - -### HTML rendering - -Using LoadHTMLGlob() or LoadHTMLFiles() - -```go -func main() { - router := gin.Default() - router.LoadHTMLGlob("templates/*") - //router.LoadHTMLFiles("templates/template1.html", "templates/template2.html") - router.GET("/index", func(c *gin.Context) { - c.HTML(http.StatusOK, "index.tmpl", gin.H{ - "title": "Main website", - }) - }) - router.Run(":8080") -} -``` - -templates/index.tmpl - -```html - -

- {{ .title }} -

- -``` - -Using templates with same name in different directories - -```go -func main() { - router := gin.Default() - router.LoadHTMLGlob("templates/**/*") - router.GET("/posts/index", func(c *gin.Context) { - c.HTML(http.StatusOK, "posts/index.tmpl", gin.H{ - "title": "Posts", - }) - }) - router.GET("/users/index", func(c *gin.Context) { - c.HTML(http.StatusOK, "users/index.tmpl", gin.H{ - "title": "Users", - }) - }) - router.Run(":8080") -} -``` - -templates/posts/index.tmpl - -```html -{{ define "posts/index.tmpl" }} -

- {{ .title }} -

-

Using posts/index.tmpl

- -{{ end }} -``` - -templates/users/index.tmpl - -```html -{{ define "users/index.tmpl" }} -

- {{ .title }} -

-

Using users/index.tmpl

- -{{ end }} -``` - -#### Custom Template renderer - -You can also use your own html template render - -```go -import "html/template" - -func main() { - router := gin.Default() - html := template.Must(template.ParseFiles("file1", "file2")) - router.SetHTMLTemplate(html) - router.Run(":8080") -} -``` - -#### Custom Delimiters - -You may use custom delims - -```go - r := gin.Default() - r.Delims("{[{", "}]}") - r.LoadHTMLGlob("/path/to/templates") -``` - -#### Custom Template Funcs - -See the detail [example code](https://github.com/gin-gonic/examples/tree/master/template). - -main.go - -```go -import ( - "fmt" - "html/template" - "net/http" - "time" - - "github.com/gin-gonic/gin" -) - -func formatAsDate(t time.Time) string { - year, month, day := t.Date() - return fmt.Sprintf("%d%02d/%02d", year, month, day) -} - -func main() { - router := gin.Default() - router.Delims("{[{", "}]}") - router.SetFuncMap(template.FuncMap{ - "formatAsDate": formatAsDate, - }) - router.LoadHTMLFiles("./testdata/template/raw.tmpl") - - router.GET("/raw", func(c *gin.Context) { - c.HTML(http.StatusOK, "raw.tmpl", map[string]interface{}{ - "now": time.Date(2017, 07, 01, 0, 0, 0, 0, time.UTC), - }) - }) - - router.Run(":8080") -} - -``` - -raw.tmpl - -```html -Date: {[{.now | formatAsDate}]} -``` - -Result: -``` -Date: 2017/07/01 -``` - -### Multitemplate - -Gin allow by default use only one html.Template. Check [a multitemplate render](https://github.com/gin-contrib/multitemplate) for using features like go 1.6 `block template`. - -### Redirects - -Issuing a HTTP redirect is easy. Both internal and external locations are supported. - -```go -r.GET("/test", func(c *gin.Context) { - c.Redirect(http.StatusMovedPermanently, "http://www.google.com/") -}) -``` - - -Issuing a Router redirect, use `HandleContext` like below. - -``` go -r.GET("/test", func(c *gin.Context) { - c.Request.URL.Path = "/test2" - r.HandleContext(c) -}) -r.GET("/test2", func(c *gin.Context) { - c.JSON(200, gin.H{"hello": "world"}) -}) -``` - - -### Custom Middleware - -```go -func Logger() gin.HandlerFunc { - return func(c *gin.Context) { - t := time.Now() - - // Set example variable - c.Set("example", "12345") - - // before request - - c.Next() - - // after request - latency := time.Since(t) - log.Print(latency) - - // access the status we are sending - status := c.Writer.Status() - log.Println(status) - } -} - -func main() { - r := gin.New() - r.Use(Logger()) - - r.GET("/test", func(c *gin.Context) { - example := c.MustGet("example").(string) - - // it would print: "12345" - log.Println(example) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Using BasicAuth() middleware - -```go -// simulate some private data -var secrets = gin.H{ - "foo": gin.H{"email": "foo@bar.com", "phone": "123433"}, - "austin": gin.H{"email": "austin@example.com", "phone": "666"}, - "lena": gin.H{"email": "lena@guapa.com", "phone": "523443"}, -} - -func main() { - r := gin.Default() - - // Group using gin.BasicAuth() middleware - // gin.Accounts is a shortcut for map[string]string - authorized := r.Group("/admin", gin.BasicAuth(gin.Accounts{ - "foo": "bar", - "austin": "1234", - "lena": "hello2", - "manu": "4321", - })) - - // /admin/secrets endpoint - // hit "localhost:8080/admin/secrets - authorized.GET("/secrets", func(c *gin.Context) { - // get user, it was set by the BasicAuth middleware - user := c.MustGet(gin.AuthUserKey).(string) - if secret, ok := secrets[user]; ok { - c.JSON(http.StatusOK, gin.H{"user": user, "secret": secret}) - } else { - c.JSON(http.StatusOK, gin.H{"user": user, "secret": "NO SECRET :("}) - } - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Goroutines inside a middleware - -When starting new Goroutines inside a middleware or handler, you **SHOULD NOT** use the original context inside it, you have to use a read-only copy. - -```go -func main() { - r := gin.Default() - - r.GET("/long_async", func(c *gin.Context) { - // create copy to be used inside the goroutine - cCp := c.Copy() - go func() { - // simulate a long task with time.Sleep(). 5 seconds - time.Sleep(5 * time.Second) - - // note that you are using the copied context "cCp", IMPORTANT - log.Println("Done! in path " + cCp.Request.URL.Path) - }() - }) - - r.GET("/long_sync", func(c *gin.Context) { - // simulate a long task with time.Sleep(). 5 seconds - time.Sleep(5 * time.Second) - - // since we are NOT using a goroutine, we do not have to copy the context - log.Println("Done! in path " + c.Request.URL.Path) - }) - - // Listen and serve on 0.0.0.0:8080 - r.Run(":8080") -} -``` - -### Custom HTTP configuration - -Use `http.ListenAndServe()` directly, like this: - -```go -func main() { - router := gin.Default() - http.ListenAndServe(":8080", router) -} -``` -or - -```go -func main() { - router := gin.Default() - - s := &http.Server{ - Addr: ":8080", - Handler: router, - ReadTimeout: 10 * time.Second, - WriteTimeout: 10 * time.Second, - MaxHeaderBytes: 1 << 20, - } - s.ListenAndServe() -} -``` - -### Support Let's Encrypt - -example for 1-line LetsEncrypt HTTPS servers. - -```go -package main - -import ( - "log" - - "github.com/gin-gonic/autotls" - "github.com/gin-gonic/gin" -) - -func main() { - r := gin.Default() - - // Ping handler - r.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - log.Fatal(autotls.Run(r, "example1.com", "example2.com")) -} -``` - -example for custom autocert manager. - -```go -package main - -import ( - "log" - - "github.com/gin-gonic/autotls" - "github.com/gin-gonic/gin" - "golang.org/x/crypto/acme/autocert" -) - -func main() { - r := gin.Default() - - // Ping handler - r.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - - m := autocert.Manager{ - Prompt: autocert.AcceptTOS, - HostPolicy: autocert.HostWhitelist("example1.com", "example2.com"), - Cache: autocert.DirCache("/var/www/.cache"), - } - - log.Fatal(autotls.RunWithManager(r, &m)) -} -``` - -### Run multiple service using Gin - -See the [question](https://github.com/gin-gonic/gin/issues/346) and try the following example: - -```go -package main - -import ( - "log" - "net/http" - "time" - - "github.com/gin-gonic/gin" - "golang.org/x/sync/errgroup" -) - -var ( - g errgroup.Group -) - -func router01() http.Handler { - e := gin.New() - e.Use(gin.Recovery()) - e.GET("/", func(c *gin.Context) { - c.JSON( - http.StatusOK, - gin.H{ - "code": http.StatusOK, - "error": "Welcome server 01", - }, - ) - }) - - return e -} - -func router02() http.Handler { - e := gin.New() - e.Use(gin.Recovery()) - e.GET("/", func(c *gin.Context) { - c.JSON( - http.StatusOK, - gin.H{ - "code": http.StatusOK, - "error": "Welcome server 02", - }, - ) - }) - - return e -} - -func main() { - server01 := &http.Server{ - Addr: ":8080", - Handler: router01(), - ReadTimeout: 5 * time.Second, - WriteTimeout: 10 * time.Second, - } - - server02 := &http.Server{ - Addr: ":8081", - Handler: router02(), - ReadTimeout: 5 * time.Second, - WriteTimeout: 10 * time.Second, - } - - g.Go(func() error { - return server01.ListenAndServe() - }) - - g.Go(func() error { - return server02.ListenAndServe() - }) - - if err := g.Wait(); err != nil { - log.Fatal(err) - } -} -``` - -### Graceful restart or stop - -Do you want to graceful restart or stop your web server? -There are some ways this can be done. - -We can use [fvbock/endless](https://github.com/fvbock/endless) to replace the default `ListenAndServe`. Refer issue [#296](https://github.com/gin-gonic/gin/issues/296) for more details. - -```go -router := gin.Default() -router.GET("/", handler) -// [...] -endless.ListenAndServe(":4242", router) -``` - -An alternative to endless: - -* [manners](https://github.com/braintree/manners): A polite Go HTTP server that shuts down gracefully. -* [graceful](https://github.com/tylerb/graceful): Graceful is a Go package enabling graceful shutdown of an http.Handler server. -* [grace](https://github.com/facebookgo/grace): Graceful restart & zero downtime deploy for Go servers. - -If you are using Go 1.8, you may not need to use this library! Consider using http.Server's built-in [Shutdown()](https://golang.org/pkg/net/http/#Server.Shutdown) method for graceful shutdowns. See the full [graceful-shutdown](https://github.com/gin-gonic/examples/tree/master/graceful-shutdown) example with gin. - -```go -// +build go1.8 - -package main - -import ( - "context" - "log" - "net/http" - "os" - "os/signal" - "syscall" - "time" - - "github.com/gin-gonic/gin" -) - -func main() { - router := gin.Default() - router.GET("/", func(c *gin.Context) { - time.Sleep(5 * time.Second) - c.String(http.StatusOK, "Welcome Gin Server") - }) - - srv := &http.Server{ - Addr: ":8080", - Handler: router, - } - - go func() { - // service connections - if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed { - log.Fatalf("listen: %s\n", err) - } - }() - - // Wait for interrupt signal to gracefully shutdown the server with - // a timeout of 5 seconds. - quit := make(chan os.Signal) - // kill (no param) default send syscall.SIGTERM - // kill -2 is syscall.SIGINT - // kill -9 is syscall.SIGKILL but can"t be catch, so don't need add it - signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM) - <-quit - log.Println("Shutdown Server ...") - - ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) - defer cancel() - if err := srv.Shutdown(ctx); err != nil { - log.Fatal("Server Shutdown:", err) - } - // catching ctx.Done(). timeout of 5 seconds. - select { - case <-ctx.Done(): - log.Println("timeout of 5 seconds.") - } - log.Println("Server exiting") -} -``` - -### Build a single binary with templates - -You can build a server into a single binary containing templates by using [go-assets][]. - -[go-assets]: https://github.com/jessevdk/go-assets - -```go -func main() { - r := gin.New() - - t, err := loadTemplate() - if err != nil { - panic(err) - } - r.SetHTMLTemplate(t) - - r.GET("/", func(c *gin.Context) { - c.HTML(http.StatusOK, "/html/index.tmpl",nil) - }) - r.Run(":8080") -} - -// loadTemplate loads templates embedded by go-assets-builder -func loadTemplate() (*template.Template, error) { - t := template.New("") - for name, file := range Assets.Files { - if file.IsDir() || !strings.HasSuffix(name, ".tmpl") { - continue - } - h, err := ioutil.ReadAll(file) - if err != nil { - return nil, err - } - t, err = t.New(name).Parse(string(h)) - if err != nil { - return nil, err - } - } - return t, nil -} -``` - -See a complete example in the `https://github.com/gin-gonic/examples/tree/master/assets-in-binary` directory. - -### Bind form-data request with custom struct - -The follow example using custom struct: - -```go -type StructA struct { - FieldA string `form:"field_a"` -} - -type StructB struct { - NestedStruct StructA - FieldB string `form:"field_b"` -} - -type StructC struct { - NestedStructPointer *StructA - FieldC string `form:"field_c"` -} - -type StructD struct { - NestedAnonyStruct struct { - FieldX string `form:"field_x"` - } - FieldD string `form:"field_d"` -} - -func GetDataB(c *gin.Context) { - var b StructB - c.Bind(&b) - c.JSON(200, gin.H{ - "a": b.NestedStruct, - "b": b.FieldB, - }) -} - -func GetDataC(c *gin.Context) { - var b StructC - c.Bind(&b) - c.JSON(200, gin.H{ - "a": b.NestedStructPointer, - "c": b.FieldC, - }) -} - -func GetDataD(c *gin.Context) { - var b StructD - c.Bind(&b) - c.JSON(200, gin.H{ - "x": b.NestedAnonyStruct, - "d": b.FieldD, - }) -} - -func main() { - r := gin.Default() - r.GET("/getb", GetDataB) - r.GET("/getc", GetDataC) - r.GET("/getd", GetDataD) - - r.Run() -} -``` - -Using the command `curl` command result: - -``` -$ curl "http://localhost:8080/getb?field_a=hello&field_b=world" -{"a":{"FieldA":"hello"},"b":"world"} -$ curl "http://localhost:8080/getc?field_a=hello&field_c=world" -{"a":{"FieldA":"hello"},"c":"world"} -$ curl "http://localhost:8080/getd?field_x=hello&field_d=world" -{"d":"world","x":{"FieldX":"hello"}} -``` - -### Try to bind body into different structs - -The normal methods for binding request body consumes `c.Request.Body` and they -cannot be called multiple times. - -```go -type formA struct { - Foo string `json:"foo" xml:"foo" binding:"required"` -} - -type formB struct { - Bar string `json:"bar" xml:"bar" binding:"required"` -} - -func SomeHandler(c *gin.Context) { - objA := formA{} - objB := formB{} - // This c.ShouldBind consumes c.Request.Body and it cannot be reused. - if errA := c.ShouldBind(&objA); errA == nil { - c.String(http.StatusOK, `the body should be formA`) - // Always an error is occurred by this because c.Request.Body is EOF now. - } else if errB := c.ShouldBind(&objB); errB == nil { - c.String(http.StatusOK, `the body should be formB`) - } else { - ... - } -} -``` - -For this, you can use `c.ShouldBindBodyWith`. - -```go -func SomeHandler(c *gin.Context) { - objA := formA{} - objB := formB{} - // This reads c.Request.Body and stores the result into the context. - if errA := c.ShouldBindBodyWith(&objA, binding.JSON); errA == nil { - c.String(http.StatusOK, `the body should be formA`) - // At this time, it reuses body stored in the context. - } else if errB := c.ShouldBindBodyWith(&objB, binding.JSON); errB == nil { - c.String(http.StatusOK, `the body should be formB JSON`) - // And it can accepts other formats - } else if errB2 := c.ShouldBindBodyWith(&objB, binding.XML); errB2 == nil { - c.String(http.StatusOK, `the body should be formB XML`) - } else { - ... - } -} -``` - -* `c.ShouldBindBodyWith` stores body into the context before binding. This has -a slight impact to performance, so you should not use this method if you are -enough to call binding at once. -* This feature is only needed for some formats -- `JSON`, `XML`, `MsgPack`, -`ProtoBuf`. For other formats, `Query`, `Form`, `FormPost`, `FormMultipart`, -can be called by `c.ShouldBind()` multiple times without any damage to -performance (See [#1341](https://github.com/gin-gonic/gin/pull/1341)). - -### http2 server push - -http.Pusher is supported only **go1.8+**. See the [golang blog](https://blog.golang.org/h2push) for detail information. - -```go -package main - -import ( - "html/template" - "log" - - "github.com/gin-gonic/gin" -) - -var html = template.Must(template.New("https").Parse(` - - - Https Test - - - -

Welcome, Ginner!

- - -`)) - -func main() { - r := gin.Default() - r.Static("/assets", "./assets") - r.SetHTMLTemplate(html) - - r.GET("/", func(c *gin.Context) { - if pusher := c.Writer.Pusher(); pusher != nil { - // use pusher.Push() to do server push - if err := pusher.Push("/assets/app.js", nil); err != nil { - log.Printf("Failed to push: %v", err) - } - } - c.HTML(200, "https", gin.H{ - "status": "success", - }) - }) - - // Listen and Server in https://127.0.0.1:8080 - r.RunTLS(":8080", "./testdata/server.pem", "./testdata/server.key") -} -``` - -### Define format for the log of routes - -The default log of routes is: -``` -[GIN-debug] POST /foo --> main.main.func1 (3 handlers) -[GIN-debug] GET /bar --> main.main.func2 (3 handlers) -[GIN-debug] GET /status --> main.main.func3 (3 handlers) -``` - -If you want to log this information in given format (e.g. JSON, key values or something else), then you can define this format with `gin.DebugPrintRouteFunc`. -In the example below, we log all routes with standard log package but you can use another log tools that suits of your needs. -```go -import ( - "log" - "net/http" - - "github.com/gin-gonic/gin" -) - -func main() { - r := gin.Default() - gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { - log.Printf("endpoint %v %v %v %v\n", httpMethod, absolutePath, handlerName, nuHandlers) - } - - r.POST("/foo", func(c *gin.Context) { - c.JSON(http.StatusOK, "foo") - }) - - r.GET("/bar", func(c *gin.Context) { - c.JSON(http.StatusOK, "bar") - }) - - r.GET("/status", func(c *gin.Context) { - c.JSON(http.StatusOK, "ok") - }) - - // Listen and Server in http://0.0.0.0:8080 - r.Run() -} -``` - -### Set and get a cookie - -```go -import ( - "fmt" - - "github.com/gin-gonic/gin" -) - -func main() { - - router := gin.Default() - - router.GET("/cookie", func(c *gin.Context) { - - cookie, err := c.Cookie("gin_cookie") - - if err != nil { - cookie = "NotSet" - c.SetCookie("gin_cookie", "test", 3600, "/", "localhost", false, true) - } - - fmt.Printf("Cookie value: %s \n", cookie) - }) - - router.Run() -} -``` - - -## Testing - -The `net/http/httptest` package is preferable way for HTTP testing. - -```go -package main - -func setupRouter() *gin.Engine { - r := gin.Default() - r.GET("/ping", func(c *gin.Context) { - c.String(200, "pong") - }) - return r -} - -func main() { - r := setupRouter() - r.Run(":8080") -} -``` - -Test for code example above: - -```go -package main - -import ( - "net/http" - "net/http/httptest" - "testing" - - "github.com/stretchr/testify/assert" -) - -func TestPingRoute(t *testing.T) { - router := setupRouter() - - w := httptest.NewRecorder() - req, _ := http.NewRequest("GET", "/ping", nil) - router.ServeHTTP(w, req) - - assert.Equal(t, 200, w.Code) - assert.Equal(t, "pong", w.Body.String()) -} -``` - -## Users - -Awesome project lists using [Gin](https://github.com/gin-gonic/gin) web framework. - -* [gorush](https://github.com/appleboy/gorush): A push notification server written in Go. -* [fnproject](https://github.com/fnproject/fn): The container native, cloud agnostic serverless platform. -* [photoprism](https://github.com/photoprism/photoprism): Personal photo management powered by Go and Google TensorFlow. -* [krakend](https://github.com/devopsfaith/krakend): Ultra performant API Gateway with middlewares. -* [picfit](https://github.com/thoas/picfit): An image resizing server written in Go. diff --git a/vendor/github.com/gin-gonic/gin/auth.go b/vendor/github.com/gin-gonic/gin/auth.go deleted file mode 100644 index 9ed81b5..0000000 --- a/vendor/github.com/gin-gonic/gin/auth.go +++ /dev/null @@ -1,96 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "crypto/subtle" - "encoding/base64" - "net/http" - "strconv" -) - -// AuthUserKey is the cookie name for user credential in basic auth. -const AuthUserKey = "user" - -// Accounts defines a key/value for user/pass list of authorized logins. -type Accounts map[string]string - -type authPair struct { - value string - user string -} - -type authPairs []authPair - -func (a authPairs) searchCredential(authValue string) (string, bool) { - if authValue == "" { - return "", false - } - for _, pair := range a { - if pair.value == authValue { - return pair.user, true - } - } - return "", false -} - -// BasicAuthForRealm returns a Basic HTTP Authorization middleware. It takes as arguments a map[string]string where -// the key is the user name and the value is the password, as well as the name of the Realm. -// If the realm is empty, "Authorization Required" will be used by default. -// (see http://tools.ietf.org/html/rfc2617#section-1.2) -func BasicAuthForRealm(accounts Accounts, realm string) HandlerFunc { - if realm == "" { - realm = "Authorization Required" - } - realm = "Basic realm=" + strconv.Quote(realm) - pairs := processAccounts(accounts) - return func(c *Context) { - // Search user in the slice of allowed credentials - user, found := pairs.searchCredential(c.requestHeader("Authorization")) - if !found { - // Credentials doesn't match, we return 401 and abort handlers chain. - c.Header("WWW-Authenticate", realm) - c.AbortWithStatus(http.StatusUnauthorized) - return - } - - // The user credentials was found, set user's id to key AuthUserKey in this context, the user's id can be read later using - // c.MustGet(gin.AuthUserKey). - c.Set(AuthUserKey, user) - } -} - -// BasicAuth returns a Basic HTTP Authorization middleware. It takes as argument a map[string]string where -// the key is the user name and the value is the password. -func BasicAuth(accounts Accounts) HandlerFunc { - return BasicAuthForRealm(accounts, "") -} - -func processAccounts(accounts Accounts) authPairs { - assert1(len(accounts) > 0, "Empty list of authorized credentials") - pairs := make(authPairs, 0, len(accounts)) - for user, password := range accounts { - assert1(user != "", "User can not be empty") - value := authorizationHeader(user, password) - pairs = append(pairs, authPair{ - value: value, - user: user, - }) - } - return pairs -} - -func authorizationHeader(user, password string) string { - base := user + ":" + password - return "Basic " + base64.StdEncoding.EncodeToString([]byte(base)) -} - -func secureCompare(given, actual string) bool { - if subtle.ConstantTimeEq(int32(len(given)), int32(len(actual))) == 1 { - return subtle.ConstantTimeCompare([]byte(given), []byte(actual)) == 1 - } - // Securely compare actual to itself to keep constant time, but always return false. - return subtle.ConstantTimeCompare([]byte(actual), []byte(actual)) == 1 && false -} diff --git a/vendor/github.com/gin-gonic/gin/binding/binding.go b/vendor/github.com/gin-gonic/gin/binding/binding.go deleted file mode 100644 index 520c510..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/binding.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import "net/http" - -// Content-Type MIME of the most common data formats. -const ( - MIMEJSON = "application/json" - MIMEHTML = "text/html" - MIMEXML = "application/xml" - MIMEXML2 = "text/xml" - MIMEPlain = "text/plain" - MIMEPOSTForm = "application/x-www-form-urlencoded" - MIMEMultipartPOSTForm = "multipart/form-data" - MIMEPROTOBUF = "application/x-protobuf" - MIMEMSGPACK = "application/x-msgpack" - MIMEMSGPACK2 = "application/msgpack" - MIMEYAML = "application/x-yaml" -) - -// Binding describes the interface which needs to be implemented for binding the -// data present in the request such as JSON request body, query parameters or -// the form POST. -type Binding interface { - Name() string - Bind(*http.Request, interface{}) error -} - -// BindingBody adds BindBody method to Binding. BindBody is similar with Bind, -// but it reads the body from supplied bytes instead of req.Body. -type BindingBody interface { - Binding - BindBody([]byte, interface{}) error -} - -// BindingUri adds BindUri method to Binding. BindUri is similar with Bind, -// but it read the Params. -type BindingUri interface { - Name() string - BindUri(map[string][]string, interface{}) error -} - -// StructValidator is the minimal interface which needs to be implemented in -// order for it to be used as the validator engine for ensuring the correctness -// of the request. Gin provides a default implementation for this using -// https://github.com/go-playground/validator/tree/v8.18.2. -type StructValidator interface { - // ValidateStruct can receive any kind of type and it should never panic, even if the configuration is not right. - // If the received type is not a struct, any validation should be skipped and nil must be returned. - // If the received type is a struct or pointer to a struct, the validation should be performed. - // If the struct is not valid or the validation itself fails, a descriptive error should be returned. - // Otherwise nil must be returned. - ValidateStruct(interface{}) error - - // Engine returns the underlying validator engine which powers the - // StructValidator implementation. - Engine() interface{} -} - -// Validator is the default validator which implements the StructValidator -// interface. It uses https://github.com/go-playground/validator/tree/v8.18.2 -// under the hood. -var Validator StructValidator = &defaultValidator{} - -// These implement the Binding interface and can be used to bind the data -// present in the request to struct instances. -var ( - JSON = jsonBinding{} - XML = xmlBinding{} - Form = formBinding{} - Query = queryBinding{} - FormPost = formPostBinding{} - FormMultipart = formMultipartBinding{} - ProtoBuf = protobufBinding{} - MsgPack = msgpackBinding{} - YAML = yamlBinding{} - Uri = uriBinding{} -) - -// Default returns the appropriate Binding instance based on the HTTP method -// and the content type. -func Default(method, contentType string) Binding { - if method == "GET" { - return Form - } - - switch contentType { - case MIMEJSON: - return JSON - case MIMEXML, MIMEXML2: - return XML - case MIMEPROTOBUF: - return ProtoBuf - case MIMEMSGPACK, MIMEMSGPACK2: - return MsgPack - case MIMEYAML: - return YAML - case MIMEMultipartPOSTForm: - return FormMultipart - default: // case MIMEPOSTForm: - return Form - } -} - -func validate(obj interface{}) error { - if Validator == nil { - return nil - } - return Validator.ValidateStruct(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/default_validator.go b/vendor/github.com/gin-gonic/gin/binding/default_validator.go deleted file mode 100644 index e7a302d..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/default_validator.go +++ /dev/null @@ -1,51 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "reflect" - "sync" - - "gopkg.in/go-playground/validator.v8" -) - -type defaultValidator struct { - once sync.Once - validate *validator.Validate -} - -var _ StructValidator = &defaultValidator{} - -// ValidateStruct receives any kind of type, but only performed struct or pointer to struct type. -func (v *defaultValidator) ValidateStruct(obj interface{}) error { - value := reflect.ValueOf(obj) - valueType := value.Kind() - if valueType == reflect.Ptr { - valueType = value.Elem().Kind() - } - if valueType == reflect.Struct { - v.lazyinit() - if err := v.validate.Struct(obj); err != nil { - return err - } - } - return nil -} - -// Engine returns the underlying validator engine which powers the default -// Validator instance. This is useful if you want to register custom validations -// or struct level validations. See validator GoDoc for more info - -// https://godoc.org/gopkg.in/go-playground/validator.v8 -func (v *defaultValidator) Engine() interface{} { - v.lazyinit() - return v.validate -} - -func (v *defaultValidator) lazyinit() { - v.once.Do(func() { - config := &validator.Config{TagName: "binding"} - v.validate = validator.New(config) - }) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/form.go b/vendor/github.com/gin-gonic/gin/binding/form.go deleted file mode 100644 index 0b28aa8..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/form.go +++ /dev/null @@ -1,89 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "mime/multipart" - "net/http" - "reflect" -) - -const defaultMemory = 32 * 1024 * 1024 - -type formBinding struct{} -type formPostBinding struct{} -type formMultipartBinding struct{} - -func (formBinding) Name() string { - return "form" -} - -func (formBinding) Bind(req *http.Request, obj interface{}) error { - if err := req.ParseForm(); err != nil { - return err - } - if err := req.ParseMultipartForm(defaultMemory); err != nil { - if err != http.ErrNotMultipart { - return err - } - } - if err := mapForm(obj, req.Form); err != nil { - return err - } - return validate(obj) -} - -func (formPostBinding) Name() string { - return "form-urlencoded" -} - -func (formPostBinding) Bind(req *http.Request, obj interface{}) error { - if err := req.ParseForm(); err != nil { - return err - } - if err := mapForm(obj, req.PostForm); err != nil { - return err - } - return validate(obj) -} - -func (formMultipartBinding) Name() string { - return "multipart/form-data" -} - -func (formMultipartBinding) Bind(req *http.Request, obj interface{}) error { - if err := req.ParseMultipartForm(defaultMemory); err != nil { - return err - } - if err := mappingByPtr(obj, (*multipartRequest)(req), "form"); err != nil { - return err - } - - return validate(obj) -} - -type multipartRequest http.Request - -var _ setter = (*multipartRequest)(nil) - -var ( - multipartFileHeaderStructType = reflect.TypeOf(multipart.FileHeader{}) -) - -// TrySet tries to set a value by the multipart request with the binding a form file -func (r *multipartRequest) TrySet(value reflect.Value, field reflect.StructField, key string, opt setOptions) (isSetted bool, err error) { - if value.Type() == multipartFileHeaderStructType { - _, file, err := (*http.Request)(r).FormFile(key) - if err != nil { - return false, err - } - if file != nil { - value.Set(reflect.ValueOf(*file)) - return true, nil - } - } - - return setByForm(value, field, r.MultipartForm.Value, key, opt) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/form_mapping.go b/vendor/github.com/gin-gonic/gin/binding/form_mapping.go deleted file mode 100644 index aaacf6c..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/form_mapping.go +++ /dev/null @@ -1,330 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "time" - - "github.com/gin-gonic/gin/internal/json" -) - -var errUnknownType = errors.New("Unknown type") - -func mapUri(ptr interface{}, m map[string][]string) error { - return mapFormByTag(ptr, m, "uri") -} - -func mapForm(ptr interface{}, form map[string][]string) error { - return mapFormByTag(ptr, form, "form") -} - -var emptyField = reflect.StructField{} - -func mapFormByTag(ptr interface{}, form map[string][]string, tag string) error { - return mappingByPtr(ptr, formSource(form), tag) -} - -// setter tries to set value on a walking by fields of a struct -type setter interface { - TrySet(value reflect.Value, field reflect.StructField, key string, opt setOptions) (isSetted bool, err error) -} - -type formSource map[string][]string - -var _ setter = formSource(nil) - -// TrySet tries to set a value by request's form source (like map[string][]string) -func (form formSource) TrySet(value reflect.Value, field reflect.StructField, tagValue string, opt setOptions) (isSetted bool, err error) { - return setByForm(value, field, form, tagValue, opt) -} - -func mappingByPtr(ptr interface{}, setter setter, tag string) error { - _, err := mapping(reflect.ValueOf(ptr), emptyField, setter, tag) - return err -} - -func mapping(value reflect.Value, field reflect.StructField, setter setter, tag string) (bool, error) { - var vKind = value.Kind() - - if vKind == reflect.Ptr { - var isNew bool - vPtr := value - if value.IsNil() { - isNew = true - vPtr = reflect.New(value.Type().Elem()) - } - isSetted, err := mapping(vPtr.Elem(), field, setter, tag) - if err != nil { - return false, err - } - if isNew && isSetted { - value.Set(vPtr) - } - return isSetted, nil - } - - ok, err := tryToSetValue(value, field, setter, tag) - if err != nil { - return false, err - } - if ok { - return true, nil - } - - if vKind == reflect.Struct { - tValue := value.Type() - - var isSetted bool - for i := 0; i < value.NumField(); i++ { - if !value.Field(i).CanSet() { - continue - } - ok, err := mapping(value.Field(i), tValue.Field(i), setter, tag) - if err != nil { - return false, err - } - isSetted = isSetted || ok - } - return isSetted, nil - } - return false, nil -} - -type setOptions struct { - isDefaultExists bool - defaultValue string -} - -func tryToSetValue(value reflect.Value, field reflect.StructField, setter setter, tag string) (bool, error) { - var tagValue string - var setOpt setOptions - - tagValue = field.Tag.Get(tag) - tagValue, opts := head(tagValue, ",") - - if tagValue == "-" { // just ignoring this field - return false, nil - } - if tagValue == "" { // default value is FieldName - tagValue = field.Name - } - if tagValue == "" { // when field is "emptyField" variable - return false, nil - } - - var opt string - for len(opts) > 0 { - opt, opts = head(opts, ",") - - k, v := head(opt, "=") - switch k { - case "default": - setOpt.isDefaultExists = true - setOpt.defaultValue = v - } - } - - return setter.TrySet(value, field, tagValue, setOpt) -} - -func setByForm(value reflect.Value, field reflect.StructField, form map[string][]string, tagValue string, opt setOptions) (isSetted bool, err error) { - vs, ok := form[tagValue] - if !ok && !opt.isDefaultExists { - return false, nil - } - - switch value.Kind() { - case reflect.Slice: - if !ok { - vs = []string{opt.defaultValue} - } - return true, setSlice(vs, value, field) - case reflect.Array: - if !ok { - vs = []string{opt.defaultValue} - } - if len(vs) != value.Len() { - return false, fmt.Errorf("%q is not valid value for %s", vs, value.Type().String()) - } - return true, setArray(vs, value, field) - default: - var val string - if !ok { - val = opt.defaultValue - } - - if len(vs) > 0 { - val = vs[0] - } - return true, setWithProperType(val, value, field) - } -} - -func setWithProperType(val string, value reflect.Value, field reflect.StructField) error { - switch value.Kind() { - case reflect.Int: - return setIntField(val, 0, value) - case reflect.Int8: - return setIntField(val, 8, value) - case reflect.Int16: - return setIntField(val, 16, value) - case reflect.Int32: - return setIntField(val, 32, value) - case reflect.Int64: - switch value.Interface().(type) { - case time.Duration: - return setTimeDuration(val, value, field) - } - return setIntField(val, 64, value) - case reflect.Uint: - return setUintField(val, 0, value) - case reflect.Uint8: - return setUintField(val, 8, value) - case reflect.Uint16: - return setUintField(val, 16, value) - case reflect.Uint32: - return setUintField(val, 32, value) - case reflect.Uint64: - return setUintField(val, 64, value) - case reflect.Bool: - return setBoolField(val, value) - case reflect.Float32: - return setFloatField(val, 32, value) - case reflect.Float64: - return setFloatField(val, 64, value) - case reflect.String: - value.SetString(val) - case reflect.Struct: - switch value.Interface().(type) { - case time.Time: - return setTimeField(val, field, value) - } - return json.Unmarshal([]byte(val), value.Addr().Interface()) - case reflect.Map: - return json.Unmarshal([]byte(val), value.Addr().Interface()) - default: - return errUnknownType - } - return nil -} - -func setIntField(val string, bitSize int, field reflect.Value) error { - if val == "" { - val = "0" - } - intVal, err := strconv.ParseInt(val, 10, bitSize) - if err == nil { - field.SetInt(intVal) - } - return err -} - -func setUintField(val string, bitSize int, field reflect.Value) error { - if val == "" { - val = "0" - } - uintVal, err := strconv.ParseUint(val, 10, bitSize) - if err == nil { - field.SetUint(uintVal) - } - return err -} - -func setBoolField(val string, field reflect.Value) error { - if val == "" { - val = "false" - } - boolVal, err := strconv.ParseBool(val) - if err == nil { - field.SetBool(boolVal) - } - return err -} - -func setFloatField(val string, bitSize int, field reflect.Value) error { - if val == "" { - val = "0.0" - } - floatVal, err := strconv.ParseFloat(val, bitSize) - if err == nil { - field.SetFloat(floatVal) - } - return err -} - -func setTimeField(val string, structField reflect.StructField, value reflect.Value) error { - timeFormat := structField.Tag.Get("time_format") - if timeFormat == "" { - timeFormat = time.RFC3339 - } - - if val == "" { - value.Set(reflect.ValueOf(time.Time{})) - return nil - } - - l := time.Local - if isUTC, _ := strconv.ParseBool(structField.Tag.Get("time_utc")); isUTC { - l = time.UTC - } - - if locTag := structField.Tag.Get("time_location"); locTag != "" { - loc, err := time.LoadLocation(locTag) - if err != nil { - return err - } - l = loc - } - - t, err := time.ParseInLocation(timeFormat, val, l) - if err != nil { - return err - } - - value.Set(reflect.ValueOf(t)) - return nil -} - -func setArray(vals []string, value reflect.Value, field reflect.StructField) error { - for i, s := range vals { - err := setWithProperType(s, value.Index(i), field) - if err != nil { - return err - } - } - return nil -} - -func setSlice(vals []string, value reflect.Value, field reflect.StructField) error { - slice := reflect.MakeSlice(value.Type(), len(vals), len(vals)) - err := setArray(vals, slice, field) - if err != nil { - return err - } - value.Set(slice) - return nil -} - -func setTimeDuration(val string, value reflect.Value, field reflect.StructField) error { - d, err := time.ParseDuration(val) - if err != nil { - return err - } - value.Set(reflect.ValueOf(d)) - return nil -} - -func head(str, sep string) (head string, tail string) { - idx := strings.Index(str, sep) - if idx < 0 { - return str, "" - } - return str[:idx], str[idx+len(sep):] -} diff --git a/vendor/github.com/gin-gonic/gin/binding/json.go b/vendor/github.com/gin-gonic/gin/binding/json.go deleted file mode 100644 index f968161..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/json.go +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "fmt" - "io" - "net/http" - - "github.com/gin-gonic/gin/internal/json" -) - -// EnableDecoderUseNumber is used to call the UseNumber method on the JSON -// Decoder instance. UseNumber causes the Decoder to unmarshal a number into an -// interface{} as a Number instead of as a float64. -var EnableDecoderUseNumber = false - -type jsonBinding struct{} - -func (jsonBinding) Name() string { - return "json" -} - -func (jsonBinding) Bind(req *http.Request, obj interface{}) error { - if req == nil || req.Body == nil { - return fmt.Errorf("invalid request") - } - return decodeJSON(req.Body, obj) -} - -func (jsonBinding) BindBody(body []byte, obj interface{}) error { - return decodeJSON(bytes.NewReader(body), obj) -} - -func decodeJSON(r io.Reader, obj interface{}) error { - decoder := json.NewDecoder(r) - if EnableDecoderUseNumber { - decoder.UseNumber() - } - if err := decoder.Decode(obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/msgpack.go b/vendor/github.com/gin-gonic/gin/binding/msgpack.go deleted file mode 100644 index b7f7319..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/msgpack.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "io" - "net/http" - - "github.com/ugorji/go/codec" -) - -type msgpackBinding struct{} - -func (msgpackBinding) Name() string { - return "msgpack" -} - -func (msgpackBinding) Bind(req *http.Request, obj interface{}) error { - return decodeMsgPack(req.Body, obj) -} - -func (msgpackBinding) BindBody(body []byte, obj interface{}) error { - return decodeMsgPack(bytes.NewReader(body), obj) -} - -func decodeMsgPack(r io.Reader, obj interface{}) error { - cdc := new(codec.MsgpackHandle) - if err := codec.NewDecoder(r, cdc).Decode(&obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/protobuf.go b/vendor/github.com/gin-gonic/gin/binding/protobuf.go deleted file mode 100644 index f9ece92..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/protobuf.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "io/ioutil" - "net/http" - - "github.com/golang/protobuf/proto" -) - -type protobufBinding struct{} - -func (protobufBinding) Name() string { - return "protobuf" -} - -func (b protobufBinding) Bind(req *http.Request, obj interface{}) error { - buf, err := ioutil.ReadAll(req.Body) - if err != nil { - return err - } - return b.BindBody(buf, obj) -} - -func (protobufBinding) BindBody(body []byte, obj interface{}) error { - if err := proto.Unmarshal(body, obj.(proto.Message)); err != nil { - return err - } - // Here it's same to return validate(obj), but util now we can't add - // `binding:""` to the struct which automatically generate by gen-proto - return nil - // return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/query.go b/vendor/github.com/gin-gonic/gin/binding/query.go deleted file mode 100644 index 219743f..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/query.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import "net/http" - -type queryBinding struct{} - -func (queryBinding) Name() string { - return "query" -} - -func (queryBinding) Bind(req *http.Request, obj interface{}) error { - values := req.URL.Query() - if err := mapForm(obj, values); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/uri.go b/vendor/github.com/gin-gonic/gin/binding/uri.go deleted file mode 100644 index f91ec38..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/uri.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -type uriBinding struct{} - -func (uriBinding) Name() string { - return "uri" -} - -func (uriBinding) BindUri(m map[string][]string, obj interface{}) error { - if err := mapUri(obj, m); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/xml.go b/vendor/github.com/gin-gonic/gin/binding/xml.go deleted file mode 100644 index 4e90114..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/xml.go +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "encoding/xml" - "io" - "net/http" -) - -type xmlBinding struct{} - -func (xmlBinding) Name() string { - return "xml" -} - -func (xmlBinding) Bind(req *http.Request, obj interface{}) error { - return decodeXML(req.Body, obj) -} - -func (xmlBinding) BindBody(body []byte, obj interface{}) error { - return decodeXML(bytes.NewReader(body), obj) -} -func decodeXML(r io.Reader, obj interface{}) error { - decoder := xml.NewDecoder(r) - if err := decoder.Decode(obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/binding/yaml.go b/vendor/github.com/gin-gonic/gin/binding/yaml.go deleted file mode 100644 index a2d36d6..0000000 --- a/vendor/github.com/gin-gonic/gin/binding/yaml.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package binding - -import ( - "bytes" - "io" - "net/http" - - "gopkg.in/yaml.v2" -) - -type yamlBinding struct{} - -func (yamlBinding) Name() string { - return "yaml" -} - -func (yamlBinding) Bind(req *http.Request, obj interface{}) error { - return decodeYAML(req.Body, obj) -} - -func (yamlBinding) BindBody(body []byte, obj interface{}) error { - return decodeYAML(bytes.NewReader(body), obj) -} - -func decodeYAML(r io.Reader, obj interface{}) error { - decoder := yaml.NewDecoder(r) - if err := decoder.Decode(obj); err != nil { - return err - } - return validate(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/codecov.yml b/vendor/github.com/gin-gonic/gin/codecov.yml deleted file mode 100644 index c9c9a52..0000000 --- a/vendor/github.com/gin-gonic/gin/codecov.yml +++ /dev/null @@ -1,5 +0,0 @@ -coverage: - notify: - gitter: - default: - url: https://webhooks.gitter.im/e/d90dcdeeab2f1e357165 diff --git a/vendor/github.com/gin-gonic/gin/context.go b/vendor/github.com/gin-gonic/gin/context.go deleted file mode 100644 index af747a1..0000000 --- a/vendor/github.com/gin-gonic/gin/context.go +++ /dev/null @@ -1,1023 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "errors" - "fmt" - "io" - "io/ioutil" - "math" - "mime/multipart" - "net" - "net/http" - "net/url" - "os" - "strings" - "time" - - "github.com/gin-contrib/sse" - "github.com/gin-gonic/gin/binding" - "github.com/gin-gonic/gin/render" -) - -// Content-Type MIME of the most common data formats. -const ( - MIMEJSON = binding.MIMEJSON - MIMEHTML = binding.MIMEHTML - MIMEXML = binding.MIMEXML - MIMEXML2 = binding.MIMEXML2 - MIMEPlain = binding.MIMEPlain - MIMEPOSTForm = binding.MIMEPOSTForm - MIMEMultipartPOSTForm = binding.MIMEMultipartPOSTForm - MIMEYAML = binding.MIMEYAML - BodyBytesKey = "_gin-gonic/gin/bodybyteskey" -) - -const abortIndex int8 = math.MaxInt8 / 2 - -// Context is the most important part of gin. It allows us to pass variables between middleware, -// manage the flow, validate the JSON of a request and render a JSON response for example. -type Context struct { - writermem responseWriter - Request *http.Request - Writer ResponseWriter - - Params Params - handlers HandlersChain - index int8 - - engine *Engine - - // Keys is a key/value pair exclusively for the context of each request. - Keys map[string]interface{} - - // Errors is a list of errors attached to all the handlers/middlewares who used this context. - Errors errorMsgs - - // Accepted defines a list of manually accepted formats for content negotiation. - Accepted []string -} - -/************************************/ -/********** CONTEXT CREATION ********/ -/************************************/ - -func (c *Context) reset() { - c.Writer = &c.writermem - c.Params = c.Params[0:0] - c.handlers = nil - c.index = -1 - c.Keys = nil - c.Errors = c.Errors[0:0] - c.Accepted = nil -} - -// Copy returns a copy of the current context that can be safely used outside the request's scope. -// This has to be used when the context has to be passed to a goroutine. -func (c *Context) Copy() *Context { - var cp = *c - cp.writermem.ResponseWriter = nil - cp.Writer = &cp.writermem - cp.index = abortIndex - cp.handlers = nil - cp.Keys = map[string]interface{}{} - for k, v := range c.Keys { - cp.Keys[k] = v - } - return &cp -} - -// HandlerName returns the main handler's name. For example if the handler is "handleGetUsers()", -// this function will return "main.handleGetUsers". -func (c *Context) HandlerName() string { - return nameOfFunction(c.handlers.Last()) -} - -// HandlerNames returns a list of all registered handlers for this context in descending order, -// following the semantics of HandlerName() -func (c *Context) HandlerNames() []string { - hn := make([]string, 0, len(c.handlers)) - for _, val := range c.handlers { - hn = append(hn, nameOfFunction(val)) - } - return hn -} - -// Handler returns the main handler. -func (c *Context) Handler() HandlerFunc { - return c.handlers.Last() -} - -/************************************/ -/*********** FLOW CONTROL ***********/ -/************************************/ - -// Next should be used only inside middleware. -// It executes the pending handlers in the chain inside the calling handler. -// See example in GitHub. -func (c *Context) Next() { - c.index++ - for c.index < int8(len(c.handlers)) { - c.handlers[c.index](c) - c.index++ - } -} - -// IsAborted returns true if the current context was aborted. -func (c *Context) IsAborted() bool { - return c.index >= abortIndex -} - -// Abort prevents pending handlers from being called. Note that this will not stop the current handler. -// Let's say you have an authorization middleware that validates that the current request is authorized. -// If the authorization fails (ex: the password does not match), call Abort to ensure the remaining handlers -// for this request are not called. -func (c *Context) Abort() { - c.index = abortIndex -} - -// AbortWithStatus calls `Abort()` and writes the headers with the specified status code. -// For example, a failed attempt to authenticate a request could use: context.AbortWithStatus(401). -func (c *Context) AbortWithStatus(code int) { - c.Status(code) - c.Writer.WriteHeaderNow() - c.Abort() -} - -// AbortWithStatusJSON calls `Abort()` and then `JSON` internally. -// This method stops the chain, writes the status code and return a JSON body. -// It also sets the Content-Type as "application/json". -func (c *Context) AbortWithStatusJSON(code int, jsonObj interface{}) { - c.Abort() - c.JSON(code, jsonObj) -} - -// AbortWithError calls `AbortWithStatus()` and `Error()` internally. -// This method stops the chain, writes the status code and pushes the specified error to `c.Errors`. -// See Context.Error() for more details. -func (c *Context) AbortWithError(code int, err error) *Error { - c.AbortWithStatus(code) - return c.Error(err) -} - -/************************************/ -/********* ERROR MANAGEMENT *********/ -/************************************/ - -// Error attaches an error to the current context. The error is pushed to a list of errors. -// It's a good idea to call Error for each error that occurred during the resolution of a request. -// A middleware can be used to collect all the errors and push them to a database together, -// print a log, or append it in the HTTP response. -// Error will panic if err is nil. -func (c *Context) Error(err error) *Error { - if err == nil { - panic("err is nil") - } - - parsedError, ok := err.(*Error) - if !ok { - parsedError = &Error{ - Err: err, - Type: ErrorTypePrivate, - } - } - - c.Errors = append(c.Errors, parsedError) - return parsedError -} - -/************************************/ -/******** METADATA MANAGEMENT********/ -/************************************/ - -// Set is used to store a new key/value pair exclusively for this context. -// It also lazy initializes c.Keys if it was not used previously. -func (c *Context) Set(key string, value interface{}) { - if c.Keys == nil { - c.Keys = make(map[string]interface{}) - } - c.Keys[key] = value -} - -// Get returns the value for the given key, ie: (value, true). -// If the value does not exists it returns (nil, false) -func (c *Context) Get(key string) (value interface{}, exists bool) { - value, exists = c.Keys[key] - return -} - -// MustGet returns the value for the given key if it exists, otherwise it panics. -func (c *Context) MustGet(key string) interface{} { - if value, exists := c.Get(key); exists { - return value - } - panic("Key \"" + key + "\" does not exist") -} - -// GetString returns the value associated with the key as a string. -func (c *Context) GetString(key string) (s string) { - if val, ok := c.Get(key); ok && val != nil { - s, _ = val.(string) - } - return -} - -// GetBool returns the value associated with the key as a boolean. -func (c *Context) GetBool(key string) (b bool) { - if val, ok := c.Get(key); ok && val != nil { - b, _ = val.(bool) - } - return -} - -// GetInt returns the value associated with the key as an integer. -func (c *Context) GetInt(key string) (i int) { - if val, ok := c.Get(key); ok && val != nil { - i, _ = val.(int) - } - return -} - -// GetInt64 returns the value associated with the key as an integer. -func (c *Context) GetInt64(key string) (i64 int64) { - if val, ok := c.Get(key); ok && val != nil { - i64, _ = val.(int64) - } - return -} - -// GetFloat64 returns the value associated with the key as a float64. -func (c *Context) GetFloat64(key string) (f64 float64) { - if val, ok := c.Get(key); ok && val != nil { - f64, _ = val.(float64) - } - return -} - -// GetTime returns the value associated with the key as time. -func (c *Context) GetTime(key string) (t time.Time) { - if val, ok := c.Get(key); ok && val != nil { - t, _ = val.(time.Time) - } - return -} - -// GetDuration returns the value associated with the key as a duration. -func (c *Context) GetDuration(key string) (d time.Duration) { - if val, ok := c.Get(key); ok && val != nil { - d, _ = val.(time.Duration) - } - return -} - -// GetStringSlice returns the value associated with the key as a slice of strings. -func (c *Context) GetStringSlice(key string) (ss []string) { - if val, ok := c.Get(key); ok && val != nil { - ss, _ = val.([]string) - } - return -} - -// GetStringMap returns the value associated with the key as a map of interfaces. -func (c *Context) GetStringMap(key string) (sm map[string]interface{}) { - if val, ok := c.Get(key); ok && val != nil { - sm, _ = val.(map[string]interface{}) - } - return -} - -// GetStringMapString returns the value associated with the key as a map of strings. -func (c *Context) GetStringMapString(key string) (sms map[string]string) { - if val, ok := c.Get(key); ok && val != nil { - sms, _ = val.(map[string]string) - } - return -} - -// GetStringMapStringSlice returns the value associated with the key as a map to a slice of strings. -func (c *Context) GetStringMapStringSlice(key string) (smss map[string][]string) { - if val, ok := c.Get(key); ok && val != nil { - smss, _ = val.(map[string][]string) - } - return -} - -/************************************/ -/************ INPUT DATA ************/ -/************************************/ - -// Param returns the value of the URL param. -// It is a shortcut for c.Params.ByName(key) -// router.GET("/user/:id", func(c *gin.Context) { -// // a GET request to /user/john -// id := c.Param("id") // id == "john" -// }) -func (c *Context) Param(key string) string { - return c.Params.ByName(key) -} - -// Query returns the keyed url query value if it exists, -// otherwise it returns an empty string `("")`. -// It is shortcut for `c.Request.URL.Query().Get(key)` -// GET /path?id=1234&name=Manu&value= -// c.Query("id") == "1234" -// c.Query("name") == "Manu" -// c.Query("value") == "" -// c.Query("wtf") == "" -func (c *Context) Query(key string) string { - value, _ := c.GetQuery(key) - return value -} - -// DefaultQuery returns the keyed url query value if it exists, -// otherwise it returns the specified defaultValue string. -// See: Query() and GetQuery() for further information. -// GET /?name=Manu&lastname= -// c.DefaultQuery("name", "unknown") == "Manu" -// c.DefaultQuery("id", "none") == "none" -// c.DefaultQuery("lastname", "none") == "" -func (c *Context) DefaultQuery(key, defaultValue string) string { - if value, ok := c.GetQuery(key); ok { - return value - } - return defaultValue -} - -// GetQuery is like Query(), it returns the keyed url query value -// if it exists `(value, true)` (even when the value is an empty string), -// otherwise it returns `("", false)`. -// It is shortcut for `c.Request.URL.Query().Get(key)` -// GET /?name=Manu&lastname= -// ("Manu", true) == c.GetQuery("name") -// ("", false) == c.GetQuery("id") -// ("", true) == c.GetQuery("lastname") -func (c *Context) GetQuery(key string) (string, bool) { - if values, ok := c.GetQueryArray(key); ok { - return values[0], ok - } - return "", false -} - -// QueryArray returns a slice of strings for a given query key. -// The length of the slice depends on the number of params with the given key. -func (c *Context) QueryArray(key string) []string { - values, _ := c.GetQueryArray(key) - return values -} - -// GetQueryArray returns a slice of strings for a given query key, plus -// a boolean value whether at least one value exists for the given key. -func (c *Context) GetQueryArray(key string) ([]string, bool) { - if values, ok := c.Request.URL.Query()[key]; ok && len(values) > 0 { - return values, true - } - return []string{}, false -} - -// QueryMap returns a map for a given query key. -func (c *Context) QueryMap(key string) map[string]string { - dicts, _ := c.GetQueryMap(key) - return dicts -} - -// GetQueryMap returns a map for a given query key, plus a boolean value -// whether at least one value exists for the given key. -func (c *Context) GetQueryMap(key string) (map[string]string, bool) { - return c.get(c.Request.URL.Query(), key) -} - -// PostForm returns the specified key from a POST urlencoded form or multipart form -// when it exists, otherwise it returns an empty string `("")`. -func (c *Context) PostForm(key string) string { - value, _ := c.GetPostForm(key) - return value -} - -// DefaultPostForm returns the specified key from a POST urlencoded form or multipart form -// when it exists, otherwise it returns the specified defaultValue string. -// See: PostForm() and GetPostForm() for further information. -func (c *Context) DefaultPostForm(key, defaultValue string) string { - if value, ok := c.GetPostForm(key); ok { - return value - } - return defaultValue -} - -// GetPostForm is like PostForm(key). It returns the specified key from a POST urlencoded -// form or multipart form when it exists `(value, true)` (even when the value is an empty string), -// otherwise it returns ("", false). -// For example, during a PATCH request to update the user's email: -// email=mail@example.com --> ("mail@example.com", true) := GetPostForm("email") // set email to "mail@example.com" -// email= --> ("", true) := GetPostForm("email") // set email to "" -// --> ("", false) := GetPostForm("email") // do nothing with email -func (c *Context) GetPostForm(key string) (string, bool) { - if values, ok := c.GetPostFormArray(key); ok { - return values[0], ok - } - return "", false -} - -// PostFormArray returns a slice of strings for a given form key. -// The length of the slice depends on the number of params with the given key. -func (c *Context) PostFormArray(key string) []string { - values, _ := c.GetPostFormArray(key) - return values -} - -// GetPostFormArray returns a slice of strings for a given form key, plus -// a boolean value whether at least one value exists for the given key. -func (c *Context) GetPostFormArray(key string) ([]string, bool) { - req := c.Request - if err := req.ParseMultipartForm(c.engine.MaxMultipartMemory); err != nil { - if err != http.ErrNotMultipart { - debugPrint("error on parse multipart form array: %v", err) - } - } - if values := req.PostForm[key]; len(values) > 0 { - return values, true - } - return []string{}, false -} - -// PostFormMap returns a map for a given form key. -func (c *Context) PostFormMap(key string) map[string]string { - dicts, _ := c.GetPostFormMap(key) - return dicts -} - -// GetPostFormMap returns a map for a given form key, plus a boolean value -// whether at least one value exists for the given key. -func (c *Context) GetPostFormMap(key string) (map[string]string, bool) { - req := c.Request - if err := req.ParseMultipartForm(c.engine.MaxMultipartMemory); err != nil { - if err != http.ErrNotMultipart { - debugPrint("error on parse multipart form map: %v", err) - } - } - return c.get(req.PostForm, key) -} - -// get is an internal method and returns a map which satisfy conditions. -func (c *Context) get(m map[string][]string, key string) (map[string]string, bool) { - dicts := make(map[string]string) - exist := false - for k, v := range m { - if i := strings.IndexByte(k, '['); i >= 1 && k[0:i] == key { - if j := strings.IndexByte(k[i+1:], ']'); j >= 1 { - exist = true - dicts[k[i+1:][:j]] = v[0] - } - } - } - return dicts, exist -} - -// FormFile returns the first file for the provided form key. -func (c *Context) FormFile(name string) (*multipart.FileHeader, error) { - if c.Request.MultipartForm == nil { - if err := c.Request.ParseMultipartForm(c.engine.MaxMultipartMemory); err != nil { - return nil, err - } - } - _, fh, err := c.Request.FormFile(name) - return fh, err -} - -// MultipartForm is the parsed multipart form, including file uploads. -func (c *Context) MultipartForm() (*multipart.Form, error) { - err := c.Request.ParseMultipartForm(c.engine.MaxMultipartMemory) - return c.Request.MultipartForm, err -} - -// SaveUploadedFile uploads the form file to specific dst. -func (c *Context) SaveUploadedFile(file *multipart.FileHeader, dst string) error { - src, err := file.Open() - if err != nil { - return err - } - defer src.Close() - - out, err := os.Create(dst) - if err != nil { - return err - } - defer out.Close() - - _, err = io.Copy(out, src) - return err -} - -// Bind checks the Content-Type to select a binding engine automatically, -// Depending the "Content-Type" header different bindings are used: -// "application/json" --> JSON binding -// "application/xml" --> XML binding -// otherwise --> returns an error. -// It parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input. -// It decodes the json payload into the struct specified as a pointer. -// It writes a 400 error and sets Content-Type header "text/plain" in the response if input is not valid. -func (c *Context) Bind(obj interface{}) error { - b := binding.Default(c.Request.Method, c.ContentType()) - return c.MustBindWith(obj, b) -} - -// BindJSON is a shortcut for c.MustBindWith(obj, binding.JSON). -func (c *Context) BindJSON(obj interface{}) error { - return c.MustBindWith(obj, binding.JSON) -} - -// BindXML is a shortcut for c.MustBindWith(obj, binding.BindXML). -func (c *Context) BindXML(obj interface{}) error { - return c.MustBindWith(obj, binding.XML) -} - -// BindQuery is a shortcut for c.MustBindWith(obj, binding.Query). -func (c *Context) BindQuery(obj interface{}) error { - return c.MustBindWith(obj, binding.Query) -} - -// BindYAML is a shortcut for c.MustBindWith(obj, binding.YAML). -func (c *Context) BindYAML(obj interface{}) error { - return c.MustBindWith(obj, binding.YAML) -} - -// BindUri binds the passed struct pointer using binding.Uri. -// It will abort the request with HTTP 400 if any error occurs. -func (c *Context) BindUri(obj interface{}) error { - if err := c.ShouldBindUri(obj); err != nil { - c.AbortWithError(http.StatusBadRequest, err).SetType(ErrorTypeBind) // nolint: errcheck - return err - } - return nil -} - -// MustBindWith binds the passed struct pointer using the specified binding engine. -// It will abort the request with HTTP 400 if any error occurs. -// See the binding package. -func (c *Context) MustBindWith(obj interface{}, b binding.Binding) error { - if err := c.ShouldBindWith(obj, b); err != nil { - c.AbortWithError(http.StatusBadRequest, err).SetType(ErrorTypeBind) // nolint: errcheck - return err - } - return nil -} - -// ShouldBind checks the Content-Type to select a binding engine automatically, -// Depending the "Content-Type" header different bindings are used: -// "application/json" --> JSON binding -// "application/xml" --> XML binding -// otherwise --> returns an error -// It parses the request's body as JSON if Content-Type == "application/json" using JSON or XML as a JSON input. -// It decodes the json payload into the struct specified as a pointer. -// Like c.Bind() but this method does not set the response status code to 400 and abort if the json is not valid. -func (c *Context) ShouldBind(obj interface{}) error { - b := binding.Default(c.Request.Method, c.ContentType()) - return c.ShouldBindWith(obj, b) -} - -// ShouldBindJSON is a shortcut for c.ShouldBindWith(obj, binding.JSON). -func (c *Context) ShouldBindJSON(obj interface{}) error { - return c.ShouldBindWith(obj, binding.JSON) -} - -// ShouldBindXML is a shortcut for c.ShouldBindWith(obj, binding.XML). -func (c *Context) ShouldBindXML(obj interface{}) error { - return c.ShouldBindWith(obj, binding.XML) -} - -// ShouldBindQuery is a shortcut for c.ShouldBindWith(obj, binding.Query). -func (c *Context) ShouldBindQuery(obj interface{}) error { - return c.ShouldBindWith(obj, binding.Query) -} - -// ShouldBindYAML is a shortcut for c.ShouldBindWith(obj, binding.YAML). -func (c *Context) ShouldBindYAML(obj interface{}) error { - return c.ShouldBindWith(obj, binding.YAML) -} - -// ShouldBindUri binds the passed struct pointer using the specified binding engine. -func (c *Context) ShouldBindUri(obj interface{}) error { - m := make(map[string][]string) - for _, v := range c.Params { - m[v.Key] = []string{v.Value} - } - return binding.Uri.BindUri(m, obj) -} - -// ShouldBindWith binds the passed struct pointer using the specified binding engine. -// See the binding package. -func (c *Context) ShouldBindWith(obj interface{}, b binding.Binding) error { - return b.Bind(c.Request, obj) -} - -// ShouldBindBodyWith is similar with ShouldBindWith, but it stores the request -// body into the context, and reuse when it is called again. -// -// NOTE: This method reads the body before binding. So you should use -// ShouldBindWith for better performance if you need to call only once. -func (c *Context) ShouldBindBodyWith(obj interface{}, bb binding.BindingBody) (err error) { - var body []byte - if cb, ok := c.Get(BodyBytesKey); ok { - if cbb, ok := cb.([]byte); ok { - body = cbb - } - } - if body == nil { - body, err = ioutil.ReadAll(c.Request.Body) - if err != nil { - return err - } - c.Set(BodyBytesKey, body) - } - return bb.BindBody(body, obj) -} - -// ClientIP implements a best effort algorithm to return the real client IP, it parses -// X-Real-IP and X-Forwarded-For in order to work properly with reverse-proxies such us: nginx or haproxy. -// Use X-Forwarded-For before X-Real-Ip as nginx uses X-Real-Ip with the proxy's IP. -func (c *Context) ClientIP() string { - if c.engine.ForwardedByClientIP { - clientIP := c.requestHeader("X-Forwarded-For") - clientIP = strings.TrimSpace(strings.Split(clientIP, ",")[0]) - if clientIP == "" { - clientIP = strings.TrimSpace(c.requestHeader("X-Real-Ip")) - } - if clientIP != "" { - return clientIP - } - } - - if c.engine.AppEngine { - if addr := c.requestHeader("X-Appengine-Remote-Addr"); addr != "" { - return addr - } - } - - if ip, _, err := net.SplitHostPort(strings.TrimSpace(c.Request.RemoteAddr)); err == nil { - return ip - } - - return "" -} - -// ContentType returns the Content-Type header of the request. -func (c *Context) ContentType() string { - return filterFlags(c.requestHeader("Content-Type")) -} - -// IsWebsocket returns true if the request headers indicate that a websocket -// handshake is being initiated by the client. -func (c *Context) IsWebsocket() bool { - if strings.Contains(strings.ToLower(c.requestHeader("Connection")), "upgrade") && - strings.ToLower(c.requestHeader("Upgrade")) == "websocket" { - return true - } - return false -} - -func (c *Context) requestHeader(key string) string { - return c.Request.Header.Get(key) -} - -/************************************/ -/******** RESPONSE RENDERING ********/ -/************************************/ - -// bodyAllowedForStatus is a copy of http.bodyAllowedForStatus non-exported function. -func bodyAllowedForStatus(status int) bool { - switch { - case status >= 100 && status <= 199: - return false - case status == http.StatusNoContent: - return false - case status == http.StatusNotModified: - return false - } - return true -} - -// Status sets the HTTP response code. -func (c *Context) Status(code int) { - c.writermem.WriteHeader(code) -} - -// Header is a intelligent shortcut for c.Writer.Header().Set(key, value). -// It writes a header in the response. -// If value == "", this method removes the header `c.Writer.Header().Del(key)` -func (c *Context) Header(key, value string) { - if value == "" { - c.Writer.Header().Del(key) - return - } - c.Writer.Header().Set(key, value) -} - -// GetHeader returns value from request headers. -func (c *Context) GetHeader(key string) string { - return c.requestHeader(key) -} - -// GetRawData return stream data. -func (c *Context) GetRawData() ([]byte, error) { - return ioutil.ReadAll(c.Request.Body) -} - -// SetCookie adds a Set-Cookie header to the ResponseWriter's headers. -// The provided cookie must have a valid Name. Invalid cookies may be -// silently dropped. -func (c *Context) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool) { - if path == "" { - path = "/" - } - http.SetCookie(c.Writer, &http.Cookie{ - Name: name, - Value: url.QueryEscape(value), - MaxAge: maxAge, - Path: path, - Domain: domain, - Secure: secure, - HttpOnly: httpOnly, - }) -} - -// Cookie returns the named cookie provided in the request or -// ErrNoCookie if not found. And return the named cookie is unescaped. -// If multiple cookies match the given name, only one cookie will -// be returned. -func (c *Context) Cookie(name string) (string, error) { - cookie, err := c.Request.Cookie(name) - if err != nil { - return "", err - } - val, _ := url.QueryUnescape(cookie.Value) - return val, nil -} - -// Render writes the response headers and calls render.Render to render data. -func (c *Context) Render(code int, r render.Render) { - c.Status(code) - - if !bodyAllowedForStatus(code) { - r.WriteContentType(c.Writer) - c.Writer.WriteHeaderNow() - return - } - - if err := r.Render(c.Writer); err != nil { - panic(err) - } -} - -// HTML renders the HTTP template specified by its file name. -// It also updates the HTTP code and sets the Content-Type as "text/html". -// See http://golang.org/doc/articles/wiki/ -func (c *Context) HTML(code int, name string, obj interface{}) { - instance := c.engine.HTMLRender.Instance(name, obj) - c.Render(code, instance) -} - -// IndentedJSON serializes the given struct as pretty JSON (indented + endlines) into the response body. -// It also sets the Content-Type as "application/json". -// WARNING: we recommend to use this only for development purposes since printing pretty JSON is -// more CPU and bandwidth consuming. Use Context.JSON() instead. -func (c *Context) IndentedJSON(code int, obj interface{}) { - c.Render(code, render.IndentedJSON{Data: obj}) -} - -// SecureJSON serializes the given struct as Secure JSON into the response body. -// Default prepends "while(1)," to response body if the given struct is array values. -// It also sets the Content-Type as "application/json". -func (c *Context) SecureJSON(code int, obj interface{}) { - c.Render(code, render.SecureJSON{Prefix: c.engine.secureJsonPrefix, Data: obj}) -} - -// JSONP serializes the given struct as JSON into the response body. -// It add padding to response body to request data from a server residing in a different domain than the client. -// It also sets the Content-Type as "application/javascript". -func (c *Context) JSONP(code int, obj interface{}) { - callback := c.DefaultQuery("callback", "") - if callback == "" { - c.Render(code, render.JSON{Data: obj}) - return - } - c.Render(code, render.JsonpJSON{Callback: callback, Data: obj}) -} - -// JSON serializes the given struct as JSON into the response body. -// It also sets the Content-Type as "application/json". -func (c *Context) JSON(code int, obj interface{}) { - c.Render(code, render.JSON{Data: obj}) -} - -// AsciiJSON serializes the given struct as JSON into the response body with unicode to ASCII string. -// It also sets the Content-Type as "application/json". -func (c *Context) AsciiJSON(code int, obj interface{}) { - c.Render(code, render.AsciiJSON{Data: obj}) -} - -// PureJSON serializes the given struct as JSON into the response body. -// PureJSON, unlike JSON, does not replace special html characters with their unicode entities. -func (c *Context) PureJSON(code int, obj interface{}) { - c.Render(code, render.PureJSON{Data: obj}) -} - -// XML serializes the given struct as XML into the response body. -// It also sets the Content-Type as "application/xml". -func (c *Context) XML(code int, obj interface{}) { - c.Render(code, render.XML{Data: obj}) -} - -// YAML serializes the given struct as YAML into the response body. -func (c *Context) YAML(code int, obj interface{}) { - c.Render(code, render.YAML{Data: obj}) -} - -// ProtoBuf serializes the given struct as ProtoBuf into the response body. -func (c *Context) ProtoBuf(code int, obj interface{}) { - c.Render(code, render.ProtoBuf{Data: obj}) -} - -// String writes the given string into the response body. -func (c *Context) String(code int, format string, values ...interface{}) { - c.Render(code, render.String{Format: format, Data: values}) -} - -// Redirect returns a HTTP redirect to the specific location. -func (c *Context) Redirect(code int, location string) { - c.Render(-1, render.Redirect{ - Code: code, - Location: location, - Request: c.Request, - }) -} - -// Data writes some data into the body stream and updates the HTTP code. -func (c *Context) Data(code int, contentType string, data []byte) { - c.Render(code, render.Data{ - ContentType: contentType, - Data: data, - }) -} - -// DataFromReader writes the specified reader into the body stream and updates the HTTP code. -func (c *Context) DataFromReader(code int, contentLength int64, contentType string, reader io.Reader, extraHeaders map[string]string) { - c.Render(code, render.Reader{ - Headers: extraHeaders, - ContentType: contentType, - ContentLength: contentLength, - Reader: reader, - }) -} - -// File writes the specified file into the body stream in a efficient way. -func (c *Context) File(filepath string) { - http.ServeFile(c.Writer, c.Request, filepath) -} - -// FileAttachment writes the specified file into the body stream in an efficient way -// On the client side, the file will typically be downloaded with the given filename -func (c *Context) FileAttachment(filepath, filename string) { - c.Writer.Header().Set("content-disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename)) - http.ServeFile(c.Writer, c.Request, filepath) -} - -// SSEvent writes a Server-Sent Event into the body stream. -func (c *Context) SSEvent(name string, message interface{}) { - c.Render(-1, sse.Event{ - Event: name, - Data: message, - }) -} - -// Stream sends a streaming response and returns a boolean -// indicates "Is client disconnected in middle of stream" -func (c *Context) Stream(step func(w io.Writer) bool) bool { - w := c.Writer - clientGone := w.CloseNotify() - for { - select { - case <-clientGone: - return true - default: - keepOpen := step(w) - w.Flush() - if !keepOpen { - return false - } - } - } -} - -/************************************/ -/******** CONTENT NEGOTIATION *******/ -/************************************/ - -// Negotiate contains all negotiations data. -type Negotiate struct { - Offered []string - HTMLName string - HTMLData interface{} - JSONData interface{} - XMLData interface{} - Data interface{} -} - -// Negotiate calls different Render according acceptable Accept format. -func (c *Context) Negotiate(code int, config Negotiate) { - switch c.NegotiateFormat(config.Offered...) { - case binding.MIMEJSON: - data := chooseData(config.JSONData, config.Data) - c.JSON(code, data) - - case binding.MIMEHTML: - data := chooseData(config.HTMLData, config.Data) - c.HTML(code, config.HTMLName, data) - - case binding.MIMEXML: - data := chooseData(config.XMLData, config.Data) - c.XML(code, data) - - default: - c.AbortWithError(http.StatusNotAcceptable, errors.New("the accepted formats are not offered by the server")) // nolint: errcheck - } -} - -// NegotiateFormat returns an acceptable Accept format. -func (c *Context) NegotiateFormat(offered ...string) string { - assert1(len(offered) > 0, "you must provide at least one offer") - - if c.Accepted == nil { - c.Accepted = parseAccept(c.requestHeader("Accept")) - } - if len(c.Accepted) == 0 { - return offered[0] - } - for _, accepted := range c.Accepted { - for _, offert := range offered { - // According to RFC 2616 and RFC 2396, non-ASCII characters are not allowed in headers, - // therefore we can just iterate over the string without casting it into []rune - i := 0 - for ; i < len(accepted); i++ { - if accepted[i] == '*' || offert[i] == '*' { - return offert - } - if accepted[i] != offert[i] { - break - } - } - if i == len(accepted) { - return offert - } - } - } - return "" -} - -// SetAccepted sets Accept header data. -func (c *Context) SetAccepted(formats ...string) { - c.Accepted = formats -} - -/************************************/ -/***** GOLANG.ORG/X/NET/CONTEXT *****/ -/************************************/ - -// Deadline returns the time when work done on behalf of this context -// should be canceled. Deadline returns ok==false when no deadline is -// set. Successive calls to Deadline return the same results. -func (c *Context) Deadline() (deadline time.Time, ok bool) { - return -} - -// Done returns a channel that's closed when work done on behalf of this -// context should be canceled. Done may return nil if this context can -// never be canceled. Successive calls to Done return the same value. -func (c *Context) Done() <-chan struct{} { - return nil -} - -// Err returns a non-nil error value after Done is closed, -// successive calls to Err return the same error. -// If Done is not yet closed, Err returns nil. -// If Done is closed, Err returns a non-nil error explaining why: -// Canceled if the context was canceled -// or DeadlineExceeded if the context's deadline passed. -func (c *Context) Err() error { - return nil -} - -// Value returns the value associated with this context for key, or nil -// if no value is associated with key. Successive calls to Value with -// the same key returns the same result. -func (c *Context) Value(key interface{}) interface{} { - if key == 0 { - return c.Request - } - if keyAsString, ok := key.(string); ok { - val, _ := c.Get(keyAsString) - return val - } - return nil -} diff --git a/vendor/github.com/gin-gonic/gin/context_appengine.go b/vendor/github.com/gin-gonic/gin/context_appengine.go deleted file mode 100644 index 38c189a..0000000 --- a/vendor/github.com/gin-gonic/gin/context_appengine.go +++ /dev/null @@ -1,11 +0,0 @@ -// +build appengine - -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -func init() { - defaultAppEngine = true -} diff --git a/vendor/github.com/gin-gonic/gin/debug.go b/vendor/github.com/gin-gonic/gin/debug.go deleted file mode 100644 index 6d40a5d..0000000 --- a/vendor/github.com/gin-gonic/gin/debug.go +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "bytes" - "fmt" - "html/template" - "os" - "runtime" - "strconv" - "strings" -) - -const ginSupportMinGoVer = 8 - -// IsDebugging returns true if the framework is running in debug mode. -// Use SetMode(gin.ReleaseMode) to disable debug mode. -func IsDebugging() bool { - return ginMode == debugCode -} - -// DebugPrintRouteFunc indicates debug log output format. -var DebugPrintRouteFunc func(httpMethod, absolutePath, handlerName string, nuHandlers int) - -func debugPrintRoute(httpMethod, absolutePath string, handlers HandlersChain) { - if IsDebugging() { - nuHandlers := len(handlers) - handlerName := nameOfFunction(handlers.Last()) - if DebugPrintRouteFunc == nil { - debugPrint("%-6s %-25s --> %s (%d handlers)\n", httpMethod, absolutePath, handlerName, nuHandlers) - } else { - DebugPrintRouteFunc(httpMethod, absolutePath, handlerName, nuHandlers) - } - } -} - -func debugPrintLoadTemplate(tmpl *template.Template) { - if IsDebugging() { - var buf bytes.Buffer - for _, tmpl := range tmpl.Templates() { - buf.WriteString("\t- ") - buf.WriteString(tmpl.Name()) - buf.WriteString("\n") - } - debugPrint("Loaded HTML Templates (%d): \n%s\n", len(tmpl.Templates()), buf.String()) - } -} - -func debugPrint(format string, values ...interface{}) { - if IsDebugging() { - if !strings.HasSuffix(format, "\n") { - format += "\n" - } - fmt.Fprintf(os.Stderr, "[GIN-debug] "+format, values...) - } -} - -func getMinVer(v string) (uint64, error) { - first := strings.IndexByte(v, '.') - last := strings.LastIndexByte(v, '.') - if first == last { - return strconv.ParseUint(v[first+1:], 10, 64) - } - return strconv.ParseUint(v[first+1:last], 10, 64) -} - -func debugPrintWARNINGDefault() { - if v, e := getMinVer(runtime.Version()); e == nil && v <= ginSupportMinGoVer { - debugPrint(`[WARNING] Now Gin requires Go 1.8 or later and Go 1.9 will be required soon. - -`) - } - debugPrint(`[WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached. - -`) -} - -func debugPrintWARNINGNew() { - debugPrint(`[WARNING] Running in "debug" mode. Switch to "release" mode in production. - - using env: export GIN_MODE=release - - using code: gin.SetMode(gin.ReleaseMode) - -`) -} - -func debugPrintWARNINGSetHTMLTemplate() { - debugPrint(`[WARNING] Since SetHTMLTemplate() is NOT thread-safe. It should only be called -at initialization. ie. before any route is registered or the router is listening in a socket: - - router := gin.Default() - router.SetHTMLTemplate(template) // << good place - -`) -} - -func debugPrintError(err error) { - if err != nil { - debugPrint("[ERROR] %v\n", err) - } -} diff --git a/vendor/github.com/gin-gonic/gin/deprecated.go b/vendor/github.com/gin-gonic/gin/deprecated.go deleted file mode 100644 index ab44742..0000000 --- a/vendor/github.com/gin-gonic/gin/deprecated.go +++ /dev/null @@ -1,21 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "log" - - "github.com/gin-gonic/gin/binding" -) - -// BindWith binds the passed struct pointer using the specified binding engine. -// See the binding package. -func (c *Context) BindWith(obj interface{}, b binding.Binding) error { - log.Println(`BindWith(\"interface{}, binding.Binding\") error is going to - be deprecated, please check issue #662 and either use MustBindWith() if you - want HTTP 400 to be automatically returned if any error occur, or use - ShouldBindWith() if you need to manage the error.`) - return c.MustBindWith(obj, b) -} diff --git a/vendor/github.com/gin-gonic/gin/doc.go b/vendor/github.com/gin-gonic/gin/doc.go deleted file mode 100644 index 1bd0386..0000000 --- a/vendor/github.com/gin-gonic/gin/doc.go +++ /dev/null @@ -1,6 +0,0 @@ -/* -Package gin implements a HTTP web framework called gin. - -See https://gin-gonic.com/ for more information about gin. -*/ -package gin // import "github.com/gin-gonic/gin" diff --git a/vendor/github.com/gin-gonic/gin/errors.go b/vendor/github.com/gin-gonic/gin/errors.go deleted file mode 100644 index 6070ff5..0000000 --- a/vendor/github.com/gin-gonic/gin/errors.go +++ /dev/null @@ -1,169 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "bytes" - "fmt" - "reflect" - - "github.com/gin-gonic/gin/internal/json" -) - -// ErrorType is an unsigned 64-bit error code as defined in the gin spec. -type ErrorType uint64 - -const ( - // ErrorTypeBind is used when Context.Bind() fails. - ErrorTypeBind ErrorType = 1 << 63 - // ErrorTypeRender is used when Context.Render() fails. - ErrorTypeRender ErrorType = 1 << 62 - // ErrorTypePrivate indicates a private error. - ErrorTypePrivate ErrorType = 1 << 0 - // ErrorTypePublic indicates a public error. - ErrorTypePublic ErrorType = 1 << 1 - // ErrorTypeAny indicates any other error. - ErrorTypeAny ErrorType = 1<<64 - 1 - // ErrorTypeNu indicates any other error. - ErrorTypeNu = 2 -) - -// Error represents a error's specification. -type Error struct { - Err error - Type ErrorType - Meta interface{} -} - -type errorMsgs []*Error - -var _ error = &Error{} - -// SetType sets the error's type. -func (msg *Error) SetType(flags ErrorType) *Error { - msg.Type = flags - return msg -} - -// SetMeta sets the error's meta data. -func (msg *Error) SetMeta(data interface{}) *Error { - msg.Meta = data - return msg -} - -// JSON creates a properly formatted JSON -func (msg *Error) JSON() interface{} { - json := H{} - if msg.Meta != nil { - value := reflect.ValueOf(msg.Meta) - switch value.Kind() { - case reflect.Struct: - return msg.Meta - case reflect.Map: - for _, key := range value.MapKeys() { - json[key.String()] = value.MapIndex(key).Interface() - } - default: - json["meta"] = msg.Meta - } - } - if _, ok := json["error"]; !ok { - json["error"] = msg.Error() - } - return json -} - -// MarshalJSON implements the json.Marshaller interface. -func (msg *Error) MarshalJSON() ([]byte, error) { - return json.Marshal(msg.JSON()) -} - -// Error implements the error interface. -func (msg Error) Error() string { - return msg.Err.Error() -} - -// IsType judges one error. -func (msg *Error) IsType(flags ErrorType) bool { - return (msg.Type & flags) > 0 -} - -// ByType returns a readonly copy filtered the byte. -// ie ByType(gin.ErrorTypePublic) returns a slice of errors with type=ErrorTypePublic. -func (a errorMsgs) ByType(typ ErrorType) errorMsgs { - if len(a) == 0 { - return nil - } - if typ == ErrorTypeAny { - return a - } - var result errorMsgs - for _, msg := range a { - if msg.IsType(typ) { - result = append(result, msg) - } - } - return result -} - -// Last returns the last error in the slice. It returns nil if the array is empty. -// Shortcut for errors[len(errors)-1]. -func (a errorMsgs) Last() *Error { - if length := len(a); length > 0 { - return a[length-1] - } - return nil -} - -// Errors returns an array will all the error messages. -// Example: -// c.Error(errors.New("first")) -// c.Error(errors.New("second")) -// c.Error(errors.New("third")) -// c.Errors.Errors() // == []string{"first", "second", "third"} -func (a errorMsgs) Errors() []string { - if len(a) == 0 { - return nil - } - errorStrings := make([]string, len(a)) - for i, err := range a { - errorStrings[i] = err.Error() - } - return errorStrings -} - -func (a errorMsgs) JSON() interface{} { - switch len(a) { - case 0: - return nil - case 1: - return a.Last().JSON() - default: - json := make([]interface{}, len(a)) - for i, err := range a { - json[i] = err.JSON() - } - return json - } -} - -// MarshalJSON implements the json.Marshaller interface. -func (a errorMsgs) MarshalJSON() ([]byte, error) { - return json.Marshal(a.JSON()) -} - -func (a errorMsgs) String() string { - if len(a) == 0 { - return "" - } - var buffer bytes.Buffer - for i, msg := range a { - fmt.Fprintf(&buffer, "Error #%02d: %s\n", i+1, msg.Err) - if msg.Meta != nil { - fmt.Fprintf(&buffer, " Meta: %v\n", msg.Meta) - } - } - return buffer.String() -} diff --git a/vendor/github.com/gin-gonic/gin/fs.go b/vendor/github.com/gin-gonic/gin/fs.go deleted file mode 100644 index 7a6738a..0000000 --- a/vendor/github.com/gin-gonic/gin/fs.go +++ /dev/null @@ -1,45 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "net/http" - "os" -) - -type onlyfilesFS struct { - fs http.FileSystem -} - -type neuteredReaddirFile struct { - http.File -} - -// Dir returns a http.Filesystem that can be used by http.FileServer(). It is used internally -// in router.Static(). -// if listDirectory == true, then it works the same as http.Dir() otherwise it returns -// a filesystem that prevents http.FileServer() to list the directory files. -func Dir(root string, listDirectory bool) http.FileSystem { - fs := http.Dir(root) - if listDirectory { - return fs - } - return &onlyfilesFS{fs} -} - -// Open conforms to http.Filesystem. -func (fs onlyfilesFS) Open(name string) (http.File, error) { - f, err := fs.fs.Open(name) - if err != nil { - return nil, err - } - return neuteredReaddirFile{f}, nil -} - -// Readdir overrides the http.File default implementation. -func (f neuteredReaddirFile) Readdir(count int) ([]os.FileInfo, error) { - // this disables directory listing - return nil, nil -} diff --git a/vendor/github.com/gin-gonic/gin/gin.go b/vendor/github.com/gin-gonic/gin/gin.go deleted file mode 100644 index 4dbe983..0000000 --- a/vendor/github.com/gin-gonic/gin/gin.go +++ /dev/null @@ -1,477 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "fmt" - "html/template" - "net" - "net/http" - "os" - "path" - "sync" - - "github.com/gin-gonic/gin/render" -) - -const defaultMultipartMemory = 32 << 20 // 32 MB - -var ( - default404Body = []byte("404 page not found") - default405Body = []byte("405 method not allowed") - defaultAppEngine bool -) - -// HandlerFunc defines the handler used by gin middleware as return value. -type HandlerFunc func(*Context) - -// HandlersChain defines a HandlerFunc array. -type HandlersChain []HandlerFunc - -// Last returns the last handler in the chain. ie. the last handler is the main own. -func (c HandlersChain) Last() HandlerFunc { - if length := len(c); length > 0 { - return c[length-1] - } - return nil -} - -// RouteInfo represents a request route's specification which contains method and path and its handler. -type RouteInfo struct { - Method string - Path string - Handler string - HandlerFunc HandlerFunc -} - -// RoutesInfo defines a RouteInfo array. -type RoutesInfo []RouteInfo - -// Engine is the framework's instance, it contains the muxer, middleware and configuration settings. -// Create an instance of Engine, by using New() or Default() -type Engine struct { - RouterGroup - - // Enables automatic redirection if the current route can't be matched but a - // handler for the path with (without) the trailing slash exists. - // For example if /foo/ is requested but a route only exists for /foo, the - // client is redirected to /foo with http status code 301 for GET requests - // and 307 for all other request methods. - RedirectTrailingSlash bool - - // If enabled, the router tries to fix the current request path, if no - // handle is registered for it. - // First superfluous path elements like ../ or // are removed. - // Afterwards the router does a case-insensitive lookup of the cleaned path. - // If a handle can be found for this route, the router makes a redirection - // to the corrected path with status code 301 for GET requests and 307 for - // all other request methods. - // For example /FOO and /..//Foo could be redirected to /foo. - // RedirectTrailingSlash is independent of this option. - RedirectFixedPath bool - - // If enabled, the router checks if another method is allowed for the - // current route, if the current request can not be routed. - // If this is the case, the request is answered with 'Method Not Allowed' - // and HTTP status code 405. - // If no other Method is allowed, the request is delegated to the NotFound - // handler. - HandleMethodNotAllowed bool - ForwardedByClientIP bool - - // #726 #755 If enabled, it will thrust some headers starting with - // 'X-AppEngine...' for better integration with that PaaS. - AppEngine bool - - // If enabled, the url.RawPath will be used to find parameters. - UseRawPath bool - - // If true, the path value will be unescaped. - // If UseRawPath is false (by default), the UnescapePathValues effectively is true, - // as url.Path gonna be used, which is already unescaped. - UnescapePathValues bool - - // Value of 'maxMemory' param that is given to http.Request's ParseMultipartForm - // method call. - MaxMultipartMemory int64 - - delims render.Delims - secureJsonPrefix string - HTMLRender render.HTMLRender - FuncMap template.FuncMap - allNoRoute HandlersChain - allNoMethod HandlersChain - noRoute HandlersChain - noMethod HandlersChain - pool sync.Pool - trees methodTrees -} - -var _ IRouter = &Engine{} - -// New returns a new blank Engine instance without any middleware attached. -// By default the configuration is: -// - RedirectTrailingSlash: true -// - RedirectFixedPath: false -// - HandleMethodNotAllowed: false -// - ForwardedByClientIP: true -// - UseRawPath: false -// - UnescapePathValues: true -func New() *Engine { - debugPrintWARNINGNew() - engine := &Engine{ - RouterGroup: RouterGroup{ - Handlers: nil, - basePath: "/", - root: true, - }, - FuncMap: template.FuncMap{}, - RedirectTrailingSlash: true, - RedirectFixedPath: false, - HandleMethodNotAllowed: false, - ForwardedByClientIP: true, - AppEngine: defaultAppEngine, - UseRawPath: false, - UnescapePathValues: true, - MaxMultipartMemory: defaultMultipartMemory, - trees: make(methodTrees, 0, 9), - delims: render.Delims{Left: "{{", Right: "}}"}, - secureJsonPrefix: "while(1);", - } - engine.RouterGroup.engine = engine - engine.pool.New = func() interface{} { - return engine.allocateContext() - } - return engine -} - -// Default returns an Engine instance with the Logger and Recovery middleware already attached. -func Default() *Engine { - debugPrintWARNINGDefault() - engine := New() - engine.Use(Logger(), Recovery()) - return engine -} - -func (engine *Engine) allocateContext() *Context { - return &Context{engine: engine} -} - -// Delims sets template left and right delims and returns a Engine instance. -func (engine *Engine) Delims(left, right string) *Engine { - engine.delims = render.Delims{Left: left, Right: right} - return engine -} - -// SecureJsonPrefix sets the secureJsonPrefix used in Context.SecureJSON. -func (engine *Engine) SecureJsonPrefix(prefix string) *Engine { - engine.secureJsonPrefix = prefix - return engine -} - -// LoadHTMLGlob loads HTML files identified by glob pattern -// and associates the result with HTML renderer. -func (engine *Engine) LoadHTMLGlob(pattern string) { - left := engine.delims.Left - right := engine.delims.Right - templ := template.Must(template.New("").Delims(left, right).Funcs(engine.FuncMap).ParseGlob(pattern)) - - if IsDebugging() { - debugPrintLoadTemplate(templ) - engine.HTMLRender = render.HTMLDebug{Glob: pattern, FuncMap: engine.FuncMap, Delims: engine.delims} - return - } - - engine.SetHTMLTemplate(templ) -} - -// LoadHTMLFiles loads a slice of HTML files -// and associates the result with HTML renderer. -func (engine *Engine) LoadHTMLFiles(files ...string) { - if IsDebugging() { - engine.HTMLRender = render.HTMLDebug{Files: files, FuncMap: engine.FuncMap, Delims: engine.delims} - return - } - - templ := template.Must(template.New("").Delims(engine.delims.Left, engine.delims.Right).Funcs(engine.FuncMap).ParseFiles(files...)) - engine.SetHTMLTemplate(templ) -} - -// SetHTMLTemplate associate a template with HTML renderer. -func (engine *Engine) SetHTMLTemplate(templ *template.Template) { - if len(engine.trees) > 0 { - debugPrintWARNINGSetHTMLTemplate() - } - - engine.HTMLRender = render.HTMLProduction{Template: templ.Funcs(engine.FuncMap)} -} - -// SetFuncMap sets the FuncMap used for template.FuncMap. -func (engine *Engine) SetFuncMap(funcMap template.FuncMap) { - engine.FuncMap = funcMap -} - -// NoRoute adds handlers for NoRoute. It return a 404 code by default. -func (engine *Engine) NoRoute(handlers ...HandlerFunc) { - engine.noRoute = handlers - engine.rebuild404Handlers() -} - -// NoMethod sets the handlers called when... TODO. -func (engine *Engine) NoMethod(handlers ...HandlerFunc) { - engine.noMethod = handlers - engine.rebuild405Handlers() -} - -// Use attaches a global middleware to the router. ie. the middleware attached though Use() will be -// included in the handlers chain for every single request. Even 404, 405, static files... -// For example, this is the right place for a logger or error management middleware. -func (engine *Engine) Use(middleware ...HandlerFunc) IRoutes { - engine.RouterGroup.Use(middleware...) - engine.rebuild404Handlers() - engine.rebuild405Handlers() - return engine -} - -func (engine *Engine) rebuild404Handlers() { - engine.allNoRoute = engine.combineHandlers(engine.noRoute) -} - -func (engine *Engine) rebuild405Handlers() { - engine.allNoMethod = engine.combineHandlers(engine.noMethod) -} - -func (engine *Engine) addRoute(method, path string, handlers HandlersChain) { - assert1(path[0] == '/', "path must begin with '/'") - assert1(method != "", "HTTP method can not be empty") - assert1(len(handlers) > 0, "there must be at least one handler") - - debugPrintRoute(method, path, handlers) - root := engine.trees.get(method) - if root == nil { - root = new(node) - engine.trees = append(engine.trees, methodTree{method: method, root: root}) - } - root.addRoute(path, handlers) -} - -// Routes returns a slice of registered routes, including some useful information, such as: -// the http method, path and the handler name. -func (engine *Engine) Routes() (routes RoutesInfo) { - for _, tree := range engine.trees { - routes = iterate("", tree.method, routes, tree.root) - } - return routes -} - -func iterate(path, method string, routes RoutesInfo, root *node) RoutesInfo { - path += root.path - if len(root.handlers) > 0 { - handlerFunc := root.handlers.Last() - routes = append(routes, RouteInfo{ - Method: method, - Path: path, - Handler: nameOfFunction(handlerFunc), - HandlerFunc: handlerFunc, - }) - } - for _, child := range root.children { - routes = iterate(path, method, routes, child) - } - return routes -} - -// Run attaches the router to a http.Server and starts listening and serving HTTP requests. -// It is a shortcut for http.ListenAndServe(addr, router) -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) Run(addr ...string) (err error) { - defer func() { debugPrintError(err) }() - - address := resolveAddress(addr) - debugPrint("Listening and serving HTTP on %s\n", address) - err = http.ListenAndServe(address, engine) - return -} - -// RunTLS attaches the router to a http.Server and starts listening and serving HTTPS (secure) requests. -// It is a shortcut for http.ListenAndServeTLS(addr, certFile, keyFile, router) -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) RunTLS(addr, certFile, keyFile string) (err error) { - debugPrint("Listening and serving HTTPS on %s\n", addr) - defer func() { debugPrintError(err) }() - - err = http.ListenAndServeTLS(addr, certFile, keyFile, engine) - return -} - -// RunUnix attaches the router to a http.Server and starts listening and serving HTTP requests -// through the specified unix socket (ie. a file). -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) RunUnix(file string) (err error) { - debugPrint("Listening and serving HTTP on unix:/%s", file) - defer func() { debugPrintError(err) }() - - os.Remove(file) - listener, err := net.Listen("unix", file) - if err != nil { - return - } - defer listener.Close() - os.Chmod(file, 0777) - err = http.Serve(listener, engine) - return -} - -// RunFd attaches the router to a http.Server and starts listening and serving HTTP requests -// through the specified file descriptor. -// Note: this method will block the calling goroutine indefinitely unless an error happens. -func (engine *Engine) RunFd(fd int) (err error) { - debugPrint("Listening and serving HTTP on fd@%d", fd) - defer func() { debugPrintError(err) }() - - f := os.NewFile(uintptr(fd), fmt.Sprintf("fd@%d", fd)) - listener, err := net.FileListener(f) - if err != nil { - return - } - defer listener.Close() - err = http.Serve(listener, engine) - return -} - -// ServeHTTP conforms to the http.Handler interface. -func (engine *Engine) ServeHTTP(w http.ResponseWriter, req *http.Request) { - c := engine.pool.Get().(*Context) - c.writermem.reset(w) - c.Request = req - c.reset() - - engine.handleHTTPRequest(c) - - engine.pool.Put(c) -} - -// HandleContext re-enter a context that has been rewritten. -// This can be done by setting c.Request.URL.Path to your new target. -// Disclaimer: You can loop yourself to death with this, use wisely. -func (engine *Engine) HandleContext(c *Context) { - oldIndexValue := c.index - c.reset() - engine.handleHTTPRequest(c) - - c.index = oldIndexValue -} - -func (engine *Engine) handleHTTPRequest(c *Context) { - httpMethod := c.Request.Method - rPath := c.Request.URL.Path - unescape := false - if engine.UseRawPath && len(c.Request.URL.RawPath) > 0 { - rPath = c.Request.URL.RawPath - unescape = engine.UnescapePathValues - } - rPath = cleanPath(rPath) - - // Find root of the tree for the given HTTP method - t := engine.trees - for i, tl := 0, len(t); i < tl; i++ { - if t[i].method != httpMethod { - continue - } - root := t[i].root - // Find route in tree - handlers, params, tsr := root.getValue(rPath, c.Params, unescape) - if handlers != nil { - c.handlers = handlers - c.Params = params - c.Next() - c.writermem.WriteHeaderNow() - return - } - if httpMethod != "CONNECT" && rPath != "/" { - if tsr && engine.RedirectTrailingSlash { - redirectTrailingSlash(c) - return - } - if engine.RedirectFixedPath && redirectFixedPath(c, root, engine.RedirectFixedPath) { - return - } - } - break - } - - if engine.HandleMethodNotAllowed { - for _, tree := range engine.trees { - if tree.method == httpMethod { - continue - } - if handlers, _, _ := tree.root.getValue(rPath, nil, unescape); handlers != nil { - c.handlers = engine.allNoMethod - serveError(c, http.StatusMethodNotAllowed, default405Body) - return - } - } - } - c.handlers = engine.allNoRoute - serveError(c, http.StatusNotFound, default404Body) -} - -var mimePlain = []string{MIMEPlain} - -func serveError(c *Context, code int, defaultMessage []byte) { - c.writermem.status = code - c.Next() - if c.writermem.Written() { - return - } - if c.writermem.Status() == code { - c.writermem.Header()["Content-Type"] = mimePlain - _, err := c.Writer.Write(defaultMessage) - if err != nil { - debugPrint("cannot write message to writer during serve error: %v", err) - } - return - } - c.writermem.WriteHeaderNow() - return -} - -func redirectTrailingSlash(c *Context) { - req := c.Request - p := req.URL.Path - if prefix := path.Clean(c.Request.Header.Get("X-Forwarded-Prefix")); prefix != "." { - p = prefix + "/" + req.URL.Path - } - code := http.StatusMovedPermanently // Permanent redirect, request with GET method - if req.Method != "GET" { - code = http.StatusTemporaryRedirect - } - - req.URL.Path = p + "/" - if length := len(p); length > 1 && p[length-1] == '/' { - req.URL.Path = p[:length-1] - } - debugPrint("redirecting request %d: %s --> %s", code, p, req.URL.String()) - http.Redirect(c.Writer, req, req.URL.String(), code) - c.writermem.WriteHeaderNow() -} - -func redirectFixedPath(c *Context, root *node, trailingSlash bool) bool { - req := c.Request - rPath := req.URL.Path - - if fixedPath, ok := root.findCaseInsensitivePath(cleanPath(rPath), trailingSlash); ok { - code := http.StatusMovedPermanently // Permanent redirect, request with GET method - if req.Method != "GET" { - code = http.StatusTemporaryRedirect - } - req.URL.Path = string(fixedPath) - debugPrint("redirecting request %d: %s --> %s", code, rPath, req.URL.String()) - http.Redirect(c.Writer, req, req.URL.String(), code) - c.writermem.WriteHeaderNow() - return true - } - return false -} diff --git a/vendor/github.com/gin-gonic/gin/go.mod b/vendor/github.com/gin-gonic/gin/go.mod deleted file mode 100644 index 1c5e995..0000000 --- a/vendor/github.com/gin-gonic/gin/go.mod +++ /dev/null @@ -1,18 +0,0 @@ -module github.com/gin-gonic/gin - -go 1.12 - -require ( - github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 - github.com/golang/protobuf v1.3.1 - github.com/json-iterator/go v1.1.6 - github.com/mattn/go-isatty v0.0.7 - github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect - github.com/modern-go/reflect2 v1.0.1 // indirect - github.com/stretchr/testify v1.3.0 - github.com/ugorji/go v1.1.4 - golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c - gopkg.in/go-playground/assert.v1 v1.2.1 // indirect - gopkg.in/go-playground/validator.v8 v8.18.2 - gopkg.in/yaml.v2 v2.2.2 -) diff --git a/vendor/github.com/gin-gonic/gin/go.sum b/vendor/github.com/gin-gonic/gin/go.sum deleted file mode 100644 index 5810468..0000000 --- a/vendor/github.com/gin-gonic/gin/go.sum +++ /dev/null @@ -1,36 +0,0 @@ -github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= -github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3 h1:t8FVkw33L+wilf2QiWkw0UV77qRpcH/JHPKGpKa2E8g= -github.com/gin-contrib/sse v0.0.0-20190301062529-5545eab6dad3/go.mod h1:VJ0WA2NBN22VlZ2dKZQPAPnyWw5XTlK1KymzLKsr59s= -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/json-iterator/go v1.1.6 h1:MrUvLMLTMxbqFJ9kzlvat/rYZqZnW3u4wkLzWTaFwKs= -github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= -github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= -github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= -github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= -github.com/modern-go/reflect2 v1.0.1 h1:9f412s+6RmYXLWZSEzVVgPGK7C2PphHj5RJrvfx9AWI= -github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -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/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= -github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= -github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= -github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= -github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= -golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c h1:uOCk1iQW6Vc18bnC13MfzScl+wdKBmM9Y9kU7Z83/lw= -golang.org/x/net v0.0.0-20190503192946-f4e77d36d62c/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= -golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223 h1:DH4skfRX4EBpamg7iV4ZlCpblAHI6s6TDM39bFZumv8= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= -gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= -gopkg.in/go-playground/assert.v1 v1.2.1 h1:xoYuJVE7KT85PYWrN730RguIQO0ePzVRfFMXadIrXTM= -gopkg.in/go-playground/assert.v1 v1.2.1/go.mod h1:9RXL0bg/zibRAgZUYszZSwO/z8Y/a8bDuhia5mkpMnE= -gopkg.in/go-playground/validator.v8 v8.18.2 h1:lFB4DoMU6B626w8ny76MV7VX6W2VHct2GVOI3xgiMrQ= -gopkg.in/go-playground/validator.v8 v8.18.2/go.mod h1:RX2a/7Ha8BgOhfk7j780h4/u/RRjR0eouCJSH80/M2Y= -gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw= -gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= diff --git a/vendor/github.com/gin-gonic/gin/internal/json/json.go b/vendor/github.com/gin-gonic/gin/internal/json/json.go deleted file mode 100644 index 480e8bf..0000000 --- a/vendor/github.com/gin-gonic/gin/internal/json/json.go +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright 2017 Bo-Yi Wu. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -// +build !jsoniter - -package json - -import "encoding/json" - -var ( - // Marshal is exported by gin/json package. - Marshal = json.Marshal - // Unmarshal is exported by gin/json package. - Unmarshal = json.Unmarshal - // MarshalIndent is exported by gin/json package. - MarshalIndent = json.MarshalIndent - // NewDecoder is exported by gin/json package. - NewDecoder = json.NewDecoder - // NewEncoder is exported by gin/json package. - NewEncoder = json.NewEncoder -) diff --git a/vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go b/vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go deleted file mode 100644 index fabd7b8..0000000 --- a/vendor/github.com/gin-gonic/gin/internal/json/jsoniter.go +++ /dev/null @@ -1,23 +0,0 @@ -// Copyright 2017 Bo-Yi Wu. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -// +build jsoniter - -package json - -import "github.com/json-iterator/go" - -var ( - json = jsoniter.ConfigCompatibleWithStandardLibrary - // Marshal is exported by gin/json package. - Marshal = json.Marshal - // Unmarshal is exported by gin/json package. - Unmarshal = json.Unmarshal - // MarshalIndent is exported by gin/json package. - MarshalIndent = json.MarshalIndent - // NewDecoder is exported by gin/json package. - NewDecoder = json.NewDecoder - // NewEncoder is exported by gin/json package. - NewEncoder = json.NewEncoder -) diff --git a/vendor/github.com/gin-gonic/gin/logger.go b/vendor/github.com/gin-gonic/gin/logger.go deleted file mode 100644 index 5ab4639..0000000 --- a/vendor/github.com/gin-gonic/gin/logger.go +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "fmt" - "io" - "net/http" - "os" - "time" - - "github.com/mattn/go-isatty" -) - -type consoleColorModeValue int - -const ( - autoColor consoleColorModeValue = iota - disableColor - forceColor -) - -var ( - green = string([]byte{27, 91, 57, 55, 59, 52, 50, 109}) - white = string([]byte{27, 91, 57, 48, 59, 52, 55, 109}) - yellow = string([]byte{27, 91, 57, 48, 59, 52, 51, 109}) - red = string([]byte{27, 91, 57, 55, 59, 52, 49, 109}) - blue = string([]byte{27, 91, 57, 55, 59, 52, 52, 109}) - magenta = string([]byte{27, 91, 57, 55, 59, 52, 53, 109}) - cyan = string([]byte{27, 91, 57, 55, 59, 52, 54, 109}) - reset = string([]byte{27, 91, 48, 109}) - consoleColorMode = autoColor -) - -// LoggerConfig defines the config for Logger middleware. -type LoggerConfig struct { - // Optional. Default value is gin.defaultLogFormatter - Formatter LogFormatter - - // Output is a writer where logs are written. - // Optional. Default value is gin.DefaultWriter. - Output io.Writer - - // SkipPaths is a url path array which logs are not written. - // Optional. - SkipPaths []string -} - -// LogFormatter gives the signature of the formatter function passed to LoggerWithFormatter -type LogFormatter func(params LogFormatterParams) string - -// LogFormatterParams is the structure any formatter will be handed when time to log comes -type LogFormatterParams struct { - Request *http.Request - - // TimeStamp shows the time after the server returns a response. - TimeStamp time.Time - // StatusCode is HTTP response code. - StatusCode int - // Latency is how much time the server cost to process a certain request. - Latency time.Duration - // ClientIP equals Context's ClientIP method. - ClientIP string - // Method is the HTTP method given to the request. - Method string - // Path is a path the client requests. - Path string - // ErrorMessage is set if error has occurred in processing the request. - ErrorMessage string - // isTerm shows whether does gin's output descriptor refers to a terminal. - isTerm bool - // BodySize is the size of the Response Body - BodySize int - // Keys are the keys set on the request's context. - Keys map[string]interface{} -} - -// StatusCodeColor is the ANSI color for appropriately logging http status code to a terminal. -func (p *LogFormatterParams) StatusCodeColor() string { - code := p.StatusCode - - switch { - case code >= http.StatusOK && code < http.StatusMultipleChoices: - return green - case code >= http.StatusMultipleChoices && code < http.StatusBadRequest: - return white - case code >= http.StatusBadRequest && code < http.StatusInternalServerError: - return yellow - default: - return red - } -} - -// MethodColor is the ANSI color for appropriately logging http method to a terminal. -func (p *LogFormatterParams) MethodColor() string { - method := p.Method - - switch method { - case "GET": - return blue - case "POST": - return cyan - case "PUT": - return yellow - case "DELETE": - return red - case "PATCH": - return green - case "HEAD": - return magenta - case "OPTIONS": - return white - default: - return reset - } -} - -// ResetColor resets all escape attributes. -func (p *LogFormatterParams) ResetColor() string { - return reset -} - -// IsOutputColor indicates whether can colors be outputted to the log. -func (p *LogFormatterParams) IsOutputColor() bool { - return consoleColorMode == forceColor || (consoleColorMode == autoColor && p.isTerm) -} - -// defaultLogFormatter is the default log format function Logger middleware uses. -var defaultLogFormatter = func(param LogFormatterParams) string { - var statusColor, methodColor, resetColor string - if param.IsOutputColor() { - statusColor = param.StatusCodeColor() - methodColor = param.MethodColor() - resetColor = param.ResetColor() - } - - if param.Latency > time.Minute { - // Truncate in a golang < 1.8 safe way - param.Latency = param.Latency - param.Latency%time.Second - } - return fmt.Sprintf("[GIN] %v |%s %3d %s| %13v | %15s |%s %-7s %s %s\n%s", - param.TimeStamp.Format("2006/01/02 - 15:04:05"), - statusColor, param.StatusCode, resetColor, - param.Latency, - param.ClientIP, - methodColor, param.Method, resetColor, - param.Path, - param.ErrorMessage, - ) -} - -// DisableConsoleColor disables color output in the console. -func DisableConsoleColor() { - consoleColorMode = disableColor -} - -// ForceConsoleColor force color output in the console. -func ForceConsoleColor() { - consoleColorMode = forceColor -} - -// ErrorLogger returns a handlerfunc for any error type. -func ErrorLogger() HandlerFunc { - return ErrorLoggerT(ErrorTypeAny) -} - -// ErrorLoggerT returns a handlerfunc for a given error type. -func ErrorLoggerT(typ ErrorType) HandlerFunc { - return func(c *Context) { - c.Next() - errors := c.Errors.ByType(typ) - if len(errors) > 0 { - c.JSON(-1, errors) - } - } -} - -// Logger instances a Logger middleware that will write the logs to gin.DefaultWriter. -// By default gin.DefaultWriter = os.Stdout. -func Logger() HandlerFunc { - return LoggerWithConfig(LoggerConfig{}) -} - -// LoggerWithFormatter instance a Logger middleware with the specified log format function. -func LoggerWithFormatter(f LogFormatter) HandlerFunc { - return LoggerWithConfig(LoggerConfig{ - Formatter: f, - }) -} - -// LoggerWithWriter instance a Logger middleware with the specified writer buffer. -// Example: os.Stdout, a file opened in write mode, a socket... -func LoggerWithWriter(out io.Writer, notlogged ...string) HandlerFunc { - return LoggerWithConfig(LoggerConfig{ - Output: out, - SkipPaths: notlogged, - }) -} - -// LoggerWithConfig instance a Logger middleware with config. -func LoggerWithConfig(conf LoggerConfig) HandlerFunc { - formatter := conf.Formatter - if formatter == nil { - formatter = defaultLogFormatter - } - - out := conf.Output - if out == nil { - out = DefaultWriter - } - - notlogged := conf.SkipPaths - - isTerm := true - - if w, ok := out.(*os.File); !ok || os.Getenv("TERM") == "dumb" || - (!isatty.IsTerminal(w.Fd()) && !isatty.IsCygwinTerminal(w.Fd())) { - isTerm = false - } - - var skip map[string]struct{} - - if length := len(notlogged); length > 0 { - skip = make(map[string]struct{}, length) - - for _, path := range notlogged { - skip[path] = struct{}{} - } - } - - return func(c *Context) { - // Start timer - start := time.Now() - path := c.Request.URL.Path - raw := c.Request.URL.RawQuery - - // Process request - c.Next() - - // Log only when path is not being skipped - if _, ok := skip[path]; !ok { - param := LogFormatterParams{ - Request: c.Request, - isTerm: isTerm, - Keys: c.Keys, - } - - // Stop timer - param.TimeStamp = time.Now() - param.Latency = param.TimeStamp.Sub(start) - - param.ClientIP = c.ClientIP() - param.Method = c.Request.Method - param.StatusCode = c.Writer.Status() - param.ErrorMessage = c.Errors.ByType(ErrorTypePrivate).String() - - param.BodySize = c.Writer.Size() - - if raw != "" { - path = path + "?" + raw - } - - param.Path = path - - fmt.Fprint(out, formatter(param)) - } - } -} diff --git a/vendor/github.com/gin-gonic/gin/mode.go b/vendor/github.com/gin-gonic/gin/mode.go deleted file mode 100644 index 8aa84aa..0000000 --- a/vendor/github.com/gin-gonic/gin/mode.go +++ /dev/null @@ -1,83 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "io" - "os" - - "github.com/gin-gonic/gin/binding" -) - -// EnvGinMode indicates environment name for gin mode. -const EnvGinMode = "GIN_MODE" - -const ( - // DebugMode indicates gin mode is debug. - DebugMode = "debug" - // ReleaseMode indicates gin mode is release. - ReleaseMode = "release" - // TestMode indicates gin mode is test. - TestMode = "test" -) -const ( - debugCode = iota - releaseCode - testCode -) - -// DefaultWriter is the default io.Writer used by Gin for debug output and -// middleware output like Logger() or Recovery(). -// Note that both Logger and Recovery provides custom ways to configure their -// output io.Writer. -// To support coloring in Windows use: -// import "github.com/mattn/go-colorable" -// gin.DefaultWriter = colorable.NewColorableStdout() -var DefaultWriter io.Writer = os.Stdout - -// DefaultErrorWriter is the default io.Writer used by Gin to debug errors -var DefaultErrorWriter io.Writer = os.Stderr - -var ginMode = debugCode -var modeName = DebugMode - -func init() { - mode := os.Getenv(EnvGinMode) - SetMode(mode) -} - -// SetMode sets gin mode according to input string. -func SetMode(value string) { - switch value { - case DebugMode, "": - ginMode = debugCode - case ReleaseMode: - ginMode = releaseCode - case TestMode: - ginMode = testCode - default: - panic("gin mode unknown: " + value) - } - if value == "" { - value = DebugMode - } - modeName = value -} - -// DisableBindValidation closes the default validator. -func DisableBindValidation() { - binding.Validator = nil -} - -// EnableJsonDecoderUseNumber sets true for binding.EnableDecoderUseNumberto to -// call the UseNumber method on the JSON Decoder instance. -func EnableJsonDecoderUseNumber() { - binding.EnableDecoderUseNumber = true -} - -// Mode returns currently gin mode. -func Mode() string { - return modeName -} diff --git a/vendor/github.com/gin-gonic/gin/path.go b/vendor/github.com/gin-gonic/gin/path.go deleted file mode 100644 index d1f5962..0000000 --- a/vendor/github.com/gin-gonic/gin/path.go +++ /dev/null @@ -1,123 +0,0 @@ -// Copyright 2013 Julien Schmidt. All rights reserved. -// Based on the path package, Copyright 2009 The Go Authors. -// Use of this source code is governed by a BSD-style license that can be found -// at https://github.com/julienschmidt/httprouter/blob/master/LICENSE. - -package gin - -// cleanPath is the URL version of path.Clean, it returns a canonical URL path -// for p, eliminating . and .. elements. -// -// The following rules are applied iteratively until no further processing can -// be done: -// 1. Replace multiple slashes with a single slash. -// 2. Eliminate each . path name element (the current directory). -// 3. Eliminate each inner .. path name element (the parent directory) -// along with the non-.. element that precedes it. -// 4. Eliminate .. elements that begin a rooted path: -// that is, replace "/.." by "/" at the beginning of a path. -// -// If the result of this process is an empty string, "/" is returned. -func cleanPath(p string) string { - // Turn empty string into "/" - if p == "" { - return "/" - } - - n := len(p) - var buf []byte - - // Invariants: - // reading from path; r is index of next byte to process. - // writing to buf; w is index of next byte to write. - - // path must start with '/' - r := 1 - w := 1 - - if p[0] != '/' { - r = 0 - buf = make([]byte, n+1) - buf[0] = '/' - } - - trailing := n > 1 && p[n-1] == '/' - - // A bit more clunky without a 'lazybuf' like the path package, but the loop - // gets completely inlined (bufApp). So in contrast to the path package this - // loop has no expensive function calls (except 1x make) - - for r < n { - switch { - case p[r] == '/': - // empty path element, trailing slash is added after the end - r++ - - case p[r] == '.' && r+1 == n: - trailing = true - r++ - - case p[r] == '.' && p[r+1] == '/': - // . element - r += 2 - - case p[r] == '.' && p[r+1] == '.' && (r+2 == n || p[r+2] == '/'): - // .. element: remove to last / - r += 3 - - if w > 1 { - // can backtrack - w-- - - if buf == nil { - for w > 1 && p[w] != '/' { - w-- - } - } else { - for w > 1 && buf[w] != '/' { - w-- - } - } - } - - default: - // real path element. - // add slash if needed - if w > 1 { - bufApp(&buf, p, w, '/') - w++ - } - - // copy element - for r < n && p[r] != '/' { - bufApp(&buf, p, w, p[r]) - w++ - r++ - } - } - } - - // re-append trailing slash - if trailing && w > 1 { - bufApp(&buf, p, w, '/') - w++ - } - - if buf == nil { - return p[:w] - } - return string(buf[:w]) -} - -// internal helper to lazily create a buffer if necessary. -func bufApp(buf *[]byte, s string, w int, c byte) { - if *buf == nil { - if s[w] == c { - return - } - - *buf = make([]byte, len(s)) - copy(*buf, s[:w]) - } - (*buf)[w] = c -} diff --git a/vendor/github.com/gin-gonic/gin/recovery.go b/vendor/github.com/gin-gonic/gin/recovery.go deleted file mode 100644 index bc946c0..0000000 --- a/vendor/github.com/gin-gonic/gin/recovery.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "bytes" - "fmt" - "io" - "io/ioutil" - "log" - "net" - "net/http" - "net/http/httputil" - "os" - "runtime" - "strings" - "time" -) - -var ( - dunno = []byte("???") - centerDot = []byte("·") - dot = []byte(".") - slash = []byte("/") -) - -// Recovery returns a middleware that recovers from any panics and writes a 500 if there was one. -func Recovery() HandlerFunc { - return RecoveryWithWriter(DefaultErrorWriter) -} - -// RecoveryWithWriter returns a middleware for a given writer that recovers from any panics and writes a 500 if there was one. -func RecoveryWithWriter(out io.Writer) HandlerFunc { - var logger *log.Logger - if out != nil { - logger = log.New(out, "\n\n\x1b[31m", log.LstdFlags) - } - return func(c *Context) { - defer func() { - if err := recover(); err != nil { - // Check for a broken connection, as it is not really a - // condition that warrants a panic stack trace. - var brokenPipe bool - if ne, ok := err.(*net.OpError); ok { - if se, ok := ne.Err.(*os.SyscallError); ok { - if strings.Contains(strings.ToLower(se.Error()), "broken pipe") || strings.Contains(strings.ToLower(se.Error()), "connection reset by peer") { - brokenPipe = true - } - } - } - if logger != nil { - stack := stack(3) - httpRequest, _ := httputil.DumpRequest(c.Request, false) - headers := strings.Split(string(httpRequest), "\r\n") - for idx, header := range headers { - current := strings.Split(header, ":") - if current[0] == "Authorization" { - headers[idx] = current[0] + ": *" - } - } - if brokenPipe { - logger.Printf("%s\n%s%s", err, string(httpRequest), reset) - } else if IsDebugging() { - logger.Printf("[Recovery] %s panic recovered:\n%s\n%s\n%s%s", - timeFormat(time.Now()), strings.Join(headers, "\r\n"), err, stack, reset) - } else { - logger.Printf("[Recovery] %s panic recovered:\n%s\n%s%s", - timeFormat(time.Now()), err, stack, reset) - } - } - - // If the connection is dead, we can't write a status to it. - if brokenPipe { - c.Error(err.(error)) // nolint: errcheck - c.Abort() - } else { - c.AbortWithStatus(http.StatusInternalServerError) - } - } - }() - c.Next() - } -} - -// stack returns a nicely formatted stack frame, skipping skip frames. -func stack(skip int) []byte { - buf := new(bytes.Buffer) // the returned data - // As we loop, we open files and read them. These variables record the currently - // loaded file. - var lines [][]byte - var lastFile string - for i := skip; ; i++ { // Skip the expected number of frames - pc, file, line, ok := runtime.Caller(i) - if !ok { - break - } - // Print this much at least. If we can't find the source, it won't show. - fmt.Fprintf(buf, "%s:%d (0x%x)\n", file, line, pc) - if file != lastFile { - data, err := ioutil.ReadFile(file) - if err != nil { - continue - } - lines = bytes.Split(data, []byte{'\n'}) - lastFile = file - } - fmt.Fprintf(buf, "\t%s: %s\n", function(pc), source(lines, line)) - } - return buf.Bytes() -} - -// source returns a space-trimmed slice of the n'th line. -func source(lines [][]byte, n int) []byte { - n-- // in stack trace, lines are 1-indexed but our array is 0-indexed - if n < 0 || n >= len(lines) { - return dunno - } - return bytes.TrimSpace(lines[n]) -} - -// function returns, if possible, the name of the function containing the PC. -func function(pc uintptr) []byte { - fn := runtime.FuncForPC(pc) - if fn == nil { - return dunno - } - name := []byte(fn.Name()) - // The name includes the path name to the package, which is unnecessary - // since the file name is already included. Plus, it has center dots. - // That is, we see - // runtime/debug.*T·ptrmethod - // and want - // *T.ptrmethod - // Also the package path might contains dot (e.g. code.google.com/...), - // so first eliminate the path prefix - if lastSlash := bytes.LastIndex(name, slash); lastSlash >= 0 { - name = name[lastSlash+1:] - } - if period := bytes.Index(name, dot); period >= 0 { - name = name[period+1:] - } - name = bytes.Replace(name, centerDot, dot, -1) - return name -} - -func timeFormat(t time.Time) string { - var timeString = t.Format("2006/01/02 - 15:04:05") - return timeString -} diff --git a/vendor/github.com/gin-gonic/gin/render/data.go b/vendor/github.com/gin-gonic/gin/render/data.go deleted file mode 100644 index 6ba657b..0000000 --- a/vendor/github.com/gin-gonic/gin/render/data.go +++ /dev/null @@ -1,25 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import "net/http" - -// Data contains ContentType and bytes data. -type Data struct { - ContentType string - Data []byte -} - -// Render (Data) writes data with custom ContentType. -func (r Data) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - _, err = w.Write(r.Data) - return -} - -// WriteContentType (Data) writes custom ContentType. -func (r Data) WriteContentType(w http.ResponseWriter) { - writeContentType(w, []string{r.ContentType}) -} diff --git a/vendor/github.com/gin-gonic/gin/render/html.go b/vendor/github.com/gin-gonic/gin/render/html.go deleted file mode 100644 index 6696ece..0000000 --- a/vendor/github.com/gin-gonic/gin/render/html.go +++ /dev/null @@ -1,92 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "html/template" - "net/http" -) - -// Delims represents a set of Left and Right delimiters for HTML template rendering. -type Delims struct { - // Left delimiter, defaults to {{. - Left string - // Right delimiter, defaults to }}. - Right string -} - -// HTMLRender interface is to be implemented by HTMLProduction and HTMLDebug. -type HTMLRender interface { - // Instance returns an HTML instance. - Instance(string, interface{}) Render -} - -// HTMLProduction contains template reference and its delims. -type HTMLProduction struct { - Template *template.Template - Delims Delims -} - -// HTMLDebug contains template delims and pattern and function with file list. -type HTMLDebug struct { - Files []string - Glob string - Delims Delims - FuncMap template.FuncMap -} - -// HTML contains template reference and its name with given interface object. -type HTML struct { - Template *template.Template - Name string - Data interface{} -} - -var htmlContentType = []string{"text/html; charset=utf-8"} - -// Instance (HTMLProduction) returns an HTML instance which it realizes Render interface. -func (r HTMLProduction) Instance(name string, data interface{}) Render { - return HTML{ - Template: r.Template, - Name: name, - Data: data, - } -} - -// Instance (HTMLDebug) returns an HTML instance which it realizes Render interface. -func (r HTMLDebug) Instance(name string, data interface{}) Render { - return HTML{ - Template: r.loadTemplate(), - Name: name, - Data: data, - } -} -func (r HTMLDebug) loadTemplate() *template.Template { - if r.FuncMap == nil { - r.FuncMap = template.FuncMap{} - } - if len(r.Files) > 0 { - return template.Must(template.New("").Delims(r.Delims.Left, r.Delims.Right).Funcs(r.FuncMap).ParseFiles(r.Files...)) - } - if r.Glob != "" { - return template.Must(template.New("").Delims(r.Delims.Left, r.Delims.Right).Funcs(r.FuncMap).ParseGlob(r.Glob)) - } - panic("the HTML debug render was created without files or glob pattern") -} - -// Render (HTML) executes template and writes its result with custom ContentType for response. -func (r HTML) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - - if r.Name == "" { - return r.Template.Execute(w, r.Data) - } - return r.Template.ExecuteTemplate(w, r.Name, r.Data) -} - -// WriteContentType (HTML) writes HTML ContentType. -func (r HTML) WriteContentType(w http.ResponseWriter) { - writeContentType(w, htmlContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/json.go b/vendor/github.com/gin-gonic/gin/render/json.go deleted file mode 100644 index 18f27fa..0000000 --- a/vendor/github.com/gin-gonic/gin/render/json.go +++ /dev/null @@ -1,194 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "bytes" - "fmt" - "html/template" - "net/http" - - "github.com/gin-gonic/gin/internal/json" -) - -// JSON contains the given interface object. -type JSON struct { - Data interface{} -} - -// IndentedJSON contains the given interface object. -type IndentedJSON struct { - Data interface{} -} - -// SecureJSON contains the given interface object and its prefix. -type SecureJSON struct { - Prefix string - Data interface{} -} - -// JsonpJSON contains the given interface object its callback. -type JsonpJSON struct { - Callback string - Data interface{} -} - -// AsciiJSON contains the given interface object. -type AsciiJSON struct { - Data interface{} -} - -// SecureJSONPrefix is a string which represents SecureJSON prefix. -type SecureJSONPrefix string - -// PureJSON contains the given interface object. -type PureJSON struct { - Data interface{} -} - -var jsonContentType = []string{"application/json; charset=utf-8"} -var jsonpContentType = []string{"application/javascript; charset=utf-8"} -var jsonAsciiContentType = []string{"application/json"} - -// Render (JSON) writes data with custom ContentType. -func (r JSON) Render(w http.ResponseWriter) (err error) { - if err = WriteJSON(w, r.Data); err != nil { - panic(err) - } - return -} - -// WriteContentType (JSON) writes JSON ContentType. -func (r JSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} - -// WriteJSON marshals the given interface object and writes it with custom ContentType. -func WriteJSON(w http.ResponseWriter, obj interface{}) error { - writeContentType(w, jsonContentType) - jsonBytes, err := json.Marshal(obj) - if err != nil { - return err - } - _, err = w.Write(jsonBytes) - return err -} - -// Render (IndentedJSON) marshals the given interface object and writes it with custom ContentType. -func (r IndentedJSON) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - jsonBytes, err := json.MarshalIndent(r.Data, "", " ") - if err != nil { - return err - } - _, err = w.Write(jsonBytes) - return err -} - -// WriteContentType (IndentedJSON) writes JSON ContentType. -func (r IndentedJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} - -// Render (SecureJSON) marshals the given interface object and writes it with custom ContentType. -func (r SecureJSON) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - jsonBytes, err := json.Marshal(r.Data) - if err != nil { - return err - } - // if the jsonBytes is array values - if bytes.HasPrefix(jsonBytes, []byte("[")) && bytes.HasSuffix(jsonBytes, []byte("]")) { - _, err = w.Write([]byte(r.Prefix)) - if err != nil { - return err - } - } - _, err = w.Write(jsonBytes) - return err -} - -// WriteContentType (SecureJSON) writes JSON ContentType. -func (r SecureJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} - -// Render (JsonpJSON) marshals the given interface object and writes it and its callback with custom ContentType. -func (r JsonpJSON) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - ret, err := json.Marshal(r.Data) - if err != nil { - return err - } - - if r.Callback == "" { - _, err = w.Write(ret) - return err - } - - callback := template.JSEscapeString(r.Callback) - _, err = w.Write([]byte(callback)) - if err != nil { - return err - } - _, err = w.Write([]byte("(")) - if err != nil { - return err - } - _, err = w.Write(ret) - if err != nil { - return err - } - _, err = w.Write([]byte(")")) - if err != nil { - return err - } - - return nil -} - -// WriteContentType (JsonpJSON) writes Javascript ContentType. -func (r JsonpJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonpContentType) -} - -// Render (AsciiJSON) marshals the given interface object and writes it with custom ContentType. -func (r AsciiJSON) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - ret, err := json.Marshal(r.Data) - if err != nil { - return err - } - - var buffer bytes.Buffer - for _, r := range string(ret) { - cvt := string(r) - if r >= 128 { - cvt = fmt.Sprintf("\\u%04x", int64(r)) - } - buffer.WriteString(cvt) - } - - _, err = w.Write(buffer.Bytes()) - return err -} - -// WriteContentType (AsciiJSON) writes JSON ContentType. -func (r AsciiJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonAsciiContentType) -} - -// Render (PureJSON) writes custom ContentType and encodes the given interface object. -func (r PureJSON) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - encoder := json.NewEncoder(w) - encoder.SetEscapeHTML(false) - return encoder.Encode(r.Data) -} - -// WriteContentType (PureJSON) writes custom ContentType. -func (r PureJSON) WriteContentType(w http.ResponseWriter) { - writeContentType(w, jsonContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/msgpack.go b/vendor/github.com/gin-gonic/gin/render/msgpack.go deleted file mode 100644 index dc681fc..0000000 --- a/vendor/github.com/gin-gonic/gin/render/msgpack.go +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "net/http" - - "github.com/ugorji/go/codec" -) - -// MsgPack contains the given interface object. -type MsgPack struct { - Data interface{} -} - -var msgpackContentType = []string{"application/msgpack; charset=utf-8"} - -// WriteContentType (MsgPack) writes MsgPack ContentType. -func (r MsgPack) WriteContentType(w http.ResponseWriter) { - writeContentType(w, msgpackContentType) -} - -// Render (MsgPack) encodes the given interface object and writes data with custom ContentType. -func (r MsgPack) Render(w http.ResponseWriter) error { - return WriteMsgPack(w, r.Data) -} - -// WriteMsgPack writes MsgPack ContentType and encodes the given interface object. -func WriteMsgPack(w http.ResponseWriter, obj interface{}) error { - writeContentType(w, msgpackContentType) - var mh codec.MsgpackHandle - return codec.NewEncoder(w, &mh).Encode(obj) -} diff --git a/vendor/github.com/gin-gonic/gin/render/protobuf.go b/vendor/github.com/gin-gonic/gin/render/protobuf.go deleted file mode 100644 index 15aca99..0000000 --- a/vendor/github.com/gin-gonic/gin/render/protobuf.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "net/http" - - "github.com/golang/protobuf/proto" -) - -// ProtoBuf contains the given interface object. -type ProtoBuf struct { - Data interface{} -} - -var protobufContentType = []string{"application/x-protobuf"} - -// Render (ProtoBuf) marshals the given interface object and writes data with custom ContentType. -func (r ProtoBuf) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - - bytes, err := proto.Marshal(r.Data.(proto.Message)) - if err != nil { - return err - } - - _, err = w.Write(bytes) - return err -} - -// WriteContentType (ProtoBuf) writes ProtoBuf ContentType. -func (r ProtoBuf) WriteContentType(w http.ResponseWriter) { - writeContentType(w, protobufContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/reader.go b/vendor/github.com/gin-gonic/gin/render/reader.go deleted file mode 100644 index 312af74..0000000 --- a/vendor/github.com/gin-gonic/gin/render/reader.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "io" - "net/http" - "strconv" -) - -// Reader contains the IO reader and its length, and custom ContentType and other headers. -type Reader struct { - ContentType string - ContentLength int64 - Reader io.Reader - Headers map[string]string -} - -// Render (Reader) writes data with custom ContentType and headers. -func (r Reader) Render(w http.ResponseWriter) (err error) { - r.WriteContentType(w) - r.Headers["Content-Length"] = strconv.FormatInt(r.ContentLength, 10) - r.writeHeaders(w, r.Headers) - _, err = io.Copy(w, r.Reader) - return -} - -// WriteContentType (Reader) writes custom ContentType. -func (r Reader) WriteContentType(w http.ResponseWriter) { - writeContentType(w, []string{r.ContentType}) -} - -// writeHeaders writes custom Header. -func (r Reader) writeHeaders(w http.ResponseWriter, headers map[string]string) { - header := w.Header() - for k, v := range headers { - if header.Get(k) == "" { - header.Set(k, v) - } - } -} diff --git a/vendor/github.com/gin-gonic/gin/render/redirect.go b/vendor/github.com/gin-gonic/gin/render/redirect.go deleted file mode 100644 index c006691..0000000 --- a/vendor/github.com/gin-gonic/gin/render/redirect.go +++ /dev/null @@ -1,29 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "fmt" - "net/http" -) - -// Redirect contains the http request reference and redirects status code and location. -type Redirect struct { - Code int - Request *http.Request - Location string -} - -// Render (Redirect) redirects the http request to new location and writes redirect response. -func (r Redirect) Render(w http.ResponseWriter) error { - if (r.Code < http.StatusMultipleChoices || r.Code > http.StatusPermanentRedirect) && r.Code != http.StatusCreated { - panic(fmt.Sprintf("Cannot redirect with status code %d", r.Code)) - } - http.Redirect(w, r.Request, r.Location, r.Code) - return nil -} - -// WriteContentType (Redirect) don't write any ContentType. -func (r Redirect) WriteContentType(http.ResponseWriter) {} diff --git a/vendor/github.com/gin-gonic/gin/render/render.go b/vendor/github.com/gin-gonic/gin/render/render.go deleted file mode 100644 index abfc79f..0000000 --- a/vendor/github.com/gin-gonic/gin/render/render.go +++ /dev/null @@ -1,41 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import "net/http" - -// Render interface is to be implemented by JSON, XML, HTML, YAML and so on. -type Render interface { - // Render writes data with custom ContentType. - Render(http.ResponseWriter) error - // WriteContentType writes custom ContentType. - WriteContentType(w http.ResponseWriter) -} - -var ( - _ Render = JSON{} - _ Render = IndentedJSON{} - _ Render = SecureJSON{} - _ Render = JsonpJSON{} - _ Render = XML{} - _ Render = String{} - _ Render = Redirect{} - _ Render = Data{} - _ Render = HTML{} - _ HTMLRender = HTMLDebug{} - _ HTMLRender = HTMLProduction{} - _ Render = YAML{} - _ Render = MsgPack{} - _ Render = Reader{} - _ Render = AsciiJSON{} - _ Render = ProtoBuf{} -) - -func writeContentType(w http.ResponseWriter, value []string) { - header := w.Header() - if val := header["Content-Type"]; len(val) == 0 { - header["Content-Type"] = value - } -} diff --git a/vendor/github.com/gin-gonic/gin/render/text.go b/vendor/github.com/gin-gonic/gin/render/text.go deleted file mode 100644 index 4e52d4c..0000000 --- a/vendor/github.com/gin-gonic/gin/render/text.go +++ /dev/null @@ -1,40 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "fmt" - "io" - "net/http" -) - -// String contains the given interface object slice and its format. -type String struct { - Format string - Data []interface{} -} - -var plainContentType = []string{"text/plain; charset=utf-8"} - -// Render (String) writes data with custom ContentType. -func (r String) Render(w http.ResponseWriter) error { - return WriteString(w, r.Format, r.Data) -} - -// WriteContentType (String) writes Plain ContentType. -func (r String) WriteContentType(w http.ResponseWriter) { - writeContentType(w, plainContentType) -} - -// WriteString writes data according to its format and write custom ContentType. -func WriteString(w http.ResponseWriter, format string, data []interface{}) (err error) { - writeContentType(w, plainContentType) - if len(data) > 0 { - _, err = fmt.Fprintf(w, format, data...) - return - } - _, err = io.WriteString(w, format) - return -} diff --git a/vendor/github.com/gin-gonic/gin/render/xml.go b/vendor/github.com/gin-gonic/gin/render/xml.go deleted file mode 100644 index cc5390a..0000000 --- a/vendor/github.com/gin-gonic/gin/render/xml.go +++ /dev/null @@ -1,28 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "encoding/xml" - "net/http" -) - -// XML contains the given interface object. -type XML struct { - Data interface{} -} - -var xmlContentType = []string{"application/xml; charset=utf-8"} - -// Render (XML) encodes the given interface object and writes data with custom ContentType. -func (r XML) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - return xml.NewEncoder(w).Encode(r.Data) -} - -// WriteContentType (XML) writes XML ContentType for response. -func (r XML) WriteContentType(w http.ResponseWriter) { - writeContentType(w, xmlContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/render/yaml.go b/vendor/github.com/gin-gonic/gin/render/yaml.go deleted file mode 100644 index 0df7836..0000000 --- a/vendor/github.com/gin-gonic/gin/render/yaml.go +++ /dev/null @@ -1,36 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package render - -import ( - "net/http" - - "gopkg.in/yaml.v2" -) - -// YAML contains the given interface object. -type YAML struct { - Data interface{} -} - -var yamlContentType = []string{"application/x-yaml; charset=utf-8"} - -// Render (YAML) marshals the given interface object and writes data with custom ContentType. -func (r YAML) Render(w http.ResponseWriter) error { - r.WriteContentType(w) - - bytes, err := yaml.Marshal(r.Data) - if err != nil { - return err - } - - _, err = w.Write(bytes) - return err -} - -// WriteContentType (YAML) writes YAML ContentType for response. -func (r YAML) WriteContentType(w http.ResponseWriter) { - writeContentType(w, yamlContentType) -} diff --git a/vendor/github.com/gin-gonic/gin/response_writer.go b/vendor/github.com/gin-gonic/gin/response_writer.go deleted file mode 100644 index 2682668..0000000 --- a/vendor/github.com/gin-gonic/gin/response_writer.go +++ /dev/null @@ -1,126 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "bufio" - "io" - "net" - "net/http" -) - -const ( - noWritten = -1 - defaultStatus = http.StatusOK -) - -// ResponseWriter ... -type ResponseWriter interface { - http.ResponseWriter - http.Hijacker - http.Flusher - http.CloseNotifier - - // Returns the HTTP response status code of the current request. - Status() int - - // Returns the number of bytes already written into the response http body. - // See Written() - Size() int - - // Writes the string into the response body. - WriteString(string) (int, error) - - // Returns true if the response body was already written. - Written() bool - - // Forces to write the http header (status code + headers). - WriteHeaderNow() - - // get the http.Pusher for server push - Pusher() http.Pusher -} - -type responseWriter struct { - http.ResponseWriter - size int - status int -} - -var _ ResponseWriter = &responseWriter{} - -func (w *responseWriter) reset(writer http.ResponseWriter) { - w.ResponseWriter = writer - w.size = noWritten - w.status = defaultStatus -} - -func (w *responseWriter) WriteHeader(code int) { - if code > 0 && w.status != code { - if w.Written() { - debugPrint("[WARNING] Headers were already written. Wanted to override status code %d with %d", w.status, code) - } - w.status = code - } -} - -func (w *responseWriter) WriteHeaderNow() { - if !w.Written() { - w.size = 0 - w.ResponseWriter.WriteHeader(w.status) - } -} - -func (w *responseWriter) Write(data []byte) (n int, err error) { - w.WriteHeaderNow() - n, err = w.ResponseWriter.Write(data) - w.size += n - return -} - -func (w *responseWriter) WriteString(s string) (n int, err error) { - w.WriteHeaderNow() - n, err = io.WriteString(w.ResponseWriter, s) - w.size += n - return -} - -func (w *responseWriter) Status() int { - return w.status -} - -func (w *responseWriter) Size() int { - return w.size -} - -func (w *responseWriter) Written() bool { - return w.size != noWritten -} - -// Hijack implements the http.Hijacker interface. -func (w *responseWriter) Hijack() (net.Conn, *bufio.ReadWriter, error) { - if w.size < 0 { - w.size = 0 - } - return w.ResponseWriter.(http.Hijacker).Hijack() -} - -// CloseNotify implements the http.CloseNotify interface. -func (w *responseWriter) CloseNotify() <-chan bool { - return w.ResponseWriter.(http.CloseNotifier).CloseNotify() -} - -// Flush implements the http.Flush interface. -func (w *responseWriter) Flush() { - w.WriteHeaderNow() - w.ResponseWriter.(http.Flusher).Flush() -} - -func (w *responseWriter) Pusher() (pusher http.Pusher) { - if pusher, ok := w.ResponseWriter.(http.Pusher); ok { - return pusher - } - return nil -} diff --git a/vendor/github.com/gin-gonic/gin/routergroup.go b/vendor/github.com/gin-gonic/gin/routergroup.go deleted file mode 100644 index a1e6c92..0000000 --- a/vendor/github.com/gin-gonic/gin/routergroup.go +++ /dev/null @@ -1,228 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "net/http" - "path" - "regexp" - "strings" -) - -// IRouter defines all router handle interface includes single and group router. -type IRouter interface { - IRoutes - Group(string, ...HandlerFunc) *RouterGroup -} - -// IRoutes defines all router handle interface. -type IRoutes interface { - Use(...HandlerFunc) IRoutes - - Handle(string, string, ...HandlerFunc) IRoutes - Any(string, ...HandlerFunc) IRoutes - GET(string, ...HandlerFunc) IRoutes - POST(string, ...HandlerFunc) IRoutes - DELETE(string, ...HandlerFunc) IRoutes - PATCH(string, ...HandlerFunc) IRoutes - PUT(string, ...HandlerFunc) IRoutes - OPTIONS(string, ...HandlerFunc) IRoutes - HEAD(string, ...HandlerFunc) IRoutes - - StaticFile(string, string) IRoutes - Static(string, string) IRoutes - StaticFS(string, http.FileSystem) IRoutes -} - -// RouterGroup is used internally to configure router, a RouterGroup is associated with -// a prefix and an array of handlers (middleware). -type RouterGroup struct { - Handlers HandlersChain - basePath string - engine *Engine - root bool -} - -var _ IRouter = &RouterGroup{} - -// Use adds middleware to the group, see example code in GitHub. -func (group *RouterGroup) Use(middleware ...HandlerFunc) IRoutes { - group.Handlers = append(group.Handlers, middleware...) - return group.returnObj() -} - -// Group creates a new router group. You should add all the routes that have common middlewares or the same path prefix. -// For example, all the routes that use a common middleware for authorization could be grouped. -func (group *RouterGroup) Group(relativePath string, handlers ...HandlerFunc) *RouterGroup { - return &RouterGroup{ - Handlers: group.combineHandlers(handlers), - basePath: group.calculateAbsolutePath(relativePath), - engine: group.engine, - } -} - -// BasePath returns the base path of router group. -// For example, if v := router.Group("/rest/n/v1/api"), v.BasePath() is "/rest/n/v1/api". -func (group *RouterGroup) BasePath() string { - return group.basePath -} - -func (group *RouterGroup) handle(httpMethod, relativePath string, handlers HandlersChain) IRoutes { - absolutePath := group.calculateAbsolutePath(relativePath) - handlers = group.combineHandlers(handlers) - group.engine.addRoute(httpMethod, absolutePath, handlers) - return group.returnObj() -} - -// Handle registers a new request handle and middleware with the given path and method. -// The last handler should be the real handler, the other ones should be middleware that can and should be shared among different routes. -// See the example code in GitHub. -// -// For GET, POST, PUT, PATCH and DELETE requests the respective shortcut -// functions can be used. -// -// This function is intended for bulk loading and to allow the usage of less -// frequently used, non-standardized or custom methods (e.g. for internal -// communication with a proxy). -func (group *RouterGroup) Handle(httpMethod, relativePath string, handlers ...HandlerFunc) IRoutes { - if matches, err := regexp.MatchString("^[A-Z]+$", httpMethod); !matches || err != nil { - panic("http method " + httpMethod + " is not valid") - } - return group.handle(httpMethod, relativePath, handlers) -} - -// POST is a shortcut for router.Handle("POST", path, handle). -func (group *RouterGroup) POST(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle("POST", relativePath, handlers) -} - -// GET is a shortcut for router.Handle("GET", path, handle). -func (group *RouterGroup) GET(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle("GET", relativePath, handlers) -} - -// DELETE is a shortcut for router.Handle("DELETE", path, handle). -func (group *RouterGroup) DELETE(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle("DELETE", relativePath, handlers) -} - -// PATCH is a shortcut for router.Handle("PATCH", path, handle). -func (group *RouterGroup) PATCH(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle("PATCH", relativePath, handlers) -} - -// PUT is a shortcut for router.Handle("PUT", path, handle). -func (group *RouterGroup) PUT(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle("PUT", relativePath, handlers) -} - -// OPTIONS is a shortcut for router.Handle("OPTIONS", path, handle). -func (group *RouterGroup) OPTIONS(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle("OPTIONS", relativePath, handlers) -} - -// HEAD is a shortcut for router.Handle("HEAD", path, handle). -func (group *RouterGroup) HEAD(relativePath string, handlers ...HandlerFunc) IRoutes { - return group.handle("HEAD", relativePath, handlers) -} - -// Any registers a route that matches all the HTTP methods. -// GET, POST, PUT, PATCH, HEAD, OPTIONS, DELETE, CONNECT, TRACE. -func (group *RouterGroup) Any(relativePath string, handlers ...HandlerFunc) IRoutes { - group.handle("GET", relativePath, handlers) - group.handle("POST", relativePath, handlers) - group.handle("PUT", relativePath, handlers) - group.handle("PATCH", relativePath, handlers) - group.handle("HEAD", relativePath, handlers) - group.handle("OPTIONS", relativePath, handlers) - group.handle("DELETE", relativePath, handlers) - group.handle("CONNECT", relativePath, handlers) - group.handle("TRACE", relativePath, handlers) - return group.returnObj() -} - -// StaticFile registers a single route in order to serve a single file of the local filesystem. -// router.StaticFile("favicon.ico", "./resources/favicon.ico") -func (group *RouterGroup) StaticFile(relativePath, filepath string) IRoutes { - if strings.Contains(relativePath, ":") || strings.Contains(relativePath, "*") { - panic("URL parameters can not be used when serving a static file") - } - handler := func(c *Context) { - c.File(filepath) - } - group.GET(relativePath, handler) - group.HEAD(relativePath, handler) - return group.returnObj() -} - -// Static serves files from the given file system root. -// Internally a http.FileServer is used, therefore http.NotFound is used instead -// of the Router's NotFound handler. -// To use the operating system's file system implementation, -// use : -// router.Static("/static", "/var/www") -func (group *RouterGroup) Static(relativePath, root string) IRoutes { - return group.StaticFS(relativePath, Dir(root, false)) -} - -// StaticFS works just like `Static()` but a custom `http.FileSystem` can be used instead. -// Gin by default user: gin.Dir() -func (group *RouterGroup) StaticFS(relativePath string, fs http.FileSystem) IRoutes { - if strings.Contains(relativePath, ":") || strings.Contains(relativePath, "*") { - panic("URL parameters can not be used when serving a static folder") - } - handler := group.createStaticHandler(relativePath, fs) - urlPattern := path.Join(relativePath, "/*filepath") - - // Register GET and HEAD handlers - group.GET(urlPattern, handler) - group.HEAD(urlPattern, handler) - return group.returnObj() -} - -func (group *RouterGroup) createStaticHandler(relativePath string, fs http.FileSystem) HandlerFunc { - absolutePath := group.calculateAbsolutePath(relativePath) - fileServer := http.StripPrefix(absolutePath, http.FileServer(fs)) - - return func(c *Context) { - if _, nolisting := fs.(*onlyfilesFS); nolisting { - c.Writer.WriteHeader(http.StatusNotFound) - } - - file := c.Param("filepath") - // Check if file exists and/or if we have permission to access it - if _, err := fs.Open(file); err != nil { - c.Writer.WriteHeader(http.StatusNotFound) - c.handlers = group.engine.noRoute - // Reset index - c.index = -1 - return - } - - fileServer.ServeHTTP(c.Writer, c.Request) - } -} - -func (group *RouterGroup) combineHandlers(handlers HandlersChain) HandlersChain { - finalSize := len(group.Handlers) + len(handlers) - if finalSize >= int(abortIndex) { - panic("too many handlers") - } - mergedHandlers := make(HandlersChain, finalSize) - copy(mergedHandlers, group.Handlers) - copy(mergedHandlers[len(group.Handlers):], handlers) - return mergedHandlers -} - -func (group *RouterGroup) calculateAbsolutePath(relativePath string) string { - return joinPaths(group.basePath, relativePath) -} - -func (group *RouterGroup) returnObj() IRoutes { - if group.root { - return group.engine - } - return group -} diff --git a/vendor/github.com/gin-gonic/gin/test_helpers.go b/vendor/github.com/gin-gonic/gin/test_helpers.go deleted file mode 100644 index 3a7a5dd..0000000 --- a/vendor/github.com/gin-gonic/gin/test_helpers.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import "net/http" - -// CreateTestContext returns a fresh engine and context for testing purposes -func CreateTestContext(w http.ResponseWriter) (c *Context, r *Engine) { - r = New() - c = r.allocateContext() - c.reset() - c.writermem.reset(w) - return -} diff --git a/vendor/github.com/gin-gonic/gin/tree.go b/vendor/github.com/gin-gonic/gin/tree.go deleted file mode 100644 index ada62ce..0000000 --- a/vendor/github.com/gin-gonic/gin/tree.go +++ /dev/null @@ -1,627 +0,0 @@ -// Copyright 2013 Julien Schmidt. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be found -// at https://github.com/julienschmidt/httprouter/blob/master/LICENSE - -package gin - -import ( - "net/url" - "strings" - "unicode" -) - -// Param is a single URL parameter, consisting of a key and a value. -type Param struct { - Key string - Value string -} - -// Params is a Param-slice, as returned by the router. -// The slice is ordered, the first URL parameter is also the first slice value. -// It is therefore safe to read values by the index. -type Params []Param - -// Get returns the value of the first Param which key matches the given name. -// If no matching Param is found, an empty string is returned. -func (ps Params) Get(name string) (string, bool) { - for _, entry := range ps { - if entry.Key == name { - return entry.Value, true - } - } - return "", false -} - -// ByName returns the value of the first Param which key matches the given name. -// If no matching Param is found, an empty string is returned. -func (ps Params) ByName(name string) (va string) { - va, _ = ps.Get(name) - return -} - -type methodTree struct { - method string - root *node -} - -type methodTrees []methodTree - -func (trees methodTrees) get(method string) *node { - for _, tree := range trees { - if tree.method == method { - return tree.root - } - } - return nil -} - -func min(a, b int) int { - if a <= b { - return a - } - return b -} - -func countParams(path string) uint8 { - var n uint - for i := 0; i < len(path); i++ { - if path[i] != ':' && path[i] != '*' { - continue - } - n++ - } - if n >= 255 { - return 255 - } - return uint8(n) -} - -type nodeType uint8 - -const ( - static nodeType = iota // default - root - param - catchAll -) - -type node struct { - path string - indices string - children []*node - handlers HandlersChain - priority uint32 - nType nodeType - maxParams uint8 - wildChild bool -} - -// increments priority of the given child and reorders if necessary. -func (n *node) incrementChildPrio(pos int) int { - n.children[pos].priority++ - prio := n.children[pos].priority - - // adjust position (move to front) - newPos := pos - for newPos > 0 && n.children[newPos-1].priority < prio { - // swap node positions - n.children[newPos-1], n.children[newPos] = n.children[newPos], n.children[newPos-1] - - newPos-- - } - - // build new index char string - if newPos != pos { - n.indices = n.indices[:newPos] + // unchanged prefix, might be empty - n.indices[pos:pos+1] + // the index char we move - n.indices[newPos:pos] + n.indices[pos+1:] // rest without char at 'pos' - } - - return newPos -} - -// addRoute adds a node with the given handle to the path. -// Not concurrency-safe! -func (n *node) addRoute(path string, handlers HandlersChain) { - fullPath := path - n.priority++ - numParams := countParams(path) - - // non-empty tree - if len(n.path) > 0 || len(n.children) > 0 { - walk: - for { - // Update maxParams of the current node - if numParams > n.maxParams { - n.maxParams = numParams - } - - // Find the longest common prefix. - // This also implies that the common prefix contains no ':' or '*' - // since the existing key can't contain those chars. - i := 0 - max := min(len(path), len(n.path)) - for i < max && path[i] == n.path[i] { - i++ - } - - // Split edge - if i < len(n.path) { - child := node{ - path: n.path[i:], - wildChild: n.wildChild, - indices: n.indices, - children: n.children, - handlers: n.handlers, - priority: n.priority - 1, - } - - // Update maxParams (max of all children) - for i := range child.children { - if child.children[i].maxParams > child.maxParams { - child.maxParams = child.children[i].maxParams - } - } - - n.children = []*node{&child} - // []byte for proper unicode char conversion, see #65 - n.indices = string([]byte{n.path[i]}) - n.path = path[:i] - n.handlers = nil - n.wildChild = false - } - - // Make new node a child of this node - if i < len(path) { - path = path[i:] - - if n.wildChild { - n = n.children[0] - n.priority++ - - // Update maxParams of the child node - if numParams > n.maxParams { - n.maxParams = numParams - } - numParams-- - - // Check if the wildcard matches - if len(path) >= len(n.path) && n.path == path[:len(n.path)] { - // check for longer wildcard, e.g. :name and :names - if len(n.path) >= len(path) || path[len(n.path)] == '/' { - continue walk - } - } - - pathSeg := path - if n.nType != catchAll { - pathSeg = strings.SplitN(path, "/", 2)[0] - } - prefix := fullPath[:strings.Index(fullPath, pathSeg)] + n.path - panic("'" + pathSeg + - "' in new path '" + fullPath + - "' conflicts with existing wildcard '" + n.path + - "' in existing prefix '" + prefix + - "'") - } - - c := path[0] - - // slash after param - if n.nType == param && c == '/' && len(n.children) == 1 { - n = n.children[0] - n.priority++ - continue walk - } - - // Check if a child with the next path byte exists - for i := 0; i < len(n.indices); i++ { - if c == n.indices[i] { - i = n.incrementChildPrio(i) - n = n.children[i] - continue walk - } - } - - // Otherwise insert it - if c != ':' && c != '*' { - // []byte for proper unicode char conversion, see #65 - n.indices += string([]byte{c}) - child := &node{ - maxParams: numParams, - } - n.children = append(n.children, child) - n.incrementChildPrio(len(n.indices) - 1) - n = child - } - n.insertChild(numParams, path, fullPath, handlers) - return - - } else if i == len(path) { // Make node a (in-path) leaf - if n.handlers != nil { - panic("handlers are already registered for path '" + fullPath + "'") - } - n.handlers = handlers - } - return - } - } else { // Empty tree - n.insertChild(numParams, path, fullPath, handlers) - n.nType = root - } -} - -func (n *node) insertChild(numParams uint8, path string, fullPath string, handlers HandlersChain) { - var offset int // already handled bytes of the path - - // find prefix until first wildcard (beginning with ':' or '*') - for i, max := 0, len(path); numParams > 0; i++ { - c := path[i] - if c != ':' && c != '*' { - continue - } - - // find wildcard end (either '/' or path end) - end := i + 1 - for end < max && path[end] != '/' { - switch path[end] { - // the wildcard name must not contain ':' and '*' - case ':', '*': - panic("only one wildcard per path segment is allowed, has: '" + - path[i:] + "' in path '" + fullPath + "'") - default: - end++ - } - } - - // check if this Node existing children which would be - // unreachable if we insert the wildcard here - if len(n.children) > 0 { - panic("wildcard route '" + path[i:end] + - "' conflicts with existing children in path '" + fullPath + "'") - } - - // check if the wildcard has a name - if end-i < 2 { - panic("wildcards must be named with a non-empty name in path '" + fullPath + "'") - } - - if c == ':' { // param - // split path at the beginning of the wildcard - if i > 0 { - n.path = path[offset:i] - offset = i - } - - child := &node{ - nType: param, - maxParams: numParams, - } - n.children = []*node{child} - n.wildChild = true - n = child - n.priority++ - numParams-- - - // if the path doesn't end with the wildcard, then there - // will be another non-wildcard subpath starting with '/' - if end < max { - n.path = path[offset:end] - offset = end - - child := &node{ - maxParams: numParams, - priority: 1, - } - n.children = []*node{child} - n = child - } - - } else { // catchAll - if end != max || numParams > 1 { - panic("catch-all routes are only allowed at the end of the path in path '" + fullPath + "'") - } - - if len(n.path) > 0 && n.path[len(n.path)-1] == '/' { - panic("catch-all conflicts with existing handle for the path segment root in path '" + fullPath + "'") - } - - // currently fixed width 1 for '/' - i-- - if path[i] != '/' { - panic("no / before catch-all in path '" + fullPath + "'") - } - - n.path = path[offset:i] - - // first node: catchAll node with empty path - child := &node{ - wildChild: true, - nType: catchAll, - maxParams: 1, - } - n.children = []*node{child} - n.indices = string(path[i]) - n = child - n.priority++ - - // second node: node holding the variable - child = &node{ - path: path[i:], - nType: catchAll, - maxParams: 1, - handlers: handlers, - priority: 1, - } - n.children = []*node{child} - - return - } - } - - // insert remaining path part and handle to the leaf - n.path = path[offset:] - n.handlers = handlers -} - -// getValue returns the handle registered with the given path (key). The values of -// wildcards are saved to a map. -// If no handle can be found, a TSR (trailing slash redirect) recommendation is -// made if a handle exists with an extra (without the) trailing slash for the -// given path. -func (n *node) getValue(path string, po Params, unescape bool) (handlers HandlersChain, p Params, tsr bool) { - p = po -walk: // Outer loop for walking the tree - for { - if len(path) > len(n.path) { - if path[:len(n.path)] == n.path { - path = path[len(n.path):] - // If this node does not have a wildcard (param or catchAll) - // child, we can just look up the next child node and continue - // to walk down the tree - if !n.wildChild { - c := path[0] - for i := 0; i < len(n.indices); i++ { - if c == n.indices[i] { - n = n.children[i] - continue walk - } - } - - // Nothing found. - // We can recommend to redirect to the same URL without a - // trailing slash if a leaf exists for that path. - tsr = path == "/" && n.handlers != nil - return - } - - // handle wildcard child - n = n.children[0] - switch n.nType { - case param: - // find param end (either '/' or path end) - end := 0 - for end < len(path) && path[end] != '/' { - end++ - } - - // save param value - if cap(p) < int(n.maxParams) { - p = make(Params, 0, n.maxParams) - } - i := len(p) - p = p[:i+1] // expand slice within preallocated capacity - p[i].Key = n.path[1:] - val := path[:end] - if unescape { - var err error - if p[i].Value, err = url.QueryUnescape(val); err != nil { - p[i].Value = val // fallback, in case of error - } - } else { - p[i].Value = val - } - - // we need to go deeper! - if end < len(path) { - if len(n.children) > 0 { - path = path[end:] - n = n.children[0] - continue walk - } - - // ... but we can't - tsr = len(path) == end+1 - return - } - - if handlers = n.handlers; handlers != nil { - return - } - if len(n.children) == 1 { - // No handle found. Check if a handle for this path + a - // trailing slash exists for TSR recommendation - n = n.children[0] - tsr = n.path == "/" && n.handlers != nil - } - - return - - case catchAll: - // save param value - if cap(p) < int(n.maxParams) { - p = make(Params, 0, n.maxParams) - } - i := len(p) - p = p[:i+1] // expand slice within preallocated capacity - p[i].Key = n.path[2:] - if unescape { - var err error - if p[i].Value, err = url.QueryUnescape(path); err != nil { - p[i].Value = path // fallback, in case of error - } - } else { - p[i].Value = path - } - - handlers = n.handlers - return - - default: - panic("invalid node type") - } - } - } else if path == n.path { - // We should have reached the node containing the handle. - // Check if this node has a handle registered. - if handlers = n.handlers; handlers != nil { - return - } - - if path == "/" && n.wildChild && n.nType != root { - tsr = true - return - } - - // No handle found. Check if a handle for this path + a - // trailing slash exists for trailing slash recommendation - for i := 0; i < len(n.indices); i++ { - if n.indices[i] == '/' { - n = n.children[i] - tsr = (len(n.path) == 1 && n.handlers != nil) || - (n.nType == catchAll && n.children[0].handlers != nil) - return - } - } - - return - } - - // Nothing found. We can recommend to redirect to the same URL with an - // extra trailing slash if a leaf exists for that path - tsr = (path == "/") || - (len(n.path) == len(path)+1 && n.path[len(path)] == '/' && - path == n.path[:len(n.path)-1] && n.handlers != nil) - return - } -} - -// findCaseInsensitivePath makes a case-insensitive lookup of the given path and tries to find a handler. -// It can optionally also fix trailing slashes. -// It returns the case-corrected path and a bool indicating whether the lookup -// was successful. -func (n *node) findCaseInsensitivePath(path string, fixTrailingSlash bool) (ciPath []byte, found bool) { - ciPath = make([]byte, 0, len(path)+1) // preallocate enough memory - - // Outer loop for walking the tree - for len(path) >= len(n.path) && strings.ToLower(path[:len(n.path)]) == strings.ToLower(n.path) { - path = path[len(n.path):] - ciPath = append(ciPath, n.path...) - - if len(path) > 0 { - // If this node does not have a wildcard (param or catchAll) child, - // we can just look up the next child node and continue to walk down - // the tree - if !n.wildChild { - r := unicode.ToLower(rune(path[0])) - for i, index := range n.indices { - // must use recursive approach since both index and - // ToLower(index) could exist. We must check both. - if r == unicode.ToLower(index) { - out, found := n.children[i].findCaseInsensitivePath(path, fixTrailingSlash) - if found { - return append(ciPath, out...), true - } - } - } - - // Nothing found. We can recommend to redirect to the same URL - // without a trailing slash if a leaf exists for that path - found = fixTrailingSlash && path == "/" && n.handlers != nil - return - } - - n = n.children[0] - switch n.nType { - case param: - // find param end (either '/' or path end) - k := 0 - for k < len(path) && path[k] != '/' { - k++ - } - - // add param value to case insensitive path - ciPath = append(ciPath, path[:k]...) - - // we need to go deeper! - if k < len(path) { - if len(n.children) > 0 { - path = path[k:] - n = n.children[0] - continue - } - - // ... but we can't - if fixTrailingSlash && len(path) == k+1 { - return ciPath, true - } - return - } - - if n.handlers != nil { - return ciPath, true - } else if fixTrailingSlash && len(n.children) == 1 { - // No handle found. Check if a handle for this path + a - // trailing slash exists - n = n.children[0] - if n.path == "/" && n.handlers != nil { - return append(ciPath, '/'), true - } - } - return - - case catchAll: - return append(ciPath, path...), true - - default: - panic("invalid node type") - } - } else { - // We should have reached the node containing the handle. - // Check if this node has a handle registered. - if n.handlers != nil { - return ciPath, true - } - - // No handle found. - // Try to fix the path by adding a trailing slash - if fixTrailingSlash { - for i := 0; i < len(n.indices); i++ { - if n.indices[i] == '/' { - n = n.children[i] - if (len(n.path) == 1 && n.handlers != nil) || - (n.nType == catchAll && n.children[0].handlers != nil) { - return append(ciPath, '/'), true - } - return - } - } - } - return - } - } - - // Nothing found. - // Try to fix the path by adding / removing a trailing slash - if fixTrailingSlash { - if path == "/" { - return ciPath, true - } - if len(path)+1 == len(n.path) && n.path[len(path)] == '/' && - strings.ToLower(path) == strings.ToLower(n.path[:len(path)]) && - n.handlers != nil { - return append(ciPath, n.path...), true - } - } - return -} diff --git a/vendor/github.com/gin-gonic/gin/utils.go b/vendor/github.com/gin-gonic/gin/utils.go deleted file mode 100644 index f4532d5..0000000 --- a/vendor/github.com/gin-gonic/gin/utils.go +++ /dev/null @@ -1,151 +0,0 @@ -// Copyright 2014 Manu Martinez-Almeida. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -import ( - "encoding/xml" - "net/http" - "os" - "path" - "reflect" - "runtime" - "strings" -) - -// BindKey indicates a default bind key. -const BindKey = "_gin-gonic/gin/bindkey" - -// Bind is a helper function for given interface object and returns a Gin middleware. -func Bind(val interface{}) HandlerFunc { - value := reflect.ValueOf(val) - if value.Kind() == reflect.Ptr { - panic(`Bind struct can not be a pointer. Example: - Use: gin.Bind(Struct{}) instead of gin.Bind(&Struct{}) -`) - } - typ := value.Type() - - return func(c *Context) { - obj := reflect.New(typ).Interface() - if c.Bind(obj) == nil { - c.Set(BindKey, obj) - } - } -} - -// WrapF is a helper function for wrapping http.HandlerFunc and returns a Gin middleware. -func WrapF(f http.HandlerFunc) HandlerFunc { - return func(c *Context) { - f(c.Writer, c.Request) - } -} - -// WrapH is a helper function for wrapping http.Handler and returns a Gin middleware. -func WrapH(h http.Handler) HandlerFunc { - return func(c *Context) { - h.ServeHTTP(c.Writer, c.Request) - } -} - -// H is a shortcut for map[string]interface{} -type H map[string]interface{} - -// MarshalXML allows type H to be used with xml.Marshal. -func (h H) MarshalXML(e *xml.Encoder, start xml.StartElement) error { - start.Name = xml.Name{ - Space: "", - Local: "map", - } - if err := e.EncodeToken(start); err != nil { - return err - } - for key, value := range h { - elem := xml.StartElement{ - Name: xml.Name{Space: "", Local: key}, - Attr: []xml.Attr{}, - } - if err := e.EncodeElement(value, elem); err != nil { - return err - } - } - - return e.EncodeToken(xml.EndElement{Name: start.Name}) -} - -func assert1(guard bool, text string) { - if !guard { - panic(text) - } -} - -func filterFlags(content string) string { - for i, char := range content { - if char == ' ' || char == ';' { - return content[:i] - } - } - return content -} - -func chooseData(custom, wildcard interface{}) interface{} { - if custom == nil { - if wildcard == nil { - panic("negotiation config is invalid") - } - return wildcard - } - return custom -} - -func parseAccept(acceptHeader string) []string { - parts := strings.Split(acceptHeader, ",") - out := make([]string, 0, len(parts)) - for _, part := range parts { - if part = strings.TrimSpace(strings.Split(part, ";")[0]); part != "" { - out = append(out, part) - } - } - return out -} - -func lastChar(str string) uint8 { - if str == "" { - panic("The length of the string can't be 0") - } - return str[len(str)-1] -} - -func nameOfFunction(f interface{}) string { - return runtime.FuncForPC(reflect.ValueOf(f).Pointer()).Name() -} - -func joinPaths(absolutePath, relativePath string) string { - if relativePath == "" { - return absolutePath - } - - finalPath := path.Join(absolutePath, relativePath) - appendSlash := lastChar(relativePath) == '/' && lastChar(finalPath) != '/' - if appendSlash { - return finalPath + "/" - } - return finalPath -} - -func resolveAddress(addr []string) string { - switch len(addr) { - case 0: - if port := os.Getenv("PORT"); port != "" { - debugPrint("Environment variable PORT=\"%s\"", port) - return ":" + port - } - debugPrint("Environment variable PORT is undefined. Using port :8080 by default") - return ":8080" - case 1: - return addr[0] - default: - panic("too much parameters") - } -} diff --git a/vendor/github.com/gin-gonic/gin/version.go b/vendor/github.com/gin-gonic/gin/version.go deleted file mode 100644 index 07e7859..0000000 --- a/vendor/github.com/gin-gonic/gin/version.go +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2018 Gin Core Team. All rights reserved. -// Use of this source code is governed by a MIT style -// license that can be found in the LICENSE file. - -package gin - -// Version is the current gin framework's version. -const Version = "v1.4.0" diff --git a/vendor/github.com/gogo/protobuf/AUTHORS b/vendor/github.com/gogo/protobuf/AUTHORS deleted file mode 100644 index 3d97fc7..0000000 --- a/vendor/github.com/gogo/protobuf/AUTHORS +++ /dev/null @@ -1,15 +0,0 @@ -# This is the official list of GoGo authors for copyright purposes. -# This file is distinct from the CONTRIBUTORS file, which -# lists people. For example, employees are listed in CONTRIBUTORS, -# but not in AUTHORS, because the employer holds the copyright. - -# Names should be added to this file as one of -# Organization's name -# Individual's name -# Individual's name - -# Please keep the list sorted. - -Sendgrid, Inc -Vastech SA (PTY) LTD -Walter Schulze diff --git a/vendor/github.com/gogo/protobuf/CONTRIBUTORS b/vendor/github.com/gogo/protobuf/CONTRIBUTORS deleted file mode 100644 index b1abc4d..0000000 --- a/vendor/github.com/gogo/protobuf/CONTRIBUTORS +++ /dev/null @@ -1,22 +0,0 @@ -Anton Povarov -Brian Goff -Clayton Coleman -Denis Smirnov -DongYun Kang -Dwayne Schultz -Georg Apitz -Gustav Paul -Johan Brandhorst -John Shahid -John Tuley -Laurent -Patrick Lee -Roger Johansson -Sam Nguyen -Sergio Arbeo -Stephen J Day -Tamir Duberstein -Todd Eisenberger -Tormod Erevik Lea -Vyacheslav Kim -Walter Schulze diff --git a/vendor/github.com/gogo/protobuf/GOLANG_CONTRIBUTORS b/vendor/github.com/gogo/protobuf/GOLANG_CONTRIBUTORS deleted file mode 100644 index b368efb..0000000 --- a/vendor/github.com/gogo/protobuf/GOLANG_CONTRIBUTORS +++ /dev/null @@ -1,5 +0,0 @@ -The contributors to the Go protobuf repository: - -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. \ No newline at end of file diff --git a/vendor/github.com/gogo/protobuf/LICENSE b/vendor/github.com/gogo/protobuf/LICENSE deleted file mode 100644 index 7be0cc7..0000000 --- a/vendor/github.com/gogo/protobuf/LICENSE +++ /dev/null @@ -1,36 +0,0 @@ -Protocol Buffers for Go with Gadgets - -Copyright (c) 2013, The GoGo Authors. All rights reserved. -http://github.com/gogo/protobuf - -Go support for Protocol Buffers - Google's data interchange format - -Copyright 2010 The Go Authors. All rights reserved. -https://github.com/golang/protobuf - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/github.com/gogo/protobuf/proto/Makefile b/vendor/github.com/gogo/protobuf/proto/Makefile deleted file mode 100644 index 41c7175..0000000 --- a/vendor/github.com/gogo/protobuf/proto/Makefile +++ /dev/null @@ -1,43 +0,0 @@ -# Go support for Protocol Buffers - Google's data interchange format -# -# Copyright 2010 The Go Authors. All rights reserved. -# https://github.com/golang/protobuf -# -# Redistribution and use in source and binary forms, with or without -# modification, are permitted provided that the following conditions are -# met: -# -# * Redistributions of source code must retain the above copyright -# notice, this list of conditions and the following disclaimer. -# * Redistributions in binary form must reproduce the above -# copyright notice, this list of conditions and the following disclaimer -# in the documentation and/or other materials provided with the -# distribution. -# * Neither the name of Google Inc. nor the names of its -# contributors may be used to endorse or promote products derived from -# this software without specific prior written permission. -# -# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -install: - go install - -test: install generate-test-pbs - go test - - -generate-test-pbs: - make install - make -C testdata - protoc-min-version --version="3.0.0" --proto_path=.:../../../../:../protobuf --gogo_out=Mtestdata/test.proto=github.com/gogo/protobuf/proto/testdata,Mgoogle/protobuf/any.proto=github.com/gogo/protobuf/types:. proto3_proto/proto3.proto - make diff --git a/vendor/github.com/gogo/protobuf/proto/clone.go b/vendor/github.com/gogo/protobuf/proto/clone.go deleted file mode 100644 index 5d4cba4..0000000 --- a/vendor/github.com/gogo/protobuf/proto/clone.go +++ /dev/null @@ -1,234 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Protocol buffer deep copy and merge. -// TODO: RawMessage. - -package proto - -import ( - "log" - "reflect" - "strings" -) - -// Clone returns a deep copy of a protocol buffer. -func Clone(pb Message) Message { - in := reflect.ValueOf(pb) - if in.IsNil() { - return pb - } - - out := reflect.New(in.Type().Elem()) - // out is empty so a merge is a deep copy. - mergeStruct(out.Elem(), in.Elem()) - return out.Interface().(Message) -} - -// Merge merges src into dst. -// Required and optional fields that are set in src will be set to that value in dst. -// Elements of repeated fields will be appended. -// Merge panics if src and dst are not the same type, or if dst is nil. -func Merge(dst, src Message) { - in := reflect.ValueOf(src) - out := reflect.ValueOf(dst) - if out.IsNil() { - panic("proto: nil destination") - } - if in.Type() != out.Type() { - // Explicit test prior to mergeStruct so that mistyped nils will fail - panic("proto: type mismatch") - } - if in.IsNil() { - // Merging nil into non-nil is a quiet no-op - return - } - mergeStruct(out.Elem(), in.Elem()) -} - -func mergeStruct(out, in reflect.Value) { - sprop := GetProperties(in.Type()) - for i := 0; i < in.NumField(); i++ { - f := in.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) - } - - if emIn, ok := in.Addr().Interface().(extensionsBytes); ok { - emOut := out.Addr().Interface().(extensionsBytes) - bIn := emIn.GetExtensions() - bOut := emOut.GetExtensions() - *bOut = append(*bOut, *bIn...) - } else if emIn, ok := extendable(in.Addr().Interface()); ok { - emOut, _ := extendable(out.Addr().Interface()) - mIn, muIn := emIn.extensionsRead() - if mIn != nil { - mOut := emOut.extensionsWrite() - muIn.Lock() - mergeExtension(mOut, mIn) - muIn.Unlock() - } - } - - uf := in.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return - } - uin := uf.Bytes() - if len(uin) > 0 { - out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) - } -} - -// mergeAny performs a merge between two values of the same type. -// viaPtr indicates whether the values were indirected through a pointer (implying proto2). -// prop is set if this is a struct field (it may be nil). -func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { - if in.Type() == protoMessageType { - if !in.IsNil() { - if out.IsNil() { - out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) - } else { - Merge(out.Interface().(Message), in.Interface().(Message)) - } - } - return - } - switch in.Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - if !viaPtr && isProto3Zero(in) { - return - } - out.Set(in) - case reflect.Interface: - // Probably a oneof field; copy non-nil values. - if in.IsNil() { - return - } - // Allocate destination if it is not set, or set to a different type. - // Otherwise we will merge as normal. - if out.IsNil() || out.Elem().Type() != in.Elem().Type() { - out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) - } - mergeAny(out.Elem(), in.Elem(), false, nil) - case reflect.Map: - if in.Len() == 0 { - return - } - if out.IsNil() { - out.Set(reflect.MakeMap(in.Type())) - } - // For maps with value types of *T or []byte we need to deep copy each value. - elemKind := in.Type().Elem().Kind() - for _, key := range in.MapKeys() { - var val reflect.Value - switch elemKind { - case reflect.Ptr: - val = reflect.New(in.Type().Elem().Elem()) - mergeAny(val, in.MapIndex(key), false, nil) - case reflect.Slice: - val = in.MapIndex(key) - val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) - default: - val = in.MapIndex(key) - } - out.SetMapIndex(key, val) - } - case reflect.Ptr: - if in.IsNil() { - return - } - if out.IsNil() { - out.Set(reflect.New(in.Elem().Type())) - } - mergeAny(out.Elem(), in.Elem(), true, nil) - case reflect.Slice: - if in.IsNil() { - return - } - if in.Type().Elem().Kind() == reflect.Uint8 { - // []byte is a scalar bytes field, not a repeated field. - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value, and should not - // be merged. - if prop != nil && prop.proto3 && in.Len() == 0 { - return - } - - // Make a deep copy. - // Append to []byte{} instead of []byte(nil) so that we never end up - // with a nil result. - out.SetBytes(append([]byte{}, in.Bytes()...)) - return - } - n := in.Len() - if out.IsNil() { - out.Set(reflect.MakeSlice(in.Type(), 0, n)) - } - switch in.Type().Elem().Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - out.Set(reflect.AppendSlice(out, in)) - default: - for i := 0; i < n; i++ { - x := reflect.Indirect(reflect.New(in.Type().Elem())) - mergeAny(x, in.Index(i), false, nil) - out.Set(reflect.Append(out, x)) - } - } - case reflect.Struct: - mergeStruct(out, in) - default: - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to copy %v", in) - } -} - -func mergeExtension(out, in map[int32]Extension) { - for extNum, eIn := range in { - eOut := Extension{desc: eIn.desc} - if eIn.value != nil { - v := reflect.New(reflect.TypeOf(eIn.value)).Elem() - mergeAny(v, reflect.ValueOf(eIn.value), false, nil) - eOut.value = v.Interface() - } - if eIn.enc != nil { - eOut.enc = make([]byte, len(eIn.enc)) - copy(eOut.enc, eIn.enc) - } - - out[extNum] = eOut - } -} diff --git a/vendor/github.com/gogo/protobuf/proto/decode.go b/vendor/github.com/gogo/protobuf/proto/decode.go deleted file mode 100644 index 737f273..0000000 --- a/vendor/github.com/gogo/protobuf/proto/decode.go +++ /dev/null @@ -1,978 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for decoding protocol buffer data to construct in-memory representations. - */ - -import ( - "errors" - "fmt" - "io" - "os" - "reflect" -) - -// errOverflow is returned when an integer is too large to be represented. -var errOverflow = errors.New("proto: integer overflow") - -// ErrInternalBadWireType is returned by generated code when an incorrect -// wire type is encountered. It does not get returned to user code. -var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") - -// The fundamental decoders that interpret bytes on the wire. -// Those that take integer types all return uint64 and are -// therefore of type valueDecoder. - -// DecodeVarint reads a varint-encoded integer from the slice. -// It returns the integer and the number of bytes consumed, or -// zero if there is not enough. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func DecodeVarint(buf []byte) (x uint64, n int) { - for shift := uint(0); shift < 64; shift += 7 { - if n >= len(buf) { - return 0, 0 - } - b := uint64(buf[n]) - n++ - x |= (b & 0x7F) << shift - if (b & 0x80) == 0 { - return x, n - } - } - - // The number is too large to represent in a 64-bit value. - return 0, 0 -} - -func (p *Buffer) decodeVarintSlow() (x uint64, err error) { - i := p.index - l := len(p.buf) - - for shift := uint(0); shift < 64; shift += 7 { - if i >= l { - err = io.ErrUnexpectedEOF - return - } - b := p.buf[i] - i++ - x |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - p.index = i - return - } - } - - // The number is too large to represent in a 64-bit value. - err = errOverflow - return -} - -// DecodeVarint reads a varint-encoded integer from the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) DecodeVarint() (x uint64, err error) { - i := p.index - buf := p.buf - - if i >= len(buf) { - return 0, io.ErrUnexpectedEOF - } else if buf[i] < 0x80 { - p.index++ - return uint64(buf[i]), nil - } else if len(buf)-i < 10 { - return p.decodeVarintSlow() - } - - var b uint64 - // we already checked the first byte - x = uint64(buf[i]) - 0x80 - i++ - - b = uint64(buf[i]) - i++ - x += b << 7 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 7 - - b = uint64(buf[i]) - i++ - x += b << 14 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 14 - - b = uint64(buf[i]) - i++ - x += b << 21 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 21 - - b = uint64(buf[i]) - i++ - x += b << 28 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 28 - - b = uint64(buf[i]) - i++ - x += b << 35 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 35 - - b = uint64(buf[i]) - i++ - x += b << 42 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 42 - - b = uint64(buf[i]) - i++ - x += b << 49 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 49 - - b = uint64(buf[i]) - i++ - x += b << 56 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 56 - - b = uint64(buf[i]) - i++ - x += b << 63 - if b&0x80 == 0 { - goto done - } - // x -= 0x80 << 63 // Always zero. - - return 0, errOverflow - -done: - p.index = i - return x, nil -} - -// DecodeFixed64 reads a 64-bit integer from the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) DecodeFixed64() (x uint64, err error) { - // x, err already 0 - i := p.index + 8 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-8]) - x |= uint64(p.buf[i-7]) << 8 - x |= uint64(p.buf[i-6]) << 16 - x |= uint64(p.buf[i-5]) << 24 - x |= uint64(p.buf[i-4]) << 32 - x |= uint64(p.buf[i-3]) << 40 - x |= uint64(p.buf[i-2]) << 48 - x |= uint64(p.buf[i-1]) << 56 - return -} - -// DecodeFixed32 reads a 32-bit integer from the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) DecodeFixed32() (x uint64, err error) { - // x, err already 0 - i := p.index + 4 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-4]) - x |= uint64(p.buf[i-3]) << 8 - x |= uint64(p.buf[i-2]) << 16 - x |= uint64(p.buf[i-1]) << 24 - return -} - -// DecodeZigzag64 reads a zigzag-encoded 64-bit integer -// from the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) DecodeZigzag64() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) - return -} - -// DecodeZigzag32 reads a zigzag-encoded 32-bit integer -// from the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) DecodeZigzag32() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) - return -} - -// These are not ValueDecoders: they produce an array of bytes or a string. -// bytes, embedded messages - -// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { - n, err := p.DecodeVarint() - if err != nil { - return nil, err - } - - nb := int(n) - if nb < 0 { - return nil, fmt.Errorf("proto: bad byte length %d", nb) - } - end := p.index + nb - if end < p.index || end > len(p.buf) { - return nil, io.ErrUnexpectedEOF - } - - if !alloc { - // todo: check if can get more uses of alloc=false - buf = p.buf[p.index:end] - p.index += nb - return - } - - buf = make([]byte, nb) - copy(buf, p.buf[p.index:]) - p.index += nb - return -} - -// DecodeStringBytes reads an encoded string from the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) DecodeStringBytes() (s string, err error) { - buf, err := p.DecodeRawBytes(false) - if err != nil { - return - } - return string(buf), nil -} - -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -// If the protocol buffer has extensions, and the field matches, add it as an extension. -// Otherwise, if the XXX_unrecognized field exists, append the skipped data there. -func (o *Buffer) skipAndSave(t reflect.Type, tag, wire int, base structPointer, unrecField field) error { - oi := o.index - - err := o.skip(t, tag, wire) - if err != nil { - return err - } - - if !unrecField.IsValid() { - return nil - } - - ptr := structPointer_Bytes(base, unrecField) - - // Add the skipped field to struct field - obuf := o.buf - - o.buf = *ptr - o.EncodeVarint(uint64(tag<<3 | wire)) - *ptr = append(o.buf, obuf[oi:o.index]...) - - o.buf = obuf - - return nil -} - -// Skip the next item in the buffer. Its wire type is decoded and presented as an argument. -func (o *Buffer) skip(t reflect.Type, tag, wire int) error { - - var u uint64 - var err error - - switch wire { - case WireVarint: - _, err = o.DecodeVarint() - case WireFixed64: - _, err = o.DecodeFixed64() - case WireBytes: - _, err = o.DecodeRawBytes(false) - case WireFixed32: - _, err = o.DecodeFixed32() - case WireStartGroup: - for { - u, err = o.DecodeVarint() - if err != nil { - break - } - fwire := int(u & 0x7) - if fwire == WireEndGroup { - break - } - ftag := int(u >> 3) - err = o.skip(t, ftag, fwire) - if err != nil { - break - } - } - default: - err = fmt.Errorf("proto: can't skip unknown wire type %d for %s", wire, t) - } - return err -} - -// Unmarshaler is the interface representing objects that can -// unmarshal themselves. The method should reset the receiver before -// decoding starts. The argument points to data that may be -// overwritten, so implementations should not keep references to the -// buffer. -type Unmarshaler interface { - Unmarshal([]byte) error -} - -// Unmarshal parses the protocol buffer representation in buf and places the -// decoded result in pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// Unmarshal resets pb before starting to unmarshal, so any -// existing data in pb is always removed. Use UnmarshalMerge -// to preserve and append to existing data. -func Unmarshal(buf []byte, pb Message) error { - pb.Reset() - return UnmarshalMerge(buf, pb) -} - -// UnmarshalMerge parses the protocol buffer representation in buf and -// writes the decoded result to pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// UnmarshalMerge merges into existing data in pb. -// Most code should use Unmarshal instead. -func UnmarshalMerge(buf []byte, pb Message) error { - // If the object can unmarshal itself, let it. - if u, ok := pb.(Unmarshaler); ok { - return u.Unmarshal(buf) - } - return NewBuffer(buf).Unmarshal(pb) -} - -// DecodeMessage reads a count-delimited message from the Buffer. -func (p *Buffer) DecodeMessage(pb Message) error { - enc, err := p.DecodeRawBytes(false) - if err != nil { - return err - } - return NewBuffer(enc).Unmarshal(pb) -} - -// DecodeGroup reads a tag-delimited group from the Buffer. -func (p *Buffer) DecodeGroup(pb Message) error { - typ, base, err := getbase(pb) - if err != nil { - return err - } - return p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), true, base) -} - -// Unmarshal parses the protocol buffer representation in the -// Buffer and places the decoded result in pb. If the struct -// underlying pb does not match the data in the buffer, the results can be -// unpredictable. -// -// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. -func (p *Buffer) Unmarshal(pb Message) error { - // If the object can unmarshal itself, let it. - if u, ok := pb.(Unmarshaler); ok { - err := u.Unmarshal(p.buf[p.index:]) - p.index = len(p.buf) - return err - } - - typ, base, err := getbase(pb) - if err != nil { - return err - } - - err = p.unmarshalType(typ.Elem(), GetProperties(typ.Elem()), false, base) - - if collectStats { - stats.Decode++ - } - - return err -} - -// unmarshalType does the work of unmarshaling a structure. -func (o *Buffer) unmarshalType(st reflect.Type, prop *StructProperties, is_group bool, base structPointer) error { - var state errorState - required, reqFields := prop.reqCount, uint64(0) - - var err error - for err == nil && o.index < len(o.buf) { - oi := o.index - var u uint64 - u, err = o.DecodeVarint() - if err != nil { - break - } - wire := int(u & 0x7) - if wire == WireEndGroup { - if is_group { - if required > 0 { - // Not enough information to determine the exact field. - // (See below.) - return &RequiredNotSetError{"{Unknown}"} - } - return nil // input is satisfied - } - return fmt.Errorf("proto: %s: wiretype end group for non-group", st) - } - tag := int(u >> 3) - if tag <= 0 { - return fmt.Errorf("proto: %s: illegal tag %d (wire type %d)", st, tag, wire) - } - fieldnum, ok := prop.decoderTags.get(tag) - if !ok { - // Maybe it's an extension? - if prop.extendable { - if e, eok := structPointer_Interface(base, st).(extensionsBytes); eok { - if isExtensionField(e, int32(tag)) { - if err = o.skip(st, tag, wire); err == nil { - ext := e.GetExtensions() - *ext = append(*ext, o.buf[oi:o.index]...) - } - continue - } - } else if e, _ := extendable(structPointer_Interface(base, st)); isExtensionField(e, int32(tag)) { - if err = o.skip(st, tag, wire); err == nil { - extmap := e.extensionsWrite() - ext := extmap[int32(tag)] // may be missing - ext.enc = append(ext.enc, o.buf[oi:o.index]...) - extmap[int32(tag)] = ext - } - continue - } - } - // Maybe it's a oneof? - if prop.oneofUnmarshaler != nil { - m := structPointer_Interface(base, st).(Message) - // First return value indicates whether tag is a oneof field. - ok, err = prop.oneofUnmarshaler(m, tag, wire, o) - if err == ErrInternalBadWireType { - // Map the error to something more descriptive. - // Do the formatting here to save generated code space. - err = fmt.Errorf("bad wiretype for oneof field in %T", m) - } - if ok { - continue - } - } - err = o.skipAndSave(st, tag, wire, base, prop.unrecField) - continue - } - p := prop.Prop[fieldnum] - - if p.dec == nil { - fmt.Fprintf(os.Stderr, "proto: no protobuf decoder for %s.%s\n", st, st.Field(fieldnum).Name) - continue - } - dec := p.dec - if wire != WireStartGroup && wire != p.WireType { - if wire == WireBytes && p.packedDec != nil { - // a packable field - dec = p.packedDec - } else { - err = fmt.Errorf("proto: bad wiretype for field %s.%s: got wiretype %d, want %d", st, st.Field(fieldnum).Name, wire, p.WireType) - continue - } - } - decErr := dec(o, p, base) - if decErr != nil && !state.shouldContinue(decErr, p) { - err = decErr - } - if err == nil && p.Required { - // Successfully decoded a required field. - if tag <= 64 { - // use bitmap for fields 1-64 to catch field reuse. - var mask uint64 = 1 << uint64(tag-1) - if reqFields&mask == 0 { - // new required field - reqFields |= mask - required-- - } - } else { - // This is imprecise. It can be fooled by a required field - // with a tag > 64 that is encoded twice; that's very rare. - // A fully correct implementation would require allocating - // a data structure, which we would like to avoid. - required-- - } - } - } - if err == nil { - if is_group { - return io.ErrUnexpectedEOF - } - if state.err != nil { - return state.err - } - if required > 0 { - // Not enough information to determine the exact field. If we use extra - // CPU, we could determine the field only if the missing required field - // has a tag <= 64 and we check reqFields. - return &RequiredNotSetError{"{Unknown}"} - } - } - return err -} - -// Individual type decoders -// For each, -// u is the decoded value, -// v is a pointer to the field (pointer) in the struct - -// Sizes of the pools to allocate inside the Buffer. -// The goal is modest amortization and allocation -// on at least 16-byte boundaries. -const ( - boolPoolSize = 16 - uint32PoolSize = 8 - uint64PoolSize = 4 -) - -// Decode a bool. -func (o *Buffer) dec_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - if len(o.bools) == 0 { - o.bools = make([]bool, boolPoolSize) - } - o.bools[0] = u != 0 - *structPointer_Bool(base, p.field) = &o.bools[0] - o.bools = o.bools[1:] - return nil -} - -func (o *Buffer) dec_proto3_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - *structPointer_BoolVal(base, p.field) = u != 0 - return nil -} - -// Decode an int32. -func (o *Buffer) dec_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word32_Set(structPointer_Word32(base, p.field), o, uint32(u)) - return nil -} - -func (o *Buffer) dec_proto3_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word32Val_Set(structPointer_Word32Val(base, p.field), uint32(u)) - return nil -} - -// Decode an int64. -func (o *Buffer) dec_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word64_Set(structPointer_Word64(base, p.field), o, u) - return nil -} - -func (o *Buffer) dec_proto3_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - word64Val_Set(structPointer_Word64Val(base, p.field), o, u) - return nil -} - -// Decode a string. -func (o *Buffer) dec_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - *structPointer_String(base, p.field) = &s - return nil -} - -func (o *Buffer) dec_proto3_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - *structPointer_StringVal(base, p.field) = s - return nil -} - -// Decode a slice of bytes ([]byte). -func (o *Buffer) dec_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - *structPointer_Bytes(base, p.field) = b - return nil -} - -// Decode a slice of bools ([]bool). -func (o *Buffer) dec_slice_bool(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - v := structPointer_BoolSlice(base, p.field) - *v = append(*v, u != 0) - return nil -} - -// Decode a slice of bools ([]bool) in packed format. -func (o *Buffer) dec_slice_packed_bool(p *Properties, base structPointer) error { - v := structPointer_BoolSlice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded bools - fin := o.index + nb - if fin < o.index { - return errOverflow - } - - y := *v - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - y = append(y, u != 0) - } - - *v = y - return nil -} - -// Decode a slice of int32s ([]int32). -func (o *Buffer) dec_slice_int32(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - structPointer_Word32Slice(base, p.field).Append(uint32(u)) - return nil -} - -// Decode a slice of int32s ([]int32) in packed format. -func (o *Buffer) dec_slice_packed_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int32s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(uint32(u)) - } - return nil -} - -// Decode a slice of int64s ([]int64). -func (o *Buffer) dec_slice_int64(p *Properties, base structPointer) error { - u, err := p.valDec(o) - if err != nil { - return err - } - - structPointer_Word64Slice(base, p.field).Append(u) - return nil -} - -// Decode a slice of int64s ([]int64) in packed format. -func (o *Buffer) dec_slice_packed_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Slice(base, p.field) - - nn, err := o.DecodeVarint() - if err != nil { - return err - } - nb := int(nn) // number of bytes of encoded int64s - - fin := o.index + nb - if fin < o.index { - return errOverflow - } - for o.index < fin { - u, err := p.valDec(o) - if err != nil { - return err - } - v.Append(u) - } - return nil -} - -// Decode a slice of strings ([]string). -func (o *Buffer) dec_slice_string(p *Properties, base structPointer) error { - s, err := o.DecodeStringBytes() - if err != nil { - return err - } - v := structPointer_StringSlice(base, p.field) - *v = append(*v, s) - return nil -} - -// Decode a slice of slice of bytes ([][]byte). -func (o *Buffer) dec_slice_slice_byte(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - v := structPointer_BytesSlice(base, p.field) - *v = append(*v, b) - return nil -} - -// Decode a map field. -func (o *Buffer) dec_new_map(p *Properties, base structPointer) error { - raw, err := o.DecodeRawBytes(false) - if err != nil { - return err - } - oi := o.index // index at the end of this map entry - o.index -= len(raw) // move buffer back to start of map entry - - mptr := structPointer_NewAt(base, p.field, p.mtype) // *map[K]V - if mptr.Elem().IsNil() { - mptr.Elem().Set(reflect.MakeMap(mptr.Type().Elem())) - } - v := mptr.Elem() // map[K]V - - // Prepare addressable doubly-indirect placeholders for the key and value types. - // See enc_new_map for why. - keyptr := reflect.New(reflect.PtrTo(p.mtype.Key())).Elem() // addressable *K - keybase := toStructPointer(keyptr.Addr()) // **K - - var valbase structPointer - var valptr reflect.Value - switch p.mtype.Elem().Kind() { - case reflect.Slice: - // []byte - var dummy []byte - valptr = reflect.ValueOf(&dummy) // *[]byte - valbase = toStructPointer(valptr) // *[]byte - case reflect.Ptr: - // message; valptr is **Msg; need to allocate the intermediate pointer - valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V - valptr.Set(reflect.New(valptr.Type().Elem())) - valbase = toStructPointer(valptr) - default: - // everything else - valptr = reflect.New(reflect.PtrTo(p.mtype.Elem())).Elem() // addressable *V - valbase = toStructPointer(valptr.Addr()) // **V - } - - // Decode. - // This parses a restricted wire format, namely the encoding of a message - // with two fields. See enc_new_map for the format. - for o.index < oi { - // tagcode for key and value properties are always a single byte - // because they have tags 1 and 2. - tagcode := o.buf[o.index] - o.index++ - switch tagcode { - case p.mkeyprop.tagcode[0]: - if err := p.mkeyprop.dec(o, p.mkeyprop, keybase); err != nil { - return err - } - case p.mvalprop.tagcode[0]: - if err := p.mvalprop.dec(o, p.mvalprop, valbase); err != nil { - return err - } - default: - // TODO: Should we silently skip this instead? - return fmt.Errorf("proto: bad map data tag %d", raw[0]) - } - } - keyelem, valelem := keyptr.Elem(), valptr.Elem() - if !keyelem.IsValid() { - keyelem = reflect.Zero(p.mtype.Key()) - } - if !valelem.IsValid() { - valelem = reflect.Zero(p.mtype.Elem()) - } - - v.SetMapIndex(keyelem, valelem) - return nil -} - -// Decode a group. -func (o *Buffer) dec_struct_group(p *Properties, base structPointer) error { - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - return o.unmarshalType(p.stype, p.sprop, true, bas) -} - -// Decode an embedded message. -func (o *Buffer) dec_struct_message(p *Properties, base structPointer) (err error) { - raw, e := o.DecodeRawBytes(false) - if e != nil { - return e - } - - bas := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(bas) { - // allocate new nested message - bas = toStructPointer(reflect.New(p.stype)) - structPointer_SetStructPointer(base, p.field, bas) - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := structPointer_Interface(bas, p.stype) - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, false, bas) - o.buf = obuf - o.index = oi - - return err -} - -// Decode a slice of embedded messages. -func (o *Buffer) dec_slice_struct_message(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, false, base) -} - -// Decode a slice of embedded groups. -func (o *Buffer) dec_slice_struct_group(p *Properties, base structPointer) error { - return o.dec_slice_struct(p, true, base) -} - -// Decode a slice of structs ([]*struct). -func (o *Buffer) dec_slice_struct(p *Properties, is_group bool, base structPointer) error { - v := reflect.New(p.stype) - bas := toStructPointer(v) - structPointer_StructPointerSlice(base, p.field).Append(bas) - - if is_group { - err := o.unmarshalType(p.stype, p.sprop, is_group, bas) - return err - } - - raw, err := o.DecodeRawBytes(false) - if err != nil { - return err - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - iv := v.Interface() - return iv.(Unmarshaler).Unmarshal(raw) - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, is_group, bas) - - o.buf = obuf - o.index = oi - - return err -} diff --git a/vendor/github.com/gogo/protobuf/proto/decode_gogo.go b/vendor/github.com/gogo/protobuf/proto/decode_gogo.go deleted file mode 100644 index 6fb74de..0000000 --- a/vendor/github.com/gogo/protobuf/proto/decode_gogo.go +++ /dev/null @@ -1,172 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "reflect" -) - -// Decode a reference to a struct pointer. -func (o *Buffer) dec_ref_struct_message(p *Properties, base structPointer) (err error) { - raw, e := o.DecodeRawBytes(false) - if e != nil { - return e - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - panic("not supported, since this is a pointer receiver") - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - bas := structPointer_FieldPointer(base, p.field) - - err = o.unmarshalType(p.stype, p.sprop, false, bas) - o.buf = obuf - o.index = oi - - return err -} - -// Decode a slice of references to struct pointers ([]struct). -func (o *Buffer) dec_slice_ref_struct(p *Properties, is_group bool, base structPointer) error { - newBas := appendStructPointer(base, p.field, p.sstype) - - if is_group { - panic("not supported, maybe in future, if requested.") - } - - raw, err := o.DecodeRawBytes(false) - if err != nil { - return err - } - - // If the object can unmarshal itself, let it. - if p.isUnmarshaler { - panic("not supported, since this is not a pointer receiver.") - } - - obuf := o.buf - oi := o.index - o.buf = raw - o.index = 0 - - err = o.unmarshalType(p.stype, p.sprop, is_group, newBas) - - o.buf = obuf - o.index = oi - - return err -} - -// Decode a slice of references to struct pointers. -func (o *Buffer) dec_slice_ref_struct_message(p *Properties, base structPointer) error { - return o.dec_slice_ref_struct(p, false, base) -} - -func setPtrCustomType(base structPointer, f field, v interface{}) { - if v == nil { - return - } - structPointer_SetStructPointer(base, f, toStructPointer(reflect.ValueOf(v))) -} - -func setCustomType(base structPointer, f field, value interface{}) { - if value == nil { - return - } - v := reflect.ValueOf(value).Elem() - t := reflect.TypeOf(value).Elem() - kind := t.Kind() - switch kind { - case reflect.Slice: - slice := reflect.MakeSlice(t, v.Len(), v.Cap()) - reflect.Copy(slice, v) - oldHeader := structPointer_GetSliceHeader(base, f) - oldHeader.Data = slice.Pointer() - oldHeader.Len = v.Len() - oldHeader.Cap = v.Cap() - default: - size := reflect.TypeOf(value).Elem().Size() - structPointer_Copy(toStructPointer(reflect.ValueOf(value)), structPointer_Add(base, f), int(size)) - } -} - -func (o *Buffer) dec_custom_bytes(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - i := reflect.New(p.ctype.Elem()).Interface() - custom := (i).(Unmarshaler) - if err := custom.Unmarshal(b); err != nil { - return err - } - setPtrCustomType(base, p.field, custom) - return nil -} - -func (o *Buffer) dec_custom_ref_bytes(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - i := reflect.New(p.ctype).Interface() - custom := (i).(Unmarshaler) - if err := custom.Unmarshal(b); err != nil { - return err - } - if custom != nil { - setCustomType(base, p.field, custom) - } - return nil -} - -// Decode a slice of bytes ([]byte) into a slice of custom types. -func (o *Buffer) dec_custom_slice_bytes(p *Properties, base structPointer) error { - b, err := o.DecodeRawBytes(true) - if err != nil { - return err - } - i := reflect.New(p.ctype.Elem()).Interface() - custom := (i).(Unmarshaler) - if err := custom.Unmarshal(b); err != nil { - return err - } - newBas := appendStructPointer(base, p.field, p.ctype) - - var zero field - setCustomType(newBas, zero, custom) - - return nil -} diff --git a/vendor/github.com/gogo/protobuf/proto/duration.go b/vendor/github.com/gogo/protobuf/proto/duration.go deleted file mode 100644 index 93464c9..0000000 --- a/vendor/github.com/gogo/protobuf/proto/duration.go +++ /dev/null @@ -1,100 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// This file implements conversions between google.protobuf.Duration -// and time.Duration. - -import ( - "errors" - "fmt" - "time" -) - -const ( - // Range of a Duration in seconds, as specified in - // google/protobuf/duration.proto. This is about 10,000 years in seconds. - maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) - minSeconds = -maxSeconds -) - -// validateDuration determines whether the Duration is valid according to the -// definition in google/protobuf/duration.proto. A valid Duration -// may still be too large to fit into a time.Duration (the range of Duration -// is about 10,000 years, and the range of time.Duration is about 290). -func validateDuration(d *duration) error { - if d == nil { - return errors.New("duration: nil Duration") - } - if d.Seconds < minSeconds || d.Seconds > maxSeconds { - return fmt.Errorf("duration: %#v: seconds out of range", d) - } - if d.Nanos <= -1e9 || d.Nanos >= 1e9 { - return fmt.Errorf("duration: %#v: nanos out of range", d) - } - // Seconds and Nanos must have the same sign, unless d.Nanos is zero. - if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { - return fmt.Errorf("duration: %#v: seconds and nanos have different signs", d) - } - return nil -} - -// DurationFromProto converts a Duration to a time.Duration. DurationFromProto -// returns an error if the Duration is invalid or is too large to be -// represented in a time.Duration. -func durationFromProto(p *duration) (time.Duration, error) { - if err := validateDuration(p); err != nil { - return 0, err - } - d := time.Duration(p.Seconds) * time.Second - if int64(d/time.Second) != p.Seconds { - return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) - } - if p.Nanos != 0 { - d += time.Duration(p.Nanos) - if (d < 0) != (p.Nanos < 0) { - return 0, fmt.Errorf("duration: %#v is out of range for time.Duration", p) - } - } - return d, nil -} - -// DurationProto converts a time.Duration to a Duration. -func durationProto(d time.Duration) *duration { - nanos := d.Nanoseconds() - secs := nanos / 1e9 - nanos -= secs * 1e9 - return &duration{ - Seconds: secs, - Nanos: int32(nanos), - } -} diff --git a/vendor/github.com/gogo/protobuf/proto/duration_gogo.go b/vendor/github.com/gogo/protobuf/proto/duration_gogo.go deleted file mode 100644 index 18e2a5f..0000000 --- a/vendor/github.com/gogo/protobuf/proto/duration_gogo.go +++ /dev/null @@ -1,203 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2016, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "reflect" - "time" -) - -var durationType = reflect.TypeOf((*time.Duration)(nil)).Elem() - -type duration struct { - Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` - Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` -} - -func (m *duration) Reset() { *m = duration{} } -func (*duration) ProtoMessage() {} -func (*duration) String() string { return "duration" } - -func init() { - RegisterType((*duration)(nil), "gogo.protobuf.proto.duration") -} - -func (o *Buffer) decDuration() (time.Duration, error) { - b, err := o.DecodeRawBytes(true) - if err != nil { - return 0, err - } - dproto := &duration{} - if err := Unmarshal(b, dproto); err != nil { - return 0, err - } - return durationFromProto(dproto) -} - -func (o *Buffer) dec_duration(p *Properties, base structPointer) error { - d, err := o.decDuration() - if err != nil { - return err - } - word64_Set(structPointer_Word64(base, p.field), o, uint64(d)) - return nil -} - -func (o *Buffer) dec_ref_duration(p *Properties, base structPointer) error { - d, err := o.decDuration() - if err != nil { - return err - } - word64Val_Set(structPointer_Word64Val(base, p.field), o, uint64(d)) - return nil -} - -func (o *Buffer) dec_slice_duration(p *Properties, base structPointer) error { - d, err := o.decDuration() - if err != nil { - return err - } - newBas := appendStructPointer(base, p.field, reflect.SliceOf(reflect.PtrTo(durationType))) - var zero field - setPtrCustomType(newBas, zero, &d) - return nil -} - -func (o *Buffer) dec_slice_ref_duration(p *Properties, base structPointer) error { - d, err := o.decDuration() - if err != nil { - return err - } - structPointer_Word64Slice(base, p.field).Append(uint64(d)) - return nil -} - -func size_duration(p *Properties, base structPointer) (n int) { - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return 0 - } - dur := structPointer_Interface(structp, durationType).(*time.Duration) - d := durationProto(*dur) - size := Size(d) - return size + sizeVarint(uint64(size)) + len(p.tagcode) -} - -func (o *Buffer) enc_duration(p *Properties, base structPointer) error { - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return ErrNil - } - dur := structPointer_Interface(structp, durationType).(*time.Duration) - d := durationProto(*dur) - data, err := Marshal(d) - if err != nil { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return nil -} - -func size_ref_duration(p *Properties, base structPointer) (n int) { - dur := structPointer_InterfaceAt(base, p.field, durationType).(*time.Duration) - d := durationProto(*dur) - size := Size(d) - return size + sizeVarint(uint64(size)) + len(p.tagcode) -} - -func (o *Buffer) enc_ref_duration(p *Properties, base structPointer) error { - dur := structPointer_InterfaceAt(base, p.field, durationType).(*time.Duration) - d := durationProto(*dur) - data, err := Marshal(d) - if err != nil { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return nil -} - -func size_slice_duration(p *Properties, base structPointer) (n int) { - pdurs := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(reflect.PtrTo(durationType))).(*[]*time.Duration) - durs := *pdurs - for i := 0; i < len(durs); i++ { - if durs[i] == nil { - return 0 - } - dproto := durationProto(*durs[i]) - size := Size(dproto) - n += len(p.tagcode) + size + sizeVarint(uint64(size)) - } - return n -} - -func (o *Buffer) enc_slice_duration(p *Properties, base structPointer) error { - pdurs := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(reflect.PtrTo(durationType))).(*[]*time.Duration) - durs := *pdurs - for i := 0; i < len(durs); i++ { - if durs[i] == nil { - return errRepeatedHasNil - } - dproto := durationProto(*durs[i]) - data, err := Marshal(dproto) - if err != nil { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - } - return nil -} - -func size_slice_ref_duration(p *Properties, base structPointer) (n int) { - pdurs := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(durationType)).(*[]time.Duration) - durs := *pdurs - for i := 0; i < len(durs); i++ { - dproto := durationProto(durs[i]) - size := Size(dproto) - n += len(p.tagcode) + size + sizeVarint(uint64(size)) - } - return n -} - -func (o *Buffer) enc_slice_ref_duration(p *Properties, base structPointer) error { - pdurs := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(durationType)).(*[]time.Duration) - durs := *pdurs - for i := 0; i < len(durs); i++ { - dproto := durationProto(durs[i]) - data, err := Marshal(dproto) - if err != nil { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - } - return nil -} diff --git a/vendor/github.com/gogo/protobuf/proto/encode.go b/vendor/github.com/gogo/protobuf/proto/encode.go deleted file mode 100644 index 8b84d1b..0000000 --- a/vendor/github.com/gogo/protobuf/proto/encode.go +++ /dev/null @@ -1,1362 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "errors" - "fmt" - "reflect" - "sort" -) - -// RequiredNotSetError is the error returned if Marshal is called with -// a protocol buffer struct whose required fields have not -// all been initialized. It is also the error returned if Unmarshal is -// called with an encoded protocol buffer that does not include all the -// required fields. -// -// When printed, RequiredNotSetError reports the first unset required field in a -// message. If the field cannot be precisely determined, it is reported as -// "{Unknown}". -type RequiredNotSetError struct { - field string -} - -func (e *RequiredNotSetError) Error() string { - return fmt.Sprintf("proto: required field %q not set", e.field) -} - -var ( - // errRepeatedHasNil is the error returned if Marshal is called with - // a struct with a repeated field containing a nil element. - errRepeatedHasNil = errors.New("proto: repeated field has nil element") - - // errOneofHasNil is the error returned if Marshal is called with - // a struct with a oneof field containing a nil element. - errOneofHasNil = errors.New("proto: oneof field has nil value") - - // ErrNil is the error returned if Marshal is called with nil. - ErrNil = errors.New("proto: Marshal called with nil") - - // ErrTooLarge is the error returned if Marshal is called with a - // message that encodes to >2GB. - ErrTooLarge = errors.New("proto: message encodes to over 2 GB") -) - -// The fundamental encoders that put bytes on the wire. -// Those that take integer types all accept uint64 and are -// therefore of type valueEncoder. - -const maxVarintBytes = 10 // maximum length of a varint - -// maxMarshalSize is the largest allowed size of an encoded protobuf, -// since C++ and Java use signed int32s for the size. -const maxMarshalSize = 1<<31 - 1 - -// EncodeVarint returns the varint encoding of x. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -// Not used by the package itself, but helpful to clients -// wishing to use the same encoding. -func EncodeVarint(x uint64) []byte { - var buf [maxVarintBytes]byte - var n int - for n = 0; x > 127; n++ { - buf[n] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - buf[n] = uint8(x) - n++ - return buf[0:n] -} - -// EncodeVarint writes a varint-encoded integer to the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) EncodeVarint(x uint64) error { - for x >= 1<<7 { - p.buf = append(p.buf, uint8(x&0x7f|0x80)) - x >>= 7 - } - p.buf = append(p.buf, uint8(x)) - return nil -} - -// SizeVarint returns the varint encoding size of an integer. -func SizeVarint(x uint64) int { - return sizeVarint(x) -} - -func sizeVarint(x uint64) (n int) { - for { - n++ - x >>= 7 - if x == 0 { - break - } - } - return n -} - -// EncodeFixed64 writes a 64-bit integer to the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) EncodeFixed64(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24), - uint8(x>>32), - uint8(x>>40), - uint8(x>>48), - uint8(x>>56)) - return nil -} - -func sizeFixed64(x uint64) int { - return 8 -} - -// EncodeFixed32 writes a 32-bit integer to the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) EncodeFixed32(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24)) - return nil -} - -func sizeFixed32(x uint64) int { - return 4 -} - -// EncodeZigzag64 writes a zigzag-encoded 64-bit integer -// to the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) EncodeZigzag64(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint((x << 1) ^ uint64((int64(x) >> 63))) -} - -func sizeZigzag64(x uint64) int { - return sizeVarint((x << 1) ^ uint64((int64(x) >> 63))) -} - -// EncodeZigzag32 writes a zigzag-encoded 32-bit integer -// to the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) EncodeZigzag32(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - -func sizeZigzag32(x uint64) int { - return sizeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - -// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) EncodeRawBytes(b []byte) error { - p.EncodeVarint(uint64(len(b))) - p.buf = append(p.buf, b...) - return nil -} - -func sizeRawBytes(b []byte) int { - return sizeVarint(uint64(len(b))) + - len(b) -} - -// EncodeStringBytes writes an encoded string to the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) EncodeStringBytes(s string) error { - p.EncodeVarint(uint64(len(s))) - p.buf = append(p.buf, s...) - return nil -} - -func sizeStringBytes(s string) int { - return sizeVarint(uint64(len(s))) + - len(s) -} - -// Marshaler is the interface representing objects that can marshal themselves. -type Marshaler interface { - Marshal() ([]byte, error) -} - -// Marshal takes the protocol buffer -// and encodes it into the wire format, returning the data. -func Marshal(pb Message) ([]byte, error) { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - return m.Marshal() - } - p := NewBuffer(nil) - err := p.Marshal(pb) - if p.buf == nil && err == nil { - // Return a non-nil slice on success. - return []byte{}, nil - } - return p.buf, err -} - -// EncodeMessage writes the protocol buffer to the Buffer, -// prefixed by a varint-encoded length. -func (p *Buffer) EncodeMessage(pb Message) error { - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return ErrNil - } - if err == nil { - var state errorState - err = p.enc_len_struct(GetProperties(t.Elem()), base, &state) - } - return err -} - -// Marshal takes the protocol buffer -// and encodes it into the wire format, writing the result to the -// Buffer. -func (p *Buffer) Marshal(pb Message) error { - // Can the object marshal itself? - if m, ok := pb.(Marshaler); ok { - data, err := m.Marshal() - p.buf = append(p.buf, data...) - return err - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return ErrNil - } - if err == nil { - err = p.enc_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - (stats).Encode++ // Parens are to work around a goimports bug. - } - - if len(p.buf) > maxMarshalSize { - return ErrTooLarge - } - return err -} - -// Size returns the encoded size of a protocol buffer. -func Size(pb Message) (n int) { - // Can the object marshal itself? If so, Size is slow. - // TODO: add Size to Marshaler, or add a Sizer interface. - if m, ok := pb.(Marshaler); ok { - b, _ := m.Marshal() - return len(b) - } - - t, base, err := getbase(pb) - if structPointer_IsNil(base) { - return 0 - } - if err == nil { - n = size_struct(GetProperties(t.Elem()), base) - } - - if collectStats { - (stats).Size++ // Parens are to work around a goimports bug. - } - - return -} - -// Individual type encoders. - -// Encode a bool. -func (o *Buffer) enc_bool(p *Properties, base structPointer) error { - v := *structPointer_Bool(base, p.field) - if v == nil { - return ErrNil - } - x := 0 - if *v { - x = 1 - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_bool(p *Properties, base structPointer) error { - v := *structPointer_BoolVal(base, p.field) - if !v { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, 1) - return nil -} - -func size_bool(p *Properties, base structPointer) int { - v := *structPointer_Bool(base, p.field) - if v == nil { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -func size_proto3_bool(p *Properties, base structPointer) int { - v := *structPointer_BoolVal(base, p.field) - if !v && !p.oneof { - return 0 - } - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -// Encode an int32. -func (o *Buffer) enc_int32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := int32(word32_Get(v)) // permit sign extension to use full 64-bit range - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func size_proto3_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) // permit sign extension to use full 64-bit range - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode a uint32. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return ErrNil - } - x := word32_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func (o *Buffer) enc_proto3_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32(base, p.field) - if word32_IsNil(v) { - return 0 - } - x := word32_Get(v) - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func size_proto3_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode an int64. -func (o *Buffer) enc_int64(p *Properties, base structPointer) error { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return ErrNil - } - x := word64_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func (o *Buffer) enc_proto3_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - if x == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func size_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64(base, p.field) - if word64_IsNil(v) { - return 0 - } - x := word64_Get(v) - n += len(p.tagcode) - n += p.valSize(x) - return -} - -func size_proto3_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - if x == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += p.valSize(x) - return -} - -// Encode a string. -func (o *Buffer) enc_string(p *Properties, base structPointer) error { - v := *structPointer_String(base, p.field) - if v == nil { - return ErrNil - } - x := *v - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(x) - return nil -} - -func (o *Buffer) enc_proto3_string(p *Properties, base structPointer) error { - v := *structPointer_StringVal(base, p.field) - if v == "" { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(v) - return nil -} - -func size_string(p *Properties, base structPointer) (n int) { - v := *structPointer_String(base, p.field) - if v == nil { - return 0 - } - x := *v - n += len(p.tagcode) - n += sizeStringBytes(x) - return -} - -func size_proto3_string(p *Properties, base structPointer) (n int) { - v := *structPointer_StringVal(base, p.field) - if v == "" && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeStringBytes(v) - return -} - -// All protocol buffer fields are nillable, but be careful. -func isNil(v reflect.Value) bool { - switch v.Kind() { - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return v.IsNil() - } - return false -} - -// Encode a message struct. -func (o *Buffer) enc_struct_message(p *Properties, base structPointer) error { - var state errorState - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return ErrNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return state.err - } - - o.buf = append(o.buf, p.tagcode...) - return o.enc_len_struct(p.sprop, structp, &state) -} - -func size_struct_message(p *Properties, base structPointer) int { - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return 0 - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n0 := len(p.tagcode) - n1 := sizeRawBytes(data) - return n0 + n1 - } - - n0 := len(p.tagcode) - n1 := size_struct(p.sprop, structp) - n2 := sizeVarint(uint64(n1)) // size of encoded length - return n0 + n1 + n2 -} - -// Encode a group struct. -func (o *Buffer) enc_struct_group(p *Properties, base structPointer) error { - var state errorState - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return ErrNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - err := o.enc_struct(p.sprop, b) - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return state.err -} - -func size_struct_group(p *Properties, base structPointer) (n int) { - b := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(b) { - return 0 - } - - n += sizeVarint(uint64((p.Tag << 3) | WireStartGroup)) - n += size_struct(p.sprop, b) - n += sizeVarint(uint64((p.Tag << 3) | WireEndGroup)) - return -} - -// Encode a slice of bools ([]bool). -func (o *Buffer) enc_slice_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - for _, x := range s { - o.buf = append(o.buf, p.tagcode...) - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_bool(p *Properties, base structPointer) int { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - return l * (len(p.tagcode) + 1) // each bool takes exactly one byte -} - -// Encode a slice of bools ([]bool) in packed format. -func (o *Buffer) enc_slice_packed_bool(p *Properties, base structPointer) error { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(l)) // each bool takes exactly one byte - for _, x := range s { - v := uint64(0) - if x { - v = 1 - } - p.valEnc(o, v) - } - return nil -} - -func size_slice_packed_bool(p *Properties, base structPointer) (n int) { - s := *structPointer_BoolSlice(base, p.field) - l := len(s) - if l == 0 { - return 0 - } - n += len(p.tagcode) - n += sizeVarint(uint64(l)) - n += l // each bool takes exactly one byte - return -} - -// Encode a slice of bytes ([]byte). -func (o *Buffer) enc_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if s == nil { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(s) - return nil -} - -func (o *Buffer) enc_proto3_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if len(s) == 0 { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(s) - return nil -} - -func size_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if s == nil && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeRawBytes(s) - return -} - -func size_proto3_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if len(s) == 0 && !p.oneof { - return 0 - } - n += len(p.tagcode) - n += sizeRawBytes(s) - return -} - -// Encode a slice of int32s ([]int32). -func (o *Buffer) enc_slice_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of int32s ([]int32) in packed format. -func (o *Buffer) enc_slice_packed_int32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - p.valEnc(buf, uint64(x)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - x := int32(s.Index(i)) // permit sign extension to use full 64-bit range - bufSize += p.valSize(uint64(x)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of uint32s ([]uint32). -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - x := s.Index(i) - p.valEnc(o, uint64(x)) - } - return nil -} - -func size_slice_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - x := s.Index(i) - n += p.valSize(uint64(x)) - } - return -} - -// Encode a slice of uint32s ([]uint32) in packed format. -// Exactly the same as int32, except for no sign extension. -func (o *Buffer) enc_slice_packed_uint32(p *Properties, base structPointer) error { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, uint64(s.Index(i))) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_uint32(p *Properties, base structPointer) (n int) { - s := structPointer_Word32Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(uint64(s.Index(i))) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of int64s ([]int64). -func (o *Buffer) enc_slice_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, s.Index(i)) - } - return nil -} - -func size_slice_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - for i := 0; i < l; i++ { - n += len(p.tagcode) - n += p.valSize(s.Index(i)) - } - return -} - -// Encode a slice of int64s ([]int64) in packed format. -func (o *Buffer) enc_slice_packed_int64(p *Properties, base structPointer) error { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return ErrNil - } - // TODO: Reuse a Buffer. - buf := NewBuffer(nil) - for i := 0; i < l; i++ { - p.valEnc(buf, s.Index(i)) - } - - o.buf = append(o.buf, p.tagcode...) - o.EncodeVarint(uint64(len(buf.buf))) - o.buf = append(o.buf, buf.buf...) - return nil -} - -func size_slice_packed_int64(p *Properties, base structPointer) (n int) { - s := structPointer_Word64Slice(base, p.field) - l := s.Len() - if l == 0 { - return 0 - } - var bufSize int - for i := 0; i < l; i++ { - bufSize += p.valSize(s.Index(i)) - } - - n += len(p.tagcode) - n += sizeVarint(uint64(bufSize)) - n += bufSize - return -} - -// Encode a slice of slice of bytes ([][]byte). -func (o *Buffer) enc_slice_slice_byte(p *Properties, base structPointer) error { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return ErrNil - } - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(ss[i]) - } - return nil -} - -func size_slice_slice_byte(p *Properties, base structPointer) (n int) { - ss := *structPointer_BytesSlice(base, p.field) - l := len(ss) - if l == 0 { - return 0 - } - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeRawBytes(ss[i]) - } - return -} - -// Encode a slice of strings ([]string). -func (o *Buffer) enc_slice_string(p *Properties, base structPointer) error { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - for i := 0; i < l; i++ { - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(ss[i]) - } - return nil -} - -func size_slice_string(p *Properties, base structPointer) (n int) { - ss := *structPointer_StringSlice(base, p.field) - l := len(ss) - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - n += sizeStringBytes(ss[i]) - } - return -} - -// Encode a slice of message structs ([]*struct). -func (o *Buffer) enc_slice_struct_message(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return errRepeatedHasNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - continue - } - - o.buf = append(o.buf, p.tagcode...) - err := o.enc_len_struct(p.sprop, structp, &state) - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return errRepeatedHasNil - } - return err - } - } - return state.err -} - -func size_slice_struct_message(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - structp := s.Index(i) - if structPointer_IsNil(structp) { - return // return the size up to this point - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n += sizeRawBytes(data) - continue - } - - n0 := size_struct(p.sprop, structp) - n1 := sizeVarint(uint64(n0)) // size of encoded length - n += n0 + n1 - } - return -} - -// Encode a slice of group structs ([]*struct). -func (o *Buffer) enc_slice_struct_group(p *Properties, base structPointer) error { - var state errorState - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return errRepeatedHasNil - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireStartGroup)) - - err := o.enc_struct(p.sprop, b) - - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return errRepeatedHasNil - } - return err - } - - o.EncodeVarint(uint64((p.Tag << 3) | WireEndGroup)) - } - return state.err -} - -func size_slice_struct_group(p *Properties, base structPointer) (n int) { - s := structPointer_StructPointerSlice(base, p.field) - l := s.Len() - - n += l * sizeVarint(uint64((p.Tag<<3)|WireStartGroup)) - n += l * sizeVarint(uint64((p.Tag<<3)|WireEndGroup)) - for i := 0; i < l; i++ { - b := s.Index(i) - if structPointer_IsNil(b) { - return // return size up to this point - } - - n += size_struct(p.sprop, b) - } - return -} - -// Encode an extension map. -func (o *Buffer) enc_map(p *Properties, base structPointer) error { - exts := structPointer_ExtMap(base, p.field) - if err := encodeExtensionsMap(*exts); err != nil { - return err - } - - return o.enc_map_body(*exts) -} - -func (o *Buffer) enc_exts(p *Properties, base structPointer) error { - exts := structPointer_Extensions(base, p.field) - - v, mu := exts.extensionsRead() - if v == nil { - return nil - } - - mu.Lock() - defer mu.Unlock() - if err := encodeExtensionsMap(v); err != nil { - return err - } - - return o.enc_map_body(v) -} - -func (o *Buffer) enc_map_body(v map[int32]Extension) error { - // Fast-path for common cases: zero or one extensions. - if len(v) <= 1 { - for _, e := range v { - o.buf = append(o.buf, e.enc...) - } - return nil - } - - // Sort keys to provide a deterministic encoding. - keys := make([]int, 0, len(v)) - for k := range v { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, k := range keys { - o.buf = append(o.buf, v[int32(k)].enc...) - } - return nil -} - -func size_map(p *Properties, base structPointer) int { - v := structPointer_ExtMap(base, p.field) - return extensionsMapSize(*v) -} - -func size_exts(p *Properties, base structPointer) int { - v := structPointer_Extensions(base, p.field) - return extensionsSize(v) -} - -// Encode a map field. -func (o *Buffer) enc_new_map(p *Properties, base structPointer) error { - var state errorState // XXX: or do we need to plumb this through? - - /* - A map defined as - map map_field = N; - is encoded in the same way as - message MapFieldEntry { - key_type key = 1; - value_type value = 2; - } - repeated MapFieldEntry map_field = N; - */ - - v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V - if v.Len() == 0 { - return nil - } - - keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) - - enc := func() error { - if err := p.mkeyprop.enc(o, p.mkeyprop, keybase); err != nil { - return err - } - if err := p.mvalprop.enc(o, p.mvalprop, valbase); err != nil && err != ErrNil { - return err - } - return nil - } - - // Don't sort map keys. It is not required by the spec, and C++ doesn't do it. - for _, key := range v.MapKeys() { - val := v.MapIndex(key) - - keycopy.Set(key) - valcopy.Set(val) - - o.buf = append(o.buf, p.tagcode...) - if err := o.enc_len_thing(enc, &state); err != nil { - return err - } - } - return nil -} - -func size_new_map(p *Properties, base structPointer) int { - v := structPointer_NewAt(base, p.field, p.mtype).Elem() // map[K]V - - keycopy, valcopy, keybase, valbase := mapEncodeScratch(p.mtype) - - n := 0 - for _, key := range v.MapKeys() { - val := v.MapIndex(key) - keycopy.Set(key) - valcopy.Set(val) - - // Tag codes for key and val are the responsibility of the sub-sizer. - keysize := p.mkeyprop.size(p.mkeyprop, keybase) - valsize := p.mvalprop.size(p.mvalprop, valbase) - entry := keysize + valsize - // Add on tag code and length of map entry itself. - n += len(p.tagcode) + sizeVarint(uint64(entry)) + entry - } - return n -} - -// mapEncodeScratch returns a new reflect.Value matching the map's value type, -// and a structPointer suitable for passing to an encoder or sizer. -func mapEncodeScratch(mapType reflect.Type) (keycopy, valcopy reflect.Value, keybase, valbase structPointer) { - // Prepare addressable doubly-indirect placeholders for the key and value types. - // This is needed because the element-type encoders expect **T, but the map iteration produces T. - - keycopy = reflect.New(mapType.Key()).Elem() // addressable K - keyptr := reflect.New(reflect.PtrTo(keycopy.Type())).Elem() // addressable *K - keyptr.Set(keycopy.Addr()) // - keybase = toStructPointer(keyptr.Addr()) // **K - - // Value types are more varied and require special handling. - switch mapType.Elem().Kind() { - case reflect.Slice: - // []byte - var dummy []byte - valcopy = reflect.ValueOf(&dummy).Elem() // addressable []byte - valbase = toStructPointer(valcopy.Addr()) - case reflect.Ptr: - // message; the generated field type is map[K]*Msg (so V is *Msg), - // so we only need one level of indirection. - valcopy = reflect.New(mapType.Elem()).Elem() // addressable V - valbase = toStructPointer(valcopy.Addr()) - default: - // everything else - valcopy = reflect.New(mapType.Elem()).Elem() // addressable V - valptr := reflect.New(reflect.PtrTo(valcopy.Type())).Elem() // addressable *V - valptr.Set(valcopy.Addr()) // - valbase = toStructPointer(valptr.Addr()) // **V - } - return -} - -// Encode a struct. -func (o *Buffer) enc_struct(prop *StructProperties, base structPointer) error { - var state errorState - // Encode fields in tag order so that decoders may use optimizations - // that depend on the ordering. - // https://developers.google.com/protocol-buffers/docs/encoding#order - for _, i := range prop.order { - p := prop.Prop[i] - if p.enc != nil { - err := p.enc(o, p, base) - if err != nil { - if err == ErrNil { - if p.Required && state.err == nil { - state.err = &RequiredNotSetError{p.Name} - } - } else if err == errRepeatedHasNil { - // Give more context to nil values in repeated fields. - return errors.New("repeated field " + p.OrigName + " has nil element") - } else if !state.shouldContinue(err, p) { - return err - } - } - if len(o.buf) > maxMarshalSize { - return ErrTooLarge - } - } - } - - // Do oneof fields. - if prop.oneofMarshaler != nil { - m := structPointer_Interface(base, prop.stype).(Message) - if err := prop.oneofMarshaler(m, o); err == ErrNil { - return errOneofHasNil - } else if err != nil { - return err - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - if len(o.buf)+len(v) > maxMarshalSize { - return ErrTooLarge - } - if len(v) > 0 { - o.buf = append(o.buf, v...) - } - } - - return state.err -} - -func size_struct(prop *StructProperties, base structPointer) (n int) { - for _, i := range prop.order { - p := prop.Prop[i] - if p.size != nil { - n += p.size(p, base) - } - } - - // Add unrecognized fields at the end. - if prop.unrecField.IsValid() { - v := *structPointer_Bytes(base, prop.unrecField) - n += len(v) - } - - // Factor in any oneof fields. - if prop.oneofSizer != nil { - m := structPointer_Interface(base, prop.stype).(Message) - n += prop.oneofSizer(m) - } - - return -} - -var zeroes [20]byte // longer than any conceivable sizeVarint - -// Encode a struct, preceded by its encoded length (as a varint). -func (o *Buffer) enc_len_struct(prop *StructProperties, base structPointer, state *errorState) error { - return o.enc_len_thing(func() error { return o.enc_struct(prop, base) }, state) -} - -// Encode something, preceded by its encoded length (as a varint). -func (o *Buffer) enc_len_thing(enc func() error, state *errorState) error { - iLen := len(o.buf) - o.buf = append(o.buf, 0, 0, 0, 0) // reserve four bytes for length - iMsg := len(o.buf) - err := enc() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - lMsg := len(o.buf) - iMsg - lLen := sizeVarint(uint64(lMsg)) - switch x := lLen - (iMsg - iLen); { - case x > 0: // actual length is x bytes larger than the space we reserved - // Move msg x bytes right. - o.buf = append(o.buf, zeroes[:x]...) - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - case x < 0: // actual length is x bytes smaller than the space we reserved - // Move msg x bytes left. - copy(o.buf[iMsg+x:], o.buf[iMsg:iMsg+lMsg]) - o.buf = o.buf[:len(o.buf)+x] // x is negative - } - // Encode the length in the reserved space. - o.buf = o.buf[:iLen] - o.EncodeVarint(uint64(lMsg)) - o.buf = o.buf[:len(o.buf)+lMsg] - return state.err -} - -// errorState maintains the first error that occurs and updates that error -// with additional context. -type errorState struct { - err error -} - -// shouldContinue reports whether encoding should continue upon encountering the -// given error. If the error is RequiredNotSetError, shouldContinue returns true -// and, if this is the first appearance of that error, remembers it for future -// reporting. -// -// If prop is not nil, it may update any error with additional context about the -// field with the error. -func (s *errorState) shouldContinue(err error, prop *Properties) bool { - // Ignore unset required fields. - reqNotSet, ok := err.(*RequiredNotSetError) - if !ok { - return false - } - if s.err == nil { - if prop != nil { - err = &RequiredNotSetError{prop.Name + "." + reqNotSet.field} - } - s.err = err - } - return true -} diff --git a/vendor/github.com/gogo/protobuf/proto/encode_gogo.go b/vendor/github.com/gogo/protobuf/proto/encode_gogo.go deleted file mode 100644 index 32111b7..0000000 --- a/vendor/github.com/gogo/protobuf/proto/encode_gogo.go +++ /dev/null @@ -1,350 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// http://github.com/golang/protobuf/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "reflect" -) - -func NewRequiredNotSetError(field string) *RequiredNotSetError { - return &RequiredNotSetError{field} -} - -type Sizer interface { - Size() int -} - -func (o *Buffer) enc_ext_slice_byte(p *Properties, base structPointer) error { - s := *structPointer_Bytes(base, p.field) - if s == nil { - return ErrNil - } - o.buf = append(o.buf, s...) - return nil -} - -func size_ext_slice_byte(p *Properties, base structPointer) (n int) { - s := *structPointer_Bytes(base, p.field) - if s == nil { - return 0 - } - n += len(s) - return -} - -// Encode a reference to bool pointer. -func (o *Buffer) enc_ref_bool(p *Properties, base structPointer) error { - v := *structPointer_BoolVal(base, p.field) - x := 0 - if v { - x = 1 - } - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_ref_bool(p *Properties, base structPointer) int { - return len(p.tagcode) + 1 // each bool takes exactly one byte -} - -// Encode a reference to int32 pointer. -func (o *Buffer) enc_ref_int32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_ref_int32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := int32(word32Val_Get(v)) - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -func (o *Buffer) enc_ref_uint32(p *Properties, base structPointer) error { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, uint64(x)) - return nil -} - -func size_ref_uint32(p *Properties, base structPointer) (n int) { - v := structPointer_Word32Val(base, p.field) - x := word32Val_Get(v) - n += len(p.tagcode) - n += p.valSize(uint64(x)) - return -} - -// Encode a reference to an int64 pointer. -func (o *Buffer) enc_ref_int64(p *Properties, base structPointer) error { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - o.buf = append(o.buf, p.tagcode...) - p.valEnc(o, x) - return nil -} - -func size_ref_int64(p *Properties, base structPointer) (n int) { - v := structPointer_Word64Val(base, p.field) - x := word64Val_Get(v) - n += len(p.tagcode) - n += p.valSize(x) - return -} - -// Encode a reference to a string pointer. -func (o *Buffer) enc_ref_string(p *Properties, base structPointer) error { - v := *structPointer_StringVal(base, p.field) - o.buf = append(o.buf, p.tagcode...) - o.EncodeStringBytes(v) - return nil -} - -func size_ref_string(p *Properties, base structPointer) (n int) { - v := *structPointer_StringVal(base, p.field) - n += len(p.tagcode) - n += sizeStringBytes(v) - return -} - -// Encode a reference to a message struct. -func (o *Buffer) enc_ref_struct_message(p *Properties, base structPointer) error { - var state errorState - structp := structPointer_GetRefStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return ErrNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return nil - } - - o.buf = append(o.buf, p.tagcode...) - return o.enc_len_struct(p.sprop, structp, &state) -} - -//TODO this is only copied, please fix this -func size_ref_struct_message(p *Properties, base structPointer) int { - structp := structPointer_GetRefStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return 0 - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n0 := len(p.tagcode) - n1 := sizeRawBytes(data) - return n0 + n1 - } - - n0 := len(p.tagcode) - n1 := size_struct(p.sprop, structp) - n2 := sizeVarint(uint64(n1)) // size of encoded length - return n0 + n1 + n2 -} - -// Encode a slice of references to message struct pointers ([]struct). -func (o *Buffer) enc_slice_ref_struct_message(p *Properties, base structPointer) error { - var state errorState - ss := structPointer_StructRefSlice(base, p.field, p.stype.Size()) - l := ss.Len() - for i := 0; i < l; i++ { - structp := ss.Index(i) - if structPointer_IsNil(structp) { - return errRepeatedHasNil - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, err := m.Marshal() - if err != nil && !state.shouldContinue(err, nil) { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - continue - } - - o.buf = append(o.buf, p.tagcode...) - err := o.enc_len_struct(p.sprop, structp, &state) - if err != nil && !state.shouldContinue(err, nil) { - if err == ErrNil { - return errRepeatedHasNil - } - return err - } - - } - return state.err -} - -//TODO this is only copied, please fix this -func size_slice_ref_struct_message(p *Properties, base structPointer) (n int) { - ss := structPointer_StructRefSlice(base, p.field, p.stype.Size()) - l := ss.Len() - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - structp := ss.Index(i) - if structPointer_IsNil(structp) { - return // return the size up to this point - } - - // Can the object marshal itself? - if p.isMarshaler { - m := structPointer_Interface(structp, p.stype).(Marshaler) - data, _ := m.Marshal() - n += len(p.tagcode) - n += sizeRawBytes(data) - continue - } - - n0 := size_struct(p.sprop, structp) - n1 := sizeVarint(uint64(n0)) // size of encoded length - n += n0 + n1 - } - return -} - -func (o *Buffer) enc_custom_bytes(p *Properties, base structPointer) error { - i := structPointer_InterfaceRef(base, p.field, p.ctype) - if i == nil { - return ErrNil - } - custom := i.(Marshaler) - data, err := custom.Marshal() - if err != nil { - return err - } - if data == nil { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return nil -} - -func size_custom_bytes(p *Properties, base structPointer) (n int) { - n += len(p.tagcode) - i := structPointer_InterfaceRef(base, p.field, p.ctype) - if i == nil { - return 0 - } - custom := i.(Marshaler) - data, _ := custom.Marshal() - n += sizeRawBytes(data) - return -} - -func (o *Buffer) enc_custom_ref_bytes(p *Properties, base structPointer) error { - custom := structPointer_InterfaceAt(base, p.field, p.ctype).(Marshaler) - data, err := custom.Marshal() - if err != nil { - return err - } - if data == nil { - return ErrNil - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return nil -} - -func size_custom_ref_bytes(p *Properties, base structPointer) (n int) { - n += len(p.tagcode) - i := structPointer_InterfaceAt(base, p.field, p.ctype) - if i == nil { - return 0 - } - custom := i.(Marshaler) - data, _ := custom.Marshal() - n += sizeRawBytes(data) - return -} - -func (o *Buffer) enc_custom_slice_bytes(p *Properties, base structPointer) error { - inter := structPointer_InterfaceRef(base, p.field, p.ctype) - if inter == nil { - return ErrNil - } - slice := reflect.ValueOf(inter) - l := slice.Len() - for i := 0; i < l; i++ { - v := slice.Index(i) - custom := v.Interface().(Marshaler) - data, err := custom.Marshal() - if err != nil { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - } - return nil -} - -func size_custom_slice_bytes(p *Properties, base structPointer) (n int) { - inter := structPointer_InterfaceRef(base, p.field, p.ctype) - if inter == nil { - return 0 - } - slice := reflect.ValueOf(inter) - l := slice.Len() - n += l * len(p.tagcode) - for i := 0; i < l; i++ { - v := slice.Index(i) - custom := v.Interface().(Marshaler) - data, _ := custom.Marshal() - n += sizeRawBytes(data) - } - return -} diff --git a/vendor/github.com/gogo/protobuf/proto/equal.go b/vendor/github.com/gogo/protobuf/proto/equal.go deleted file mode 100644 index 2ed1cf5..0000000 --- a/vendor/github.com/gogo/protobuf/proto/equal.go +++ /dev/null @@ -1,300 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Protocol buffer comparison. - -package proto - -import ( - "bytes" - "log" - "reflect" - "strings" -) - -/* -Equal returns true iff protocol buffers a and b are equal. -The arguments must both be pointers to protocol buffer structs. - -Equality is defined in this way: - - Two messages are equal iff they are the same type, - corresponding fields are equal, unknown field sets - are equal, and extensions sets are equal. - - Two set scalar fields are equal iff their values are equal. - If the fields are of a floating-point type, remember that - NaN != x for all x, including NaN. If the message is defined - in a proto3 .proto file, fields are not "set"; specifically, - zero length proto3 "bytes" fields are equal (nil == {}). - - Two repeated fields are equal iff their lengths are the same, - and their corresponding elements are equal. Note a "bytes" field, - although represented by []byte, is not a repeated field and the - rule for the scalar fields described above applies. - - Two unset fields are equal. - - Two unknown field sets are equal if their current - encoded state is equal. - - Two extension sets are equal iff they have corresponding - elements that are pairwise equal. - - Two map fields are equal iff their lengths are the same, - and they contain the same set of elements. Zero-length map - fields are equal. - - Every other combination of things are not equal. - -The return value is undefined if a and b are not protocol buffers. -*/ -func Equal(a, b Message) bool { - if a == nil || b == nil { - return a == b - } - v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) - if v1.Type() != v2.Type() { - return false - } - if v1.Kind() == reflect.Ptr { - if v1.IsNil() { - return v2.IsNil() - } - if v2.IsNil() { - return false - } - v1, v2 = v1.Elem(), v2.Elem() - } - if v1.Kind() != reflect.Struct { - return false - } - return equalStruct(v1, v2) -} - -// v1 and v2 are known to have the same type. -func equalStruct(v1, v2 reflect.Value) bool { - sprop := GetProperties(v1.Type()) - for i := 0; i < v1.NumField(); i++ { - f := v1.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - f1, f2 := v1.Field(i), v2.Field(i) - if f.Type.Kind() == reflect.Ptr { - if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { - // both unset - continue - } else if n1 != n2 { - // set/unset mismatch - return false - } - b1, ok := f1.Interface().(raw) - if ok { - b2 := f2.Interface().(raw) - // RawMessage - if !bytes.Equal(b1.Bytes(), b2.Bytes()) { - return false - } - continue - } - f1, f2 = f1.Elem(), f2.Elem() - } - if !equalAny(f1, f2, sprop.Prop[i]) { - return false - } - } - - if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_InternalExtensions") - if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { - return false - } - } - - if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_extensions") - if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { - return false - } - } - - uf := v1.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return true - } - - u1 := uf.Bytes() - u2 := v2.FieldByName("XXX_unrecognized").Bytes() - if !bytes.Equal(u1, u2) { - return false - } - - return true -} - -// v1 and v2 are known to have the same type. -// prop may be nil. -func equalAny(v1, v2 reflect.Value, prop *Properties) bool { - if v1.Type() == protoMessageType { - m1, _ := v1.Interface().(Message) - m2, _ := v2.Interface().(Message) - return Equal(m1, m2) - } - switch v1.Kind() { - case reflect.Bool: - return v1.Bool() == v2.Bool() - case reflect.Float32, reflect.Float64: - return v1.Float() == v2.Float() - case reflect.Int32, reflect.Int64: - return v1.Int() == v2.Int() - case reflect.Interface: - // Probably a oneof field; compare the inner values. - n1, n2 := v1.IsNil(), v2.IsNil() - if n1 || n2 { - return n1 == n2 - } - e1, e2 := v1.Elem(), v2.Elem() - if e1.Type() != e2.Type() { - return false - } - return equalAny(e1, e2, nil) - case reflect.Map: - if v1.Len() != v2.Len() { - return false - } - for _, key := range v1.MapKeys() { - val2 := v2.MapIndex(key) - if !val2.IsValid() { - // This key was not found in the second map. - return false - } - if !equalAny(v1.MapIndex(key), val2, nil) { - return false - } - } - return true - case reflect.Ptr: - // Maps may have nil values in them, so check for nil. - if v1.IsNil() && v2.IsNil() { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return equalAny(v1.Elem(), v2.Elem(), prop) - case reflect.Slice: - if v1.Type().Elem().Kind() == reflect.Uint8 { - // short circuit: []byte - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value. - if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) - } - - if v1.Len() != v2.Len() { - return false - } - for i := 0; i < v1.Len(); i++ { - if !equalAny(v1.Index(i), v2.Index(i), prop) { - return false - } - } - return true - case reflect.String: - return v1.Interface().(string) == v2.Interface().(string) - case reflect.Struct: - return equalStruct(v1, v2) - case reflect.Uint32, reflect.Uint64: - return v1.Uint() == v2.Uint() - } - - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to compare %v", v1) - return false -} - -// base is the struct type that the extensions are based on. -// x1 and x2 are InternalExtensions. -func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { - em1, _ := x1.extensionsRead() - em2, _ := x2.extensionsRead() - return equalExtMap(base, em1, em2) -} - -func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { - if len(em1) != len(em2) { - return false - } - - for extNum, e1 := range em1 { - e2, ok := em2[extNum] - if !ok { - return false - } - - m1, m2 := e1.value, e2.value - - if m1 != nil && m2 != nil { - // Both are unencoded. - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - continue - } - - // At least one is encoded. To do a semantically correct comparison - // we need to unmarshal them first. - var desc *ExtensionDesc - if m := extensionMaps[base]; m != nil { - desc = m[extNum] - } - if desc == nil { - log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) - continue - } - var err error - if m1 == nil { - m1, err = decodeExtension(e1.enc, desc) - } - if m2 == nil && err == nil { - m2, err = decodeExtension(e2.enc, desc) - } - if err != nil { - // The encoded form is invalid. - log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) - return false - } - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - } - - return true -} diff --git a/vendor/github.com/gogo/protobuf/proto/extensions.go b/vendor/github.com/gogo/protobuf/proto/extensions.go deleted file mode 100644 index 0dfcb53..0000000 --- a/vendor/github.com/gogo/protobuf/proto/extensions.go +++ /dev/null @@ -1,693 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Types and routines for supporting protocol buffer extensions. - */ - -import ( - "errors" - "fmt" - "reflect" - "strconv" - "sync" -) - -// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. -var ErrMissingExtension = errors.New("proto: missing extension") - -// ExtensionRange represents a range of message extensions for a protocol buffer. -// Used in code generated by the protocol compiler. -type ExtensionRange struct { - Start, End int32 // both inclusive -} - -// extendableProto is an interface implemented by any protocol buffer generated by the current -// proto compiler that may be extended. -type extendableProto interface { - Message - ExtensionRangeArray() []ExtensionRange - extensionsWrite() map[int32]Extension - extensionsRead() (map[int32]Extension, sync.Locker) -} - -// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous -// version of the proto compiler that may be extended. -type extendableProtoV1 interface { - Message - ExtensionRangeArray() []ExtensionRange - ExtensionMap() map[int32]Extension -} - -type extensionsBytes interface { - Message - ExtensionRangeArray() []ExtensionRange - GetExtensions() *[]byte -} - -// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. -type extensionAdapter struct { - extendableProtoV1 -} - -func (e extensionAdapter) extensionsWrite() map[int32]Extension { - return e.ExtensionMap() -} - -func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { - return e.ExtensionMap(), notLocker{} -} - -// notLocker is a sync.Locker whose Lock and Unlock methods are nops. -type notLocker struct{} - -func (n notLocker) Lock() {} -func (n notLocker) Unlock() {} - -// extendable returns the extendableProto interface for the given generated proto message. -// If the proto message has the old extension format, it returns a wrapper that implements -// the extendableProto interface. -func extendable(p interface{}) (extendableProto, bool) { - if ep, ok := p.(extendableProto); ok { - return ep, ok - } - if ep, ok := p.(extendableProtoV1); ok { - return extensionAdapter{ep}, ok - } - return nil, false -} - -// XXX_InternalExtensions is an internal representation of proto extensions. -// -// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, -// thus gaining the unexported 'extensions' method, which can be called only from the proto package. -// -// The methods of XXX_InternalExtensions are not concurrency safe in general, -// but calls to logically read-only methods such as has and get may be executed concurrently. -type XXX_InternalExtensions struct { - // The struct must be indirect so that if a user inadvertently copies a - // generated message and its embedded XXX_InternalExtensions, they - // avoid the mayhem of a copied mutex. - // - // The mutex serializes all logically read-only operations to p.extensionMap. - // It is up to the client to ensure that write operations to p.extensionMap are - // mutually exclusive with other accesses. - p *struct { - mu sync.Mutex - extensionMap map[int32]Extension - } -} - -// extensionsWrite returns the extension map, creating it on first use. -func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { - if e.p == nil { - e.p = new(struct { - mu sync.Mutex - extensionMap map[int32]Extension - }) - e.p.extensionMap = make(map[int32]Extension) - } - return e.p.extensionMap -} - -// extensionsRead returns the extensions map for read-only use. It may be nil. -// The caller must hold the returned mutex's lock when accessing Elements within the map. -func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { - if e.p == nil { - return nil, nil - } - return e.p.extensionMap, &e.p.mu -} - -type extensionRange interface { - Message - ExtensionRangeArray() []ExtensionRange -} - -var extendableProtoType = reflect.TypeOf((*extendableProto)(nil)).Elem() -var extendableProtoV1Type = reflect.TypeOf((*extendableProtoV1)(nil)).Elem() -var extendableBytesType = reflect.TypeOf((*extensionsBytes)(nil)).Elem() -var extensionRangeType = reflect.TypeOf((*extensionRange)(nil)).Elem() - -// ExtensionDesc represents an extension specification. -// Used in generated code from the protocol compiler. -type ExtensionDesc struct { - ExtendedType Message // nil pointer to the type that is being extended - ExtensionType interface{} // nil pointer to the extension type - Field int32 // field number - Name string // fully-qualified name of extension, for text formatting - Tag string // protobuf tag style - Filename string // name of the file in which the extension is defined -} - -func (ed *ExtensionDesc) repeated() bool { - t := reflect.TypeOf(ed.ExtensionType) - return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 -} - -// Extension represents an extension in a message. -type Extension struct { - // When an extension is stored in a message using SetExtension - // only desc and value are set. When the message is marshaled - // enc will be set to the encoded form of the message. - // - // When a message is unmarshaled and contains extensions, each - // extension will have only enc set. When such an extension is - // accessed using GetExtension (or GetExtensions) desc and value - // will be set. - desc *ExtensionDesc - value interface{} - enc []byte -} - -// SetRawExtension is for testing only. -func SetRawExtension(base Message, id int32, b []byte) { - if ebase, ok := base.(extensionsBytes); ok { - clearExtension(base, id) - ext := ebase.GetExtensions() - *ext = append(*ext, b...) - return - } - epb, ok := extendable(base) - if !ok { - return - } - extmap := epb.extensionsWrite() - extmap[id] = Extension{enc: b} -} - -// isExtensionField returns true iff the given field number is in an extension range. -func isExtensionField(pb extensionRange, field int32) bool { - for _, er := range pb.ExtensionRangeArray() { - if er.Start <= field && field <= er.End { - return true - } - } - return false -} - -// checkExtensionTypes checks that the given extension is valid for pb. -func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { - var pbi interface{} = pb - // Check the extended type. - if ea, ok := pbi.(extensionAdapter); ok { - pbi = ea.extendableProtoV1 - } - if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { - return errors.New("proto: bad extended type; " + b.String() + " does not extend " + a.String()) - } - // Check the range. - if !isExtensionField(pb, extension.Field) { - return errors.New("proto: bad extension number; not in declared ranges") - } - return nil -} - -// extPropKey is sufficient to uniquely identify an extension. -type extPropKey struct { - base reflect.Type - field int32 -} - -var extProp = struct { - sync.RWMutex - m map[extPropKey]*Properties -}{ - m: make(map[extPropKey]*Properties), -} - -func extensionProperties(ed *ExtensionDesc) *Properties { - key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} - - extProp.RLock() - if prop, ok := extProp.m[key]; ok { - extProp.RUnlock() - return prop - } - extProp.RUnlock() - - extProp.Lock() - defer extProp.Unlock() - // Check again. - if prop, ok := extProp.m[key]; ok { - return prop - } - - prop := new(Properties) - prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) - extProp.m[key] = prop - return prop -} - -// encode encodes any unmarshaled (unencoded) extensions in e. -func encodeExtensions(e *XXX_InternalExtensions) error { - m, mu := e.extensionsRead() - if m == nil { - return nil // fast path - } - mu.Lock() - defer mu.Unlock() - return encodeExtensionsMap(m) -} - -// encode encodes any unmarshaled (unencoded) extensions in e. -func encodeExtensionsMap(m map[int32]Extension) error { - for k, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - p := NewBuffer(nil) - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - if err := props.enc(p, props, toStructPointer(x)); err != nil { - return err - } - e.enc = p.buf - m[k] = e - } - return nil -} - -func extensionsSize(e *XXX_InternalExtensions) (n int) { - m, mu := e.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - defer mu.Unlock() - return extensionsMapSize(m) -} - -func extensionsMapSize(m map[int32]Extension) (n int) { - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - n += props.size(props, toStructPointer(x)) - } - return -} - -// HasExtension returns whether the given extension is present in pb. -func HasExtension(pb Message, extension *ExtensionDesc) bool { - if epb, doki := pb.(extensionsBytes); doki { - ext := epb.GetExtensions() - buf := *ext - o := 0 - for o < len(buf) { - tag, n := DecodeVarint(buf[o:]) - fieldNum := int32(tag >> 3) - if int32(fieldNum) == extension.Field { - return true - } - wireType := int(tag & 0x7) - o += n - l, err := size(buf[o:], wireType) - if err != nil { - return false - } - o += l - } - return false - } - // TODO: Check types, field numbers, etc.? - epb, ok := extendable(pb) - if !ok { - return false - } - extmap, mu := epb.extensionsRead() - if extmap == nil { - return false - } - mu.Lock() - _, ok = extmap[extension.Field] - mu.Unlock() - return ok -} - -func deleteExtension(pb extensionsBytes, theFieldNum int32, offset int) int { - ext := pb.GetExtensions() - for offset < len(*ext) { - tag, n1 := DecodeVarint((*ext)[offset:]) - fieldNum := int32(tag >> 3) - wireType := int(tag & 0x7) - n2, err := size((*ext)[offset+n1:], wireType) - if err != nil { - panic(err) - } - newOffset := offset + n1 + n2 - if fieldNum == theFieldNum { - *ext = append((*ext)[:offset], (*ext)[newOffset:]...) - return offset - } - offset = newOffset - } - return -1 -} - -// ClearExtension removes the given extension from pb. -func ClearExtension(pb Message, extension *ExtensionDesc) { - clearExtension(pb, extension.Field) -} - -func clearExtension(pb Message, fieldNum int32) { - if epb, doki := pb.(extensionsBytes); doki { - offset := 0 - for offset != -1 { - offset = deleteExtension(epb, fieldNum, offset) - } - return - } - epb, ok := extendable(pb) - if !ok { - return - } - // TODO: Check types, field numbers, etc.? - extmap := epb.extensionsWrite() - delete(extmap, fieldNum) -} - -// GetExtension parses and returns the given extension of pb. -// If the extension is not present and has no default value it returns ErrMissingExtension. -func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { - if epb, doki := pb.(extensionsBytes); doki { - ext := epb.GetExtensions() - o := 0 - for o < len(*ext) { - tag, n := DecodeVarint((*ext)[o:]) - fieldNum := int32(tag >> 3) - wireType := int(tag & 0x7) - l, err := size((*ext)[o+n:], wireType) - if err != nil { - return nil, err - } - if int32(fieldNum) == extension.Field { - v, err := decodeExtension((*ext)[o:o+n+l], extension) - if err != nil { - return nil, err - } - return v, nil - } - o += n + l - } - return defaultExtensionValue(extension) - } - epb, ok := extendable(pb) - if !ok { - return nil, errors.New("proto: not an extendable proto") - } - if err := checkExtensionTypes(epb, extension); err != nil { - return nil, err - } - - emap, mu := epb.extensionsRead() - if emap == nil { - return defaultExtensionValue(extension) - } - mu.Lock() - defer mu.Unlock() - e, ok := emap[extension.Field] - if !ok { - // defaultExtensionValue returns the default value or - // ErrMissingExtension if there is no default. - return defaultExtensionValue(extension) - } - - if e.value != nil { - // Already decoded. Check the descriptor, though. - if e.desc != extension { - // This shouldn't happen. If it does, it means that - // GetExtension was called twice with two different - // descriptors with the same field number. - return nil, errors.New("proto: descriptor conflict") - } - return e.value, nil - } - - v, err := decodeExtension(e.enc, extension) - if err != nil { - return nil, err - } - - // Remember the decoded version and drop the encoded version. - // That way it is safe to mutate what we return. - e.value = v - e.desc = extension - e.enc = nil - emap[extension.Field] = e - return e.value, nil -} - -// defaultExtensionValue returns the default value for extension. -// If no default for an extension is defined ErrMissingExtension is returned. -func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { - t := reflect.TypeOf(extension.ExtensionType) - props := extensionProperties(extension) - - sf, _, err := fieldDefault(t, props) - if err != nil { - return nil, err - } - - if sf == nil || sf.value == nil { - // There is no default value. - return nil, ErrMissingExtension - } - - if t.Kind() != reflect.Ptr { - // We do not need to return a Ptr, we can directly return sf.value. - return sf.value, nil - } - - // We need to return an interface{} that is a pointer to sf.value. - value := reflect.New(t).Elem() - value.Set(reflect.New(value.Type().Elem())) - if sf.kind == reflect.Int32 { - // We may have an int32 or an enum, but the underlying data is int32. - // Since we can't set an int32 into a non int32 reflect.value directly - // set it as a int32. - value.Elem().SetInt(int64(sf.value.(int32))) - } else { - value.Elem().Set(reflect.ValueOf(sf.value)) - } - return value.Interface(), nil -} - -// decodeExtension decodes an extension encoded in b. -func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { - o := NewBuffer(b) - - t := reflect.TypeOf(extension.ExtensionType) - - props := extensionProperties(extension) - - // t is a pointer to a struct, pointer to basic type or a slice. - // Allocate a "field" to store the pointer/slice itself; the - // pointer/slice will be stored here. We pass - // the address of this field to props.dec. - // This passes a zero field and a *t and lets props.dec - // interpret it as a *struct{ x t }. - value := reflect.New(t).Elem() - - for { - // Discard wire type and field number varint. It isn't needed. - if _, err := o.DecodeVarint(); err != nil { - return nil, err - } - - if err := props.dec(o, props, toStructPointer(value.Addr())); err != nil { - return nil, err - } - - if o.index >= len(o.buf) { - break - } - } - return value.Interface(), nil -} - -// GetExtensions returns a slice of the extensions present in pb that are also listed in es. -// The returned slice has the same length as es; missing extensions will appear as nil elements. -func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { - extensions = make([]interface{}, len(es)) - for i, e := range es { - extensions[i], err = GetExtension(pb, e) - if err == ErrMissingExtension { - err = nil - } - if err != nil { - return - } - } - return -} - -// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. -// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing -// just the Field field, which defines the extension's field number. -func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { - epb, ok := extendable(pb) - if !ok { - return nil, fmt.Errorf("proto: %T is not an extendable proto.Message", pb) - } - registeredExtensions := RegisteredExtensions(pb) - - emap, mu := epb.extensionsRead() - if emap == nil { - return nil, nil - } - mu.Lock() - defer mu.Unlock() - extensions := make([]*ExtensionDesc, 0, len(emap)) - for extid, e := range emap { - desc := e.desc - if desc == nil { - desc = registeredExtensions[extid] - if desc == nil { - desc = &ExtensionDesc{Field: extid} - } - } - - extensions = append(extensions, desc) - } - return extensions, nil -} - -// SetExtension sets the specified extension of pb to the specified value. -func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { - if epb, doki := pb.(extensionsBytes); doki { - ClearExtension(pb, extension) - ext := epb.GetExtensions() - et := reflect.TypeOf(extension.ExtensionType) - props := extensionProperties(extension) - p := NewBuffer(nil) - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(value)) - if err := props.enc(p, props, toStructPointer(x)); err != nil { - return err - } - *ext = append(*ext, p.buf...) - return nil - } - epb, ok := extendable(pb) - if !ok { - return errors.New("proto: not an extendable proto") - } - if err := checkExtensionTypes(epb, extension); err != nil { - return err - } - typ := reflect.TypeOf(extension.ExtensionType) - if typ != reflect.TypeOf(value) { - return errors.New("proto: bad extension value type") - } - // nil extension values need to be caught early, because the - // encoder can't distinguish an ErrNil due to a nil extension - // from an ErrNil due to a missing field. Extensions are - // always optional, so the encoder would just swallow the error - // and drop all the extensions from the encoded message. - if reflect.ValueOf(value).IsNil() { - return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) - } - - extmap := epb.extensionsWrite() - extmap[extension.Field] = Extension{desc: extension, value: value} - return nil -} - -// ClearAllExtensions clears all extensions from pb. -func ClearAllExtensions(pb Message) { - if epb, doki := pb.(extensionsBytes); doki { - ext := epb.GetExtensions() - *ext = []byte{} - return - } - epb, ok := extendable(pb) - if !ok { - return - } - m := epb.extensionsWrite() - for k := range m { - delete(m, k) - } -} - -// A global registry of extensions. -// The generated code will register the generated descriptors by calling RegisterExtension. - -var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) - -// RegisterExtension is called from the generated code. -func RegisterExtension(desc *ExtensionDesc) { - st := reflect.TypeOf(desc.ExtendedType).Elem() - m := extensionMaps[st] - if m == nil { - m = make(map[int32]*ExtensionDesc) - extensionMaps[st] = m - } - if _, ok := m[desc.Field]; ok { - panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) - } - m[desc.Field] = desc -} - -// RegisteredExtensions returns a map of the registered extensions of a -// protocol buffer struct, indexed by the extension number. -// The argument pb should be a nil pointer to the struct type. -func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { - return extensionMaps[reflect.TypeOf(pb).Elem()] -} diff --git a/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go b/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go deleted file mode 100644 index ea6478f..0000000 --- a/vendor/github.com/gogo/protobuf/proto/extensions_gogo.go +++ /dev/null @@ -1,294 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "bytes" - "errors" - "fmt" - "reflect" - "sort" - "strings" - "sync" -) - -func GetBoolExtension(pb Message, extension *ExtensionDesc, ifnotset bool) bool { - if reflect.ValueOf(pb).IsNil() { - return ifnotset - } - value, err := GetExtension(pb, extension) - if err != nil { - return ifnotset - } - if value == nil { - return ifnotset - } - if value.(*bool) == nil { - return ifnotset - } - return *(value.(*bool)) -} - -func (this *Extension) Equal(that *Extension) bool { - return bytes.Equal(this.enc, that.enc) -} - -func (this *Extension) Compare(that *Extension) int { - return bytes.Compare(this.enc, that.enc) -} - -func SizeOfInternalExtension(m extendableProto) (n int) { - return SizeOfExtensionMap(m.extensionsWrite()) -} - -func SizeOfExtensionMap(m map[int32]Extension) (n int) { - return extensionsMapSize(m) -} - -type sortableMapElem struct { - field int32 - ext Extension -} - -func newSortableExtensionsFromMap(m map[int32]Extension) sortableExtensions { - s := make(sortableExtensions, 0, len(m)) - for k, v := range m { - s = append(s, &sortableMapElem{field: k, ext: v}) - } - return s -} - -type sortableExtensions []*sortableMapElem - -func (this sortableExtensions) Len() int { return len(this) } - -func (this sortableExtensions) Swap(i, j int) { this[i], this[j] = this[j], this[i] } - -func (this sortableExtensions) Less(i, j int) bool { return this[i].field < this[j].field } - -func (this sortableExtensions) String() string { - sort.Sort(this) - ss := make([]string, len(this)) - for i := range this { - ss[i] = fmt.Sprintf("%d: %v", this[i].field, this[i].ext) - } - return "map[" + strings.Join(ss, ",") + "]" -} - -func StringFromInternalExtension(m extendableProto) string { - return StringFromExtensionsMap(m.extensionsWrite()) -} - -func StringFromExtensionsMap(m map[int32]Extension) string { - return newSortableExtensionsFromMap(m).String() -} - -func StringFromExtensionsBytes(ext []byte) string { - m, err := BytesToExtensionsMap(ext) - if err != nil { - panic(err) - } - return StringFromExtensionsMap(m) -} - -func EncodeInternalExtension(m extendableProto, data []byte) (n int, err error) { - return EncodeExtensionMap(m.extensionsWrite(), data) -} - -func EncodeExtensionMap(m map[int32]Extension, data []byte) (n int, err error) { - if err := encodeExtensionsMap(m); err != nil { - return 0, err - } - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - for _, k := range keys { - n += copy(data[n:], m[int32(k)].enc) - } - return n, nil -} - -func GetRawExtension(m map[int32]Extension, id int32) ([]byte, error) { - if m[id].value == nil || m[id].desc == nil { - return m[id].enc, nil - } - if err := encodeExtensionsMap(m); err != nil { - return nil, err - } - return m[id].enc, nil -} - -func size(buf []byte, wire int) (int, error) { - switch wire { - case WireVarint: - _, n := DecodeVarint(buf) - return n, nil - case WireFixed64: - return 8, nil - case WireBytes: - v, n := DecodeVarint(buf) - return int(v) + n, nil - case WireFixed32: - return 4, nil - case WireStartGroup: - offset := 0 - for { - u, n := DecodeVarint(buf[offset:]) - fwire := int(u & 0x7) - offset += n - if fwire == WireEndGroup { - return offset, nil - } - s, err := size(buf[offset:], wire) - if err != nil { - return 0, err - } - offset += s - } - } - return 0, fmt.Errorf("proto: can't get size for unknown wire type %d", wire) -} - -func BytesToExtensionsMap(buf []byte) (map[int32]Extension, error) { - m := make(map[int32]Extension) - i := 0 - for i < len(buf) { - tag, n := DecodeVarint(buf[i:]) - if n <= 0 { - return nil, fmt.Errorf("unable to decode varint") - } - fieldNum := int32(tag >> 3) - wireType := int(tag & 0x7) - l, err := size(buf[i+n:], wireType) - if err != nil { - return nil, err - } - end := i + int(l) + n - m[int32(fieldNum)] = Extension{enc: buf[i:end]} - i = end - } - return m, nil -} - -func NewExtension(e []byte) Extension { - ee := Extension{enc: make([]byte, len(e))} - copy(ee.enc, e) - return ee -} - -func AppendExtension(e Message, tag int32, buf []byte) { - if ee, eok := e.(extensionsBytes); eok { - ext := ee.GetExtensions() - *ext = append(*ext, buf...) - return - } - if ee, eok := e.(extendableProto); eok { - m := ee.extensionsWrite() - ext := m[int32(tag)] // may be missing - ext.enc = append(ext.enc, buf...) - m[int32(tag)] = ext - } -} - -func encodeExtension(e *Extension) error { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - return nil - } - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - et := reflect.TypeOf(e.desc.ExtensionType) - props := extensionProperties(e.desc) - - p := NewBuffer(nil) - // If e.value has type T, the encoder expects a *struct{ X T }. - // Pass a *T with a zero field and hope it all works out. - x := reflect.New(et) - x.Elem().Set(reflect.ValueOf(e.value)) - if err := props.enc(p, props, toStructPointer(x)); err != nil { - return err - } - e.enc = p.buf - return nil -} - -func (this Extension) GoString() string { - if this.enc == nil { - if err := encodeExtension(&this); err != nil { - panic(err) - } - } - return fmt.Sprintf("proto.NewExtension(%#v)", this.enc) -} - -func SetUnsafeExtension(pb Message, fieldNum int32, value interface{}) error { - typ := reflect.TypeOf(pb).Elem() - ext, ok := extensionMaps[typ] - if !ok { - return fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) - } - desc, ok := ext[fieldNum] - if !ok { - return errors.New("proto: bad extension number; not in declared ranges") - } - return SetExtension(pb, desc, value) -} - -func GetUnsafeExtension(pb Message, fieldNum int32) (interface{}, error) { - typ := reflect.TypeOf(pb).Elem() - ext, ok := extensionMaps[typ] - if !ok { - return nil, fmt.Errorf("proto: bad extended type; %s is not extendable", typ.String()) - } - desc, ok := ext[fieldNum] - if !ok { - return nil, fmt.Errorf("unregistered field number %d", fieldNum) - } - return GetExtension(pb, desc) -} - -func NewUnsafeXXX_InternalExtensions(m map[int32]Extension) XXX_InternalExtensions { - x := &XXX_InternalExtensions{ - p: new(struct { - mu sync.Mutex - extensionMap map[int32]Extension - }), - } - x.p.extensionMap = m - return *x -} - -func GetUnsafeExtensionsMap(extendable Message) map[int32]Extension { - pb := extendable.(extendableProto) - return pb.extensionsWrite() -} diff --git a/vendor/github.com/gogo/protobuf/proto/lib.go b/vendor/github.com/gogo/protobuf/proto/lib.go deleted file mode 100644 index c98d73d..0000000 --- a/vendor/github.com/gogo/protobuf/proto/lib.go +++ /dev/null @@ -1,897 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/* -Package proto converts data structures to and from the wire format of -protocol buffers. It works in concert with the Go source code generated -for .proto files by the protocol compiler. - -A summary of the properties of the protocol buffer interface -for a protocol buffer variable v: - - - Names are turned from camel_case to CamelCase for export. - - There are no methods on v to set fields; just treat - them as structure fields. - - There are getters that return a field's value if set, - and return the field's default value if unset. - The getters work even if the receiver is a nil message. - - The zero value for a struct is its correct initialization state. - All desired fields must be set before marshaling. - - A Reset() method will restore a protobuf struct to its zero state. - - Non-repeated fields are pointers to the values; nil means unset. - That is, optional or required field int32 f becomes F *int32. - - Repeated fields are slices. - - Helper functions are available to aid the setting of fields. - msg.Foo = proto.String("hello") // set field - - Constants are defined to hold the default values of all fields that - have them. They have the form Default_StructName_FieldName. - Because the getter methods handle defaulted values, - direct use of these constants should be rare. - - Enums are given type names and maps from names to values. - Enum values are prefixed by the enclosing message's name, or by the - enum's type name if it is a top-level enum. Enum types have a String - method, and a Enum method to assist in message construction. - - Nested messages, groups and enums have type names prefixed with the name of - the surrounding message type. - - Extensions are given descriptor names that start with E_, - followed by an underscore-delimited list of the nested messages - that contain it (if any) followed by the CamelCased name of the - extension field itself. HasExtension, ClearExtension, GetExtension - and SetExtension are functions for manipulating extensions. - - Oneof field sets are given a single field in their message, - with distinguished wrapper types for each possible field value. - - Marshal and Unmarshal are functions to encode and decode the wire format. - -When the .proto file specifies `syntax="proto3"`, there are some differences: - - - Non-repeated fields of non-message type are values instead of pointers. - - Enum types do not get an Enum method. - -The simplest way to describe this is to see an example. -Given file test.proto, containing - - package example; - - enum FOO { X = 17; } - - message Test { - required string label = 1; - optional int32 type = 2 [default=77]; - repeated int64 reps = 3; - optional group OptionalGroup = 4 { - required string RequiredField = 5; - } - oneof union { - int32 number = 6; - string name = 7; - } - } - -The resulting file, test.pb.go, is: - - package example - - import proto "github.com/gogo/protobuf/proto" - import math "math" - - type FOO int32 - const ( - FOO_X FOO = 17 - ) - var FOO_name = map[int32]string{ - 17: "X", - } - var FOO_value = map[string]int32{ - "X": 17, - } - - func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p - } - func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) - } - func (x *FOO) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FOO_value, data) - if err != nil { - return err - } - *x = FOO(value) - return nil - } - - type Test struct { - Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` - Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` - Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` - Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - // Types that are valid to be assigned to Union: - // *Test_Number - // *Test_Name - Union isTest_Union `protobuf_oneof:"union"` - XXX_unrecognized []byte `json:"-"` - } - func (m *Test) Reset() { *m = Test{} } - func (m *Test) String() string { return proto.CompactTextString(m) } - func (*Test) ProtoMessage() {} - - type isTest_Union interface { - isTest_Union() - } - - type Test_Number struct { - Number int32 `protobuf:"varint,6,opt,name=number"` - } - type Test_Name struct { - Name string `protobuf:"bytes,7,opt,name=name"` - } - - func (*Test_Number) isTest_Union() {} - func (*Test_Name) isTest_Union() {} - - func (m *Test) GetUnion() isTest_Union { - if m != nil { - return m.Union - } - return nil - } - const Default_Test_Type int32 = 77 - - func (m *Test) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" - } - - func (m *Test) GetType() int32 { - if m != nil && m.Type != nil { - return *m.Type - } - return Default_Test_Type - } - - func (m *Test) GetOptionalgroup() *Test_OptionalGroup { - if m != nil { - return m.Optionalgroup - } - return nil - } - - type Test_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` - } - func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } - func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } - - func (m *Test_OptionalGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" - } - - func (m *Test) GetNumber() int32 { - if x, ok := m.GetUnion().(*Test_Number); ok { - return x.Number - } - return 0 - } - - func (m *Test) GetName() string { - if x, ok := m.GetUnion().(*Test_Name); ok { - return x.Name - } - return "" - } - - func init() { - proto.RegisterEnum("example.FOO", FOO_name, FOO_value) - } - -To create and play with a Test object: - - package main - - import ( - "log" - - "github.com/gogo/protobuf/proto" - pb "./example.pb" - ) - - func main() { - test := &pb.Test{ - Label: proto.String("hello"), - Type: proto.Int32(17), - Reps: []int64{1, 2, 3}, - Optionalgroup: &pb.Test_OptionalGroup{ - RequiredField: proto.String("good bye"), - }, - Union: &pb.Test_Name{"fred"}, - } - data, err := proto.Marshal(test) - if err != nil { - log.Fatal("marshaling error: ", err) - } - newTest := &pb.Test{} - err = proto.Unmarshal(data, newTest) - if err != nil { - log.Fatal("unmarshaling error: ", err) - } - // Now test and newTest contain the same data. - if test.GetLabel() != newTest.GetLabel() { - log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) - } - // Use a type switch to determine which oneof was set. - switch u := test.Union.(type) { - case *pb.Test_Number: // u.Number contains the number. - case *pb.Test_Name: // u.Name contains the string. - } - // etc. - } -*/ -package proto - -import ( - "encoding/json" - "fmt" - "log" - "reflect" - "sort" - "strconv" - "sync" -) - -// Message is implemented by generated protocol buffer messages. -type Message interface { - Reset() - String() string - ProtoMessage() -} - -// Stats records allocation details about the protocol buffer encoders -// and decoders. Useful for tuning the library itself. -type Stats struct { - Emalloc uint64 // mallocs in encode - Dmalloc uint64 // mallocs in decode - Encode uint64 // number of encodes - Decode uint64 // number of decodes - Chit uint64 // number of cache hits - Cmiss uint64 // number of cache misses - Size uint64 // number of sizes -} - -// Set to true to enable stats collection. -const collectStats = false - -var stats Stats - -// GetStats returns a copy of the global Stats structure. -func GetStats() Stats { return stats } - -// A Buffer is a buffer manager for marshaling and unmarshaling -// protocol buffers. It may be reused between invocations to -// reduce memory usage. It is not necessary to use a Buffer; -// the global functions Marshal and Unmarshal create a -// temporary Buffer and are fine for most applications. -type Buffer struct { - buf []byte // encode/decode byte stream - index int // read point - - // pools of basic types to amortize allocation. - bools []bool - uint32s []uint32 - uint64s []uint64 - - // extra pools, only used with pointer_reflect.go - int32s []int32 - int64s []int64 - float32s []float32 - float64s []float64 -} - -// NewBuffer allocates a new Buffer and initializes its internal data to -// the contents of the argument slice. -func NewBuffer(e []byte) *Buffer { - return &Buffer{buf: e} -} - -// Reset resets the Buffer, ready for marshaling a new protocol buffer. -func (p *Buffer) Reset() { - p.buf = p.buf[0:0] // for reading/writing - p.index = 0 // for reading -} - -// SetBuf replaces the internal buffer with the slice, -// ready for unmarshaling the contents of the slice. -func (p *Buffer) SetBuf(s []byte) { - p.buf = s - p.index = 0 -} - -// Bytes returns the contents of the Buffer. -func (p *Buffer) Bytes() []byte { return p.buf } - -/* - * Helper routines for simplifying the creation of optional fields of basic type. - */ - -// Bool is a helper routine that allocates a new bool value -// to store v and returns a pointer to it. -func Bool(v bool) *bool { - return &v -} - -// Int32 is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it. -func Int32(v int32) *int32 { - return &v -} - -// Int is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it, but unlike Int32 -// its argument value is an int. -func Int(v int) *int32 { - p := new(int32) - *p = int32(v) - return p -} - -// Int64 is a helper routine that allocates a new int64 value -// to store v and returns a pointer to it. -func Int64(v int64) *int64 { - return &v -} - -// Float32 is a helper routine that allocates a new float32 value -// to store v and returns a pointer to it. -func Float32(v float32) *float32 { - return &v -} - -// Float64 is a helper routine that allocates a new float64 value -// to store v and returns a pointer to it. -func Float64(v float64) *float64 { - return &v -} - -// Uint32 is a helper routine that allocates a new uint32 value -// to store v and returns a pointer to it. -func Uint32(v uint32) *uint32 { - return &v -} - -// Uint64 is a helper routine that allocates a new uint64 value -// to store v and returns a pointer to it. -func Uint64(v uint64) *uint64 { - return &v -} - -// String is a helper routine that allocates a new string value -// to store v and returns a pointer to it. -func String(v string) *string { - return &v -} - -// EnumName is a helper function to simplify printing protocol buffer enums -// by name. Given an enum map and a value, it returns a useful string. -func EnumName(m map[int32]string, v int32) string { - s, ok := m[v] - if ok { - return s - } - return strconv.Itoa(int(v)) -} - -// UnmarshalJSONEnum is a helper function to simplify recovering enum int values -// from their JSON-encoded representation. Given a map from the enum's symbolic -// names to its int values, and a byte buffer containing the JSON-encoded -// value, it returns an int32 that can be cast to the enum type by the caller. -// -// The function can deal with both JSON representations, numeric and symbolic. -func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { - if data[0] == '"' { - // New style: enums are strings. - var repr string - if err := json.Unmarshal(data, &repr); err != nil { - return -1, err - } - val, ok := m[repr] - if !ok { - return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) - } - return val, nil - } - // Old style: enums are ints. - var val int32 - if err := json.Unmarshal(data, &val); err != nil { - return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) - } - return val, nil -} - -// DebugPrint dumps the encoded data in b in a debugging format with a header -// including the string s. Used in testing but made available for general debugging. -func (p *Buffer) DebugPrint(s string, b []byte) { - var u uint64 - - obuf := p.buf - sindex := p.index - p.buf = b - p.index = 0 - depth := 0 - - fmt.Printf("\n--- %s ---\n", s) - -out: - for { - for i := 0; i < depth; i++ { - fmt.Print(" ") - } - - index := p.index - if index == len(p.buf) { - break - } - - op, err := p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: fetching op err %v\n", index, err) - break out - } - tag := op >> 3 - wire := op & 7 - - switch wire { - default: - fmt.Printf("%3d: t=%3d unknown wire=%d\n", - index, tag, wire) - break out - - case WireBytes: - var r []byte - - r, err = p.DecodeRawBytes(false) - if err != nil { - break out - } - fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) - if len(r) <= 6 { - for i := 0; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } else { - for i := 0; i < 3; i++ { - fmt.Printf(" %.2x", r[i]) - } - fmt.Printf(" ..") - for i := len(r) - 3; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } - fmt.Printf("\n") - - case WireFixed32: - u, err = p.DecodeFixed32() - if err != nil { - fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) - - case WireFixed64: - u, err = p.DecodeFixed64() - if err != nil { - fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) - - case WireVarint: - u, err = p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) - - case WireStartGroup: - fmt.Printf("%3d: t=%3d start\n", index, tag) - depth++ - - case WireEndGroup: - depth-- - fmt.Printf("%3d: t=%3d end\n", index, tag) - } - } - - if depth != 0 { - fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) - } - fmt.Printf("\n") - - p.buf = obuf - p.index = sindex -} - -// SetDefaults sets unset protocol buffer fields to their default values. -// It only modifies fields that are both unset and have defined defaults. -// It recursively sets default values in any non-nil sub-messages. -func SetDefaults(pb Message) { - setDefaults(reflect.ValueOf(pb), true, false) -} - -// v is a pointer to a struct. -func setDefaults(v reflect.Value, recur, zeros bool) { - v = v.Elem() - - defaultMu.RLock() - dm, ok := defaults[v.Type()] - defaultMu.RUnlock() - if !ok { - dm = buildDefaultMessage(v.Type()) - defaultMu.Lock() - defaults[v.Type()] = dm - defaultMu.Unlock() - } - - for _, sf := range dm.scalars { - f := v.Field(sf.index) - if !f.IsNil() { - // field already set - continue - } - dv := sf.value - if dv == nil && !zeros { - // no explicit default, and don't want to set zeros - continue - } - fptr := f.Addr().Interface() // **T - // TODO: Consider batching the allocations we do here. - switch sf.kind { - case reflect.Bool: - b := new(bool) - if dv != nil { - *b = dv.(bool) - } - *(fptr.(**bool)) = b - case reflect.Float32: - f := new(float32) - if dv != nil { - *f = dv.(float32) - } - *(fptr.(**float32)) = f - case reflect.Float64: - f := new(float64) - if dv != nil { - *f = dv.(float64) - } - *(fptr.(**float64)) = f - case reflect.Int32: - // might be an enum - if ft := f.Type(); ft != int32PtrType { - // enum - f.Set(reflect.New(ft.Elem())) - if dv != nil { - f.Elem().SetInt(int64(dv.(int32))) - } - } else { - // int32 field - i := new(int32) - if dv != nil { - *i = dv.(int32) - } - *(fptr.(**int32)) = i - } - case reflect.Int64: - i := new(int64) - if dv != nil { - *i = dv.(int64) - } - *(fptr.(**int64)) = i - case reflect.String: - s := new(string) - if dv != nil { - *s = dv.(string) - } - *(fptr.(**string)) = s - case reflect.Uint8: - // exceptional case: []byte - var b []byte - if dv != nil { - db := dv.([]byte) - b = make([]byte, len(db)) - copy(b, db) - } else { - b = []byte{} - } - *(fptr.(*[]byte)) = b - case reflect.Uint32: - u := new(uint32) - if dv != nil { - *u = dv.(uint32) - } - *(fptr.(**uint32)) = u - case reflect.Uint64: - u := new(uint64) - if dv != nil { - *u = dv.(uint64) - } - *(fptr.(**uint64)) = u - default: - log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) - } - } - - for _, ni := range dm.nested { - f := v.Field(ni) - // f is *T or []*T or map[T]*T - switch f.Kind() { - case reflect.Ptr: - if f.IsNil() { - continue - } - setDefaults(f, recur, zeros) - - case reflect.Slice: - for i := 0; i < f.Len(); i++ { - e := f.Index(i) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - - case reflect.Map: - for _, k := range f.MapKeys() { - e := f.MapIndex(k) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - } - } -} - -var ( - // defaults maps a protocol buffer struct type to a slice of the fields, - // with its scalar fields set to their proto-declared non-zero default values. - defaultMu sync.RWMutex - defaults = make(map[reflect.Type]defaultMessage) - - int32PtrType = reflect.TypeOf((*int32)(nil)) -) - -// defaultMessage represents information about the default values of a message. -type defaultMessage struct { - scalars []scalarField - nested []int // struct field index of nested messages -} - -type scalarField struct { - index int // struct field index - kind reflect.Kind // element type (the T in *T or []T) - value interface{} // the proto-declared default value, or nil -} - -// t is a struct type. -func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { - sprop := GetProperties(t) - for _, prop := range sprop.Prop { - fi, ok := sprop.decoderTags.get(prop.Tag) - if !ok { - // XXX_unrecognized - continue - } - ft := t.Field(fi).Type - - sf, nested, err := fieldDefault(ft, prop) - switch { - case err != nil: - log.Print(err) - case nested: - dm.nested = append(dm.nested, fi) - case sf != nil: - sf.index = fi - dm.scalars = append(dm.scalars, *sf) - } - } - - return dm -} - -// fieldDefault returns the scalarField for field type ft. -// sf will be nil if the field can not have a default. -// nestedMessage will be true if this is a nested message. -// Note that sf.index is not set on return. -func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { - var canHaveDefault bool - switch ft.Kind() { - case reflect.Ptr: - if ft.Elem().Kind() == reflect.Struct { - nestedMessage = true - } else { - canHaveDefault = true // proto2 scalar field - } - - case reflect.Slice: - switch ft.Elem().Kind() { - case reflect.Ptr: - nestedMessage = true // repeated message - case reflect.Uint8: - canHaveDefault = true // bytes field - } - - case reflect.Map: - if ft.Elem().Kind() == reflect.Ptr { - nestedMessage = true // map with message values - } - } - - if !canHaveDefault { - if nestedMessage { - return nil, true, nil - } - return nil, false, nil - } - - // We now know that ft is a pointer or slice. - sf = &scalarField{kind: ft.Elem().Kind()} - - // scalar fields without defaults - if !prop.HasDefault { - return sf, false, nil - } - - // a scalar field: either *T or []byte - switch ft.Elem().Kind() { - case reflect.Bool: - x, err := strconv.ParseBool(prop.Default) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Float32: - x, err := strconv.ParseFloat(prop.Default, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) - } - sf.value = float32(x) - case reflect.Float64: - x, err := strconv.ParseFloat(prop.Default, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Int32: - x, err := strconv.ParseInt(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) - } - sf.value = int32(x) - case reflect.Int64: - x, err := strconv.ParseInt(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.String: - sf.value = prop.Default - case reflect.Uint8: - // []byte (not *uint8) - sf.value = []byte(prop.Default) - case reflect.Uint32: - x, err := strconv.ParseUint(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) - } - sf.value = uint32(x) - case reflect.Uint64: - x, err := strconv.ParseUint(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) - } - sf.value = x - default: - return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) - } - - return sf, false, nil -} - -// Map fields may have key types of non-float scalars, strings and enums. -// The easiest way to sort them in some deterministic order is to use fmt. -// If this turns out to be inefficient we can always consider other options, -// such as doing a Schwartzian transform. - -func mapKeys(vs []reflect.Value) sort.Interface { - s := mapKeySorter{ - vs: vs, - // default Less function: textual comparison - less: func(a, b reflect.Value) bool { - return fmt.Sprint(a.Interface()) < fmt.Sprint(b.Interface()) - }, - } - - // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps; - // numeric keys are sorted numerically. - if len(vs) == 0 { - return s - } - switch vs[0].Kind() { - case reflect.Int32, reflect.Int64: - s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } - case reflect.Uint32, reflect.Uint64: - s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } - } - - return s -} - -type mapKeySorter struct { - vs []reflect.Value - less func(a, b reflect.Value) bool -} - -func (s mapKeySorter) Len() int { return len(s.vs) } -func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } -func (s mapKeySorter) Less(i, j int) bool { - return s.less(s.vs[i], s.vs[j]) -} - -// isProto3Zero reports whether v is a zero proto3 value. -func isProto3Zero(v reflect.Value) bool { - switch v.Kind() { - case reflect.Bool: - return !v.Bool() - case reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint32, reflect.Uint64: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.String: - return v.String() == "" - } - return false -} - -// ProtoPackageIsVersion2 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const GoGoProtoPackageIsVersion2 = true - -// ProtoPackageIsVersion1 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const GoGoProtoPackageIsVersion1 = true diff --git a/vendor/github.com/gogo/protobuf/proto/lib_gogo.go b/vendor/github.com/gogo/protobuf/proto/lib_gogo.go deleted file mode 100644 index 4b4f7c9..0000000 --- a/vendor/github.com/gogo/protobuf/proto/lib_gogo.go +++ /dev/null @@ -1,42 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "encoding/json" - "strconv" -) - -func MarshalJSONEnum(m map[int32]string, value int32) ([]byte, error) { - s, ok := m[value] - if !ok { - s = strconv.Itoa(int(value)) - } - return json.Marshal(s) -} diff --git a/vendor/github.com/gogo/protobuf/proto/message_set.go b/vendor/github.com/gogo/protobuf/proto/message_set.go deleted file mode 100644 index fd982de..0000000 --- a/vendor/github.com/gogo/protobuf/proto/message_set.go +++ /dev/null @@ -1,311 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Support for message sets. - */ - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "reflect" - "sort" -) - -// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. -// A message type ID is required for storing a protocol buffer in a message set. -var errNoMessageTypeID = errors.New("proto does not have a message type ID") - -// The first two types (_MessageSet_Item and messageSet) -// model what the protocol compiler produces for the following protocol message: -// message MessageSet { -// repeated group Item = 1 { -// required int32 type_id = 2; -// required string message = 3; -// }; -// } -// That is the MessageSet wire format. We can't use a proto to generate these -// because that would introduce a circular dependency between it and this package. - -type _MessageSet_Item struct { - TypeId *int32 `protobuf:"varint,2,req,name=type_id"` - Message []byte `protobuf:"bytes,3,req,name=message"` -} - -type messageSet struct { - Item []*_MessageSet_Item `protobuf:"group,1,rep"` - XXX_unrecognized []byte - // TODO: caching? -} - -// Make sure messageSet is a Message. -var _ Message = (*messageSet)(nil) - -// messageTypeIder is an interface satisfied by a protocol buffer type -// that may be stored in a MessageSet. -type messageTypeIder interface { - MessageTypeId() int32 -} - -func (ms *messageSet) find(pb Message) *_MessageSet_Item { - mti, ok := pb.(messageTypeIder) - if !ok { - return nil - } - id := mti.MessageTypeId() - for _, item := range ms.Item { - if *item.TypeId == id { - return item - } - } - return nil -} - -func (ms *messageSet) Has(pb Message) bool { - if ms.find(pb) != nil { - return true - } - return false -} - -func (ms *messageSet) Unmarshal(pb Message) error { - if item := ms.find(pb); item != nil { - return Unmarshal(item.Message, pb) - } - if _, ok := pb.(messageTypeIder); !ok { - return errNoMessageTypeID - } - return nil // TODO: return error instead? -} - -func (ms *messageSet) Marshal(pb Message) error { - msg, err := Marshal(pb) - if err != nil { - return err - } - if item := ms.find(pb); item != nil { - // reuse existing item - item.Message = msg - return nil - } - - mti, ok := pb.(messageTypeIder) - if !ok { - return errNoMessageTypeID - } - - mtid := mti.MessageTypeId() - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: &mtid, - Message: msg, - }) - return nil -} - -func (ms *messageSet) Reset() { *ms = messageSet{} } -func (ms *messageSet) String() string { return CompactTextString(ms) } -func (*messageSet) ProtoMessage() {} - -// Support for the message_set_wire_format message option. - -func skipVarint(buf []byte) []byte { - i := 0 - for ; buf[i]&0x80 != 0; i++ { - } - return buf[i+1:] -} - -// MarshalMessageSet encodes the extension map represented by m in the message set wire format. -// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSet(exts interface{}) ([]byte, error) { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - if err := encodeExtensions(exts); err != nil { - return nil, err - } - m, _ = exts.extensionsRead() - case map[int32]Extension: - if err := encodeExtensionsMap(exts); err != nil { - return nil, err - } - m = exts - default: - return nil, errors.New("proto: not an extension map") - } - - // Sort extension IDs to provide a deterministic encoding. - // See also enc_map in encode.go. - ids := make([]int, 0, len(m)) - for id := range m { - ids = append(ids, int(id)) - } - sort.Ints(ids) - - ms := &messageSet{Item: make([]*_MessageSet_Item, 0, len(m))} - for _, id := range ids { - e := m[int32(id)] - // Remove the wire type and field number varint, as well as the length varint. - msg := skipVarint(skipVarint(e.enc)) - - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: Int32(int32(id)), - Message: msg, - }) - } - return Marshal(ms) -} - -// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. -// It is called by generated Unmarshal methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSet(buf []byte, exts interface{}) error { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - m = exts.extensionsWrite() - case map[int32]Extension: - m = exts - default: - return errors.New("proto: not an extension map") - } - - ms := new(messageSet) - if err := Unmarshal(buf, ms); err != nil { - return err - } - for _, item := range ms.Item { - id := *item.TypeId - msg := item.Message - - // Restore wire type and field number varint, plus length varint. - // Be careful to preserve duplicate items. - b := EncodeVarint(uint64(id)<<3 | WireBytes) - if ext, ok := m[id]; ok { - // Existing data; rip off the tag and length varint - // so we join the new data correctly. - // We can assume that ext.enc is set because we are unmarshaling. - o := ext.enc[len(b):] // skip wire type and field number - _, n := DecodeVarint(o) // calculate length of length varint - o = o[n:] // skip length varint - msg = append(o, msg...) // join old data and new data - } - b = append(b, EncodeVarint(uint64(len(msg)))...) - b = append(b, msg...) - - m[id] = Extension{enc: b} - } - return nil -} - -// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. -// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - m, _ = exts.extensionsRead() - case map[int32]Extension: - m = exts - default: - return nil, errors.New("proto: not an extension map") - } - var b bytes.Buffer - b.WriteByte('{') - - // Process the map in key order for deterministic output. - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) // int32Slice defined in text.go - - for i, id := range ids { - ext := m[id] - if i > 0 { - b.WriteByte(',') - } - - msd, ok := messageSetMap[id] - if !ok { - // Unknown type; we can't render it, so skip it. - continue - } - fmt.Fprintf(&b, `"[%s]":`, msd.name) - - x := ext.value - if x == nil { - x = reflect.New(msd.t.Elem()).Interface() - if err := Unmarshal(ext.enc, x.(Message)); err != nil { - return nil, err - } - } - d, err := json.Marshal(x) - if err != nil { - return nil, err - } - b.Write(d) - } - b.WriteByte('}') - return b.Bytes(), nil -} - -// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. -// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { - // Common-case fast path. - if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { - return nil - } - - // This is fairly tricky, and it's not clear that it is needed. - return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") -} - -// A global registry of types that can be used in a MessageSet. - -var messageSetMap = make(map[int32]messageSetDesc) - -type messageSetDesc struct { - t reflect.Type // pointer to struct - name string -} - -// RegisterMessageSetType is called from the generated code. -func RegisterMessageSetType(m Message, fieldNum int32, name string) { - messageSetMap[fieldNum] = messageSetDesc{ - t: reflect.TypeOf(m), - name: name, - } -} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go deleted file mode 100644 index fb512e2..0000000 --- a/vendor/github.com/gogo/protobuf/proto/pointer_reflect.go +++ /dev/null @@ -1,484 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build appengine js - -// This file contains an implementation of proto field accesses using package reflect. -// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can -// be used on App Engine. - -package proto - -import ( - "math" - "reflect" -) - -// A structPointer is a pointer to a struct. -type structPointer struct { - v reflect.Value -} - -// toStructPointer returns a structPointer equivalent to the given reflect value. -// The reflect value must itself be a pointer to a struct. -func toStructPointer(v reflect.Value) structPointer { - return structPointer{v} -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p.v.IsNil() -} - -// Interface returns the struct pointer as an interface value. -func structPointer_Interface(p structPointer, _ reflect.Type) interface{} { - return p.v.Interface() -} - -// A field identifies a field in a struct, accessible from a structPointer. -// In this implementation, a field is identified by the sequence of field indices -// passed to reflect's FieldByIndex. -type field []int - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return f.Index -} - -// invalidField is an invalid field identifier. -var invalidField = field(nil) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { return f != nil } - -// field returns the given field in the struct as a reflect value. -func structPointer_field(p structPointer, f field) reflect.Value { - // Special case: an extension map entry with a value of type T - // passes a *T to the struct-handling code with a zero field, - // expecting that it will be treated as equivalent to *struct{ X T }, - // which has the same memory layout. We have to handle that case - // specially, because reflect will panic if we call FieldByIndex on a - // non-struct. - if f == nil { - return p.v.Elem() - } - - return p.v.Elem().FieldByIndex(f) -} - -// ifield returns the given field in the struct as an interface value. -func structPointer_ifield(p structPointer, f field) interface{} { - return structPointer_field(p, f).Addr().Interface() -} - -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return structPointer_ifield(p, f).(*[]byte) -} - -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return structPointer_ifield(p, f).(*[][]byte) -} - -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return structPointer_ifield(p, f).(**bool) -} - -// BoolVal returns the address of a bool field in the struct. -func structPointer_BoolVal(p structPointer, f field) *bool { - return structPointer_ifield(p, f).(*bool) -} - -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return structPointer_ifield(p, f).(*[]bool) -} - -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return structPointer_ifield(p, f).(**string) -} - -// StringVal returns the address of a string field in the struct. -func structPointer_StringVal(p structPointer, f field) *string { - return structPointer_ifield(p, f).(*string) -} - -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return structPointer_ifield(p, f).(*[]string) -} - -// Extensions returns the address of an extension map field in the struct. -func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { - return structPointer_ifield(p, f).(*XXX_InternalExtensions) -} - -// ExtMap returns the address of an extension map field in the struct. -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return structPointer_ifield(p, f).(*map[int32]Extension) -} - -// NewAt returns the reflect.Value for a pointer to a field in the struct. -func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { - return structPointer_field(p, f).Addr() -} - -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - structPointer_field(p, f).Set(q.v) -} - -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return structPointer{structPointer_field(p, f)} -} - -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) structPointerSlice { - return structPointerSlice{structPointer_field(p, f)} -} - -// A structPointerSlice represents the address of a slice of pointers to structs -// (themselves messages or groups). That is, v.Type() is *[]*struct{...}. -type structPointerSlice struct { - v reflect.Value -} - -func (p structPointerSlice) Len() int { return p.v.Len() } -func (p structPointerSlice) Index(i int) structPointer { return structPointer{p.v.Index(i)} } -func (p structPointerSlice) Append(q structPointer) { - p.v.Set(reflect.Append(p.v, q.v)) -} - -var ( - int32Type = reflect.TypeOf(int32(0)) - uint32Type = reflect.TypeOf(uint32(0)) - float32Type = reflect.TypeOf(float32(0)) - int64Type = reflect.TypeOf(int64(0)) - uint64Type = reflect.TypeOf(uint64(0)) - float64Type = reflect.TypeOf(float64(0)) -) - -// A word32 represents a field of type *int32, *uint32, *float32, or *enum. -// That is, v.Type() is *int32, *uint32, *float32, or *enum and v is assignable. -type word32 struct { - v reflect.Value -} - -// IsNil reports whether p is nil. -func word32_IsNil(p word32) bool { - return p.v.IsNil() -} - -// Set sets p to point at a newly allocated word with bits set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - t := p.v.Type().Elem() - switch t { - case int32Type: - if len(o.int32s) == 0 { - o.int32s = make([]int32, uint32PoolSize) - } - o.int32s[0] = int32(x) - p.v.Set(reflect.ValueOf(&o.int32s[0])) - o.int32s = o.int32s[1:] - return - case uint32Type: - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - p.v.Set(reflect.ValueOf(&o.uint32s[0])) - o.uint32s = o.uint32s[1:] - return - case float32Type: - if len(o.float32s) == 0 { - o.float32s = make([]float32, uint32PoolSize) - } - o.float32s[0] = math.Float32frombits(x) - p.v.Set(reflect.ValueOf(&o.float32s[0])) - o.float32s = o.float32s[1:] - return - } - - // must be enum - p.v.Set(reflect.New(t)) - p.v.Elem().SetInt(int64(int32(x))) -} - -// Get gets the bits pointed at by p, as a uint32. -func word32_Get(p word32) uint32 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") -} - -// Word32 returns a reference to a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32{structPointer_field(p, f)} -} - -// A word32Val represents a field of type int32, uint32, float32, or enum. -// That is, v.Type() is int32, uint32, float32, or enum and v is assignable. -type word32Val struct { - v reflect.Value -} - -// Set sets *p to x. -func word32Val_Set(p word32Val, x uint32) { - switch p.v.Type() { - case int32Type: - p.v.SetInt(int64(x)) - return - case uint32Type: - p.v.SetUint(uint64(x)) - return - case float32Type: - p.v.SetFloat(float64(math.Float32frombits(x))) - return - } - - // must be enum - p.v.SetInt(int64(int32(x))) -} - -// Get gets the bits pointed at by p, as a uint32. -func word32Val_Get(p word32Val) uint32 { - elem := p.v - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") -} - -// Word32Val returns a reference to a int32, uint32, float32, or enum field in the struct. -func structPointer_Word32Val(p structPointer, f field) word32Val { - return word32Val{structPointer_field(p, f)} -} - -// A word32Slice is a slice of 32-bit values. -// That is, v.Type() is []int32, []uint32, []float32, or []enum. -type word32Slice struct { - v reflect.Value -} - -func (p word32Slice) Append(x uint32) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int32: - elem.SetInt(int64(int32(x))) - case reflect.Uint32: - elem.SetUint(uint64(x)) - case reflect.Float32: - elem.SetFloat(float64(math.Float32frombits(x))) - } -} - -func (p word32Slice) Len() int { - return p.v.Len() -} - -func (p word32Slice) Index(i int) uint32 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int32: - return uint32(elem.Int()) - case reflect.Uint32: - return uint32(elem.Uint()) - case reflect.Float32: - return math.Float32bits(float32(elem.Float())) - } - panic("unreachable") -} - -// Word32Slice returns a reference to a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) word32Slice { - return word32Slice{structPointer_field(p, f)} -} - -// word64 is like word32 but for 64-bit values. -type word64 struct { - v reflect.Value -} - -func word64_Set(p word64, o *Buffer, x uint64) { - t := p.v.Type().Elem() - switch t { - case int64Type: - if len(o.int64s) == 0 { - o.int64s = make([]int64, uint64PoolSize) - } - o.int64s[0] = int64(x) - p.v.Set(reflect.ValueOf(&o.int64s[0])) - o.int64s = o.int64s[1:] - return - case uint64Type: - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - p.v.Set(reflect.ValueOf(&o.uint64s[0])) - o.uint64s = o.uint64s[1:] - return - case float64Type: - if len(o.float64s) == 0 { - o.float64s = make([]float64, uint64PoolSize) - } - o.float64s[0] = math.Float64frombits(x) - p.v.Set(reflect.ValueOf(&o.float64s[0])) - o.float64s = o.float64s[1:] - return - } - panic("unreachable") -} - -func word64_IsNil(p word64) bool { - return p.v.IsNil() -} - -func word64_Get(p word64) uint64 { - elem := p.v.Elem() - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return elem.Uint() - case reflect.Float64: - return math.Float64bits(elem.Float()) - } - panic("unreachable") -} - -func structPointer_Word64(p structPointer, f field) word64 { - return word64{structPointer_field(p, f)} -} - -// word64Val is like word32Val but for 64-bit values. -type word64Val struct { - v reflect.Value -} - -func word64Val_Set(p word64Val, o *Buffer, x uint64) { - switch p.v.Type() { - case int64Type: - p.v.SetInt(int64(x)) - return - case uint64Type: - p.v.SetUint(x) - return - case float64Type: - p.v.SetFloat(math.Float64frombits(x)) - return - } - panic("unreachable") -} - -func word64Val_Get(p word64Val) uint64 { - elem := p.v - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return elem.Uint() - case reflect.Float64: - return math.Float64bits(elem.Float()) - } - panic("unreachable") -} - -func structPointer_Word64Val(p structPointer, f field) word64Val { - return word64Val{structPointer_field(p, f)} -} - -type word64Slice struct { - v reflect.Value -} - -func (p word64Slice) Append(x uint64) { - n, m := p.v.Len(), p.v.Cap() - if n < m { - p.v.SetLen(n + 1) - } else { - t := p.v.Type().Elem() - p.v.Set(reflect.Append(p.v, reflect.Zero(t))) - } - elem := p.v.Index(n) - switch elem.Kind() { - case reflect.Int64: - elem.SetInt(int64(int64(x))) - case reflect.Uint64: - elem.SetUint(uint64(x)) - case reflect.Float64: - elem.SetFloat(float64(math.Float64frombits(x))) - } -} - -func (p word64Slice) Len() int { - return p.v.Len() -} - -func (p word64Slice) Index(i int) uint64 { - elem := p.v.Index(i) - switch elem.Kind() { - case reflect.Int64: - return uint64(elem.Int()) - case reflect.Uint64: - return uint64(elem.Uint()) - case reflect.Float64: - return math.Float64bits(float64(elem.Float())) - } - panic("unreachable") -} - -func structPointer_Word64Slice(p structPointer, f field) word64Slice { - return word64Slice{structPointer_field(p, f)} -} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go deleted file mode 100644 index 1763a5f..0000000 --- a/vendor/github.com/gogo/protobuf/proto/pointer_reflect_gogo.go +++ /dev/null @@ -1,85 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2016, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build appengine js - -package proto - -import ( - "reflect" -) - -func structPointer_FieldPointer(p structPointer, f field) structPointer { - panic("not implemented") -} - -func appendStructPointer(base structPointer, f field, typ reflect.Type) structPointer { - panic("not implemented") -} - -func structPointer_InterfaceAt(p structPointer, f field, t reflect.Type) interface{} { - panic("not implemented") -} - -func structPointer_InterfaceRef(p structPointer, f field, t reflect.Type) interface{} { - panic("not implemented") -} - -func structPointer_GetRefStructPointer(p structPointer, f field) structPointer { - panic("not implemented") -} - -func structPointer_Add(p structPointer, size field) structPointer { - panic("not implemented") -} - -func structPointer_Len(p structPointer, f field) int { - panic("not implemented") -} - -func structPointer_GetSliceHeader(p structPointer, f field) *reflect.SliceHeader { - panic("not implemented") -} - -func structPointer_Copy(oldptr structPointer, newptr structPointer, size int) { - panic("not implemented") -} - -func structPointer_StructRefSlice(p structPointer, f field, size uintptr) *structRefSlice { - panic("not implemented") -} - -type structRefSlice struct{} - -func (v *structRefSlice) Len() int { - panic("not implemented") -} - -func (v *structRefSlice) Index(i int) structPointer { - panic("not implemented") -} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go deleted file mode 100644 index 6b5567d..0000000 --- a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe.go +++ /dev/null @@ -1,270 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build !appengine,!js - -// This file contains the implementation of the proto field accesses using package unsafe. - -package proto - -import ( - "reflect" - "unsafe" -) - -// NOTE: These type_Foo functions would more idiomatically be methods, -// but Go does not allow methods on pointer types, and we must preserve -// some pointer type for the garbage collector. We use these -// funcs with clunky names as our poor approximation to methods. -// -// An alternative would be -// type structPointer struct { p unsafe.Pointer } -// but that does not registerize as well. - -// A structPointer is a pointer to a struct. -type structPointer unsafe.Pointer - -// toStructPointer returns a structPointer equivalent to the given reflect value. -func toStructPointer(v reflect.Value) structPointer { - return structPointer(unsafe.Pointer(v.Pointer())) -} - -// IsNil reports whether p is nil. -func structPointer_IsNil(p structPointer) bool { - return p == nil -} - -// Interface returns the struct pointer, assumed to have element type t, -// as an interface value. -func structPointer_Interface(p structPointer, t reflect.Type) interface{} { - return reflect.NewAt(t, unsafe.Pointer(p)).Interface() -} - -// A field identifies a field in a struct, accessible from a structPointer. -// In this implementation, a field is identified by its byte offset from the start of the struct. -type field uintptr - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return field(f.Offset) -} - -// invalidField is an invalid field identifier. -const invalidField = ^field(0) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { - return f != ^field(0) -} - -// Bytes returns the address of a []byte field in the struct. -func structPointer_Bytes(p structPointer, f field) *[]byte { - return (*[]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// BytesSlice returns the address of a [][]byte field in the struct. -func structPointer_BytesSlice(p structPointer, f field) *[][]byte { - return (*[][]byte)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// Bool returns the address of a *bool field in the struct. -func structPointer_Bool(p structPointer, f field) **bool { - return (**bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// BoolVal returns the address of a bool field in the struct. -func structPointer_BoolVal(p structPointer, f field) *bool { - return (*bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// BoolSlice returns the address of a []bool field in the struct. -func structPointer_BoolSlice(p structPointer, f field) *[]bool { - return (*[]bool)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// String returns the address of a *string field in the struct. -func structPointer_String(p structPointer, f field) **string { - return (**string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// StringVal returns the address of a string field in the struct. -func structPointer_StringVal(p structPointer, f field) *string { - return (*string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// StringSlice returns the address of a []string field in the struct. -func structPointer_StringSlice(p structPointer, f field) *[]string { - return (*[]string)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// ExtMap returns the address of an extension map field in the struct. -func structPointer_Extensions(p structPointer, f field) *XXX_InternalExtensions { - return (*XXX_InternalExtensions)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -func structPointer_ExtMap(p structPointer, f field) *map[int32]Extension { - return (*map[int32]Extension)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// NewAt returns the reflect.Value for a pointer to a field in the struct. -func structPointer_NewAt(p structPointer, f field, typ reflect.Type) reflect.Value { - return reflect.NewAt(typ, unsafe.Pointer(uintptr(p)+uintptr(f))) -} - -// SetStructPointer writes a *struct field in the struct. -func structPointer_SetStructPointer(p structPointer, f field, q structPointer) { - *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) = q -} - -// GetStructPointer reads a *struct field in the struct. -func structPointer_GetStructPointer(p structPointer, f field) structPointer { - return *(*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// StructPointerSlice the address of a []*struct field in the struct. -func structPointer_StructPointerSlice(p structPointer, f field) *structPointerSlice { - return (*structPointerSlice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// A structPointerSlice represents a slice of pointers to structs (themselves submessages or groups). -type structPointerSlice []structPointer - -func (v *structPointerSlice) Len() int { return len(*v) } -func (v *structPointerSlice) Index(i int) structPointer { return (*v)[i] } -func (v *structPointerSlice) Append(p structPointer) { *v = append(*v, p) } - -// A word32 is the address of a "pointer to 32-bit value" field. -type word32 **uint32 - -// IsNil reports whether *v is nil. -func word32_IsNil(p word32) bool { - return *p == nil -} - -// Set sets *v to point at a newly allocated word set to x. -func word32_Set(p word32, o *Buffer, x uint32) { - if len(o.uint32s) == 0 { - o.uint32s = make([]uint32, uint32PoolSize) - } - o.uint32s[0] = x - *p = &o.uint32s[0] - o.uint32s = o.uint32s[1:] -} - -// Get gets the value pointed at by *v. -func word32_Get(p word32) uint32 { - return **p -} - -// Word32 returns the address of a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32(p structPointer, f field) word32 { - return word32((**uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// A word32Val is the address of a 32-bit value field. -type word32Val *uint32 - -// Set sets *p to x. -func word32Val_Set(p word32Val, x uint32) { - *p = x -} - -// Get gets the value pointed at by p. -func word32Val_Get(p word32Val) uint32 { - return *p -} - -// Word32Val returns the address of a *int32, *uint32, *float32, or *enum field in the struct. -func structPointer_Word32Val(p structPointer, f field) word32Val { - return word32Val((*uint32)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// A word32Slice is a slice of 32-bit values. -type word32Slice []uint32 - -func (v *word32Slice) Append(x uint32) { *v = append(*v, x) } -func (v *word32Slice) Len() int { return len(*v) } -func (v *word32Slice) Index(i int) uint32 { return (*v)[i] } - -// Word32Slice returns the address of a []int32, []uint32, []float32, or []enum field in the struct. -func structPointer_Word32Slice(p structPointer, f field) *word32Slice { - return (*word32Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -// word64 is like word32 but for 64-bit values. -type word64 **uint64 - -func word64_Set(p word64, o *Buffer, x uint64) { - if len(o.uint64s) == 0 { - o.uint64s = make([]uint64, uint64PoolSize) - } - o.uint64s[0] = x - *p = &o.uint64s[0] - o.uint64s = o.uint64s[1:] -} - -func word64_IsNil(p word64) bool { - return *p == nil -} - -func word64_Get(p word64) uint64 { - return **p -} - -func structPointer_Word64(p structPointer, f field) word64 { - return word64((**uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// word64Val is like word32Val but for 64-bit values. -type word64Val *uint64 - -func word64Val_Set(p word64Val, o *Buffer, x uint64) { - *p = x -} - -func word64Val_Get(p word64Val) uint64 { - return *p -} - -func structPointer_Word64Val(p structPointer, f field) word64Val { - return word64Val((*uint64)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -// word64Slice is like word32Slice but for 64-bit values. -type word64Slice []uint64 - -func (v *word64Slice) Append(x uint64) { *v = append(*v, x) } -func (v *word64Slice) Len() int { return len(*v) } -func (v *word64Slice) Index(i int) uint64 { return (*v)[i] } - -func structPointer_Word64Slice(p structPointer, f field) *word64Slice { - return (*word64Slice)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} diff --git a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go b/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go deleted file mode 100644 index f156a29..0000000 --- a/vendor/github.com/gogo/protobuf/proto/pointer_unsafe_gogo.go +++ /dev/null @@ -1,128 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build !appengine,!js - -// This file contains the implementation of the proto field accesses using package unsafe. - -package proto - -import ( - "reflect" - "unsafe" -) - -func structPointer_InterfaceAt(p structPointer, f field, t reflect.Type) interface{} { - point := unsafe.Pointer(uintptr(p) + uintptr(f)) - r := reflect.NewAt(t, point) - return r.Interface() -} - -func structPointer_InterfaceRef(p structPointer, f field, t reflect.Type) interface{} { - point := unsafe.Pointer(uintptr(p) + uintptr(f)) - r := reflect.NewAt(t, point) - if r.Elem().IsNil() { - return nil - } - return r.Elem().Interface() -} - -func copyUintPtr(oldptr, newptr uintptr, size int) { - oldbytes := make([]byte, 0) - oldslice := (*reflect.SliceHeader)(unsafe.Pointer(&oldbytes)) - oldslice.Data = oldptr - oldslice.Len = size - oldslice.Cap = size - newbytes := make([]byte, 0) - newslice := (*reflect.SliceHeader)(unsafe.Pointer(&newbytes)) - newslice.Data = newptr - newslice.Len = size - newslice.Cap = size - copy(newbytes, oldbytes) -} - -func structPointer_Copy(oldptr structPointer, newptr structPointer, size int) { - copyUintPtr(uintptr(oldptr), uintptr(newptr), size) -} - -func appendStructPointer(base structPointer, f field, typ reflect.Type) structPointer { - size := typ.Elem().Size() - - oldHeader := structPointer_GetSliceHeader(base, f) - oldSlice := reflect.NewAt(typ, unsafe.Pointer(oldHeader)).Elem() - newLen := oldHeader.Len + 1 - newSlice := reflect.MakeSlice(typ, newLen, newLen) - reflect.Copy(newSlice, oldSlice) - bas := toStructPointer(newSlice) - oldHeader.Data = uintptr(bas) - oldHeader.Len = newLen - oldHeader.Cap = newLen - - return structPointer(unsafe.Pointer(uintptr(unsafe.Pointer(bas)) + uintptr(uintptr(newLen-1)*size))) -} - -func structPointer_FieldPointer(p structPointer, f field) structPointer { - return structPointer(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -func structPointer_GetRefStructPointer(p structPointer, f field) structPointer { - return structPointer((*structPointer)(unsafe.Pointer(uintptr(p) + uintptr(f)))) -} - -func structPointer_GetSliceHeader(p structPointer, f field) *reflect.SliceHeader { - return (*reflect.SliceHeader)(unsafe.Pointer(uintptr(p) + uintptr(f))) -} - -func structPointer_Add(p structPointer, size field) structPointer { - return structPointer(unsafe.Pointer(uintptr(p) + uintptr(size))) -} - -func structPointer_Len(p structPointer, f field) int { - return len(*(*[]interface{})(unsafe.Pointer(structPointer_GetRefStructPointer(p, f)))) -} - -func structPointer_StructRefSlice(p structPointer, f field, size uintptr) *structRefSlice { - return &structRefSlice{p: p, f: f, size: size} -} - -// A structRefSlice represents a slice of structs (themselves submessages or groups). -type structRefSlice struct { - p structPointer - f field - size uintptr -} - -func (v *structRefSlice) Len() int { - return structPointer_Len(v.p, v.f) -} - -func (v *structRefSlice) Index(i int) structPointer { - ss := structPointer_GetStructPointer(v.p, v.f) - ss1 := structPointer_GetRefStructPointer(ss, 0) - return structPointer_Add(ss1, field(uintptr(i)*v.size)) -} diff --git a/vendor/github.com/gogo/protobuf/proto/properties.go b/vendor/github.com/gogo/protobuf/proto/properties.go deleted file mode 100644 index 2a69e88..0000000 --- a/vendor/github.com/gogo/protobuf/proto/properties.go +++ /dev/null @@ -1,971 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "fmt" - "log" - "os" - "reflect" - "sort" - "strconv" - "strings" - "sync" -) - -const debug bool = false - -// Constants that identify the encoding of a value on the wire. -const ( - WireVarint = 0 - WireFixed64 = 1 - WireBytes = 2 - WireStartGroup = 3 - WireEndGroup = 4 - WireFixed32 = 5 -) - -const startSize = 10 // initial slice/string sizes - -// Encoders are defined in encode.go -// An encoder outputs the full representation of a field, including its -// tag and encoder type. -type encoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueEncoder encodes a single integer in a particular encoding. -type valueEncoder func(o *Buffer, x uint64) error - -// Sizers are defined in encode.go -// A sizer returns the encoded size of a field, including its tag and encoder -// type. -type sizer func(prop *Properties, base structPointer) int - -// A valueSizer returns the encoded size of a single integer in a particular -// encoding. -type valueSizer func(x uint64) int - -// Decoders are defined in decode.go -// A decoder creates a value from its wire representation. -// Unrecognized subelements are saved in unrec. -type decoder func(p *Buffer, prop *Properties, base structPointer) error - -// A valueDecoder decodes a single integer in a particular encoding. -type valueDecoder func(o *Buffer) (x uint64, err error) - -// A oneofMarshaler does the marshaling for all oneof fields in a message. -type oneofMarshaler func(Message, *Buffer) error - -// A oneofUnmarshaler does the unmarshaling for a oneof field in a message. -type oneofUnmarshaler func(Message, int, int, *Buffer) (bool, error) - -// A oneofSizer does the sizing for all oneof fields in a message. -type oneofSizer func(Message) int - -// tagMap is an optimization over map[int]int for typical protocol buffer -// use-cases. Encoded protocol buffers are often in tag order with small tag -// numbers. -type tagMap struct { - fastTags []int - slowTags map[int]int -} - -// tagMapFastLimit is the upper bound on the tag number that will be stored in -// the tagMap slice rather than its map. -const tagMapFastLimit = 1024 - -func (p *tagMap) get(t int) (int, bool) { - if t > 0 && t < tagMapFastLimit { - if t >= len(p.fastTags) { - return 0, false - } - fi := p.fastTags[t] - return fi, fi >= 0 - } - fi, ok := p.slowTags[t] - return fi, ok -} - -func (p *tagMap) put(t int, fi int) { - if t > 0 && t < tagMapFastLimit { - for len(p.fastTags) < t+1 { - p.fastTags = append(p.fastTags, -1) - } - p.fastTags[t] = fi - return - } - if p.slowTags == nil { - p.slowTags = make(map[int]int) - } - p.slowTags[t] = fi -} - -// StructProperties represents properties for all the fields of a struct. -// decoderTags and decoderOrigNames should only be used by the decoder. -type StructProperties struct { - Prop []*Properties // properties for each field - reqCount int // required count - decoderTags tagMap // map from proto tag to struct field number - decoderOrigNames map[string]int // map from original name to struct field number - order []int // list of struct field numbers in tag order - unrecField field // field id of the XXX_unrecognized []byte field - extendable bool // is this an extendable proto - - oneofMarshaler oneofMarshaler - oneofUnmarshaler oneofUnmarshaler - oneofSizer oneofSizer - stype reflect.Type - - // OneofTypes contains information about the oneof fields in this message. - // It is keyed by the original name of a field. - OneofTypes map[string]*OneofProperties -} - -// OneofProperties represents information about a specific field in a oneof. -type OneofProperties struct { - Type reflect.Type // pointer to generated struct type for this oneof field - Field int // struct field number of the containing oneof in the message - Prop *Properties -} - -// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. -// See encode.go, (*Buffer).enc_struct. - -func (sp *StructProperties) Len() int { return len(sp.order) } -func (sp *StructProperties) Less(i, j int) bool { - return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag -} -func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } - -// Properties represents the protocol-specific behavior of a single struct field. -type Properties struct { - Name string // name of the field, for error messages - OrigName string // original name before protocol compiler (always set) - JSONName string // name to use for JSON; determined by protoc - Wire string - WireType int - Tag int - Required bool - Optional bool - Repeated bool - Packed bool // relevant for repeated primitives only - Enum string // set for enum types only - proto3 bool // whether this is known to be a proto3 field; set for []byte only - oneof bool // whether this is a oneof field - - Default string // default value - HasDefault bool // whether an explicit default was provided - CustomType string - CastType string - StdTime bool - StdDuration bool - - enc encoder - valEnc valueEncoder // set for bool and numeric types only - field field - tagcode []byte // encoding of EncodeVarint((Tag<<3)|WireType) - tagbuf [8]byte - stype reflect.Type // set for struct types only - sstype reflect.Type // set for slices of structs types only - ctype reflect.Type // set for custom types only - sprop *StructProperties // set for struct types only - isMarshaler bool - isUnmarshaler bool - - mtype reflect.Type // set for map types only - mkeyprop *Properties // set for map types only - mvalprop *Properties // set for map types only - - size sizer - valSize valueSizer // set for bool and numeric types only - - dec decoder - valDec valueDecoder // set for bool and numeric types only - - // If this is a packable field, this will be the decoder for the packed version of the field. - packedDec decoder -} - -// String formats the properties in the protobuf struct field tag style. -func (p *Properties) String() string { - s := p.Wire - s = "," - s += strconv.Itoa(p.Tag) - if p.Required { - s += ",req" - } - if p.Optional { - s += ",opt" - } - if p.Repeated { - s += ",rep" - } - if p.Packed { - s += ",packed" - } - s += ",name=" + p.OrigName - if p.JSONName != p.OrigName { - s += ",json=" + p.JSONName - } - if p.proto3 { - s += ",proto3" - } - if p.oneof { - s += ",oneof" - } - if len(p.Enum) > 0 { - s += ",enum=" + p.Enum - } - if p.HasDefault { - s += ",def=" + p.Default - } - return s -} - -// Parse populates p by parsing a string in the protobuf struct field tag style. -func (p *Properties) Parse(s string) { - // "bytes,49,opt,name=foo,def=hello!" - fields := strings.Split(s, ",") // breaks def=, but handled below. - if len(fields) < 2 { - fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) - return - } - - p.Wire = fields[0] - switch p.Wire { - case "varint": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeVarint - p.valDec = (*Buffer).DecodeVarint - p.valSize = sizeVarint - case "fixed32": - p.WireType = WireFixed32 - p.valEnc = (*Buffer).EncodeFixed32 - p.valDec = (*Buffer).DecodeFixed32 - p.valSize = sizeFixed32 - case "fixed64": - p.WireType = WireFixed64 - p.valEnc = (*Buffer).EncodeFixed64 - p.valDec = (*Buffer).DecodeFixed64 - p.valSize = sizeFixed64 - case "zigzag32": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag32 - p.valDec = (*Buffer).DecodeZigzag32 - p.valSize = sizeZigzag32 - case "zigzag64": - p.WireType = WireVarint - p.valEnc = (*Buffer).EncodeZigzag64 - p.valDec = (*Buffer).DecodeZigzag64 - p.valSize = sizeZigzag64 - case "bytes", "group": - p.WireType = WireBytes - // no numeric converter for non-numeric types - default: - fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) - return - } - - var err error - p.Tag, err = strconv.Atoi(fields[1]) - if err != nil { - return - } - - for i := 2; i < len(fields); i++ { - f := fields[i] - switch { - case f == "req": - p.Required = true - case f == "opt": - p.Optional = true - case f == "rep": - p.Repeated = true - case f == "packed": - p.Packed = true - case strings.HasPrefix(f, "name="): - p.OrigName = f[5:] - case strings.HasPrefix(f, "json="): - p.JSONName = f[5:] - case strings.HasPrefix(f, "enum="): - p.Enum = f[5:] - case f == "proto3": - p.proto3 = true - case f == "oneof": - p.oneof = true - case strings.HasPrefix(f, "def="): - p.HasDefault = true - p.Default = f[4:] // rest of string - if i+1 < len(fields) { - // Commas aren't escaped, and def is always last. - p.Default += "," + strings.Join(fields[i+1:], ",") - break - } - case strings.HasPrefix(f, "embedded="): - p.OrigName = strings.Split(f, "=")[1] - case strings.HasPrefix(f, "customtype="): - p.CustomType = strings.Split(f, "=")[1] - case strings.HasPrefix(f, "casttype="): - p.CastType = strings.Split(f, "=")[1] - case f == "stdtime": - p.StdTime = true - case f == "stdduration": - p.StdDuration = true - } - } -} - -func logNoSliceEnc(t1, t2 reflect.Type) { - fmt.Fprintf(os.Stderr, "proto: no slice oenc for %T = []%T\n", t1, t2) -} - -var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() - -// Initialize the fields for encoding and decoding. -func (p *Properties) setEncAndDec(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { - p.enc = nil - p.dec = nil - p.size = nil - isMap := typ.Kind() == reflect.Map - if len(p.CustomType) > 0 && !isMap { - p.setCustomEncAndDec(typ) - p.setTag(lockGetProp) - return - } - if p.StdTime && !isMap { - p.setTimeEncAndDec(typ) - p.setTag(lockGetProp) - return - } - if p.StdDuration && !isMap { - p.setDurationEncAndDec(typ) - p.setTag(lockGetProp) - return - } - switch t1 := typ; t1.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no coders for %v\n", t1) - - // proto3 scalar types - - case reflect.Bool: - if p.proto3 { - p.enc = (*Buffer).enc_proto3_bool - p.dec = (*Buffer).dec_proto3_bool - p.size = size_proto3_bool - } else { - p.enc = (*Buffer).enc_ref_bool - p.dec = (*Buffer).dec_proto3_bool - p.size = size_ref_bool - } - case reflect.Int32: - if p.proto3 { - p.enc = (*Buffer).enc_proto3_int32 - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_proto3_int32 - } else { - p.enc = (*Buffer).enc_ref_int32 - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_ref_int32 - } - case reflect.Uint32: - if p.proto3 { - p.enc = (*Buffer).enc_proto3_uint32 - p.dec = (*Buffer).dec_proto3_int32 // can reuse - p.size = size_proto3_uint32 - } else { - p.enc = (*Buffer).enc_ref_uint32 - p.dec = (*Buffer).dec_proto3_int32 // can reuse - p.size = size_ref_uint32 - } - case reflect.Int64, reflect.Uint64: - if p.proto3 { - p.enc = (*Buffer).enc_proto3_int64 - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_proto3_int64 - } else { - p.enc = (*Buffer).enc_ref_int64 - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_ref_int64 - } - case reflect.Float32: - if p.proto3 { - p.enc = (*Buffer).enc_proto3_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_proto3_uint32 - } else { - p.enc = (*Buffer).enc_ref_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int32 - p.size = size_ref_uint32 - } - case reflect.Float64: - if p.proto3 { - p.enc = (*Buffer).enc_proto3_int64 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_proto3_int64 - } else { - p.enc = (*Buffer).enc_ref_int64 // can just treat them as bits - p.dec = (*Buffer).dec_proto3_int64 - p.size = size_ref_int64 - } - case reflect.String: - if p.proto3 { - p.enc = (*Buffer).enc_proto3_string - p.dec = (*Buffer).dec_proto3_string - p.size = size_proto3_string - } else { - p.enc = (*Buffer).enc_ref_string - p.dec = (*Buffer).dec_proto3_string - p.size = size_ref_string - } - case reflect.Struct: - p.stype = typ - p.isMarshaler = isMarshaler(typ) - p.isUnmarshaler = isUnmarshaler(typ) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_ref_struct_message - p.dec = (*Buffer).dec_ref_struct_message - p.size = size_ref_struct_message - } else { - fmt.Fprintf(os.Stderr, "proto: no coders for struct %T\n", typ) - } - - case reflect.Ptr: - switch t2 := t1.Elem(); t2.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no encoder function for %v -> %v\n", t1, t2) - break - case reflect.Bool: - p.enc = (*Buffer).enc_bool - p.dec = (*Buffer).dec_bool - p.size = size_bool - case reflect.Int32: - p.enc = (*Buffer).enc_int32 - p.dec = (*Buffer).dec_int32 - p.size = size_int32 - case reflect.Uint32: - p.enc = (*Buffer).enc_uint32 - p.dec = (*Buffer).dec_int32 // can reuse - p.size = size_uint32 - case reflect.Int64, reflect.Uint64: - p.enc = (*Buffer).enc_int64 - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.Float32: - p.enc = (*Buffer).enc_uint32 // can just treat them as bits - p.dec = (*Buffer).dec_int32 - p.size = size_uint32 - case reflect.Float64: - p.enc = (*Buffer).enc_int64 // can just treat them as bits - p.dec = (*Buffer).dec_int64 - p.size = size_int64 - case reflect.String: - p.enc = (*Buffer).enc_string - p.dec = (*Buffer).dec_string - p.size = size_string - case reflect.Struct: - p.stype = t1.Elem() - p.isMarshaler = isMarshaler(t1) - p.isUnmarshaler = isUnmarshaler(t1) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_struct_message - p.dec = (*Buffer).dec_struct_message - p.size = size_struct_message - } else { - p.enc = (*Buffer).enc_struct_group - p.dec = (*Buffer).dec_struct_group - p.size = size_struct_group - } - } - - case reflect.Slice: - switch t2 := t1.Elem(); t2.Kind() { - default: - logNoSliceEnc(t1, t2) - break - case reflect.Bool: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_bool - p.size = size_slice_packed_bool - } else { - p.enc = (*Buffer).enc_slice_bool - p.size = size_slice_bool - } - p.dec = (*Buffer).dec_slice_bool - p.packedDec = (*Buffer).dec_slice_packed_bool - case reflect.Int32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int32 - p.size = size_slice_packed_int32 - } else { - p.enc = (*Buffer).enc_slice_int32 - p.size = size_slice_int32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Uint32: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case reflect.Int64, reflect.Uint64: - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - case reflect.Uint8: - p.dec = (*Buffer).dec_slice_byte - if p.proto3 { - p.enc = (*Buffer).enc_proto3_slice_byte - p.size = size_proto3_slice_byte - } else { - p.enc = (*Buffer).enc_slice_byte - p.size = size_slice_byte - } - case reflect.Float32, reflect.Float64: - switch t2.Bits() { - case 32: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_uint32 - p.size = size_slice_packed_uint32 - } else { - p.enc = (*Buffer).enc_slice_uint32 - p.size = size_slice_uint32 - } - p.dec = (*Buffer).dec_slice_int32 - p.packedDec = (*Buffer).dec_slice_packed_int32 - case 64: - // can just treat them as bits - if p.Packed { - p.enc = (*Buffer).enc_slice_packed_int64 - p.size = size_slice_packed_int64 - } else { - p.enc = (*Buffer).enc_slice_int64 - p.size = size_slice_int64 - } - p.dec = (*Buffer).dec_slice_int64 - p.packedDec = (*Buffer).dec_slice_packed_int64 - default: - logNoSliceEnc(t1, t2) - break - } - case reflect.String: - p.enc = (*Buffer).enc_slice_string - p.dec = (*Buffer).dec_slice_string - p.size = size_slice_string - case reflect.Ptr: - switch t3 := t2.Elem(); t3.Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T -> %T\n", t1, t2, t3) - break - case reflect.Struct: - p.stype = t2.Elem() - p.isMarshaler = isMarshaler(t2) - p.isUnmarshaler = isUnmarshaler(t2) - if p.Wire == "bytes" { - p.enc = (*Buffer).enc_slice_struct_message - p.dec = (*Buffer).dec_slice_struct_message - p.size = size_slice_struct_message - } else { - p.enc = (*Buffer).enc_slice_struct_group - p.dec = (*Buffer).dec_slice_struct_group - p.size = size_slice_struct_group - } - } - case reflect.Slice: - switch t2.Elem().Kind() { - default: - fmt.Fprintf(os.Stderr, "proto: no slice elem oenc for %T -> %T -> %T\n", t1, t2, t2.Elem()) - break - case reflect.Uint8: - p.enc = (*Buffer).enc_slice_slice_byte - p.dec = (*Buffer).dec_slice_slice_byte - p.size = size_slice_slice_byte - } - case reflect.Struct: - p.setSliceOfNonPointerStructs(t1) - } - - case reflect.Map: - p.enc = (*Buffer).enc_new_map - p.dec = (*Buffer).dec_new_map - p.size = size_new_map - - p.mtype = t1 - p.mkeyprop = &Properties{} - p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) - p.mvalprop = &Properties{} - vtype := p.mtype.Elem() - if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { - // The value type is not a message (*T) or bytes ([]byte), - // so we need encoders for the pointer to this type. - vtype = reflect.PtrTo(vtype) - } - - p.mvalprop.CustomType = p.CustomType - p.mvalprop.StdDuration = p.StdDuration - p.mvalprop.StdTime = p.StdTime - p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) - } - p.setTag(lockGetProp) -} - -func (p *Properties) setTag(lockGetProp bool) { - // precalculate tag code - wire := p.WireType - if p.Packed { - wire = WireBytes - } - x := uint32(p.Tag)<<3 | uint32(wire) - i := 0 - for i = 0; x > 127; i++ { - p.tagbuf[i] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - p.tagbuf[i] = uint8(x) - p.tagcode = p.tagbuf[0 : i+1] - - if p.stype != nil { - if lockGetProp { - p.sprop = GetProperties(p.stype) - } else { - p.sprop = getPropertiesLocked(p.stype) - } - } -} - -var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() - unmarshalerType = reflect.TypeOf((*Unmarshaler)(nil)).Elem() -) - -// isMarshaler reports whether type t implements Marshaler. -func isMarshaler(t reflect.Type) bool { - return t.Implements(marshalerType) -} - -// isUnmarshaler reports whether type t implements Unmarshaler. -func isUnmarshaler(t reflect.Type) bool { - return t.Implements(unmarshalerType) -} - -// Init populates the properties from a protocol buffer struct tag. -func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { - p.init(typ, name, tag, f, true) -} - -func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { - // "bytes,49,opt,def=hello!" - p.Name = name - p.OrigName = name - if f != nil { - p.field = toField(f) - } - if tag == "" { - return - } - p.Parse(tag) - p.setEncAndDec(typ, f, lockGetProp) -} - -var ( - propertiesMu sync.RWMutex - propertiesMap = make(map[reflect.Type]*StructProperties) -) - -// GetProperties returns the list of properties for the type represented by t. -// t must represent a generated struct type of a protocol message. -func GetProperties(t reflect.Type) *StructProperties { - if t.Kind() != reflect.Struct { - panic("proto: type must have kind struct") - } - - // Most calls to GetProperties in a long-running program will be - // retrieving details for types we have seen before. - propertiesMu.RLock() - sprop, ok := propertiesMap[t] - propertiesMu.RUnlock() - if ok { - if collectStats { - stats.Chit++ - } - return sprop - } - - propertiesMu.Lock() - sprop = getPropertiesLocked(t) - propertiesMu.Unlock() - return sprop -} - -// getPropertiesLocked requires that propertiesMu is held. -func getPropertiesLocked(t reflect.Type) *StructProperties { - if prop, ok := propertiesMap[t]; ok { - if collectStats { - stats.Chit++ - } - return prop - } - if collectStats { - stats.Cmiss++ - } - - prop := new(StructProperties) - // in case of recursive protos, fill this in now. - propertiesMap[t] = prop - - // build properties - prop.extendable = reflect.PtrTo(t).Implements(extendableProtoType) || - reflect.PtrTo(t).Implements(extendableProtoV1Type) || - reflect.PtrTo(t).Implements(extendableBytesType) - prop.unrecField = invalidField - prop.Prop = make([]*Properties, t.NumField()) - prop.order = make([]int, t.NumField()) - - isOneofMessage := false - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - p := new(Properties) - name := f.Name - p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) - - if f.Name == "XXX_InternalExtensions" { // special case - p.enc = (*Buffer).enc_exts - p.dec = nil // not needed - p.size = size_exts - } else if f.Name == "XXX_extensions" { // special case - if len(f.Tag.Get("protobuf")) > 0 { - p.enc = (*Buffer).enc_ext_slice_byte - p.dec = nil // not needed - p.size = size_ext_slice_byte - } else { - p.enc = (*Buffer).enc_map - p.dec = nil // not needed - p.size = size_map - } - } else if f.Name == "XXX_unrecognized" { // special case - prop.unrecField = toField(&f) - } - oneof := f.Tag.Get("protobuf_oneof") // special case - if oneof != "" { - isOneofMessage = true - // Oneof fields don't use the traditional protobuf tag. - p.OrigName = oneof - } - prop.Prop[i] = p - prop.order[i] = i - if debug { - print(i, " ", f.Name, " ", t.String(), " ") - if p.Tag > 0 { - print(p.String()) - } - print("\n") - } - if p.enc == nil && !strings.HasPrefix(f.Name, "XXX_") && oneof == "" { - fmt.Fprintln(os.Stderr, "proto: no encoder for", f.Name, f.Type.String(), "[GetProperties]") - } - } - - // Re-order prop.order. - sort.Sort(prop) - - type oneofMessage interface { - XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) - } - if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); isOneofMessage && ok { - var oots []interface{} - prop.oneofMarshaler, prop.oneofUnmarshaler, prop.oneofSizer, oots = om.XXX_OneofFuncs() - prop.stype = t - - // Interpret oneof metadata. - prop.OneofTypes = make(map[string]*OneofProperties) - for _, oot := range oots { - oop := &OneofProperties{ - Type: reflect.ValueOf(oot).Type(), // *T - Prop: new(Properties), - } - sft := oop.Type.Elem().Field(0) - oop.Prop.Name = sft.Name - oop.Prop.Parse(sft.Tag.Get("protobuf")) - // There will be exactly one interface field that - // this new value is assignable to. - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if f.Type.Kind() != reflect.Interface { - continue - } - if !oop.Type.AssignableTo(f.Type) { - continue - } - oop.Field = i - break - } - prop.OneofTypes[oop.Prop.OrigName] = oop - } - } - - // build required counts - // build tags - reqCount := 0 - prop.decoderOrigNames = make(map[string]int) - for i, p := range prop.Prop { - if strings.HasPrefix(p.Name, "XXX_") { - // Internal fields should not appear in tags/origNames maps. - // They are handled specially when encoding and decoding. - continue - } - if p.Required { - reqCount++ - } - prop.decoderTags.put(p.Tag, i) - prop.decoderOrigNames[p.OrigName] = i - } - prop.reqCount = reqCount - - return prop -} - -// Return the Properties object for the x[0]'th field of the structure. -func propByIndex(t reflect.Type, x []int) *Properties { - if len(x) != 1 { - fmt.Fprintf(os.Stderr, "proto: field index dimension %d (not 1) for type %s\n", len(x), t) - return nil - } - prop := GetProperties(t) - return prop.Prop[x[0]] -} - -// Get the address and type of a pointer to a struct from an interface. -func getbase(pb Message) (t reflect.Type, b structPointer, err error) { - if pb == nil { - err = ErrNil - return - } - // get the reflect type of the pointer to the struct. - t = reflect.TypeOf(pb) - // get the address of the struct. - value := reflect.ValueOf(pb) - b = toStructPointer(value) - return -} - -// A global registry of enum types. -// The generated code will register the generated maps by calling RegisterEnum. - -var enumValueMaps = make(map[string]map[string]int32) -var enumStringMaps = make(map[string]map[int32]string) - -// RegisterEnum is called from the generated code to install the enum descriptor -// maps into the global table to aid parsing text format protocol buffers. -func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { - if _, ok := enumValueMaps[typeName]; ok { - panic("proto: duplicate enum registered: " + typeName) - } - enumValueMaps[typeName] = valueMap - if _, ok := enumStringMaps[typeName]; ok { - panic("proto: duplicate enum registered: " + typeName) - } - enumStringMaps[typeName] = unusedNameMap -} - -// EnumValueMap returns the mapping from names to integers of the -// enum type enumType, or a nil if not found. -func EnumValueMap(enumType string) map[string]int32 { - return enumValueMaps[enumType] -} - -// A registry of all linked message types. -// The string is a fully-qualified proto name ("pkg.Message"). -var ( - protoTypes = make(map[string]reflect.Type) - revProtoTypes = make(map[reflect.Type]string) -) - -// RegisterType is called from generated code and maps from the fully qualified -// proto name to the type (pointer to struct) of the protocol buffer. -func RegisterType(x Message, name string) { - if _, ok := protoTypes[name]; ok { - // TODO: Some day, make this a panic. - log.Printf("proto: duplicate proto type registered: %s", name) - return - } - t := reflect.TypeOf(x) - protoTypes[name] = t - revProtoTypes[t] = name -} - -// MessageName returns the fully-qualified proto name for the given message type. -func MessageName(x Message) string { - type xname interface { - XXX_MessageName() string - } - if m, ok := x.(xname); ok { - return m.XXX_MessageName() - } - return revProtoTypes[reflect.TypeOf(x)] -} - -// MessageType returns the message type (pointer to struct) for a named message. -func MessageType(name string) reflect.Type { return protoTypes[name] } - -// A registry of all linked proto files. -var ( - protoFiles = make(map[string][]byte) // file name => fileDescriptor -) - -// RegisterFile is called from generated code and maps from the -// full file name of a .proto file to its compressed FileDescriptorProto. -func RegisterFile(filename string, fileDescriptor []byte) { - protoFiles[filename] = fileDescriptor -} - -// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. -func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/gogo/protobuf/proto/properties_gogo.go b/vendor/github.com/gogo/protobuf/proto/properties_gogo.go deleted file mode 100644 index b6b7176..0000000 --- a/vendor/github.com/gogo/protobuf/proto/properties_gogo.go +++ /dev/null @@ -1,111 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "os" - "reflect" -) - -func (p *Properties) setCustomEncAndDec(typ reflect.Type) { - p.ctype = typ - if p.Repeated { - p.enc = (*Buffer).enc_custom_slice_bytes - p.dec = (*Buffer).dec_custom_slice_bytes - p.size = size_custom_slice_bytes - } else if typ.Kind() == reflect.Ptr { - p.enc = (*Buffer).enc_custom_bytes - p.dec = (*Buffer).dec_custom_bytes - p.size = size_custom_bytes - } else { - p.enc = (*Buffer).enc_custom_ref_bytes - p.dec = (*Buffer).dec_custom_ref_bytes - p.size = size_custom_ref_bytes - } -} - -func (p *Properties) setDurationEncAndDec(typ reflect.Type) { - if p.Repeated { - if typ.Elem().Kind() == reflect.Ptr { - p.enc = (*Buffer).enc_slice_duration - p.dec = (*Buffer).dec_slice_duration - p.size = size_slice_duration - } else { - p.enc = (*Buffer).enc_slice_ref_duration - p.dec = (*Buffer).dec_slice_ref_duration - p.size = size_slice_ref_duration - } - } else if typ.Kind() == reflect.Ptr { - p.enc = (*Buffer).enc_duration - p.dec = (*Buffer).dec_duration - p.size = size_duration - } else { - p.enc = (*Buffer).enc_ref_duration - p.dec = (*Buffer).dec_ref_duration - p.size = size_ref_duration - } -} - -func (p *Properties) setTimeEncAndDec(typ reflect.Type) { - if p.Repeated { - if typ.Elem().Kind() == reflect.Ptr { - p.enc = (*Buffer).enc_slice_time - p.dec = (*Buffer).dec_slice_time - p.size = size_slice_time - } else { - p.enc = (*Buffer).enc_slice_ref_time - p.dec = (*Buffer).dec_slice_ref_time - p.size = size_slice_ref_time - } - } else if typ.Kind() == reflect.Ptr { - p.enc = (*Buffer).enc_time - p.dec = (*Buffer).dec_time - p.size = size_time - } else { - p.enc = (*Buffer).enc_ref_time - p.dec = (*Buffer).dec_ref_time - p.size = size_ref_time - } - -} - -func (p *Properties) setSliceOfNonPointerStructs(typ reflect.Type) { - t2 := typ.Elem() - p.sstype = typ - p.stype = t2 - p.isMarshaler = isMarshaler(t2) - p.isUnmarshaler = isUnmarshaler(t2) - p.enc = (*Buffer).enc_slice_ref_struct_message - p.dec = (*Buffer).dec_slice_ref_struct_message - p.size = size_slice_ref_struct_message - if p.Wire != "bytes" { - fmt.Fprintf(os.Stderr, "proto: no ptr oenc for %T -> %T \n", typ, t2) - } -} diff --git a/vendor/github.com/gogo/protobuf/proto/skip_gogo.go b/vendor/github.com/gogo/protobuf/proto/skip_gogo.go deleted file mode 100644 index 5a5fd93..0000000 --- a/vendor/github.com/gogo/protobuf/proto/skip_gogo.go +++ /dev/null @@ -1,119 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "io" -) - -func Skip(data []byte) (n int, err error) { - l := len(data) - index := 0 - for index < l { - var wire uint64 - for shift := uint(0); ; shift += 7 { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - b := data[index] - index++ - wire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - wireType := int(wire & 0x7) - switch wireType { - case 0: - for { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - index++ - if data[index-1] < 0x80 { - break - } - } - return index, nil - case 1: - index += 8 - return index, nil - case 2: - var length int - for shift := uint(0); ; shift += 7 { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - b := data[index] - index++ - length |= (int(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - index += length - return index, nil - case 3: - for { - var innerWire uint64 - var start int = index - for shift := uint(0); ; shift += 7 { - if index >= l { - return 0, io.ErrUnexpectedEOF - } - b := data[index] - index++ - innerWire |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - break - } - } - innerWireType := int(innerWire & 0x7) - if innerWireType == 4 { - break - } - next, err := Skip(data[start:]) - if err != nil { - return 0, err - } - index = start + next - } - return index, nil - case 4: - return index, nil - case 5: - index += 4 - return index, nil - default: - return 0, fmt.Errorf("proto: illegal wireType %d", wireType) - } - } - panic("unreachable") -} diff --git a/vendor/github.com/gogo/protobuf/proto/text.go b/vendor/github.com/gogo/protobuf/proto/text.go deleted file mode 100644 index f609d1d..0000000 --- a/vendor/github.com/gogo/protobuf/proto/text.go +++ /dev/null @@ -1,939 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// Functions for writing the text protocol buffer format. - -import ( - "bufio" - "bytes" - "encoding" - "errors" - "fmt" - "io" - "log" - "math" - "reflect" - "sort" - "strings" - "sync" - "time" -) - -var ( - newline = []byte("\n") - spaces = []byte(" ") - gtNewline = []byte(">\n") - endBraceNewline = []byte("}\n") - backslashN = []byte{'\\', 'n'} - backslashR = []byte{'\\', 'r'} - backslashT = []byte{'\\', 't'} - backslashDQ = []byte{'\\', '"'} - backslashBS = []byte{'\\', '\\'} - posInf = []byte("inf") - negInf = []byte("-inf") - nan = []byte("nan") -) - -type writer interface { - io.Writer - WriteByte(byte) error -} - -// textWriter is an io.Writer that tracks its indentation level. -type textWriter struct { - ind int - complete bool // if the current position is a complete line - compact bool // whether to write out as a one-liner - w writer -} - -func (w *textWriter) WriteString(s string) (n int, err error) { - if !strings.Contains(s, "\n") { - if !w.compact && w.complete { - w.writeIndent() - } - w.complete = false - return io.WriteString(w.w, s) - } - // WriteString is typically called without newlines, so this - // codepath and its copy are rare. We copy to avoid - // duplicating all of Write's logic here. - return w.Write([]byte(s)) -} - -func (w *textWriter) Write(p []byte) (n int, err error) { - newlines := bytes.Count(p, newline) - if newlines == 0 { - if !w.compact && w.complete { - w.writeIndent() - } - n, err = w.w.Write(p) - w.complete = false - return n, err - } - - frags := bytes.SplitN(p, newline, newlines+1) - if w.compact { - for i, frag := range frags { - if i > 0 { - if err := w.w.WriteByte(' '); err != nil { - return n, err - } - n++ - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - } - return n, nil - } - - for i, frag := range frags { - if w.complete { - w.writeIndent() - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - if i+1 < len(frags) { - if err := w.w.WriteByte('\n'); err != nil { - return n, err - } - n++ - } - } - w.complete = len(frags[len(frags)-1]) == 0 - return n, nil -} - -func (w *textWriter) WriteByte(c byte) error { - if w.compact && c == '\n' { - c = ' ' - } - if !w.compact && w.complete { - w.writeIndent() - } - err := w.w.WriteByte(c) - w.complete = c == '\n' - return err -} - -func (w *textWriter) indent() { w.ind++ } - -func (w *textWriter) unindent() { - if w.ind == 0 { - log.Print("proto: textWriter unindented too far") - return - } - w.ind-- -} - -func writeName(w *textWriter, props *Properties) error { - if _, err := w.WriteString(props.OrigName); err != nil { - return err - } - if props.Wire != "group" { - return w.WriteByte(':') - } - return nil -} - -// raw is the interface satisfied by RawMessage. -type raw interface { - Bytes() []byte -} - -func requiresQuotes(u string) bool { - // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. - for _, ch := range u { - switch { - case ch == '.' || ch == '/' || ch == '_': - continue - case '0' <= ch && ch <= '9': - continue - case 'A' <= ch && ch <= 'Z': - continue - case 'a' <= ch && ch <= 'z': - continue - default: - return true - } - } - return false -} - -// isAny reports whether sv is a google.protobuf.Any message -func isAny(sv reflect.Value) bool { - type wkt interface { - XXX_WellKnownType() string - } - t, ok := sv.Addr().Interface().(wkt) - return ok && t.XXX_WellKnownType() == "Any" -} - -// writeProto3Any writes an expanded google.protobuf.Any message. -// -// It returns (false, nil) if sv value can't be unmarshaled (e.g. because -// required messages are not linked in). -// -// It returns (true, error) when sv was written in expanded format or an error -// was encountered. -func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { - turl := sv.FieldByName("TypeUrl") - val := sv.FieldByName("Value") - if !turl.IsValid() || !val.IsValid() { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - b, ok := val.Interface().([]byte) - if !ok { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - parts := strings.Split(turl.String(), "/") - mt := MessageType(parts[len(parts)-1]) - if mt == nil { - return false, nil - } - m := reflect.New(mt.Elem()) - if err := Unmarshal(b, m.Interface().(Message)); err != nil { - return false, nil - } - w.Write([]byte("[")) - u := turl.String() - if requiresQuotes(u) { - writeString(w, u) - } else { - w.Write([]byte(u)) - } - if w.compact { - w.Write([]byte("]:<")) - } else { - w.Write([]byte("]: <\n")) - w.ind++ - } - if err := tm.writeStruct(w, m.Elem()); err != nil { - return true, err - } - if w.compact { - w.Write([]byte("> ")) - } else { - w.ind-- - w.Write([]byte(">\n")) - } - return true, nil -} - -func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { - if tm.ExpandAny && isAny(sv) { - if canExpand, err := tm.writeProto3Any(w, sv); canExpand { - return err - } - } - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < sv.NumField(); i++ { - fv := sv.Field(i) - props := sprops.Prop[i] - name := st.Field(i).Name - - if strings.HasPrefix(name, "XXX_") { - // There are two XXX_ fields: - // XXX_unrecognized []byte - // XXX_extensions map[int32]proto.Extension - // The first is handled here; - // the second is handled at the bottom of this function. - if name == "XXX_unrecognized" && !fv.IsNil() { - if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Field not filled in. This could be an optional field or - // a required field that wasn't filled in. Either way, there - // isn't anything we can show for it. - continue - } - if fv.Kind() == reflect.Slice && fv.IsNil() { - // Repeated field that is empty, or a bytes field that is unused. - continue - } - - if props.Repeated && fv.Kind() == reflect.Slice { - // Repeated field. - for j := 0; j < fv.Len(); j++ { - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - v := fv.Index(j) - if v.Kind() == reflect.Ptr && v.IsNil() { - // A nil message in a repeated field is not valid, - // but we can handle that more gracefully than panicking. - if _, err := w.Write([]byte("\n")); err != nil { - return err - } - continue - } - if len(props.Enum) > 0 { - if err := tm.writeEnum(w, v, props); err != nil { - return err - } - } else if err := tm.writeAny(w, v, props); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Map { - // Map fields are rendered as a repeated struct with key/value fields. - keys := fv.MapKeys() - sort.Sort(mapKeys(keys)) - for _, key := range keys { - val := fv.MapIndex(key) - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - // open struct - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - // key - if _, err := w.WriteString("key:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, key, props.mkeyprop); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - // nil values aren't legal, but we can avoid panicking because of them. - if val.Kind() != reflect.Ptr || !val.IsNil() { - // value - if _, err := w.WriteString("value:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, val, props.mvalprop); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - // close struct - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { - // empty bytes field - continue - } - if props.proto3 && fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { - // proto3 non-repeated scalar field; skip if zero value - if isProto3Zero(fv) { - continue - } - } - - if fv.Kind() == reflect.Interface { - // Check if it is a oneof. - if st.Field(i).Tag.Get("protobuf_oneof") != "" { - // fv is nil, or holds a pointer to generated struct. - // That generated struct has exactly one field, - // which has a protobuf struct tag. - if fv.IsNil() { - continue - } - inner := fv.Elem().Elem() // interface -> *T -> T - tag := inner.Type().Field(0).Tag.Get("protobuf") - props = new(Properties) // Overwrite the outer props var, but not its pointee. - props.Parse(tag) - // Write the value in the oneof, not the oneof itself. - fv = inner.Field(0) - - // Special case to cope with malformed messages gracefully: - // If the value in the oneof is a nil pointer, don't panic - // in writeAny. - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Use errors.New so writeAny won't render quotes. - msg := errors.New("/* nil */") - fv = reflect.ValueOf(&msg).Elem() - } - } - } - - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if b, ok := fv.Interface().(raw); ok { - if err := writeRaw(w, b.Bytes()); err != nil { - return err - } - continue - } - - if len(props.Enum) > 0 { - if err := tm.writeEnum(w, fv, props); err != nil { - return err - } - } else if err := tm.writeAny(w, fv, props); err != nil { - return err - } - - if err := w.WriteByte('\n'); err != nil { - return err - } - } - - // Extensions (the XXX_extensions field). - pv := sv - if pv.CanAddr() { - pv = sv.Addr() - } else { - pv = reflect.New(sv.Type()) - pv.Elem().Set(sv) - } - if pv.Type().Implements(extensionRangeType) { - if err := tm.writeExtensions(w, pv); err != nil { - return err - } - } - - return nil -} - -// writeRaw writes an uninterpreted raw message. -func writeRaw(w *textWriter, b []byte) error { - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if err := writeUnknownStruct(w, b); err != nil { - return err - } - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - return nil -} - -// writeAny writes an arbitrary field. -func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { - v = reflect.Indirect(v) - - if props != nil { - if len(props.CustomType) > 0 { - custom, ok := v.Interface().(Marshaler) - if ok { - data, err := custom.Marshal() - if err != nil { - return err - } - if err := writeString(w, string(data)); err != nil { - return err - } - return nil - } - } else if len(props.CastType) > 0 { - if _, ok := v.Interface().(interface { - String() string - }); ok { - switch v.Kind() { - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: - _, err := fmt.Fprintf(w, "%d", v.Interface()) - return err - } - } - } else if props.StdTime { - t, ok := v.Interface().(time.Time) - if !ok { - return fmt.Errorf("stdtime is not time.Time, but %T", v.Interface()) - } - tproto, err := timestampProto(t) - if err != nil { - return err - } - propsCopy := *props // Make a copy so that this is goroutine-safe - propsCopy.StdTime = false - err = tm.writeAny(w, reflect.ValueOf(tproto), &propsCopy) - return err - } else if props.StdDuration { - d, ok := v.Interface().(time.Duration) - if !ok { - return fmt.Errorf("stdtime is not time.Duration, but %T", v.Interface()) - } - dproto := durationProto(d) - propsCopy := *props // Make a copy so that this is goroutine-safe - propsCopy.StdDuration = false - err := tm.writeAny(w, reflect.ValueOf(dproto), &propsCopy) - return err - } - } - - // Floats have special cases. - if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { - x := v.Float() - var b []byte - switch { - case math.IsInf(x, 1): - b = posInf - case math.IsInf(x, -1): - b = negInf - case math.IsNaN(x): - b = nan - } - if b != nil { - _, err := w.Write(b) - return err - } - // Other values are handled below. - } - - // We don't attempt to serialise every possible value type; only those - // that can occur in protocol buffers. - switch v.Kind() { - case reflect.Slice: - // Should only be a []byte; repeated fields are handled in writeStruct. - if err := writeString(w, string(v.Bytes())); err != nil { - return err - } - case reflect.String: - if err := writeString(w, v.String()); err != nil { - return err - } - case reflect.Struct: - // Required/optional group/message. - var bra, ket byte = '<', '>' - if props != nil && props.Wire == "group" { - bra, ket = '{', '}' - } - if err := w.WriteByte(bra); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if etm, ok := v.Interface().(encoding.TextMarshaler); ok { - text, err := etm.MarshalText() - if err != nil { - return err - } - if _, err = w.Write(text); err != nil { - return err - } - } else if err := tm.writeStruct(w, v); err != nil { - return err - } - w.unindent() - if err := w.WriteByte(ket); err != nil { - return err - } - default: - _, err := fmt.Fprint(w, v.Interface()) - return err - } - return nil -} - -// equivalent to C's isprint. -func isprint(c byte) bool { - return c >= 0x20 && c < 0x7f -} - -// writeString writes a string in the protocol buffer text format. -// It is similar to strconv.Quote except we don't use Go escape sequences, -// we treat the string as a byte sequence, and we use octal escapes. -// These differences are to maintain interoperability with the other -// languages' implementations of the text format. -func writeString(w *textWriter, s string) error { - // use WriteByte here to get any needed indent - if err := w.WriteByte('"'); err != nil { - return err - } - // Loop over the bytes, not the runes. - for i := 0; i < len(s); i++ { - var err error - // Divergence from C++: we don't escape apostrophes. - // There's no need to escape them, and the C++ parser - // copes with a naked apostrophe. - switch c := s[i]; c { - case '\n': - _, err = w.w.Write(backslashN) - case '\r': - _, err = w.w.Write(backslashR) - case '\t': - _, err = w.w.Write(backslashT) - case '"': - _, err = w.w.Write(backslashDQ) - case '\\': - _, err = w.w.Write(backslashBS) - default: - if isprint(c) { - err = w.w.WriteByte(c) - } else { - _, err = fmt.Fprintf(w.w, "\\%03o", c) - } - } - if err != nil { - return err - } - } - return w.WriteByte('"') -} - -func writeUnknownStruct(w *textWriter, data []byte) (err error) { - if !w.compact { - if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { - return err - } - } - b := NewBuffer(data) - for b.index < len(b.buf) { - x, err := b.DecodeVarint() - if err != nil { - _, ferr := fmt.Fprintf(w, "/* %v */\n", err) - return ferr - } - wire, tag := x&7, x>>3 - if wire == WireEndGroup { - w.unindent() - if _, werr := w.Write(endBraceNewline); werr != nil { - return werr - } - continue - } - if _, ferr := fmt.Fprint(w, tag); ferr != nil { - return ferr - } - if wire != WireStartGroup { - if err = w.WriteByte(':'); err != nil { - return err - } - } - if !w.compact || wire == WireStartGroup { - if err = w.WriteByte(' '); err != nil { - return err - } - } - switch wire { - case WireBytes: - buf, e := b.DecodeRawBytes(false) - if e == nil { - _, err = fmt.Fprintf(w, "%q", buf) - } else { - _, err = fmt.Fprintf(w, "/* %v */", e) - } - case WireFixed32: - x, err = b.DecodeFixed32() - err = writeUnknownInt(w, x, err) - case WireFixed64: - x, err = b.DecodeFixed64() - err = writeUnknownInt(w, x, err) - case WireStartGroup: - err = w.WriteByte('{') - w.indent() - case WireVarint: - x, err = b.DecodeVarint() - err = writeUnknownInt(w, x, err) - default: - _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) - } - if err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - return nil -} - -func writeUnknownInt(w *textWriter, x uint64, err error) error { - if err == nil { - _, err = fmt.Fprint(w, x) - } else { - _, err = fmt.Fprintf(w, "/* %v */", err) - } - return err -} - -type int32Slice []int32 - -func (s int32Slice) Len() int { return len(s) } -func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } -func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// writeExtensions writes all the extensions in pv. -// pv is assumed to be a pointer to a protocol message struct that is extendable. -func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { - emap := extensionMaps[pv.Type().Elem()] - e := pv.Interface().(Message) - - var m map[int32]Extension - var mu sync.Locker - if em, ok := e.(extensionsBytes); ok { - eb := em.GetExtensions() - var err error - m, err = BytesToExtensionsMap(*eb) - if err != nil { - return err - } - mu = notLocker{} - } else if _, ok := e.(extendableProto); ok { - ep, _ := extendable(e) - m, mu = ep.extensionsRead() - if m == nil { - return nil - } - } - - // Order the extensions by ID. - // This isn't strictly necessary, but it will give us - // canonical output, which will also make testing easier. - - mu.Lock() - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) - mu.Unlock() - - for _, extNum := range ids { - ext := m[extNum] - var desc *ExtensionDesc - if emap != nil { - desc = emap[extNum] - } - if desc == nil { - // Unknown extension. - if err := writeUnknownStruct(w, ext.enc); err != nil { - return err - } - continue - } - - pb, err := GetExtension(e, desc) - if err != nil { - return fmt.Errorf("failed getting extension: %v", err) - } - - // Repeated extensions will appear as a slice. - if !desc.repeated() { - if err := tm.writeExtension(w, desc.Name, pb); err != nil { - return err - } - } else { - v := reflect.ValueOf(pb) - for i := 0; i < v.Len(); i++ { - if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { - return err - } - } - } - } - return nil -} - -func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { - if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - return nil -} - -func (w *textWriter) writeIndent() { - if !w.complete { - return - } - remain := w.ind * 2 - for remain > 0 { - n := remain - if n > len(spaces) { - n = len(spaces) - } - w.w.Write(spaces[:n]) - remain -= n - } - w.complete = false -} - -// TextMarshaler is a configurable text format marshaler. -type TextMarshaler struct { - Compact bool // use compact text format (one line). - ExpandAny bool // expand google.protobuf.Any messages of known types -} - -// Marshal writes a given protocol buffer in text format. -// The only errors returned are from w. -func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { - val := reflect.ValueOf(pb) - if pb == nil || val.IsNil() { - w.Write([]byte("")) - return nil - } - var bw *bufio.Writer - ww, ok := w.(writer) - if !ok { - bw = bufio.NewWriter(w) - ww = bw - } - aw := &textWriter{ - w: ww, - complete: true, - compact: tm.Compact, - } - - if etm, ok := pb.(encoding.TextMarshaler); ok { - text, err := etm.MarshalText() - if err != nil { - return err - } - if _, err = aw.Write(text); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil - } - // Dereference the received pointer so we don't have outer < and >. - v := reflect.Indirect(val) - if err := tm.writeStruct(aw, v); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil -} - -// Text is the same as Marshal, but returns the string directly. -func (tm *TextMarshaler) Text(pb Message) string { - var buf bytes.Buffer - tm.Marshal(&buf, pb) - return buf.String() -} - -var ( - defaultTextMarshaler = TextMarshaler{} - compactTextMarshaler = TextMarshaler{Compact: true} -) - -// TODO: consider removing some of the Marshal functions below. - -// MarshalText writes a given protocol buffer in text format. -// The only errors returned are from w. -func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } - -// MarshalTextString is the same as MarshalText, but returns the string directly. -func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } - -// CompactText writes a given protocol buffer in compact text format (one line). -func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } - -// CompactTextString is the same as CompactText, but returns the string directly. -func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/gogo/protobuf/proto/text_gogo.go b/vendor/github.com/gogo/protobuf/proto/text_gogo.go deleted file mode 100644 index 1d6c6aa..0000000 --- a/vendor/github.com/gogo/protobuf/proto/text_gogo.go +++ /dev/null @@ -1,57 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "reflect" -) - -func (tm *TextMarshaler) writeEnum(w *textWriter, v reflect.Value, props *Properties) error { - m, ok := enumStringMaps[props.Enum] - if !ok { - if err := tm.writeAny(w, v, props); err != nil { - return err - } - } - key := int32(0) - if v.Kind() == reflect.Ptr { - key = int32(v.Elem().Int()) - } else { - key = int32(v.Int()) - } - s, ok := m[key] - if !ok { - if err := tm.writeAny(w, v, props); err != nil { - return err - } - } - _, err := fmt.Fprint(w, s) - return err -} diff --git a/vendor/github.com/gogo/protobuf/proto/text_parser.go b/vendor/github.com/gogo/protobuf/proto/text_parser.go deleted file mode 100644 index f127672..0000000 --- a/vendor/github.com/gogo/protobuf/proto/text_parser.go +++ /dev/null @@ -1,1013 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// Functions for parsing the Text protocol buffer format. -// TODO: message sets. - -import ( - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "time" - "unicode/utf8" -) - -// Error string emitted when deserializing Any and fields are already set -const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" - -type ParseError struct { - Message string - Line int // 1-based line number - Offset int // 0-based byte offset from start of input -} - -func (p *ParseError) Error() string { - if p.Line == 1 { - // show offset only for first line - return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) - } - return fmt.Sprintf("line %d: %v", p.Line, p.Message) -} - -type token struct { - value string - err *ParseError - line int // line number - offset int // byte number from start of input, not start of line - unquoted string // the unquoted version of value, if it was a quoted string -} - -func (t *token) String() string { - if t.err == nil { - return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) - } - return fmt.Sprintf("parse error: %v", t.err) -} - -type textParser struct { - s string // remaining input - done bool // whether the parsing is finished (success or error) - backed bool // whether back() was called - offset, line int - cur token -} - -func newTextParser(s string) *textParser { - p := new(textParser) - p.s = s - p.line = 1 - p.cur.line = 1 - return p -} - -func (p *textParser) errorf(format string, a ...interface{}) *ParseError { - pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} - p.cur.err = pe - p.done = true - return pe -} - -// Numbers and identifiers are matched by [-+._A-Za-z0-9] -func isIdentOrNumberChar(c byte) bool { - switch { - case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': - return true - case '0' <= c && c <= '9': - return true - } - switch c { - case '-', '+', '.', '_': - return true - } - return false -} - -func isWhitespace(c byte) bool { - switch c { - case ' ', '\t', '\n', '\r': - return true - } - return false -} - -func isQuote(c byte) bool { - switch c { - case '"', '\'': - return true - } - return false -} - -func (p *textParser) skipWhitespace() { - i := 0 - for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { - if p.s[i] == '#' { - // comment; skip to end of line or input - for i < len(p.s) && p.s[i] != '\n' { - i++ - } - if i == len(p.s) { - break - } - } - if p.s[i] == '\n' { - p.line++ - } - i++ - } - p.offset += i - p.s = p.s[i:len(p.s)] - if len(p.s) == 0 { - p.done = true - } -} - -func (p *textParser) advance() { - // Skip whitespace - p.skipWhitespace() - if p.done { - return - } - - // Start of non-whitespace - p.cur.err = nil - p.cur.offset, p.cur.line = p.offset, p.line - p.cur.unquoted = "" - switch p.s[0] { - case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': - // Single symbol - p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] - case '"', '\'': - // Quoted string - i := 1 - for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { - if p.s[i] == '\\' && i+1 < len(p.s) { - // skip escaped char - i++ - } - i++ - } - if i >= len(p.s) || p.s[i] != p.s[0] { - p.errorf("unmatched quote") - return - } - unq, err := unquoteC(p.s[1:i], rune(p.s[0])) - if err != nil { - p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) - return - } - p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] - p.cur.unquoted = unq - default: - i := 0 - for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { - i++ - } - if i == 0 { - p.errorf("unexpected byte %#x", p.s[0]) - return - } - p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] - } - p.offset += len(p.cur.value) -} - -var ( - errBadUTF8 = errors.New("proto: bad UTF-8") - errBadHex = errors.New("proto: bad hexadecimal") -) - -func unquoteC(s string, quote rune) (string, error) { - // This is based on C++'s tokenizer.cc. - // Despite its name, this is *not* parsing C syntax. - // For instance, "\0" is an invalid quoted string. - - // Avoid allocation in trivial cases. - simple := true - for _, r := range s { - if r == '\\' || r == quote { - simple = false - break - } - } - if simple { - return s, nil - } - - buf := make([]byte, 0, 3*len(s)/2) - for len(s) > 0 { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", errBadUTF8 - } - s = s[n:] - if r != '\\' { - if r < utf8.RuneSelf { - buf = append(buf, byte(r)) - } else { - buf = append(buf, string(r)...) - } - continue - } - - ch, tail, err := unescape(s) - if err != nil { - return "", err - } - buf = append(buf, ch...) - s = tail - } - return string(buf), nil -} - -func unescape(s string) (ch string, tail string, err error) { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", "", errBadUTF8 - } - s = s[n:] - switch r { - case 'a': - return "\a", s, nil - case 'b': - return "\b", s, nil - case 'f': - return "\f", s, nil - case 'n': - return "\n", s, nil - case 'r': - return "\r", s, nil - case 't': - return "\t", s, nil - case 'v': - return "\v", s, nil - case '?': - return "?", s, nil // trigraph workaround - case '\'', '"', '\\': - return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7', 'x', 'X': - if len(s) < 2 { - return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) - } - base := 8 - ss := s[:2] - s = s[2:] - if r == 'x' || r == 'X' { - base = 16 - } else { - ss = string(r) + ss - } - i, err := strconv.ParseUint(ss, base, 8) - if err != nil { - return "", "", err - } - return string([]byte{byte(i)}), s, nil - case 'u', 'U': - n := 4 - if r == 'U' { - n = 8 - } - if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d digits`, r, n) - } - - bs := make([]byte, n/2) - for i := 0; i < n; i += 2 { - a, ok1 := unhex(s[i]) - b, ok2 := unhex(s[i+1]) - if !ok1 || !ok2 { - return "", "", errBadHex - } - bs[i/2] = a<<4 | b - } - s = s[n:] - return string(bs), s, nil - } - return "", "", fmt.Errorf(`unknown escape \%c`, r) -} - -// Adapted from src/pkg/strconv/quote.go. -func unhex(b byte) (v byte, ok bool) { - switch { - case '0' <= b && b <= '9': - return b - '0', true - case 'a' <= b && b <= 'f': - return b - 'a' + 10, true - case 'A' <= b && b <= 'F': - return b - 'A' + 10, true - } - return 0, false -} - -// Back off the parser by one token. Can only be done between calls to next(). -// It makes the next advance() a no-op. -func (p *textParser) back() { p.backed = true } - -// Advances the parser and returns the new current token. -func (p *textParser) next() *token { - if p.backed || p.done { - p.backed = false - return &p.cur - } - p.advance() - if p.done { - p.cur.value = "" - } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { - // Look for multiple quoted strings separated by whitespace, - // and concatenate them. - cat := p.cur - for { - p.skipWhitespace() - if p.done || !isQuote(p.s[0]) { - break - } - p.advance() - if p.cur.err != nil { - return &p.cur - } - cat.value += " " + p.cur.value - cat.unquoted += p.cur.unquoted - } - p.done = false // parser may have seen EOF, but we want to return cat - p.cur = cat - } - return &p.cur -} - -func (p *textParser) consumeToken(s string) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != s { - p.back() - return p.errorf("expected %q, found %q", s, tok.value) - } - return nil -} - -// Return a RequiredNotSetError indicating which required field was not set. -func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < st.NumField(); i++ { - if !isNil(sv.Field(i)) { - continue - } - - props := sprops.Prop[i] - if props.Required { - return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} - } - } - return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen -} - -// Returns the index in the struct for the named field, as well as the parsed tag properties. -func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { - i, ok := sprops.decoderOrigNames[name] - if ok { - return i, sprops.Prop[i], true - } - return -1, nil, false -} - -// Consume a ':' from the input stream (if the next token is a colon), -// returning an error if a colon is needed but not present. -func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ":" { - // Colon is optional when the field is a group or message. - needColon := true - switch props.Wire { - case "group": - needColon = false - case "bytes": - // A "bytes" field is either a message, a string, or a repeated field; - // those three become *T, *string and []T respectively, so we can check for - // this field being a pointer to a non-string. - if typ.Kind() == reflect.Ptr { - // *T or *string - if typ.Elem().Kind() == reflect.String { - break - } - } else if typ.Kind() == reflect.Slice { - // []T or []*T - if typ.Elem().Kind() != reflect.Ptr { - break - } - } else if typ.Kind() == reflect.String { - // The proto3 exception is for a string field, - // which requires a colon. - break - } - needColon = false - } - if needColon { - return p.errorf("expected ':', found %q", tok.value) - } - p.back() - } - return nil -} - -func (p *textParser) readStruct(sv reflect.Value, terminator string) error { - st := sv.Type() - sprops := GetProperties(st) - reqCount := sprops.reqCount - var reqFieldErr error - fieldSet := make(map[string]bool) - // A struct is a sequence of "name: value", terminated by one of - // '>' or '}', or the end of the input. A name may also be - // "[extension]" or "[type/url]". - // - // The whole struct can also be an expanded Any message, like: - // [type/url] < ... struct contents ... > - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - if tok.value == "[" { - // Looks like an extension or an Any. - // - // TODO: Check whether we need to handle - // namespace rooted names (e.g. ".something.Foo"). - extName, err := p.consumeExtName() - if err != nil { - return err - } - - if s := strings.LastIndex(extName, "/"); s >= 0 { - // If it contains a slash, it's an Any type URL. - messageName := extName[s+1:] - mt := MessageType(messageName) - if mt == nil { - return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) - } - tok = p.next() - if tok.err != nil { - return tok.err - } - // consume an optional colon - if tok.value == ":" { - tok = p.next() - if tok.err != nil { - return tok.err - } - } - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - v := reflect.New(mt.Elem()) - if pe := p.readStruct(v.Elem(), terminator); pe != nil { - return pe - } - b, err := Marshal(v.Interface().(Message)) - if err != nil { - return p.errorf("failed to marshal message of type %q: %v", messageName, err) - } - if fieldSet["type_url"] { - return p.errorf(anyRepeatedlyUnpacked, "type_url") - } - if fieldSet["value"] { - return p.errorf(anyRepeatedlyUnpacked, "value") - } - sv.FieldByName("TypeUrl").SetString(extName) - sv.FieldByName("Value").SetBytes(b) - fieldSet["type_url"] = true - fieldSet["value"] = true - continue - } - - var desc *ExtensionDesc - // This could be faster, but it's functional. - // TODO: Do something smarter than a linear scan. - for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { - if d.Name == extName { - desc = d - break - } - } - if desc == nil { - return p.errorf("unrecognized extension %q", extName) - } - - props := &Properties{} - props.Parse(desc.Tag) - - typ := reflect.TypeOf(desc.ExtensionType) - if err := p.checkForColon(props, typ); err != nil { - return err - } - - rep := desc.repeated() - - // Read the extension structure, and set it in - // the value we're constructing. - var ext reflect.Value - if !rep { - ext = reflect.New(typ).Elem() - } else { - ext = reflect.New(typ.Elem()).Elem() - } - if err := p.readAny(ext, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - ep := sv.Addr().Interface().(Message) - if !rep { - SetExtension(ep, desc, ext.Interface()) - } else { - old, err := GetExtension(ep, desc) - var sl reflect.Value - if err == nil { - sl = reflect.ValueOf(old) // existing slice - } else { - sl = reflect.MakeSlice(typ, 0, 1) - } - sl = reflect.Append(sl, ext) - SetExtension(ep, desc, sl.Interface()) - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - continue - } - - // This is a normal, non-extension field. - name := tok.value - var dst reflect.Value - fi, props, ok := structFieldByName(sprops, name) - if ok { - dst = sv.Field(fi) - } else if oop, ok := sprops.OneofTypes[name]; ok { - // It is a oneof. - props = oop.Prop - nv := reflect.New(oop.Type.Elem()) - dst = nv.Elem().Field(0) - field := sv.Field(oop.Field) - if !field.IsNil() { - return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) - } - field.Set(nv) - } - if !dst.IsValid() { - return p.errorf("unknown field name %q in %v", name, st) - } - - if dst.Kind() == reflect.Map { - // Consume any colon. - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Construct the map if it doesn't already exist. - if dst.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) - } - key := reflect.New(dst.Type().Key()).Elem() - val := reflect.New(dst.Type().Elem()).Elem() - - // The map entry should be this sequence of tokens: - // < key : KEY value : VALUE > - // However, implementations may omit key or value, and technically - // we should support them in any order. See b/28924776 for a time - // this went wrong. - - tok := p.next() - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - switch tok.value { - case "key": - if err := p.consumeToken(":"); err != nil { - return err - } - if err := p.readAny(key, props.mkeyprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - case "value": - if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { - return err - } - if err := p.readAny(val, props.mvalprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - default: - p.back() - return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) - } - } - - dst.SetMapIndex(key, val) - continue - } - - // Check that it's not already set if it's not a repeated field. - if !props.Repeated && fieldSet[name] { - return p.errorf("non-repeated field %q was repeated", name) - } - - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Parse into the field. - fieldSet[name] = true - if err := p.readAny(dst, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - if props.Required { - reqCount-- - } - - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - - } - - if reqCount > 0 { - return p.missingRequiredFieldError(sv) - } - return reqFieldErr -} - -// consumeExtName consumes extension name or expanded Any type URL and the -// following ']'. It returns the name or URL consumed. -func (p *textParser) consumeExtName() (string, error) { - tok := p.next() - if tok.err != nil { - return "", tok.err - } - - // If extension name or type url is quoted, it's a single token. - if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { - name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) - if err != nil { - return "", err - } - return name, p.consumeToken("]") - } - - // Consume everything up to "]" - var parts []string - for tok.value != "]" { - parts = append(parts, tok.value) - tok = p.next() - if tok.err != nil { - return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) - } - } - return strings.Join(parts, ""), nil -} - -// consumeOptionalSeparator consumes an optional semicolon or comma. -// It is used in readStruct to provide backward compatibility. -func (p *textParser) consumeOptionalSeparator() error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ";" && tok.value != "," { - p.back() - } - return nil -} - -func (p *textParser) readAny(v reflect.Value, props *Properties) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == "" { - return p.errorf("unexpected EOF") - } - if len(props.CustomType) > 0 { - if props.Repeated { - t := reflect.TypeOf(v.Interface()) - if t.Kind() == reflect.Slice { - tc := reflect.TypeOf(new(Marshaler)) - ok := t.Elem().Implements(tc.Elem()) - if ok { - fv := v - flen := fv.Len() - if flen == fv.Cap() { - nav := reflect.MakeSlice(v.Type(), flen, 2*flen+1) - reflect.Copy(nav, fv) - fv.Set(nav) - } - fv.SetLen(flen + 1) - - // Read one. - p.back() - return p.readAny(fv.Index(flen), props) - } - } - } - if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { - custom := reflect.New(props.ctype.Elem()).Interface().(Unmarshaler) - err := custom.Unmarshal([]byte(tok.unquoted)) - if err != nil { - return p.errorf("%v %v: %v", err, v.Type(), tok.value) - } - v.Set(reflect.ValueOf(custom)) - } else { - custom := reflect.New(reflect.TypeOf(v.Interface())).Interface().(Unmarshaler) - err := custom.Unmarshal([]byte(tok.unquoted)) - if err != nil { - return p.errorf("%v %v: %v", err, v.Type(), tok.value) - } - v.Set(reflect.Indirect(reflect.ValueOf(custom))) - } - return nil - } - if props.StdTime { - fv := v - p.back() - props.StdTime = false - tproto := ×tamp{} - err := p.readAny(reflect.ValueOf(tproto).Elem(), props) - props.StdTime = true - if err != nil { - return err - } - tim, err := timestampFromProto(tproto) - if err != nil { - return err - } - if props.Repeated { - t := reflect.TypeOf(v.Interface()) - if t.Kind() == reflect.Slice { - if t.Elem().Kind() == reflect.Ptr { - ts := fv.Interface().([]*time.Time) - ts = append(ts, &tim) - fv.Set(reflect.ValueOf(ts)) - return nil - } else { - ts := fv.Interface().([]time.Time) - ts = append(ts, tim) - fv.Set(reflect.ValueOf(ts)) - return nil - } - } - } - if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { - v.Set(reflect.ValueOf(&tim)) - } else { - v.Set(reflect.Indirect(reflect.ValueOf(&tim))) - } - return nil - } - if props.StdDuration { - fv := v - p.back() - props.StdDuration = false - dproto := &duration{} - err := p.readAny(reflect.ValueOf(dproto).Elem(), props) - props.StdDuration = true - if err != nil { - return err - } - dur, err := durationFromProto(dproto) - if err != nil { - return err - } - if props.Repeated { - t := reflect.TypeOf(v.Interface()) - if t.Kind() == reflect.Slice { - if t.Elem().Kind() == reflect.Ptr { - ds := fv.Interface().([]*time.Duration) - ds = append(ds, &dur) - fv.Set(reflect.ValueOf(ds)) - return nil - } else { - ds := fv.Interface().([]time.Duration) - ds = append(ds, dur) - fv.Set(reflect.ValueOf(ds)) - return nil - } - } - } - if reflect.TypeOf(v.Interface()).Kind() == reflect.Ptr { - v.Set(reflect.ValueOf(&dur)) - } else { - v.Set(reflect.Indirect(reflect.ValueOf(&dur))) - } - return nil - } - switch fv := v; fv.Kind() { - case reflect.Slice: - at := v.Type() - if at.Elem().Kind() == reflect.Uint8 { - // Special case for []byte - if tok.value[0] != '"' && tok.value[0] != '\'' { - // Deliberately written out here, as the error after - // this switch statement would write "invalid []byte: ...", - // which is not as user-friendly. - return p.errorf("invalid string: %v", tok.value) - } - bytes := []byte(tok.unquoted) - fv.Set(reflect.ValueOf(bytes)) - return nil - } - // Repeated field. - if tok.value == "[" { - // Repeated field with list notation, like [1,2,3]. - for { - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - err := p.readAny(fv.Index(fv.Len()-1), props) - if err != nil { - return err - } - ntok := p.next() - if ntok.err != nil { - return ntok.err - } - if ntok.value == "]" { - break - } - if ntok.value != "," { - return p.errorf("Expected ']' or ',' found %q", ntok.value) - } - } - return nil - } - // One value of the repeated field. - p.back() - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - return p.readAny(fv.Index(fv.Len()-1), props) - case reflect.Bool: - // true/1/t/True or false/f/0/False. - switch tok.value { - case "true", "1", "t", "True": - fv.SetBool(true) - return nil - case "false", "0", "f", "False": - fv.SetBool(false) - return nil - } - case reflect.Float32, reflect.Float64: - v := tok.value - // Ignore 'f' for compatibility with output generated by C++, but don't - // remove 'f' when the value is "-inf" or "inf". - if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { - v = v[:len(v)-1] - } - if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { - fv.SetFloat(f) - return nil - } - case reflect.Int32: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - fv.SetInt(x) - return nil - } - - if len(props.Enum) == 0 { - break - } - m, ok := enumValueMaps[props.Enum] - if !ok { - break - } - x, ok := m[tok.value] - if !ok { - break - } - fv.SetInt(int64(x)) - return nil - case reflect.Int64: - if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { - fv.SetInt(x) - return nil - } - - case reflect.Ptr: - // A basic field (indirected through pointer), or a repeated message/group - p.back() - fv.Set(reflect.New(fv.Type().Elem())) - return p.readAny(fv.Elem(), props) - case reflect.String: - if tok.value[0] == '"' || tok.value[0] == '\'' { - fv.SetString(tok.unquoted) - return nil - } - case reflect.Struct: - var terminator string - switch tok.value { - case "{": - terminator = "}" - case "<": - terminator = ">" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - // TODO: Handle nested messages which implement encoding.TextUnmarshaler. - return p.readStruct(fv, terminator) - case reflect.Uint32: - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - fv.SetUint(x) - return nil - } - case reflect.Uint64: - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - fv.SetUint(x) - return nil - } - } - return p.errorf("invalid %v: %v", v.Type(), tok.value) -} - -// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb -// before starting to unmarshal, so any existing data in pb is always removed. -// If a required field is not set and no other error occurs, -// UnmarshalText returns *RequiredNotSetError. -func UnmarshalText(s string, pb Message) error { - if um, ok := pb.(encoding.TextUnmarshaler); ok { - err := um.UnmarshalText([]byte(s)) - return err - } - pb.Reset() - v := reflect.ValueOf(pb) - if pe := newTextParser(s).readStruct(v.Elem(), ""); pe != nil { - return pe - } - return nil -} diff --git a/vendor/github.com/gogo/protobuf/proto/timestamp.go b/vendor/github.com/gogo/protobuf/proto/timestamp.go deleted file mode 100644 index 9324f65..0000000 --- a/vendor/github.com/gogo/protobuf/proto/timestamp.go +++ /dev/null @@ -1,113 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// This file implements operations on google.protobuf.Timestamp. - -import ( - "errors" - "fmt" - "time" -) - -const ( - // Seconds field of the earliest valid Timestamp. - // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). - minValidSeconds = -62135596800 - // Seconds field just after the latest valid Timestamp. - // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). - maxValidSeconds = 253402300800 -) - -// validateTimestamp determines whether a Timestamp is valid. -// A valid timestamp represents a time in the range -// [0001-01-01, 10000-01-01) and has a Nanos field -// in the range [0, 1e9). -// -// If the Timestamp is valid, validateTimestamp returns nil. -// Otherwise, it returns an error that describes -// the problem. -// -// Every valid Timestamp can be represented by a time.Time, but the converse is not true. -func validateTimestamp(ts *timestamp) error { - if ts == nil { - return errors.New("timestamp: nil Timestamp") - } - if ts.Seconds < minValidSeconds { - return fmt.Errorf("timestamp: %#v before 0001-01-01", ts) - } - if ts.Seconds >= maxValidSeconds { - return fmt.Errorf("timestamp: %#v after 10000-01-01", ts) - } - if ts.Nanos < 0 || ts.Nanos >= 1e9 { - return fmt.Errorf("timestamp: %#v: nanos not in range [0, 1e9)", ts) - } - return nil -} - -// TimestampFromProto converts a google.protobuf.Timestamp proto to a time.Time. -// It returns an error if the argument is invalid. -// -// Unlike most Go functions, if Timestamp returns an error, the first return value -// is not the zero time.Time. Instead, it is the value obtained from the -// time.Unix function when passed the contents of the Timestamp, in the UTC -// locale. This may or may not be a meaningful time; many invalid Timestamps -// do map to valid time.Times. -// -// A nil Timestamp returns an error. The first return value in that case is -// undefined. -func timestampFromProto(ts *timestamp) (time.Time, error) { - // Don't return the zero value on error, because corresponds to a valid - // timestamp. Instead return whatever time.Unix gives us. - var t time.Time - if ts == nil { - t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp - } else { - t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() - } - return t, validateTimestamp(ts) -} - -// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. -// It returns an error if the resulting Timestamp is invalid. -func timestampProto(t time.Time) (*timestamp, error) { - seconds := t.Unix() - nanos := int32(t.Sub(time.Unix(seconds, 0))) - ts := ×tamp{ - Seconds: seconds, - Nanos: nanos, - } - if err := validateTimestamp(ts); err != nil { - return nil, err - } - return ts, nil -} diff --git a/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go b/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go deleted file mode 100644 index d427647..0000000 --- a/vendor/github.com/gogo/protobuf/proto/timestamp_gogo.go +++ /dev/null @@ -1,229 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2016, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "reflect" - "time" -) - -var timeType = reflect.TypeOf((*time.Time)(nil)).Elem() - -type timestamp struct { - Seconds int64 `protobuf:"varint,1,opt,name=seconds,proto3" json:"seconds,omitempty"` - Nanos int32 `protobuf:"varint,2,opt,name=nanos,proto3" json:"nanos,omitempty"` -} - -func (m *timestamp) Reset() { *m = timestamp{} } -func (*timestamp) ProtoMessage() {} -func (*timestamp) String() string { return "timestamp" } - -func init() { - RegisterType((*timestamp)(nil), "gogo.protobuf.proto.timestamp") -} - -func (o *Buffer) decTimestamp() (time.Time, error) { - b, err := o.DecodeRawBytes(true) - if err != nil { - return time.Time{}, err - } - tproto := ×tamp{} - if err := Unmarshal(b, tproto); err != nil { - return time.Time{}, err - } - return timestampFromProto(tproto) -} - -func (o *Buffer) dec_time(p *Properties, base structPointer) error { - t, err := o.decTimestamp() - if err != nil { - return err - } - setPtrCustomType(base, p.field, &t) - return nil -} - -func (o *Buffer) dec_ref_time(p *Properties, base structPointer) error { - t, err := o.decTimestamp() - if err != nil { - return err - } - setCustomType(base, p.field, &t) - return nil -} - -func (o *Buffer) dec_slice_time(p *Properties, base structPointer) error { - t, err := o.decTimestamp() - if err != nil { - return err - } - newBas := appendStructPointer(base, p.field, reflect.SliceOf(reflect.PtrTo(timeType))) - var zero field - setPtrCustomType(newBas, zero, &t) - return nil -} - -func (o *Buffer) dec_slice_ref_time(p *Properties, base structPointer) error { - t, err := o.decTimestamp() - if err != nil { - return err - } - newBas := appendStructPointer(base, p.field, reflect.SliceOf(timeType)) - var zero field - setCustomType(newBas, zero, &t) - return nil -} - -func size_time(p *Properties, base structPointer) (n int) { - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return 0 - } - tim := structPointer_Interface(structp, timeType).(*time.Time) - t, err := timestampProto(*tim) - if err != nil { - return 0 - } - size := Size(t) - return size + sizeVarint(uint64(size)) + len(p.tagcode) -} - -func (o *Buffer) enc_time(p *Properties, base structPointer) error { - structp := structPointer_GetStructPointer(base, p.field) - if structPointer_IsNil(structp) { - return ErrNil - } - tim := structPointer_Interface(structp, timeType).(*time.Time) - t, err := timestampProto(*tim) - if err != nil { - return err - } - data, err := Marshal(t) - if err != nil { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return nil -} - -func size_ref_time(p *Properties, base structPointer) (n int) { - tim := structPointer_InterfaceAt(base, p.field, timeType).(*time.Time) - t, err := timestampProto(*tim) - if err != nil { - return 0 - } - size := Size(t) - return size + sizeVarint(uint64(size)) + len(p.tagcode) -} - -func (o *Buffer) enc_ref_time(p *Properties, base structPointer) error { - tim := structPointer_InterfaceAt(base, p.field, timeType).(*time.Time) - t, err := timestampProto(*tim) - if err != nil { - return err - } - data, err := Marshal(t) - if err != nil { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - return nil -} - -func size_slice_time(p *Properties, base structPointer) (n int) { - ptims := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(reflect.PtrTo(timeType))).(*[]*time.Time) - tims := *ptims - for i := 0; i < len(tims); i++ { - if tims[i] == nil { - return 0 - } - tproto, err := timestampProto(*tims[i]) - if err != nil { - return 0 - } - size := Size(tproto) - n += len(p.tagcode) + size + sizeVarint(uint64(size)) - } - return n -} - -func (o *Buffer) enc_slice_time(p *Properties, base structPointer) error { - ptims := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(reflect.PtrTo(timeType))).(*[]*time.Time) - tims := *ptims - for i := 0; i < len(tims); i++ { - if tims[i] == nil { - return errRepeatedHasNil - } - tproto, err := timestampProto(*tims[i]) - if err != nil { - return err - } - data, err := Marshal(tproto) - if err != nil { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - } - return nil -} - -func size_slice_ref_time(p *Properties, base structPointer) (n int) { - ptims := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(timeType)).(*[]time.Time) - tims := *ptims - for i := 0; i < len(tims); i++ { - tproto, err := timestampProto(tims[i]) - if err != nil { - return 0 - } - size := Size(tproto) - n += len(p.tagcode) + size + sizeVarint(uint64(size)) - } - return n -} - -func (o *Buffer) enc_slice_ref_time(p *Properties, base structPointer) error { - ptims := structPointer_InterfaceAt(base, p.field, reflect.SliceOf(timeType)).(*[]time.Time) - tims := *ptims - for i := 0; i < len(tims); i++ { - tproto, err := timestampProto(tims[i]) - if err != nil { - return err - } - data, err := Marshal(tproto) - if err != nil { - return err - } - o.buf = append(o.buf, p.tagcode...) - o.EncodeRawBytes(data) - } - return nil -} diff --git a/vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go b/vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go deleted file mode 100644 index ceadde6..0000000 --- a/vendor/github.com/gogo/protobuf/sortkeys/sortkeys.go +++ /dev/null @@ -1,101 +0,0 @@ -// Protocol Buffers for Go with Gadgets -// -// Copyright (c) 2013, The GoGo Authors. All rights reserved. -// http://github.com/gogo/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package sortkeys - -import ( - "sort" -) - -func Strings(l []string) { - sort.Strings(l) -} - -func Float64s(l []float64) { - sort.Float64s(l) -} - -func Float32s(l []float32) { - sort.Sort(Float32Slice(l)) -} - -func Int64s(l []int64) { - sort.Sort(Int64Slice(l)) -} - -func Int32s(l []int32) { - sort.Sort(Int32Slice(l)) -} - -func Uint64s(l []uint64) { - sort.Sort(Uint64Slice(l)) -} - -func Uint32s(l []uint32) { - sort.Sort(Uint32Slice(l)) -} - -func Bools(l []bool) { - sort.Sort(BoolSlice(l)) -} - -type BoolSlice []bool - -func (p BoolSlice) Len() int { return len(p) } -func (p BoolSlice) Less(i, j int) bool { return p[j] } -func (p BoolSlice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -type Int64Slice []int64 - -func (p Int64Slice) Len() int { return len(p) } -func (p Int64Slice) Less(i, j int) bool { return p[i] < p[j] } -func (p Int64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -type Int32Slice []int32 - -func (p Int32Slice) Len() int { return len(p) } -func (p Int32Slice) Less(i, j int) bool { return p[i] < p[j] } -func (p Int32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -type Uint64Slice []uint64 - -func (p Uint64Slice) Len() int { return len(p) } -func (p Uint64Slice) Less(i, j int) bool { return p[i] < p[j] } -func (p Uint64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -type Uint32Slice []uint32 - -func (p Uint32Slice) Len() int { return len(p) } -func (p Uint32Slice) Less(i, j int) bool { return p[i] < p[j] } -func (p Uint32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } - -type Float32Slice []float32 - -func (p Float32Slice) Len() int { return len(p) } -func (p Float32Slice) Less(i, j int) bool { return p[i] < p[j] } -func (p Float32Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] } diff --git a/vendor/github.com/golang/protobuf/AUTHORS b/vendor/github.com/golang/protobuf/AUTHORS deleted file mode 100644 index 15167cd..0000000 --- a/vendor/github.com/golang/protobuf/AUTHORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code refers to The Go Authors for copyright purposes. -# The master list of authors is in the main Go distribution, -# visible at http://tip.golang.org/AUTHORS. diff --git a/vendor/github.com/golang/protobuf/CONTRIBUTORS b/vendor/github.com/golang/protobuf/CONTRIBUTORS deleted file mode 100644 index 1c4577e..0000000 --- a/vendor/github.com/golang/protobuf/CONTRIBUTORS +++ /dev/null @@ -1,3 +0,0 @@ -# This source code was written by the Go contributors. -# The master list of contributors is in the main Go distribution, -# visible at http://tip.golang.org/CONTRIBUTORS. diff --git a/vendor/github.com/golang/protobuf/LICENSE b/vendor/github.com/golang/protobuf/LICENSE deleted file mode 100644 index 1b1b192..0000000 --- a/vendor/github.com/golang/protobuf/LICENSE +++ /dev/null @@ -1,31 +0,0 @@ -Go support for Protocol Buffers - Google's data interchange format - -Copyright 2010 The Go Authors. All rights reserved. -https://github.com/golang/protobuf - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - diff --git a/vendor/github.com/golang/protobuf/proto/clone.go b/vendor/github.com/golang/protobuf/proto/clone.go deleted file mode 100644 index 3cd3249..0000000 --- a/vendor/github.com/golang/protobuf/proto/clone.go +++ /dev/null @@ -1,253 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Protocol buffer deep copy and merge. -// TODO: RawMessage. - -package proto - -import ( - "fmt" - "log" - "reflect" - "strings" -) - -// Clone returns a deep copy of a protocol buffer. -func Clone(src Message) Message { - in := reflect.ValueOf(src) - if in.IsNil() { - return src - } - out := reflect.New(in.Type().Elem()) - dst := out.Interface().(Message) - Merge(dst, src) - return dst -} - -// Merger is the interface representing objects that can merge messages of the same type. -type Merger interface { - // Merge merges src into this message. - // Required and optional fields that are set in src will be set to that value in dst. - // Elements of repeated fields will be appended. - // - // Merge may panic if called with a different argument type than the receiver. - Merge(src Message) -} - -// generatedMerger is the custom merge method that generated protos will have. -// We must add this method since a generate Merge method will conflict with -// many existing protos that have a Merge data field already defined. -type generatedMerger interface { - XXX_Merge(src Message) -} - -// Merge merges src into dst. -// Required and optional fields that are set in src will be set to that value in dst. -// Elements of repeated fields will be appended. -// Merge panics if src and dst are not the same type, or if dst is nil. -func Merge(dst, src Message) { - if m, ok := dst.(Merger); ok { - m.Merge(src) - return - } - - in := reflect.ValueOf(src) - out := reflect.ValueOf(dst) - if out.IsNil() { - panic("proto: nil destination") - } - if in.Type() != out.Type() { - panic(fmt.Sprintf("proto.Merge(%T, %T) type mismatch", dst, src)) - } - if in.IsNil() { - return // Merge from nil src is a noop - } - if m, ok := dst.(generatedMerger); ok { - m.XXX_Merge(src) - return - } - mergeStruct(out.Elem(), in.Elem()) -} - -func mergeStruct(out, in reflect.Value) { - sprop := GetProperties(in.Type()) - for i := 0; i < in.NumField(); i++ { - f := in.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - mergeAny(out.Field(i), in.Field(i), false, sprop.Prop[i]) - } - - if emIn, err := extendable(in.Addr().Interface()); err == nil { - emOut, _ := extendable(out.Addr().Interface()) - mIn, muIn := emIn.extensionsRead() - if mIn != nil { - mOut := emOut.extensionsWrite() - muIn.Lock() - mergeExtension(mOut, mIn) - muIn.Unlock() - } - } - - uf := in.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return - } - uin := uf.Bytes() - if len(uin) > 0 { - out.FieldByName("XXX_unrecognized").SetBytes(append([]byte(nil), uin...)) - } -} - -// mergeAny performs a merge between two values of the same type. -// viaPtr indicates whether the values were indirected through a pointer (implying proto2). -// prop is set if this is a struct field (it may be nil). -func mergeAny(out, in reflect.Value, viaPtr bool, prop *Properties) { - if in.Type() == protoMessageType { - if !in.IsNil() { - if out.IsNil() { - out.Set(reflect.ValueOf(Clone(in.Interface().(Message)))) - } else { - Merge(out.Interface().(Message), in.Interface().(Message)) - } - } - return - } - switch in.Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - if !viaPtr && isProto3Zero(in) { - return - } - out.Set(in) - case reflect.Interface: - // Probably a oneof field; copy non-nil values. - if in.IsNil() { - return - } - // Allocate destination if it is not set, or set to a different type. - // Otherwise we will merge as normal. - if out.IsNil() || out.Elem().Type() != in.Elem().Type() { - out.Set(reflect.New(in.Elem().Elem().Type())) // interface -> *T -> T -> new(T) - } - mergeAny(out.Elem(), in.Elem(), false, nil) - case reflect.Map: - if in.Len() == 0 { - return - } - if out.IsNil() { - out.Set(reflect.MakeMap(in.Type())) - } - // For maps with value types of *T or []byte we need to deep copy each value. - elemKind := in.Type().Elem().Kind() - for _, key := range in.MapKeys() { - var val reflect.Value - switch elemKind { - case reflect.Ptr: - val = reflect.New(in.Type().Elem().Elem()) - mergeAny(val, in.MapIndex(key), false, nil) - case reflect.Slice: - val = in.MapIndex(key) - val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) - default: - val = in.MapIndex(key) - } - out.SetMapIndex(key, val) - } - case reflect.Ptr: - if in.IsNil() { - return - } - if out.IsNil() { - out.Set(reflect.New(in.Elem().Type())) - } - mergeAny(out.Elem(), in.Elem(), true, nil) - case reflect.Slice: - if in.IsNil() { - return - } - if in.Type().Elem().Kind() == reflect.Uint8 { - // []byte is a scalar bytes field, not a repeated field. - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value, and should not - // be merged. - if prop != nil && prop.proto3 && in.Len() == 0 { - return - } - - // Make a deep copy. - // Append to []byte{} instead of []byte(nil) so that we never end up - // with a nil result. - out.SetBytes(append([]byte{}, in.Bytes()...)) - return - } - n := in.Len() - if out.IsNil() { - out.Set(reflect.MakeSlice(in.Type(), 0, n)) - } - switch in.Type().Elem().Kind() { - case reflect.Bool, reflect.Float32, reflect.Float64, reflect.Int32, reflect.Int64, - reflect.String, reflect.Uint32, reflect.Uint64: - out.Set(reflect.AppendSlice(out, in)) - default: - for i := 0; i < n; i++ { - x := reflect.Indirect(reflect.New(in.Type().Elem())) - mergeAny(x, in.Index(i), false, nil) - out.Set(reflect.Append(out, x)) - } - } - case reflect.Struct: - mergeStruct(out, in) - default: - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to copy %v", in) - } -} - -func mergeExtension(out, in map[int32]Extension) { - for extNum, eIn := range in { - eOut := Extension{desc: eIn.desc} - if eIn.value != nil { - v := reflect.New(reflect.TypeOf(eIn.value)).Elem() - mergeAny(v, reflect.ValueOf(eIn.value), false, nil) - eOut.value = v.Interface() - } - if eIn.enc != nil { - eOut.enc = make([]byte, len(eIn.enc)) - copy(eOut.enc, eIn.enc) - } - - out[extNum] = eOut - } -} diff --git a/vendor/github.com/golang/protobuf/proto/decode.go b/vendor/github.com/golang/protobuf/proto/decode.go deleted file mode 100644 index d9aa3c4..0000000 --- a/vendor/github.com/golang/protobuf/proto/decode.go +++ /dev/null @@ -1,428 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for decoding protocol buffer data to construct in-memory representations. - */ - -import ( - "errors" - "fmt" - "io" -) - -// errOverflow is returned when an integer is too large to be represented. -var errOverflow = errors.New("proto: integer overflow") - -// ErrInternalBadWireType is returned by generated code when an incorrect -// wire type is encountered. It does not get returned to user code. -var ErrInternalBadWireType = errors.New("proto: internal error: bad wiretype for oneof") - -// DecodeVarint reads a varint-encoded integer from the slice. -// It returns the integer and the number of bytes consumed, or -// zero if there is not enough. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func DecodeVarint(buf []byte) (x uint64, n int) { - for shift := uint(0); shift < 64; shift += 7 { - if n >= len(buf) { - return 0, 0 - } - b := uint64(buf[n]) - n++ - x |= (b & 0x7F) << shift - if (b & 0x80) == 0 { - return x, n - } - } - - // The number is too large to represent in a 64-bit value. - return 0, 0 -} - -func (p *Buffer) decodeVarintSlow() (x uint64, err error) { - i := p.index - l := len(p.buf) - - for shift := uint(0); shift < 64; shift += 7 { - if i >= l { - err = io.ErrUnexpectedEOF - return - } - b := p.buf[i] - i++ - x |= (uint64(b) & 0x7F) << shift - if b < 0x80 { - p.index = i - return - } - } - - // The number is too large to represent in a 64-bit value. - err = errOverflow - return -} - -// DecodeVarint reads a varint-encoded integer from the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) DecodeVarint() (x uint64, err error) { - i := p.index - buf := p.buf - - if i >= len(buf) { - return 0, io.ErrUnexpectedEOF - } else if buf[i] < 0x80 { - p.index++ - return uint64(buf[i]), nil - } else if len(buf)-i < 10 { - return p.decodeVarintSlow() - } - - var b uint64 - // we already checked the first byte - x = uint64(buf[i]) - 0x80 - i++ - - b = uint64(buf[i]) - i++ - x += b << 7 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 7 - - b = uint64(buf[i]) - i++ - x += b << 14 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 14 - - b = uint64(buf[i]) - i++ - x += b << 21 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 21 - - b = uint64(buf[i]) - i++ - x += b << 28 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 28 - - b = uint64(buf[i]) - i++ - x += b << 35 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 35 - - b = uint64(buf[i]) - i++ - x += b << 42 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 42 - - b = uint64(buf[i]) - i++ - x += b << 49 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 49 - - b = uint64(buf[i]) - i++ - x += b << 56 - if b&0x80 == 0 { - goto done - } - x -= 0x80 << 56 - - b = uint64(buf[i]) - i++ - x += b << 63 - if b&0x80 == 0 { - goto done - } - // x -= 0x80 << 63 // Always zero. - - return 0, errOverflow - -done: - p.index = i - return x, nil -} - -// DecodeFixed64 reads a 64-bit integer from the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) DecodeFixed64() (x uint64, err error) { - // x, err already 0 - i := p.index + 8 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-8]) - x |= uint64(p.buf[i-7]) << 8 - x |= uint64(p.buf[i-6]) << 16 - x |= uint64(p.buf[i-5]) << 24 - x |= uint64(p.buf[i-4]) << 32 - x |= uint64(p.buf[i-3]) << 40 - x |= uint64(p.buf[i-2]) << 48 - x |= uint64(p.buf[i-1]) << 56 - return -} - -// DecodeFixed32 reads a 32-bit integer from the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) DecodeFixed32() (x uint64, err error) { - // x, err already 0 - i := p.index + 4 - if i < 0 || i > len(p.buf) { - err = io.ErrUnexpectedEOF - return - } - p.index = i - - x = uint64(p.buf[i-4]) - x |= uint64(p.buf[i-3]) << 8 - x |= uint64(p.buf[i-2]) << 16 - x |= uint64(p.buf[i-1]) << 24 - return -} - -// DecodeZigzag64 reads a zigzag-encoded 64-bit integer -// from the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) DecodeZigzag64() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = (x >> 1) ^ uint64((int64(x&1)<<63)>>63) - return -} - -// DecodeZigzag32 reads a zigzag-encoded 32-bit integer -// from the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) DecodeZigzag32() (x uint64, err error) { - x, err = p.DecodeVarint() - if err != nil { - return - } - x = uint64((uint32(x) >> 1) ^ uint32((int32(x&1)<<31)>>31)) - return -} - -// DecodeRawBytes reads a count-delimited byte buffer from the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) DecodeRawBytes(alloc bool) (buf []byte, err error) { - n, err := p.DecodeVarint() - if err != nil { - return nil, err - } - - nb := int(n) - if nb < 0 { - return nil, fmt.Errorf("proto: bad byte length %d", nb) - } - end := p.index + nb - if end < p.index || end > len(p.buf) { - return nil, io.ErrUnexpectedEOF - } - - if !alloc { - // todo: check if can get more uses of alloc=false - buf = p.buf[p.index:end] - p.index += nb - return - } - - buf = make([]byte, nb) - copy(buf, p.buf[p.index:]) - p.index += nb - return -} - -// DecodeStringBytes reads an encoded string from the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) DecodeStringBytes() (s string, err error) { - buf, err := p.DecodeRawBytes(false) - if err != nil { - return - } - return string(buf), nil -} - -// Unmarshaler is the interface representing objects that can -// unmarshal themselves. The argument points to data that may be -// overwritten, so implementations should not keep references to the -// buffer. -// Unmarshal implementations should not clear the receiver. -// Any unmarshaled data should be merged into the receiver. -// Callers of Unmarshal that do not want to retain existing data -// should Reset the receiver before calling Unmarshal. -type Unmarshaler interface { - Unmarshal([]byte) error -} - -// newUnmarshaler is the interface representing objects that can -// unmarshal themselves. The semantics are identical to Unmarshaler. -// -// This exists to support protoc-gen-go generated messages. -// The proto package will stop type-asserting to this interface in the future. -// -// DO NOT DEPEND ON THIS. -type newUnmarshaler interface { - XXX_Unmarshal([]byte) error -} - -// Unmarshal parses the protocol buffer representation in buf and places the -// decoded result in pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// Unmarshal resets pb before starting to unmarshal, so any -// existing data in pb is always removed. Use UnmarshalMerge -// to preserve and append to existing data. -func Unmarshal(buf []byte, pb Message) error { - pb.Reset() - if u, ok := pb.(newUnmarshaler); ok { - return u.XXX_Unmarshal(buf) - } - if u, ok := pb.(Unmarshaler); ok { - return u.Unmarshal(buf) - } - return NewBuffer(buf).Unmarshal(pb) -} - -// UnmarshalMerge parses the protocol buffer representation in buf and -// writes the decoded result to pb. If the struct underlying pb does not match -// the data in buf, the results can be unpredictable. -// -// UnmarshalMerge merges into existing data in pb. -// Most code should use Unmarshal instead. -func UnmarshalMerge(buf []byte, pb Message) error { - if u, ok := pb.(newUnmarshaler); ok { - return u.XXX_Unmarshal(buf) - } - if u, ok := pb.(Unmarshaler); ok { - // NOTE: The history of proto have unfortunately been inconsistent - // whether Unmarshaler should or should not implicitly clear itself. - // Some implementations do, most do not. - // Thus, calling this here may or may not do what people want. - // - // See https://github.com/golang/protobuf/issues/424 - return u.Unmarshal(buf) - } - return NewBuffer(buf).Unmarshal(pb) -} - -// DecodeMessage reads a count-delimited message from the Buffer. -func (p *Buffer) DecodeMessage(pb Message) error { - enc, err := p.DecodeRawBytes(false) - if err != nil { - return err - } - return NewBuffer(enc).Unmarshal(pb) -} - -// DecodeGroup reads a tag-delimited group from the Buffer. -// StartGroup tag is already consumed. This function consumes -// EndGroup tag. -func (p *Buffer) DecodeGroup(pb Message) error { - b := p.buf[p.index:] - x, y := findEndGroup(b) - if x < 0 { - return io.ErrUnexpectedEOF - } - err := Unmarshal(b[:x], pb) - p.index += y - return err -} - -// Unmarshal parses the protocol buffer representation in the -// Buffer and places the decoded result in pb. If the struct -// underlying pb does not match the data in the buffer, the results can be -// unpredictable. -// -// Unlike proto.Unmarshal, this does not reset pb before starting to unmarshal. -func (p *Buffer) Unmarshal(pb Message) error { - // If the object can unmarshal itself, let it. - if u, ok := pb.(newUnmarshaler); ok { - err := u.XXX_Unmarshal(p.buf[p.index:]) - p.index = len(p.buf) - return err - } - if u, ok := pb.(Unmarshaler); ok { - // NOTE: The history of proto have unfortunately been inconsistent - // whether Unmarshaler should or should not implicitly clear itself. - // Some implementations do, most do not. - // Thus, calling this here may or may not do what people want. - // - // See https://github.com/golang/protobuf/issues/424 - err := u.Unmarshal(p.buf[p.index:]) - p.index = len(p.buf) - return err - } - - // Slow workaround for messages that aren't Unmarshalers. - // This includes some hand-coded .pb.go files and - // bootstrap protos. - // TODO: fix all of those and then add Unmarshal to - // the Message interface. Then: - // The cast above and code below can be deleted. - // The old unmarshaler can be deleted. - // Clients can call Unmarshal directly (can already do that, actually). - var info InternalMessageInfo - err := info.Unmarshal(pb, p.buf[p.index:]) - p.index = len(p.buf) - return err -} diff --git a/vendor/github.com/golang/protobuf/proto/discard.go b/vendor/github.com/golang/protobuf/proto/discard.go deleted file mode 100644 index dea2617..0000000 --- a/vendor/github.com/golang/protobuf/proto/discard.go +++ /dev/null @@ -1,350 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2017 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "reflect" - "strings" - "sync" - "sync/atomic" -) - -type generatedDiscarder interface { - XXX_DiscardUnknown() -} - -// DiscardUnknown recursively discards all unknown fields from this message -// and all embedded messages. -// -// When unmarshaling a message with unrecognized fields, the tags and values -// of such fields are preserved in the Message. This allows a later call to -// marshal to be able to produce a message that continues to have those -// unrecognized fields. To avoid this, DiscardUnknown is used to -// explicitly clear the unknown fields after unmarshaling. -// -// For proto2 messages, the unknown fields of message extensions are only -// discarded from messages that have been accessed via GetExtension. -func DiscardUnknown(m Message) { - if m, ok := m.(generatedDiscarder); ok { - m.XXX_DiscardUnknown() - return - } - // TODO: Dynamically populate a InternalMessageInfo for legacy messages, - // but the master branch has no implementation for InternalMessageInfo, - // so it would be more work to replicate that approach. - discardLegacy(m) -} - -// DiscardUnknown recursively discards all unknown fields. -func (a *InternalMessageInfo) DiscardUnknown(m Message) { - di := atomicLoadDiscardInfo(&a.discard) - if di == nil { - di = getDiscardInfo(reflect.TypeOf(m).Elem()) - atomicStoreDiscardInfo(&a.discard, di) - } - di.discard(toPointer(&m)) -} - -type discardInfo struct { - typ reflect.Type - - initialized int32 // 0: only typ is valid, 1: everything is valid - lock sync.Mutex - - fields []discardFieldInfo - unrecognized field -} - -type discardFieldInfo struct { - field field // Offset of field, guaranteed to be valid - discard func(src pointer) -} - -var ( - discardInfoMap = map[reflect.Type]*discardInfo{} - discardInfoLock sync.Mutex -) - -func getDiscardInfo(t reflect.Type) *discardInfo { - discardInfoLock.Lock() - defer discardInfoLock.Unlock() - di := discardInfoMap[t] - if di == nil { - di = &discardInfo{typ: t} - discardInfoMap[t] = di - } - return di -} - -func (di *discardInfo) discard(src pointer) { - if src.isNil() { - return // Nothing to do. - } - - if atomic.LoadInt32(&di.initialized) == 0 { - di.computeDiscardInfo() - } - - for _, fi := range di.fields { - sfp := src.offset(fi.field) - fi.discard(sfp) - } - - // For proto2 messages, only discard unknown fields in message extensions - // that have been accessed via GetExtension. - if em, err := extendable(src.asPointerTo(di.typ).Interface()); err == nil { - // Ignore lock since DiscardUnknown is not concurrency safe. - emm, _ := em.extensionsRead() - for _, mx := range emm { - if m, ok := mx.value.(Message); ok { - DiscardUnknown(m) - } - } - } - - if di.unrecognized.IsValid() { - *src.offset(di.unrecognized).toBytes() = nil - } -} - -func (di *discardInfo) computeDiscardInfo() { - di.lock.Lock() - defer di.lock.Unlock() - if di.initialized != 0 { - return - } - t := di.typ - n := t.NumField() - - for i := 0; i < n; i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - - dfi := discardFieldInfo{field: toField(&f)} - tf := f.Type - - // Unwrap tf to get its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic(fmt.Sprintf("%v.%s cannot be a slice of pointers to primitive types", t, f.Name)) - } - - switch tf.Kind() { - case reflect.Struct: - switch { - case !isPointer: - panic(fmt.Sprintf("%v.%s cannot be a direct struct value", t, f.Name)) - case isSlice: // E.g., []*pb.T - di := getDiscardInfo(tf) - dfi.discard = func(src pointer) { - sps := src.getPointerSlice() - for _, sp := range sps { - if !sp.isNil() { - di.discard(sp) - } - } - } - default: // E.g., *pb.T - di := getDiscardInfo(tf) - dfi.discard = func(src pointer) { - sp := src.getPointer() - if !sp.isNil() { - di.discard(sp) - } - } - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%v.%s cannot be a pointer to a map or a slice of map values", t, f.Name)) - default: // E.g., map[K]V - if tf.Elem().Kind() == reflect.Ptr { // Proto struct (e.g., *T) - dfi.discard = func(src pointer) { - sm := src.asPointerTo(tf).Elem() - if sm.Len() == 0 { - return - } - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - DiscardUnknown(val.Interface().(Message)) - } - } - } else { - dfi.discard = func(pointer) {} // Noop - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%v.%s cannot be a pointer to a interface or a slice of interface values", t, f.Name)) - default: // E.g., interface{} - // TODO: Make this faster? - dfi.discard = func(src pointer) { - su := src.asPointerTo(tf).Elem() - if !su.IsNil() { - sv := su.Elem().Elem().Field(0) - if sv.Kind() == reflect.Ptr && sv.IsNil() { - return - } - switch sv.Type().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - DiscardUnknown(sv.Interface().(Message)) - } - } - } - } - default: - continue - } - di.fields = append(di.fields, dfi) - } - - di.unrecognized = invalidField - if f, ok := t.FieldByName("XXX_unrecognized"); ok { - if f.Type != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - di.unrecognized = toField(&f) - } - - atomic.StoreInt32(&di.initialized, 1) -} - -func discardLegacy(m Message) { - v := reflect.ValueOf(m) - if v.Kind() != reflect.Ptr || v.IsNil() { - return - } - v = v.Elem() - if v.Kind() != reflect.Struct { - return - } - t := v.Type() - - for i := 0; i < v.NumField(); i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - vf := v.Field(i) - tf := f.Type - - // Unwrap tf to get its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic(fmt.Sprintf("%T.%s cannot be a slice of pointers to primitive types", m, f.Name)) - } - - switch tf.Kind() { - case reflect.Struct: - switch { - case !isPointer: - panic(fmt.Sprintf("%T.%s cannot be a direct struct value", m, f.Name)) - case isSlice: // E.g., []*pb.T - for j := 0; j < vf.Len(); j++ { - discardLegacy(vf.Index(j).Interface().(Message)) - } - default: // E.g., *pb.T - discardLegacy(vf.Interface().(Message)) - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%T.%s cannot be a pointer to a map or a slice of map values", m, f.Name)) - default: // E.g., map[K]V - tv := vf.Type().Elem() - if tv.Kind() == reflect.Ptr && tv.Implements(protoMessageType) { // Proto struct (e.g., *T) - for _, key := range vf.MapKeys() { - val := vf.MapIndex(key) - discardLegacy(val.Interface().(Message)) - } - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic(fmt.Sprintf("%T.%s cannot be a pointer to a interface or a slice of interface values", m, f.Name)) - default: // E.g., test_proto.isCommunique_Union interface - if !vf.IsNil() && f.Tag.Get("protobuf_oneof") != "" { - vf = vf.Elem() // E.g., *test_proto.Communique_Msg - if !vf.IsNil() { - vf = vf.Elem() // E.g., test_proto.Communique_Msg - vf = vf.Field(0) // E.g., Proto struct (e.g., *T) or primitive value - if vf.Kind() == reflect.Ptr { - discardLegacy(vf.Interface().(Message)) - } - } - } - } - } - } - - if vf := v.FieldByName("XXX_unrecognized"); vf.IsValid() { - if vf.Type() != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - vf.Set(reflect.ValueOf([]byte(nil))) - } - - // For proto2 messages, only discard unknown fields in message extensions - // that have been accessed via GetExtension. - if em, err := extendable(m); err == nil { - // Ignore lock since discardLegacy is not concurrency safe. - emm, _ := em.extensionsRead() - for _, mx := range emm { - if m, ok := mx.value.(Message); ok { - discardLegacy(m) - } - } - } -} diff --git a/vendor/github.com/golang/protobuf/proto/encode.go b/vendor/github.com/golang/protobuf/proto/encode.go deleted file mode 100644 index c27d35f..0000000 --- a/vendor/github.com/golang/protobuf/proto/encode.go +++ /dev/null @@ -1,221 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "errors" - "fmt" - "reflect" -) - -// RequiredNotSetError is the error returned if Marshal is called with -// a protocol buffer struct whose required fields have not -// all been initialized. It is also the error returned if Unmarshal is -// called with an encoded protocol buffer that does not include all the -// required fields. -// -// When printed, RequiredNotSetError reports the first unset required field in a -// message. If the field cannot be precisely determined, it is reported as -// "{Unknown}". -type RequiredNotSetError struct { - field string -} - -func (e *RequiredNotSetError) Error() string { - return fmt.Sprintf("proto: required field %q not set", e.field) -} - -var ( - // errRepeatedHasNil is the error returned if Marshal is called with - // a struct with a repeated field containing a nil element. - errRepeatedHasNil = errors.New("proto: repeated field has nil element") - - // errOneofHasNil is the error returned if Marshal is called with - // a struct with a oneof field containing a nil element. - errOneofHasNil = errors.New("proto: oneof field has nil value") - - // ErrNil is the error returned if Marshal is called with nil. - ErrNil = errors.New("proto: Marshal called with nil") - - // ErrTooLarge is the error returned if Marshal is called with a - // message that encodes to >2GB. - ErrTooLarge = errors.New("proto: message encodes to over 2 GB") -) - -// The fundamental encoders that put bytes on the wire. -// Those that take integer types all accept uint64 and are -// therefore of type valueEncoder. - -const maxVarintBytes = 10 // maximum length of a varint - -// EncodeVarint returns the varint encoding of x. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -// Not used by the package itself, but helpful to clients -// wishing to use the same encoding. -func EncodeVarint(x uint64) []byte { - var buf [maxVarintBytes]byte - var n int - for n = 0; x > 127; n++ { - buf[n] = 0x80 | uint8(x&0x7F) - x >>= 7 - } - buf[n] = uint8(x) - n++ - return buf[0:n] -} - -// EncodeVarint writes a varint-encoded integer to the Buffer. -// This is the format for the -// int32, int64, uint32, uint64, bool, and enum -// protocol buffer types. -func (p *Buffer) EncodeVarint(x uint64) error { - for x >= 1<<7 { - p.buf = append(p.buf, uint8(x&0x7f|0x80)) - x >>= 7 - } - p.buf = append(p.buf, uint8(x)) - return nil -} - -// SizeVarint returns the varint encoding size of an integer. -func SizeVarint(x uint64) int { - switch { - case x < 1<<7: - return 1 - case x < 1<<14: - return 2 - case x < 1<<21: - return 3 - case x < 1<<28: - return 4 - case x < 1<<35: - return 5 - case x < 1<<42: - return 6 - case x < 1<<49: - return 7 - case x < 1<<56: - return 8 - case x < 1<<63: - return 9 - } - return 10 -} - -// EncodeFixed64 writes a 64-bit integer to the Buffer. -// This is the format for the -// fixed64, sfixed64, and double protocol buffer types. -func (p *Buffer) EncodeFixed64(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24), - uint8(x>>32), - uint8(x>>40), - uint8(x>>48), - uint8(x>>56)) - return nil -} - -// EncodeFixed32 writes a 32-bit integer to the Buffer. -// This is the format for the -// fixed32, sfixed32, and float protocol buffer types. -func (p *Buffer) EncodeFixed32(x uint64) error { - p.buf = append(p.buf, - uint8(x), - uint8(x>>8), - uint8(x>>16), - uint8(x>>24)) - return nil -} - -// EncodeZigzag64 writes a zigzag-encoded 64-bit integer -// to the Buffer. -// This is the format used for the sint64 protocol buffer type. -func (p *Buffer) EncodeZigzag64(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((x << 1) ^ uint64((int64(x) >> 63)))) -} - -// EncodeZigzag32 writes a zigzag-encoded 32-bit integer -// to the Buffer. -// This is the format used for the sint32 protocol buffer type. -func (p *Buffer) EncodeZigzag32(x uint64) error { - // use signed number to get arithmetic right shift. - return p.EncodeVarint(uint64((uint32(x) << 1) ^ uint32((int32(x) >> 31)))) -} - -// EncodeRawBytes writes a count-delimited byte buffer to the Buffer. -// This is the format used for the bytes protocol buffer -// type and for embedded messages. -func (p *Buffer) EncodeRawBytes(b []byte) error { - p.EncodeVarint(uint64(len(b))) - p.buf = append(p.buf, b...) - return nil -} - -// EncodeStringBytes writes an encoded string to the Buffer. -// This is the format used for the proto2 string type. -func (p *Buffer) EncodeStringBytes(s string) error { - p.EncodeVarint(uint64(len(s))) - p.buf = append(p.buf, s...) - return nil -} - -// Marshaler is the interface representing objects that can marshal themselves. -type Marshaler interface { - Marshal() ([]byte, error) -} - -// EncodeMessage writes the protocol buffer to the Buffer, -// prefixed by a varint-encoded length. -func (p *Buffer) EncodeMessage(pb Message) error { - siz := Size(pb) - p.EncodeVarint(uint64(siz)) - return p.Marshal(pb) -} - -// All protocol buffer fields are nillable, but be careful. -func isNil(v reflect.Value) bool { - switch v.Kind() { - case reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice: - return v.IsNil() - } - return false -} diff --git a/vendor/github.com/golang/protobuf/proto/equal.go b/vendor/github.com/golang/protobuf/proto/equal.go deleted file mode 100644 index d4db5a1..0000000 --- a/vendor/github.com/golang/protobuf/proto/equal.go +++ /dev/null @@ -1,300 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2011 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// Protocol buffer comparison. - -package proto - -import ( - "bytes" - "log" - "reflect" - "strings" -) - -/* -Equal returns true iff protocol buffers a and b are equal. -The arguments must both be pointers to protocol buffer structs. - -Equality is defined in this way: - - Two messages are equal iff they are the same type, - corresponding fields are equal, unknown field sets - are equal, and extensions sets are equal. - - Two set scalar fields are equal iff their values are equal. - If the fields are of a floating-point type, remember that - NaN != x for all x, including NaN. If the message is defined - in a proto3 .proto file, fields are not "set"; specifically, - zero length proto3 "bytes" fields are equal (nil == {}). - - Two repeated fields are equal iff their lengths are the same, - and their corresponding elements are equal. Note a "bytes" field, - although represented by []byte, is not a repeated field and the - rule for the scalar fields described above applies. - - Two unset fields are equal. - - Two unknown field sets are equal if their current - encoded state is equal. - - Two extension sets are equal iff they have corresponding - elements that are pairwise equal. - - Two map fields are equal iff their lengths are the same, - and they contain the same set of elements. Zero-length map - fields are equal. - - Every other combination of things are not equal. - -The return value is undefined if a and b are not protocol buffers. -*/ -func Equal(a, b Message) bool { - if a == nil || b == nil { - return a == b - } - v1, v2 := reflect.ValueOf(a), reflect.ValueOf(b) - if v1.Type() != v2.Type() { - return false - } - if v1.Kind() == reflect.Ptr { - if v1.IsNil() { - return v2.IsNil() - } - if v2.IsNil() { - return false - } - v1, v2 = v1.Elem(), v2.Elem() - } - if v1.Kind() != reflect.Struct { - return false - } - return equalStruct(v1, v2) -} - -// v1 and v2 are known to have the same type. -func equalStruct(v1, v2 reflect.Value) bool { - sprop := GetProperties(v1.Type()) - for i := 0; i < v1.NumField(); i++ { - f := v1.Type().Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - f1, f2 := v1.Field(i), v2.Field(i) - if f.Type.Kind() == reflect.Ptr { - if n1, n2 := f1.IsNil(), f2.IsNil(); n1 && n2 { - // both unset - continue - } else if n1 != n2 { - // set/unset mismatch - return false - } - f1, f2 = f1.Elem(), f2.Elem() - } - if !equalAny(f1, f2, sprop.Prop[i]) { - return false - } - } - - if em1 := v1.FieldByName("XXX_InternalExtensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_InternalExtensions") - if !equalExtensions(v1.Type(), em1.Interface().(XXX_InternalExtensions), em2.Interface().(XXX_InternalExtensions)) { - return false - } - } - - if em1 := v1.FieldByName("XXX_extensions"); em1.IsValid() { - em2 := v2.FieldByName("XXX_extensions") - if !equalExtMap(v1.Type(), em1.Interface().(map[int32]Extension), em2.Interface().(map[int32]Extension)) { - return false - } - } - - uf := v1.FieldByName("XXX_unrecognized") - if !uf.IsValid() { - return true - } - - u1 := uf.Bytes() - u2 := v2.FieldByName("XXX_unrecognized").Bytes() - return bytes.Equal(u1, u2) -} - -// v1 and v2 are known to have the same type. -// prop may be nil. -func equalAny(v1, v2 reflect.Value, prop *Properties) bool { - if v1.Type() == protoMessageType { - m1, _ := v1.Interface().(Message) - m2, _ := v2.Interface().(Message) - return Equal(m1, m2) - } - switch v1.Kind() { - case reflect.Bool: - return v1.Bool() == v2.Bool() - case reflect.Float32, reflect.Float64: - return v1.Float() == v2.Float() - case reflect.Int32, reflect.Int64: - return v1.Int() == v2.Int() - case reflect.Interface: - // Probably a oneof field; compare the inner values. - n1, n2 := v1.IsNil(), v2.IsNil() - if n1 || n2 { - return n1 == n2 - } - e1, e2 := v1.Elem(), v2.Elem() - if e1.Type() != e2.Type() { - return false - } - return equalAny(e1, e2, nil) - case reflect.Map: - if v1.Len() != v2.Len() { - return false - } - for _, key := range v1.MapKeys() { - val2 := v2.MapIndex(key) - if !val2.IsValid() { - // This key was not found in the second map. - return false - } - if !equalAny(v1.MapIndex(key), val2, nil) { - return false - } - } - return true - case reflect.Ptr: - // Maps may have nil values in them, so check for nil. - if v1.IsNil() && v2.IsNil() { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return equalAny(v1.Elem(), v2.Elem(), prop) - case reflect.Slice: - if v1.Type().Elem().Kind() == reflect.Uint8 { - // short circuit: []byte - - // Edge case: if this is in a proto3 message, a zero length - // bytes field is considered the zero value. - if prop != nil && prop.proto3 && v1.Len() == 0 && v2.Len() == 0 { - return true - } - if v1.IsNil() != v2.IsNil() { - return false - } - return bytes.Equal(v1.Interface().([]byte), v2.Interface().([]byte)) - } - - if v1.Len() != v2.Len() { - return false - } - for i := 0; i < v1.Len(); i++ { - if !equalAny(v1.Index(i), v2.Index(i), prop) { - return false - } - } - return true - case reflect.String: - return v1.Interface().(string) == v2.Interface().(string) - case reflect.Struct: - return equalStruct(v1, v2) - case reflect.Uint32, reflect.Uint64: - return v1.Uint() == v2.Uint() - } - - // unknown type, so not a protocol buffer - log.Printf("proto: don't know how to compare %v", v1) - return false -} - -// base is the struct type that the extensions are based on. -// x1 and x2 are InternalExtensions. -func equalExtensions(base reflect.Type, x1, x2 XXX_InternalExtensions) bool { - em1, _ := x1.extensionsRead() - em2, _ := x2.extensionsRead() - return equalExtMap(base, em1, em2) -} - -func equalExtMap(base reflect.Type, em1, em2 map[int32]Extension) bool { - if len(em1) != len(em2) { - return false - } - - for extNum, e1 := range em1 { - e2, ok := em2[extNum] - if !ok { - return false - } - - m1, m2 := e1.value, e2.value - - if m1 == nil && m2 == nil { - // Both have only encoded form. - if bytes.Equal(e1.enc, e2.enc) { - continue - } - // The bytes are different, but the extensions might still be - // equal. We need to decode them to compare. - } - - if m1 != nil && m2 != nil { - // Both are unencoded. - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - continue - } - - // At least one is encoded. To do a semantically correct comparison - // we need to unmarshal them first. - var desc *ExtensionDesc - if m := extensionMaps[base]; m != nil { - desc = m[extNum] - } - if desc == nil { - // If both have only encoded form and the bytes are the same, - // it is handled above. We get here when the bytes are different. - // We don't know how to decode it, so just compare them as byte - // slices. - log.Printf("proto: don't know how to compare extension %d of %v", extNum, base) - return false - } - var err error - if m1 == nil { - m1, err = decodeExtension(e1.enc, desc) - } - if m2 == nil && err == nil { - m2, err = decodeExtension(e2.enc, desc) - } - if err != nil { - // The encoded form is invalid. - log.Printf("proto: badly encoded extension %d of %v: %v", extNum, base, err) - return false - } - if !equalAny(reflect.ValueOf(m1), reflect.ValueOf(m2), nil) { - return false - } - } - - return true -} diff --git a/vendor/github.com/golang/protobuf/proto/extensions.go b/vendor/github.com/golang/protobuf/proto/extensions.go deleted file mode 100644 index 816a3b9..0000000 --- a/vendor/github.com/golang/protobuf/proto/extensions.go +++ /dev/null @@ -1,543 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Types and routines for supporting protocol buffer extensions. - */ - -import ( - "errors" - "fmt" - "io" - "reflect" - "strconv" - "sync" -) - -// ErrMissingExtension is the error returned by GetExtension if the named extension is not in the message. -var ErrMissingExtension = errors.New("proto: missing extension") - -// ExtensionRange represents a range of message extensions for a protocol buffer. -// Used in code generated by the protocol compiler. -type ExtensionRange struct { - Start, End int32 // both inclusive -} - -// extendableProto is an interface implemented by any protocol buffer generated by the current -// proto compiler that may be extended. -type extendableProto interface { - Message - ExtensionRangeArray() []ExtensionRange - extensionsWrite() map[int32]Extension - extensionsRead() (map[int32]Extension, sync.Locker) -} - -// extendableProtoV1 is an interface implemented by a protocol buffer generated by the previous -// version of the proto compiler that may be extended. -type extendableProtoV1 interface { - Message - ExtensionRangeArray() []ExtensionRange - ExtensionMap() map[int32]Extension -} - -// extensionAdapter is a wrapper around extendableProtoV1 that implements extendableProto. -type extensionAdapter struct { - extendableProtoV1 -} - -func (e extensionAdapter) extensionsWrite() map[int32]Extension { - return e.ExtensionMap() -} - -func (e extensionAdapter) extensionsRead() (map[int32]Extension, sync.Locker) { - return e.ExtensionMap(), notLocker{} -} - -// notLocker is a sync.Locker whose Lock and Unlock methods are nops. -type notLocker struct{} - -func (n notLocker) Lock() {} -func (n notLocker) Unlock() {} - -// extendable returns the extendableProto interface for the given generated proto message. -// If the proto message has the old extension format, it returns a wrapper that implements -// the extendableProto interface. -func extendable(p interface{}) (extendableProto, error) { - switch p := p.(type) { - case extendableProto: - if isNilPtr(p) { - return nil, fmt.Errorf("proto: nil %T is not extendable", p) - } - return p, nil - case extendableProtoV1: - if isNilPtr(p) { - return nil, fmt.Errorf("proto: nil %T is not extendable", p) - } - return extensionAdapter{p}, nil - } - // Don't allocate a specific error containing %T: - // this is the hot path for Clone and MarshalText. - return nil, errNotExtendable -} - -var errNotExtendable = errors.New("proto: not an extendable proto.Message") - -func isNilPtr(x interface{}) bool { - v := reflect.ValueOf(x) - return v.Kind() == reflect.Ptr && v.IsNil() -} - -// XXX_InternalExtensions is an internal representation of proto extensions. -// -// Each generated message struct type embeds an anonymous XXX_InternalExtensions field, -// thus gaining the unexported 'extensions' method, which can be called only from the proto package. -// -// The methods of XXX_InternalExtensions are not concurrency safe in general, -// but calls to logically read-only methods such as has and get may be executed concurrently. -type XXX_InternalExtensions struct { - // The struct must be indirect so that if a user inadvertently copies a - // generated message and its embedded XXX_InternalExtensions, they - // avoid the mayhem of a copied mutex. - // - // The mutex serializes all logically read-only operations to p.extensionMap. - // It is up to the client to ensure that write operations to p.extensionMap are - // mutually exclusive with other accesses. - p *struct { - mu sync.Mutex - extensionMap map[int32]Extension - } -} - -// extensionsWrite returns the extension map, creating it on first use. -func (e *XXX_InternalExtensions) extensionsWrite() map[int32]Extension { - if e.p == nil { - e.p = new(struct { - mu sync.Mutex - extensionMap map[int32]Extension - }) - e.p.extensionMap = make(map[int32]Extension) - } - return e.p.extensionMap -} - -// extensionsRead returns the extensions map for read-only use. It may be nil. -// The caller must hold the returned mutex's lock when accessing Elements within the map. -func (e *XXX_InternalExtensions) extensionsRead() (map[int32]Extension, sync.Locker) { - if e.p == nil { - return nil, nil - } - return e.p.extensionMap, &e.p.mu -} - -// ExtensionDesc represents an extension specification. -// Used in generated code from the protocol compiler. -type ExtensionDesc struct { - ExtendedType Message // nil pointer to the type that is being extended - ExtensionType interface{} // nil pointer to the extension type - Field int32 // field number - Name string // fully-qualified name of extension, for text formatting - Tag string // protobuf tag style - Filename string // name of the file in which the extension is defined -} - -func (ed *ExtensionDesc) repeated() bool { - t := reflect.TypeOf(ed.ExtensionType) - return t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 -} - -// Extension represents an extension in a message. -type Extension struct { - // When an extension is stored in a message using SetExtension - // only desc and value are set. When the message is marshaled - // enc will be set to the encoded form of the message. - // - // When a message is unmarshaled and contains extensions, each - // extension will have only enc set. When such an extension is - // accessed using GetExtension (or GetExtensions) desc and value - // will be set. - desc *ExtensionDesc - value interface{} - enc []byte -} - -// SetRawExtension is for testing only. -func SetRawExtension(base Message, id int32, b []byte) { - epb, err := extendable(base) - if err != nil { - return - } - extmap := epb.extensionsWrite() - extmap[id] = Extension{enc: b} -} - -// isExtensionField returns true iff the given field number is in an extension range. -func isExtensionField(pb extendableProto, field int32) bool { - for _, er := range pb.ExtensionRangeArray() { - if er.Start <= field && field <= er.End { - return true - } - } - return false -} - -// checkExtensionTypes checks that the given extension is valid for pb. -func checkExtensionTypes(pb extendableProto, extension *ExtensionDesc) error { - var pbi interface{} = pb - // Check the extended type. - if ea, ok := pbi.(extensionAdapter); ok { - pbi = ea.extendableProtoV1 - } - if a, b := reflect.TypeOf(pbi), reflect.TypeOf(extension.ExtendedType); a != b { - return fmt.Errorf("proto: bad extended type; %v does not extend %v", b, a) - } - // Check the range. - if !isExtensionField(pb, extension.Field) { - return errors.New("proto: bad extension number; not in declared ranges") - } - return nil -} - -// extPropKey is sufficient to uniquely identify an extension. -type extPropKey struct { - base reflect.Type - field int32 -} - -var extProp = struct { - sync.RWMutex - m map[extPropKey]*Properties -}{ - m: make(map[extPropKey]*Properties), -} - -func extensionProperties(ed *ExtensionDesc) *Properties { - key := extPropKey{base: reflect.TypeOf(ed.ExtendedType), field: ed.Field} - - extProp.RLock() - if prop, ok := extProp.m[key]; ok { - extProp.RUnlock() - return prop - } - extProp.RUnlock() - - extProp.Lock() - defer extProp.Unlock() - // Check again. - if prop, ok := extProp.m[key]; ok { - return prop - } - - prop := new(Properties) - prop.Init(reflect.TypeOf(ed.ExtensionType), "unknown_name", ed.Tag, nil) - extProp.m[key] = prop - return prop -} - -// HasExtension returns whether the given extension is present in pb. -func HasExtension(pb Message, extension *ExtensionDesc) bool { - // TODO: Check types, field numbers, etc.? - epb, err := extendable(pb) - if err != nil { - return false - } - extmap, mu := epb.extensionsRead() - if extmap == nil { - return false - } - mu.Lock() - _, ok := extmap[extension.Field] - mu.Unlock() - return ok -} - -// ClearExtension removes the given extension from pb. -func ClearExtension(pb Message, extension *ExtensionDesc) { - epb, err := extendable(pb) - if err != nil { - return - } - // TODO: Check types, field numbers, etc.? - extmap := epb.extensionsWrite() - delete(extmap, extension.Field) -} - -// GetExtension retrieves a proto2 extended field from pb. -// -// If the descriptor is type complete (i.e., ExtensionDesc.ExtensionType is non-nil), -// then GetExtension parses the encoded field and returns a Go value of the specified type. -// If the field is not present, then the default value is returned (if one is specified), -// otherwise ErrMissingExtension is reported. -// -// If the descriptor is not type complete (i.e., ExtensionDesc.ExtensionType is nil), -// then GetExtension returns the raw encoded bytes of the field extension. -func GetExtension(pb Message, extension *ExtensionDesc) (interface{}, error) { - epb, err := extendable(pb) - if err != nil { - return nil, err - } - - if extension.ExtendedType != nil { - // can only check type if this is a complete descriptor - if err := checkExtensionTypes(epb, extension); err != nil { - return nil, err - } - } - - emap, mu := epb.extensionsRead() - if emap == nil { - return defaultExtensionValue(extension) - } - mu.Lock() - defer mu.Unlock() - e, ok := emap[extension.Field] - if !ok { - // defaultExtensionValue returns the default value or - // ErrMissingExtension if there is no default. - return defaultExtensionValue(extension) - } - - if e.value != nil { - // Already decoded. Check the descriptor, though. - if e.desc != extension { - // This shouldn't happen. If it does, it means that - // GetExtension was called twice with two different - // descriptors with the same field number. - return nil, errors.New("proto: descriptor conflict") - } - return e.value, nil - } - - if extension.ExtensionType == nil { - // incomplete descriptor - return e.enc, nil - } - - v, err := decodeExtension(e.enc, extension) - if err != nil { - return nil, err - } - - // Remember the decoded version and drop the encoded version. - // That way it is safe to mutate what we return. - e.value = v - e.desc = extension - e.enc = nil - emap[extension.Field] = e - return e.value, nil -} - -// defaultExtensionValue returns the default value for extension. -// If no default for an extension is defined ErrMissingExtension is returned. -func defaultExtensionValue(extension *ExtensionDesc) (interface{}, error) { - if extension.ExtensionType == nil { - // incomplete descriptor, so no default - return nil, ErrMissingExtension - } - - t := reflect.TypeOf(extension.ExtensionType) - props := extensionProperties(extension) - - sf, _, err := fieldDefault(t, props) - if err != nil { - return nil, err - } - - if sf == nil || sf.value == nil { - // There is no default value. - return nil, ErrMissingExtension - } - - if t.Kind() != reflect.Ptr { - // We do not need to return a Ptr, we can directly return sf.value. - return sf.value, nil - } - - // We need to return an interface{} that is a pointer to sf.value. - value := reflect.New(t).Elem() - value.Set(reflect.New(value.Type().Elem())) - if sf.kind == reflect.Int32 { - // We may have an int32 or an enum, but the underlying data is int32. - // Since we can't set an int32 into a non int32 reflect.value directly - // set it as a int32. - value.Elem().SetInt(int64(sf.value.(int32))) - } else { - value.Elem().Set(reflect.ValueOf(sf.value)) - } - return value.Interface(), nil -} - -// decodeExtension decodes an extension encoded in b. -func decodeExtension(b []byte, extension *ExtensionDesc) (interface{}, error) { - t := reflect.TypeOf(extension.ExtensionType) - unmarshal := typeUnmarshaler(t, extension.Tag) - - // t is a pointer to a struct, pointer to basic type or a slice. - // Allocate space to store the pointer/slice. - value := reflect.New(t).Elem() - - var err error - for { - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - wire := int(x) & 7 - - b, err = unmarshal(b, valToPointer(value.Addr()), wire) - if err != nil { - return nil, err - } - - if len(b) == 0 { - break - } - } - return value.Interface(), nil -} - -// GetExtensions returns a slice of the extensions present in pb that are also listed in es. -// The returned slice has the same length as es; missing extensions will appear as nil elements. -func GetExtensions(pb Message, es []*ExtensionDesc) (extensions []interface{}, err error) { - epb, err := extendable(pb) - if err != nil { - return nil, err - } - extensions = make([]interface{}, len(es)) - for i, e := range es { - extensions[i], err = GetExtension(epb, e) - if err == ErrMissingExtension { - err = nil - } - if err != nil { - return - } - } - return -} - -// ExtensionDescs returns a new slice containing pb's extension descriptors, in undefined order. -// For non-registered extensions, ExtensionDescs returns an incomplete descriptor containing -// just the Field field, which defines the extension's field number. -func ExtensionDescs(pb Message) ([]*ExtensionDesc, error) { - epb, err := extendable(pb) - if err != nil { - return nil, err - } - registeredExtensions := RegisteredExtensions(pb) - - emap, mu := epb.extensionsRead() - if emap == nil { - return nil, nil - } - mu.Lock() - defer mu.Unlock() - extensions := make([]*ExtensionDesc, 0, len(emap)) - for extid, e := range emap { - desc := e.desc - if desc == nil { - desc = registeredExtensions[extid] - if desc == nil { - desc = &ExtensionDesc{Field: extid} - } - } - - extensions = append(extensions, desc) - } - return extensions, nil -} - -// SetExtension sets the specified extension of pb to the specified value. -func SetExtension(pb Message, extension *ExtensionDesc, value interface{}) error { - epb, err := extendable(pb) - if err != nil { - return err - } - if err := checkExtensionTypes(epb, extension); err != nil { - return err - } - typ := reflect.TypeOf(extension.ExtensionType) - if typ != reflect.TypeOf(value) { - return errors.New("proto: bad extension value type") - } - // nil extension values need to be caught early, because the - // encoder can't distinguish an ErrNil due to a nil extension - // from an ErrNil due to a missing field. Extensions are - // always optional, so the encoder would just swallow the error - // and drop all the extensions from the encoded message. - if reflect.ValueOf(value).IsNil() { - return fmt.Errorf("proto: SetExtension called with nil value of type %T", value) - } - - extmap := epb.extensionsWrite() - extmap[extension.Field] = Extension{desc: extension, value: value} - return nil -} - -// ClearAllExtensions clears all extensions from pb. -func ClearAllExtensions(pb Message) { - epb, err := extendable(pb) - if err != nil { - return - } - m := epb.extensionsWrite() - for k := range m { - delete(m, k) - } -} - -// A global registry of extensions. -// The generated code will register the generated descriptors by calling RegisterExtension. - -var extensionMaps = make(map[reflect.Type]map[int32]*ExtensionDesc) - -// RegisterExtension is called from the generated code. -func RegisterExtension(desc *ExtensionDesc) { - st := reflect.TypeOf(desc.ExtendedType).Elem() - m := extensionMaps[st] - if m == nil { - m = make(map[int32]*ExtensionDesc) - extensionMaps[st] = m - } - if _, ok := m[desc.Field]; ok { - panic("proto: duplicate extension registered: " + st.String() + " " + strconv.Itoa(int(desc.Field))) - } - m[desc.Field] = desc -} - -// RegisteredExtensions returns a map of the registered extensions of a -// protocol buffer struct, indexed by the extension number. -// The argument pb should be a nil pointer to the struct type. -func RegisteredExtensions(pb Message) map[int32]*ExtensionDesc { - return extensionMaps[reflect.TypeOf(pb).Elem()] -} diff --git a/vendor/github.com/golang/protobuf/proto/lib.go b/vendor/github.com/golang/protobuf/proto/lib.go deleted file mode 100644 index 0e2191b..0000000 --- a/vendor/github.com/golang/protobuf/proto/lib.go +++ /dev/null @@ -1,921 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/* -Package proto converts data structures to and from the wire format of -protocol buffers. It works in concert with the Go source code generated -for .proto files by the protocol compiler. - -A summary of the properties of the protocol buffer interface -for a protocol buffer variable v: - - - Names are turned from camel_case to CamelCase for export. - - There are no methods on v to set fields; just treat - them as structure fields. - - There are getters that return a field's value if set, - and return the field's default value if unset. - The getters work even if the receiver is a nil message. - - The zero value for a struct is its correct initialization state. - All desired fields must be set before marshaling. - - A Reset() method will restore a protobuf struct to its zero state. - - Non-repeated fields are pointers to the values; nil means unset. - That is, optional or required field int32 f becomes F *int32. - - Repeated fields are slices. - - Helper functions are available to aid the setting of fields. - msg.Foo = proto.String("hello") // set field - - Constants are defined to hold the default values of all fields that - have them. They have the form Default_StructName_FieldName. - Because the getter methods handle defaulted values, - direct use of these constants should be rare. - - Enums are given type names and maps from names to values. - Enum values are prefixed by the enclosing message's name, or by the - enum's type name if it is a top-level enum. Enum types have a String - method, and a Enum method to assist in message construction. - - Nested messages, groups and enums have type names prefixed with the name of - the surrounding message type. - - Extensions are given descriptor names that start with E_, - followed by an underscore-delimited list of the nested messages - that contain it (if any) followed by the CamelCased name of the - extension field itself. HasExtension, ClearExtension, GetExtension - and SetExtension are functions for manipulating extensions. - - Oneof field sets are given a single field in their message, - with distinguished wrapper types for each possible field value. - - Marshal and Unmarshal are functions to encode and decode the wire format. - -When the .proto file specifies `syntax="proto3"`, there are some differences: - - - Non-repeated fields of non-message type are values instead of pointers. - - Enum types do not get an Enum method. - -The simplest way to describe this is to see an example. -Given file test.proto, containing - - package example; - - enum FOO { X = 17; } - - message Test { - required string label = 1; - optional int32 type = 2 [default=77]; - repeated int64 reps = 3; - optional group OptionalGroup = 4 { - required string RequiredField = 5; - } - oneof union { - int32 number = 6; - string name = 7; - } - } - -The resulting file, test.pb.go, is: - - package example - - import proto "github.com/golang/protobuf/proto" - import math "math" - - type FOO int32 - const ( - FOO_X FOO = 17 - ) - var FOO_name = map[int32]string{ - 17: "X", - } - var FOO_value = map[string]int32{ - "X": 17, - } - - func (x FOO) Enum() *FOO { - p := new(FOO) - *p = x - return p - } - func (x FOO) String() string { - return proto.EnumName(FOO_name, int32(x)) - } - func (x *FOO) UnmarshalJSON(data []byte) error { - value, err := proto.UnmarshalJSONEnum(FOO_value, data) - if err != nil { - return err - } - *x = FOO(value) - return nil - } - - type Test struct { - Label *string `protobuf:"bytes,1,req,name=label" json:"label,omitempty"` - Type *int32 `protobuf:"varint,2,opt,name=type,def=77" json:"type,omitempty"` - Reps []int64 `protobuf:"varint,3,rep,name=reps" json:"reps,omitempty"` - Optionalgroup *Test_OptionalGroup `protobuf:"group,4,opt,name=OptionalGroup" json:"optionalgroup,omitempty"` - // Types that are valid to be assigned to Union: - // *Test_Number - // *Test_Name - Union isTest_Union `protobuf_oneof:"union"` - XXX_unrecognized []byte `json:"-"` - } - func (m *Test) Reset() { *m = Test{} } - func (m *Test) String() string { return proto.CompactTextString(m) } - func (*Test) ProtoMessage() {} - - type isTest_Union interface { - isTest_Union() - } - - type Test_Number struct { - Number int32 `protobuf:"varint,6,opt,name=number"` - } - type Test_Name struct { - Name string `protobuf:"bytes,7,opt,name=name"` - } - - func (*Test_Number) isTest_Union() {} - func (*Test_Name) isTest_Union() {} - - func (m *Test) GetUnion() isTest_Union { - if m != nil { - return m.Union - } - return nil - } - const Default_Test_Type int32 = 77 - - func (m *Test) GetLabel() string { - if m != nil && m.Label != nil { - return *m.Label - } - return "" - } - - func (m *Test) GetType() int32 { - if m != nil && m.Type != nil { - return *m.Type - } - return Default_Test_Type - } - - func (m *Test) GetOptionalgroup() *Test_OptionalGroup { - if m != nil { - return m.Optionalgroup - } - return nil - } - - type Test_OptionalGroup struct { - RequiredField *string `protobuf:"bytes,5,req" json:"RequiredField,omitempty"` - } - func (m *Test_OptionalGroup) Reset() { *m = Test_OptionalGroup{} } - func (m *Test_OptionalGroup) String() string { return proto.CompactTextString(m) } - - func (m *Test_OptionalGroup) GetRequiredField() string { - if m != nil && m.RequiredField != nil { - return *m.RequiredField - } - return "" - } - - func (m *Test) GetNumber() int32 { - if x, ok := m.GetUnion().(*Test_Number); ok { - return x.Number - } - return 0 - } - - func (m *Test) GetName() string { - if x, ok := m.GetUnion().(*Test_Name); ok { - return x.Name - } - return "" - } - - func init() { - proto.RegisterEnum("example.FOO", FOO_name, FOO_value) - } - -To create and play with a Test object: - - package main - - import ( - "log" - - "github.com/golang/protobuf/proto" - pb "./example.pb" - ) - - func main() { - test := &pb.Test{ - Label: proto.String("hello"), - Type: proto.Int32(17), - Reps: []int64{1, 2, 3}, - Optionalgroup: &pb.Test_OptionalGroup{ - RequiredField: proto.String("good bye"), - }, - Union: &pb.Test_Name{"fred"}, - } - data, err := proto.Marshal(test) - if err != nil { - log.Fatal("marshaling error: ", err) - } - newTest := &pb.Test{} - err = proto.Unmarshal(data, newTest) - if err != nil { - log.Fatal("unmarshaling error: ", err) - } - // Now test and newTest contain the same data. - if test.GetLabel() != newTest.GetLabel() { - log.Fatalf("data mismatch %q != %q", test.GetLabel(), newTest.GetLabel()) - } - // Use a type switch to determine which oneof was set. - switch u := test.Union.(type) { - case *pb.Test_Number: // u.Number contains the number. - case *pb.Test_Name: // u.Name contains the string. - } - // etc. - } -*/ -package proto - -import ( - "encoding/json" - "errors" - "fmt" - "log" - "reflect" - "sort" - "strconv" - "sync" -) - -var errInvalidUTF8 = errors.New("proto: invalid UTF-8 string") - -// Message is implemented by generated protocol buffer messages. -type Message interface { - Reset() - String() string - ProtoMessage() -} - -// Stats records allocation details about the protocol buffer encoders -// and decoders. Useful for tuning the library itself. -type Stats struct { - Emalloc uint64 // mallocs in encode - Dmalloc uint64 // mallocs in decode - Encode uint64 // number of encodes - Decode uint64 // number of decodes - Chit uint64 // number of cache hits - Cmiss uint64 // number of cache misses - Size uint64 // number of sizes -} - -// Set to true to enable stats collection. -const collectStats = false - -var stats Stats - -// GetStats returns a copy of the global Stats structure. -func GetStats() Stats { return stats } - -// A Buffer is a buffer manager for marshaling and unmarshaling -// protocol buffers. It may be reused between invocations to -// reduce memory usage. It is not necessary to use a Buffer; -// the global functions Marshal and Unmarshal create a -// temporary Buffer and are fine for most applications. -type Buffer struct { - buf []byte // encode/decode byte stream - index int // read point - - deterministic bool -} - -// NewBuffer allocates a new Buffer and initializes its internal data to -// the contents of the argument slice. -func NewBuffer(e []byte) *Buffer { - return &Buffer{buf: e} -} - -// Reset resets the Buffer, ready for marshaling a new protocol buffer. -func (p *Buffer) Reset() { - p.buf = p.buf[0:0] // for reading/writing - p.index = 0 // for reading -} - -// SetBuf replaces the internal buffer with the slice, -// ready for unmarshaling the contents of the slice. -func (p *Buffer) SetBuf(s []byte) { - p.buf = s - p.index = 0 -} - -// Bytes returns the contents of the Buffer. -func (p *Buffer) Bytes() []byte { return p.buf } - -// SetDeterministic sets whether to use deterministic serialization. -// -// Deterministic serialization guarantees that for a given binary, equal -// messages will always be serialized to the same bytes. This implies: -// -// - Repeated serialization of a message will return the same bytes. -// - Different processes of the same binary (which may be executing on -// different machines) will serialize equal messages to the same bytes. -// -// Note that the deterministic serialization is NOT canonical across -// languages. It is not guaranteed to remain stable over time. It is unstable -// across different builds with schema changes due to unknown fields. -// Users who need canonical serialization (e.g., persistent storage in a -// canonical form, fingerprinting, etc.) should define their own -// canonicalization specification and implement their own serializer rather -// than relying on this API. -// -// If deterministic serialization is requested, map entries will be sorted -// by keys in lexographical order. This is an implementation detail and -// subject to change. -func (p *Buffer) SetDeterministic(deterministic bool) { - p.deterministic = deterministic -} - -/* - * Helper routines for simplifying the creation of optional fields of basic type. - */ - -// Bool is a helper routine that allocates a new bool value -// to store v and returns a pointer to it. -func Bool(v bool) *bool { - return &v -} - -// Int32 is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it. -func Int32(v int32) *int32 { - return &v -} - -// Int is a helper routine that allocates a new int32 value -// to store v and returns a pointer to it, but unlike Int32 -// its argument value is an int. -func Int(v int) *int32 { - p := new(int32) - *p = int32(v) - return p -} - -// Int64 is a helper routine that allocates a new int64 value -// to store v and returns a pointer to it. -func Int64(v int64) *int64 { - return &v -} - -// Float32 is a helper routine that allocates a new float32 value -// to store v and returns a pointer to it. -func Float32(v float32) *float32 { - return &v -} - -// Float64 is a helper routine that allocates a new float64 value -// to store v and returns a pointer to it. -func Float64(v float64) *float64 { - return &v -} - -// Uint32 is a helper routine that allocates a new uint32 value -// to store v and returns a pointer to it. -func Uint32(v uint32) *uint32 { - return &v -} - -// Uint64 is a helper routine that allocates a new uint64 value -// to store v and returns a pointer to it. -func Uint64(v uint64) *uint64 { - return &v -} - -// String is a helper routine that allocates a new string value -// to store v and returns a pointer to it. -func String(v string) *string { - return &v -} - -// EnumName is a helper function to simplify printing protocol buffer enums -// by name. Given an enum map and a value, it returns a useful string. -func EnumName(m map[int32]string, v int32) string { - s, ok := m[v] - if ok { - return s - } - return strconv.Itoa(int(v)) -} - -// UnmarshalJSONEnum is a helper function to simplify recovering enum int values -// from their JSON-encoded representation. Given a map from the enum's symbolic -// names to its int values, and a byte buffer containing the JSON-encoded -// value, it returns an int32 that can be cast to the enum type by the caller. -// -// The function can deal with both JSON representations, numeric and symbolic. -func UnmarshalJSONEnum(m map[string]int32, data []byte, enumName string) (int32, error) { - if data[0] == '"' { - // New style: enums are strings. - var repr string - if err := json.Unmarshal(data, &repr); err != nil { - return -1, err - } - val, ok := m[repr] - if !ok { - return 0, fmt.Errorf("unrecognized enum %s value %q", enumName, repr) - } - return val, nil - } - // Old style: enums are ints. - var val int32 - if err := json.Unmarshal(data, &val); err != nil { - return 0, fmt.Errorf("cannot unmarshal %#q into enum %s", data, enumName) - } - return val, nil -} - -// DebugPrint dumps the encoded data in b in a debugging format with a header -// including the string s. Used in testing but made available for general debugging. -func (p *Buffer) DebugPrint(s string, b []byte) { - var u uint64 - - obuf := p.buf - index := p.index - p.buf = b - p.index = 0 - depth := 0 - - fmt.Printf("\n--- %s ---\n", s) - -out: - for { - for i := 0; i < depth; i++ { - fmt.Print(" ") - } - - index := p.index - if index == len(p.buf) { - break - } - - op, err := p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: fetching op err %v\n", index, err) - break out - } - tag := op >> 3 - wire := op & 7 - - switch wire { - default: - fmt.Printf("%3d: t=%3d unknown wire=%d\n", - index, tag, wire) - break out - - case WireBytes: - var r []byte - - r, err = p.DecodeRawBytes(false) - if err != nil { - break out - } - fmt.Printf("%3d: t=%3d bytes [%d]", index, tag, len(r)) - if len(r) <= 6 { - for i := 0; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } else { - for i := 0; i < 3; i++ { - fmt.Printf(" %.2x", r[i]) - } - fmt.Printf(" ..") - for i := len(r) - 3; i < len(r); i++ { - fmt.Printf(" %.2x", r[i]) - } - } - fmt.Printf("\n") - - case WireFixed32: - u, err = p.DecodeFixed32() - if err != nil { - fmt.Printf("%3d: t=%3d fix32 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix32 %d\n", index, tag, u) - - case WireFixed64: - u, err = p.DecodeFixed64() - if err != nil { - fmt.Printf("%3d: t=%3d fix64 err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d fix64 %d\n", index, tag, u) - - case WireVarint: - u, err = p.DecodeVarint() - if err != nil { - fmt.Printf("%3d: t=%3d varint err %v\n", index, tag, err) - break out - } - fmt.Printf("%3d: t=%3d varint %d\n", index, tag, u) - - case WireStartGroup: - fmt.Printf("%3d: t=%3d start\n", index, tag) - depth++ - - case WireEndGroup: - depth-- - fmt.Printf("%3d: t=%3d end\n", index, tag) - } - } - - if depth != 0 { - fmt.Printf("%3d: start-end not balanced %d\n", p.index, depth) - } - fmt.Printf("\n") - - p.buf = obuf - p.index = index -} - -// SetDefaults sets unset protocol buffer fields to their default values. -// It only modifies fields that are both unset and have defined defaults. -// It recursively sets default values in any non-nil sub-messages. -func SetDefaults(pb Message) { - setDefaults(reflect.ValueOf(pb), true, false) -} - -// v is a pointer to a struct. -func setDefaults(v reflect.Value, recur, zeros bool) { - v = v.Elem() - - defaultMu.RLock() - dm, ok := defaults[v.Type()] - defaultMu.RUnlock() - if !ok { - dm = buildDefaultMessage(v.Type()) - defaultMu.Lock() - defaults[v.Type()] = dm - defaultMu.Unlock() - } - - for _, sf := range dm.scalars { - f := v.Field(sf.index) - if !f.IsNil() { - // field already set - continue - } - dv := sf.value - if dv == nil && !zeros { - // no explicit default, and don't want to set zeros - continue - } - fptr := f.Addr().Interface() // **T - // TODO: Consider batching the allocations we do here. - switch sf.kind { - case reflect.Bool: - b := new(bool) - if dv != nil { - *b = dv.(bool) - } - *(fptr.(**bool)) = b - case reflect.Float32: - f := new(float32) - if dv != nil { - *f = dv.(float32) - } - *(fptr.(**float32)) = f - case reflect.Float64: - f := new(float64) - if dv != nil { - *f = dv.(float64) - } - *(fptr.(**float64)) = f - case reflect.Int32: - // might be an enum - if ft := f.Type(); ft != int32PtrType { - // enum - f.Set(reflect.New(ft.Elem())) - if dv != nil { - f.Elem().SetInt(int64(dv.(int32))) - } - } else { - // int32 field - i := new(int32) - if dv != nil { - *i = dv.(int32) - } - *(fptr.(**int32)) = i - } - case reflect.Int64: - i := new(int64) - if dv != nil { - *i = dv.(int64) - } - *(fptr.(**int64)) = i - case reflect.String: - s := new(string) - if dv != nil { - *s = dv.(string) - } - *(fptr.(**string)) = s - case reflect.Uint8: - // exceptional case: []byte - var b []byte - if dv != nil { - db := dv.([]byte) - b = make([]byte, len(db)) - copy(b, db) - } else { - b = []byte{} - } - *(fptr.(*[]byte)) = b - case reflect.Uint32: - u := new(uint32) - if dv != nil { - *u = dv.(uint32) - } - *(fptr.(**uint32)) = u - case reflect.Uint64: - u := new(uint64) - if dv != nil { - *u = dv.(uint64) - } - *(fptr.(**uint64)) = u - default: - log.Printf("proto: can't set default for field %v (sf.kind=%v)", f, sf.kind) - } - } - - for _, ni := range dm.nested { - f := v.Field(ni) - // f is *T or []*T or map[T]*T - switch f.Kind() { - case reflect.Ptr: - if f.IsNil() { - continue - } - setDefaults(f, recur, zeros) - - case reflect.Slice: - for i := 0; i < f.Len(); i++ { - e := f.Index(i) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - - case reflect.Map: - for _, k := range f.MapKeys() { - e := f.MapIndex(k) - if e.IsNil() { - continue - } - setDefaults(e, recur, zeros) - } - } - } -} - -var ( - // defaults maps a protocol buffer struct type to a slice of the fields, - // with its scalar fields set to their proto-declared non-zero default values. - defaultMu sync.RWMutex - defaults = make(map[reflect.Type]defaultMessage) - - int32PtrType = reflect.TypeOf((*int32)(nil)) -) - -// defaultMessage represents information about the default values of a message. -type defaultMessage struct { - scalars []scalarField - nested []int // struct field index of nested messages -} - -type scalarField struct { - index int // struct field index - kind reflect.Kind // element type (the T in *T or []T) - value interface{} // the proto-declared default value, or nil -} - -// t is a struct type. -func buildDefaultMessage(t reflect.Type) (dm defaultMessage) { - sprop := GetProperties(t) - for _, prop := range sprop.Prop { - fi, ok := sprop.decoderTags.get(prop.Tag) - if !ok { - // XXX_unrecognized - continue - } - ft := t.Field(fi).Type - - sf, nested, err := fieldDefault(ft, prop) - switch { - case err != nil: - log.Print(err) - case nested: - dm.nested = append(dm.nested, fi) - case sf != nil: - sf.index = fi - dm.scalars = append(dm.scalars, *sf) - } - } - - return dm -} - -// fieldDefault returns the scalarField for field type ft. -// sf will be nil if the field can not have a default. -// nestedMessage will be true if this is a nested message. -// Note that sf.index is not set on return. -func fieldDefault(ft reflect.Type, prop *Properties) (sf *scalarField, nestedMessage bool, err error) { - var canHaveDefault bool - switch ft.Kind() { - case reflect.Ptr: - if ft.Elem().Kind() == reflect.Struct { - nestedMessage = true - } else { - canHaveDefault = true // proto2 scalar field - } - - case reflect.Slice: - switch ft.Elem().Kind() { - case reflect.Ptr: - nestedMessage = true // repeated message - case reflect.Uint8: - canHaveDefault = true // bytes field - } - - case reflect.Map: - if ft.Elem().Kind() == reflect.Ptr { - nestedMessage = true // map with message values - } - } - - if !canHaveDefault { - if nestedMessage { - return nil, true, nil - } - return nil, false, nil - } - - // We now know that ft is a pointer or slice. - sf = &scalarField{kind: ft.Elem().Kind()} - - // scalar fields without defaults - if !prop.HasDefault { - return sf, false, nil - } - - // a scalar field: either *T or []byte - switch ft.Elem().Kind() { - case reflect.Bool: - x, err := strconv.ParseBool(prop.Default) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default bool %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Float32: - x, err := strconv.ParseFloat(prop.Default, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float32 %q: %v", prop.Default, err) - } - sf.value = float32(x) - case reflect.Float64: - x, err := strconv.ParseFloat(prop.Default, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default float64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.Int32: - x, err := strconv.ParseInt(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int32 %q: %v", prop.Default, err) - } - sf.value = int32(x) - case reflect.Int64: - x, err := strconv.ParseInt(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default int64 %q: %v", prop.Default, err) - } - sf.value = x - case reflect.String: - sf.value = prop.Default - case reflect.Uint8: - // []byte (not *uint8) - sf.value = []byte(prop.Default) - case reflect.Uint32: - x, err := strconv.ParseUint(prop.Default, 10, 32) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint32 %q: %v", prop.Default, err) - } - sf.value = uint32(x) - case reflect.Uint64: - x, err := strconv.ParseUint(prop.Default, 10, 64) - if err != nil { - return nil, false, fmt.Errorf("proto: bad default uint64 %q: %v", prop.Default, err) - } - sf.value = x - default: - return nil, false, fmt.Errorf("proto: unhandled def kind %v", ft.Elem().Kind()) - } - - return sf, false, nil -} - -// mapKeys returns a sort.Interface to be used for sorting the map keys. -// Map fields may have key types of non-float scalars, strings and enums. -func mapKeys(vs []reflect.Value) sort.Interface { - s := mapKeySorter{vs: vs} - - // Type specialization per https://developers.google.com/protocol-buffers/docs/proto#maps. - if len(vs) == 0 { - return s - } - switch vs[0].Kind() { - case reflect.Int32, reflect.Int64: - s.less = func(a, b reflect.Value) bool { return a.Int() < b.Int() } - case reflect.Uint32, reflect.Uint64: - s.less = func(a, b reflect.Value) bool { return a.Uint() < b.Uint() } - case reflect.Bool: - s.less = func(a, b reflect.Value) bool { return !a.Bool() && b.Bool() } // false < true - case reflect.String: - s.less = func(a, b reflect.Value) bool { return a.String() < b.String() } - default: - panic(fmt.Sprintf("unsupported map key type: %v", vs[0].Kind())) - } - - return s -} - -type mapKeySorter struct { - vs []reflect.Value - less func(a, b reflect.Value) bool -} - -func (s mapKeySorter) Len() int { return len(s.vs) } -func (s mapKeySorter) Swap(i, j int) { s.vs[i], s.vs[j] = s.vs[j], s.vs[i] } -func (s mapKeySorter) Less(i, j int) bool { - return s.less(s.vs[i], s.vs[j]) -} - -// isProto3Zero reports whether v is a zero proto3 value. -func isProto3Zero(v reflect.Value) bool { - switch v.Kind() { - case reflect.Bool: - return !v.Bool() - case reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint32, reflect.Uint64: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.String: - return v.String() == "" - } - return false -} - -// ProtoPackageIsVersion2 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const ProtoPackageIsVersion2 = true - -// ProtoPackageIsVersion1 is referenced from generated protocol buffer files -// to assert that that code is compatible with this version of the proto package. -const ProtoPackageIsVersion1 = true - -// InternalMessageInfo is a type used internally by generated .pb.go files. -// This type is not intended to be used by non-generated code. -// This type is not subject to any compatibility guarantee. -type InternalMessageInfo struct { - marshal *marshalInfo - unmarshal *unmarshalInfo - merge *mergeInfo - discard *discardInfo -} diff --git a/vendor/github.com/golang/protobuf/proto/message_set.go b/vendor/github.com/golang/protobuf/proto/message_set.go deleted file mode 100644 index 3b6ca41..0000000 --- a/vendor/github.com/golang/protobuf/proto/message_set.go +++ /dev/null @@ -1,314 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Support for message sets. - */ - -import ( - "bytes" - "encoding/json" - "errors" - "fmt" - "reflect" - "sort" - "sync" -) - -// errNoMessageTypeID occurs when a protocol buffer does not have a message type ID. -// A message type ID is required for storing a protocol buffer in a message set. -var errNoMessageTypeID = errors.New("proto does not have a message type ID") - -// The first two types (_MessageSet_Item and messageSet) -// model what the protocol compiler produces for the following protocol message: -// message MessageSet { -// repeated group Item = 1 { -// required int32 type_id = 2; -// required string message = 3; -// }; -// } -// That is the MessageSet wire format. We can't use a proto to generate these -// because that would introduce a circular dependency between it and this package. - -type _MessageSet_Item struct { - TypeId *int32 `protobuf:"varint,2,req,name=type_id"` - Message []byte `protobuf:"bytes,3,req,name=message"` -} - -type messageSet struct { - Item []*_MessageSet_Item `protobuf:"group,1,rep"` - XXX_unrecognized []byte - // TODO: caching? -} - -// Make sure messageSet is a Message. -var _ Message = (*messageSet)(nil) - -// messageTypeIder is an interface satisfied by a protocol buffer type -// that may be stored in a MessageSet. -type messageTypeIder interface { - MessageTypeId() int32 -} - -func (ms *messageSet) find(pb Message) *_MessageSet_Item { - mti, ok := pb.(messageTypeIder) - if !ok { - return nil - } - id := mti.MessageTypeId() - for _, item := range ms.Item { - if *item.TypeId == id { - return item - } - } - return nil -} - -func (ms *messageSet) Has(pb Message) bool { - return ms.find(pb) != nil -} - -func (ms *messageSet) Unmarshal(pb Message) error { - if item := ms.find(pb); item != nil { - return Unmarshal(item.Message, pb) - } - if _, ok := pb.(messageTypeIder); !ok { - return errNoMessageTypeID - } - return nil // TODO: return error instead? -} - -func (ms *messageSet) Marshal(pb Message) error { - msg, err := Marshal(pb) - if err != nil { - return err - } - if item := ms.find(pb); item != nil { - // reuse existing item - item.Message = msg - return nil - } - - mti, ok := pb.(messageTypeIder) - if !ok { - return errNoMessageTypeID - } - - mtid := mti.MessageTypeId() - ms.Item = append(ms.Item, &_MessageSet_Item{ - TypeId: &mtid, - Message: msg, - }) - return nil -} - -func (ms *messageSet) Reset() { *ms = messageSet{} } -func (ms *messageSet) String() string { return CompactTextString(ms) } -func (*messageSet) ProtoMessage() {} - -// Support for the message_set_wire_format message option. - -func skipVarint(buf []byte) []byte { - i := 0 - for ; buf[i]&0x80 != 0; i++ { - } - return buf[i+1:] -} - -// MarshalMessageSet encodes the extension map represented by m in the message set wire format. -// It is called by generated Marshal methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSet(exts interface{}) ([]byte, error) { - return marshalMessageSet(exts, false) -} - -// marshaMessageSet implements above function, with the opt to turn on / off deterministic during Marshal. -func marshalMessageSet(exts interface{}, deterministic bool) ([]byte, error) { - switch exts := exts.(type) { - case *XXX_InternalExtensions: - var u marshalInfo - siz := u.sizeMessageSet(exts) - b := make([]byte, 0, siz) - return u.appendMessageSet(b, exts, deterministic) - - case map[int32]Extension: - // This is an old-style extension map. - // Wrap it in a new-style XXX_InternalExtensions. - ie := XXX_InternalExtensions{ - p: &struct { - mu sync.Mutex - extensionMap map[int32]Extension - }{ - extensionMap: exts, - }, - } - - var u marshalInfo - siz := u.sizeMessageSet(&ie) - b := make([]byte, 0, siz) - return u.appendMessageSet(b, &ie, deterministic) - - default: - return nil, errors.New("proto: not an extension map") - } -} - -// UnmarshalMessageSet decodes the extension map encoded in buf in the message set wire format. -// It is called by Unmarshal methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSet(buf []byte, exts interface{}) error { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - m = exts.extensionsWrite() - case map[int32]Extension: - m = exts - default: - return errors.New("proto: not an extension map") - } - - ms := new(messageSet) - if err := Unmarshal(buf, ms); err != nil { - return err - } - for _, item := range ms.Item { - id := *item.TypeId - msg := item.Message - - // Restore wire type and field number varint, plus length varint. - // Be careful to preserve duplicate items. - b := EncodeVarint(uint64(id)<<3 | WireBytes) - if ext, ok := m[id]; ok { - // Existing data; rip off the tag and length varint - // so we join the new data correctly. - // We can assume that ext.enc is set because we are unmarshaling. - o := ext.enc[len(b):] // skip wire type and field number - _, n := DecodeVarint(o) // calculate length of length varint - o = o[n:] // skip length varint - msg = append(o, msg...) // join old data and new data - } - b = append(b, EncodeVarint(uint64(len(msg)))...) - b = append(b, msg...) - - m[id] = Extension{enc: b} - } - return nil -} - -// MarshalMessageSetJSON encodes the extension map represented by m in JSON format. -// It is called by generated MarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func MarshalMessageSetJSON(exts interface{}) ([]byte, error) { - var m map[int32]Extension - switch exts := exts.(type) { - case *XXX_InternalExtensions: - var mu sync.Locker - m, mu = exts.extensionsRead() - if m != nil { - // Keep the extensions map locked until we're done marshaling to prevent - // races between marshaling and unmarshaling the lazily-{en,de}coded - // values. - mu.Lock() - defer mu.Unlock() - } - case map[int32]Extension: - m = exts - default: - return nil, errors.New("proto: not an extension map") - } - var b bytes.Buffer - b.WriteByte('{') - - // Process the map in key order for deterministic output. - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) // int32Slice defined in text.go - - for i, id := range ids { - ext := m[id] - msd, ok := messageSetMap[id] - if !ok { - // Unknown type; we can't render it, so skip it. - continue - } - - if i > 0 && b.Len() > 1 { - b.WriteByte(',') - } - - fmt.Fprintf(&b, `"[%s]":`, msd.name) - - x := ext.value - if x == nil { - x = reflect.New(msd.t.Elem()).Interface() - if err := Unmarshal(ext.enc, x.(Message)); err != nil { - return nil, err - } - } - d, err := json.Marshal(x) - if err != nil { - return nil, err - } - b.Write(d) - } - b.WriteByte('}') - return b.Bytes(), nil -} - -// UnmarshalMessageSetJSON decodes the extension map encoded in buf in JSON format. -// It is called by generated UnmarshalJSON methods on protocol buffer messages with the message_set_wire_format option. -func UnmarshalMessageSetJSON(buf []byte, exts interface{}) error { - // Common-case fast path. - if len(buf) == 0 || bytes.Equal(buf, []byte("{}")) { - return nil - } - - // This is fairly tricky, and it's not clear that it is needed. - return errors.New("TODO: UnmarshalMessageSetJSON not yet implemented") -} - -// A global registry of types that can be used in a MessageSet. - -var messageSetMap = make(map[int32]messageSetDesc) - -type messageSetDesc struct { - t reflect.Type // pointer to struct - name string -} - -// RegisterMessageSetType is called from the generated code. -func RegisterMessageSetType(m Message, fieldNum int32, name string) { - messageSetMap[fieldNum] = messageSetDesc{ - t: reflect.TypeOf(m), - name: name, - } -} diff --git a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go b/vendor/github.com/golang/protobuf/proto/pointer_reflect.go deleted file mode 100644 index b6cad90..0000000 --- a/vendor/github.com/golang/protobuf/proto/pointer_reflect.go +++ /dev/null @@ -1,357 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build purego appengine js - -// This file contains an implementation of proto field accesses using package reflect. -// It is slower than the code in pointer_unsafe.go but it avoids package unsafe and can -// be used on App Engine. - -package proto - -import ( - "reflect" - "sync" -) - -const unsafeAllowed = false - -// A field identifies a field in a struct, accessible from a pointer. -// In this implementation, a field is identified by the sequence of field indices -// passed to reflect's FieldByIndex. -type field []int - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return f.Index -} - -// invalidField is an invalid field identifier. -var invalidField = field(nil) - -// zeroField is a noop when calling pointer.offset. -var zeroField = field([]int{}) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { return f != nil } - -// The pointer type is for the table-driven decoder. -// The implementation here uses a reflect.Value of pointer type to -// create a generic pointer. In pointer_unsafe.go we use unsafe -// instead of reflect to implement the same (but faster) interface. -type pointer struct { - v reflect.Value -} - -// toPointer converts an interface of pointer type to a pointer -// that points to the same target. -func toPointer(i *Message) pointer { - return pointer{v: reflect.ValueOf(*i)} -} - -// toAddrPointer converts an interface to a pointer that points to -// the interface data. -func toAddrPointer(i *interface{}, isptr bool) pointer { - v := reflect.ValueOf(*i) - u := reflect.New(v.Type()) - u.Elem().Set(v) - return pointer{v: u} -} - -// valToPointer converts v to a pointer. v must be of pointer type. -func valToPointer(v reflect.Value) pointer { - return pointer{v: v} -} - -// offset converts from a pointer to a structure to a pointer to -// one of its fields. -func (p pointer) offset(f field) pointer { - return pointer{v: p.v.Elem().FieldByIndex(f).Addr()} -} - -func (p pointer) isNil() bool { - return p.v.IsNil() -} - -// grow updates the slice s in place to make it one element longer. -// s must be addressable. -// Returns the (addressable) new element. -func grow(s reflect.Value) reflect.Value { - n, m := s.Len(), s.Cap() - if n < m { - s.SetLen(n + 1) - } else { - s.Set(reflect.Append(s, reflect.Zero(s.Type().Elem()))) - } - return s.Index(n) -} - -func (p pointer) toInt64() *int64 { - return p.v.Interface().(*int64) -} -func (p pointer) toInt64Ptr() **int64 { - return p.v.Interface().(**int64) -} -func (p pointer) toInt64Slice() *[]int64 { - return p.v.Interface().(*[]int64) -} - -var int32ptr = reflect.TypeOf((*int32)(nil)) - -func (p pointer) toInt32() *int32 { - return p.v.Convert(int32ptr).Interface().(*int32) -} - -// The toInt32Ptr/Slice methods don't work because of enums. -// Instead, we must use set/get methods for the int32ptr/slice case. -/* - func (p pointer) toInt32Ptr() **int32 { - return p.v.Interface().(**int32) -} - func (p pointer) toInt32Slice() *[]int32 { - return p.v.Interface().(*[]int32) -} -*/ -func (p pointer) getInt32Ptr() *int32 { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - return p.v.Elem().Interface().(*int32) - } - // an enum - return p.v.Elem().Convert(int32PtrType).Interface().(*int32) -} -func (p pointer) setInt32Ptr(v int32) { - // Allocate value in a *int32. Possibly convert that to a *enum. - // Then assign it to a **int32 or **enum. - // Note: we can convert *int32 to *enum, but we can't convert - // **int32 to **enum! - p.v.Elem().Set(reflect.ValueOf(&v).Convert(p.v.Type().Elem())) -} - -// getInt32Slice copies []int32 from p as a new slice. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) getInt32Slice() []int32 { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - return p.v.Elem().Interface().([]int32) - } - // an enum - // Allocate a []int32, then assign []enum's values into it. - // Note: we can't convert []enum to []int32. - slice := p.v.Elem() - s := make([]int32, slice.Len()) - for i := 0; i < slice.Len(); i++ { - s[i] = int32(slice.Index(i).Int()) - } - return s -} - -// setInt32Slice copies []int32 into p as a new slice. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) setInt32Slice(v []int32) { - if p.v.Type().Elem().Elem() == reflect.TypeOf(int32(0)) { - // raw int32 type - p.v.Elem().Set(reflect.ValueOf(v)) - return - } - // an enum - // Allocate a []enum, then assign []int32's values into it. - // Note: we can't convert []enum to []int32. - slice := reflect.MakeSlice(p.v.Type().Elem(), len(v), cap(v)) - for i, x := range v { - slice.Index(i).SetInt(int64(x)) - } - p.v.Elem().Set(slice) -} -func (p pointer) appendInt32Slice(v int32) { - grow(p.v.Elem()).SetInt(int64(v)) -} - -func (p pointer) toUint64() *uint64 { - return p.v.Interface().(*uint64) -} -func (p pointer) toUint64Ptr() **uint64 { - return p.v.Interface().(**uint64) -} -func (p pointer) toUint64Slice() *[]uint64 { - return p.v.Interface().(*[]uint64) -} -func (p pointer) toUint32() *uint32 { - return p.v.Interface().(*uint32) -} -func (p pointer) toUint32Ptr() **uint32 { - return p.v.Interface().(**uint32) -} -func (p pointer) toUint32Slice() *[]uint32 { - return p.v.Interface().(*[]uint32) -} -func (p pointer) toBool() *bool { - return p.v.Interface().(*bool) -} -func (p pointer) toBoolPtr() **bool { - return p.v.Interface().(**bool) -} -func (p pointer) toBoolSlice() *[]bool { - return p.v.Interface().(*[]bool) -} -func (p pointer) toFloat64() *float64 { - return p.v.Interface().(*float64) -} -func (p pointer) toFloat64Ptr() **float64 { - return p.v.Interface().(**float64) -} -func (p pointer) toFloat64Slice() *[]float64 { - return p.v.Interface().(*[]float64) -} -func (p pointer) toFloat32() *float32 { - return p.v.Interface().(*float32) -} -func (p pointer) toFloat32Ptr() **float32 { - return p.v.Interface().(**float32) -} -func (p pointer) toFloat32Slice() *[]float32 { - return p.v.Interface().(*[]float32) -} -func (p pointer) toString() *string { - return p.v.Interface().(*string) -} -func (p pointer) toStringPtr() **string { - return p.v.Interface().(**string) -} -func (p pointer) toStringSlice() *[]string { - return p.v.Interface().(*[]string) -} -func (p pointer) toBytes() *[]byte { - return p.v.Interface().(*[]byte) -} -func (p pointer) toBytesSlice() *[][]byte { - return p.v.Interface().(*[][]byte) -} -func (p pointer) toExtensions() *XXX_InternalExtensions { - return p.v.Interface().(*XXX_InternalExtensions) -} -func (p pointer) toOldExtensions() *map[int32]Extension { - return p.v.Interface().(*map[int32]Extension) -} -func (p pointer) getPointer() pointer { - return pointer{v: p.v.Elem()} -} -func (p pointer) setPointer(q pointer) { - p.v.Elem().Set(q.v) -} -func (p pointer) appendPointer(q pointer) { - grow(p.v.Elem()).Set(q.v) -} - -// getPointerSlice copies []*T from p as a new []pointer. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) getPointerSlice() []pointer { - if p.v.IsNil() { - return nil - } - n := p.v.Elem().Len() - s := make([]pointer, n) - for i := 0; i < n; i++ { - s[i] = pointer{v: p.v.Elem().Index(i)} - } - return s -} - -// setPointerSlice copies []pointer into p as a new []*T. -// This behavior differs from the implementation in pointer_unsafe.go. -func (p pointer) setPointerSlice(v []pointer) { - if v == nil { - p.v.Elem().Set(reflect.New(p.v.Elem().Type()).Elem()) - return - } - s := reflect.MakeSlice(p.v.Elem().Type(), 0, len(v)) - for _, p := range v { - s = reflect.Append(s, p.v) - } - p.v.Elem().Set(s) -} - -// getInterfacePointer returns a pointer that points to the -// interface data of the interface pointed by p. -func (p pointer) getInterfacePointer() pointer { - if p.v.Elem().IsNil() { - return pointer{v: p.v.Elem()} - } - return pointer{v: p.v.Elem().Elem().Elem().Field(0).Addr()} // *interface -> interface -> *struct -> struct -} - -func (p pointer) asPointerTo(t reflect.Type) reflect.Value { - // TODO: check that p.v.Type().Elem() == t? - return p.v -} - -func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} -func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} -func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} -func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { - atomicLock.Lock() - defer atomicLock.Unlock() - return *p -} -func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { - atomicLock.Lock() - defer atomicLock.Unlock() - *p = v -} - -var atomicLock sync.Mutex diff --git a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go b/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go deleted file mode 100644 index d55a335..0000000 --- a/vendor/github.com/golang/protobuf/proto/pointer_unsafe.go +++ /dev/null @@ -1,308 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2012 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -// +build !purego,!appengine,!js - -// This file contains the implementation of the proto field accesses using package unsafe. - -package proto - -import ( - "reflect" - "sync/atomic" - "unsafe" -) - -const unsafeAllowed = true - -// A field identifies a field in a struct, accessible from a pointer. -// In this implementation, a field is identified by its byte offset from the start of the struct. -type field uintptr - -// toField returns a field equivalent to the given reflect field. -func toField(f *reflect.StructField) field { - return field(f.Offset) -} - -// invalidField is an invalid field identifier. -const invalidField = ^field(0) - -// zeroField is a noop when calling pointer.offset. -const zeroField = field(0) - -// IsValid reports whether the field identifier is valid. -func (f field) IsValid() bool { - return f != invalidField -} - -// The pointer type below is for the new table-driven encoder/decoder. -// The implementation here uses unsafe.Pointer to create a generic pointer. -// In pointer_reflect.go we use reflect instead of unsafe to implement -// the same (but slower) interface. -type pointer struct { - p unsafe.Pointer -} - -// size of pointer -var ptrSize = unsafe.Sizeof(uintptr(0)) - -// toPointer converts an interface of pointer type to a pointer -// that points to the same target. -func toPointer(i *Message) pointer { - // Super-tricky - read pointer out of data word of interface value. - // Saves ~25ns over the equivalent: - // return valToPointer(reflect.ValueOf(*i)) - return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} -} - -// toAddrPointer converts an interface to a pointer that points to -// the interface data. -func toAddrPointer(i *interface{}, isptr bool) pointer { - // Super-tricky - read or get the address of data word of interface value. - if isptr { - // The interface is of pointer type, thus it is a direct interface. - // The data word is the pointer data itself. We take its address. - return pointer{p: unsafe.Pointer(uintptr(unsafe.Pointer(i)) + ptrSize)} - } - // The interface is not of pointer type. The data word is the pointer - // to the data. - return pointer{p: (*[2]unsafe.Pointer)(unsafe.Pointer(i))[1]} -} - -// valToPointer converts v to a pointer. v must be of pointer type. -func valToPointer(v reflect.Value) pointer { - return pointer{p: unsafe.Pointer(v.Pointer())} -} - -// offset converts from a pointer to a structure to a pointer to -// one of its fields. -func (p pointer) offset(f field) pointer { - // For safety, we should panic if !f.IsValid, however calling panic causes - // this to no longer be inlineable, which is a serious performance cost. - /* - if !f.IsValid() { - panic("invalid field") - } - */ - return pointer{p: unsafe.Pointer(uintptr(p.p) + uintptr(f))} -} - -func (p pointer) isNil() bool { - return p.p == nil -} - -func (p pointer) toInt64() *int64 { - return (*int64)(p.p) -} -func (p pointer) toInt64Ptr() **int64 { - return (**int64)(p.p) -} -func (p pointer) toInt64Slice() *[]int64 { - return (*[]int64)(p.p) -} -func (p pointer) toInt32() *int32 { - return (*int32)(p.p) -} - -// See pointer_reflect.go for why toInt32Ptr/Slice doesn't exist. -/* - func (p pointer) toInt32Ptr() **int32 { - return (**int32)(p.p) - } - func (p pointer) toInt32Slice() *[]int32 { - return (*[]int32)(p.p) - } -*/ -func (p pointer) getInt32Ptr() *int32 { - return *(**int32)(p.p) -} -func (p pointer) setInt32Ptr(v int32) { - *(**int32)(p.p) = &v -} - -// getInt32Slice loads a []int32 from p. -// The value returned is aliased with the original slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) getInt32Slice() []int32 { - return *(*[]int32)(p.p) -} - -// setInt32Slice stores a []int32 to p. -// The value set is aliased with the input slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) setInt32Slice(v []int32) { - *(*[]int32)(p.p) = v -} - -// TODO: Can we get rid of appendInt32Slice and use setInt32Slice instead? -func (p pointer) appendInt32Slice(v int32) { - s := (*[]int32)(p.p) - *s = append(*s, v) -} - -func (p pointer) toUint64() *uint64 { - return (*uint64)(p.p) -} -func (p pointer) toUint64Ptr() **uint64 { - return (**uint64)(p.p) -} -func (p pointer) toUint64Slice() *[]uint64 { - return (*[]uint64)(p.p) -} -func (p pointer) toUint32() *uint32 { - return (*uint32)(p.p) -} -func (p pointer) toUint32Ptr() **uint32 { - return (**uint32)(p.p) -} -func (p pointer) toUint32Slice() *[]uint32 { - return (*[]uint32)(p.p) -} -func (p pointer) toBool() *bool { - return (*bool)(p.p) -} -func (p pointer) toBoolPtr() **bool { - return (**bool)(p.p) -} -func (p pointer) toBoolSlice() *[]bool { - return (*[]bool)(p.p) -} -func (p pointer) toFloat64() *float64 { - return (*float64)(p.p) -} -func (p pointer) toFloat64Ptr() **float64 { - return (**float64)(p.p) -} -func (p pointer) toFloat64Slice() *[]float64 { - return (*[]float64)(p.p) -} -func (p pointer) toFloat32() *float32 { - return (*float32)(p.p) -} -func (p pointer) toFloat32Ptr() **float32 { - return (**float32)(p.p) -} -func (p pointer) toFloat32Slice() *[]float32 { - return (*[]float32)(p.p) -} -func (p pointer) toString() *string { - return (*string)(p.p) -} -func (p pointer) toStringPtr() **string { - return (**string)(p.p) -} -func (p pointer) toStringSlice() *[]string { - return (*[]string)(p.p) -} -func (p pointer) toBytes() *[]byte { - return (*[]byte)(p.p) -} -func (p pointer) toBytesSlice() *[][]byte { - return (*[][]byte)(p.p) -} -func (p pointer) toExtensions() *XXX_InternalExtensions { - return (*XXX_InternalExtensions)(p.p) -} -func (p pointer) toOldExtensions() *map[int32]Extension { - return (*map[int32]Extension)(p.p) -} - -// getPointerSlice loads []*T from p as a []pointer. -// The value returned is aliased with the original slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) getPointerSlice() []pointer { - // Super-tricky - p should point to a []*T where T is a - // message type. We load it as []pointer. - return *(*[]pointer)(p.p) -} - -// setPointerSlice stores []pointer into p as a []*T. -// The value set is aliased with the input slice. -// This behavior differs from the implementation in pointer_reflect.go. -func (p pointer) setPointerSlice(v []pointer) { - // Super-tricky - p should point to a []*T where T is a - // message type. We store it as []pointer. - *(*[]pointer)(p.p) = v -} - -// getPointer loads the pointer at p and returns it. -func (p pointer) getPointer() pointer { - return pointer{p: *(*unsafe.Pointer)(p.p)} -} - -// setPointer stores the pointer q at p. -func (p pointer) setPointer(q pointer) { - *(*unsafe.Pointer)(p.p) = q.p -} - -// append q to the slice pointed to by p. -func (p pointer) appendPointer(q pointer) { - s := (*[]unsafe.Pointer)(p.p) - *s = append(*s, q.p) -} - -// getInterfacePointer returns a pointer that points to the -// interface data of the interface pointed by p. -func (p pointer) getInterfacePointer() pointer { - // Super-tricky - read pointer out of data word of interface value. - return pointer{p: (*(*[2]unsafe.Pointer)(p.p))[1]} -} - -// asPointerTo returns a reflect.Value that is a pointer to an -// object of type t stored at p. -func (p pointer) asPointerTo(t reflect.Type) reflect.Value { - return reflect.NewAt(t, p.p) -} - -func atomicLoadUnmarshalInfo(p **unmarshalInfo) *unmarshalInfo { - return (*unmarshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreUnmarshalInfo(p **unmarshalInfo, v *unmarshalInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} -func atomicLoadMarshalInfo(p **marshalInfo) *marshalInfo { - return (*marshalInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreMarshalInfo(p **marshalInfo, v *marshalInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} -func atomicLoadMergeInfo(p **mergeInfo) *mergeInfo { - return (*mergeInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreMergeInfo(p **mergeInfo, v *mergeInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} -func atomicLoadDiscardInfo(p **discardInfo) *discardInfo { - return (*discardInfo)(atomic.LoadPointer((*unsafe.Pointer)(unsafe.Pointer(p)))) -} -func atomicStoreDiscardInfo(p **discardInfo, v *discardInfo) { - atomic.StorePointer((*unsafe.Pointer)(unsafe.Pointer(p)), unsafe.Pointer(v)) -} diff --git a/vendor/github.com/golang/protobuf/proto/properties.go b/vendor/github.com/golang/protobuf/proto/properties.go deleted file mode 100644 index f710ada..0000000 --- a/vendor/github.com/golang/protobuf/proto/properties.go +++ /dev/null @@ -1,544 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -/* - * Routines for encoding data into the wire format for protocol buffers. - */ - -import ( - "fmt" - "log" - "os" - "reflect" - "sort" - "strconv" - "strings" - "sync" -) - -const debug bool = false - -// Constants that identify the encoding of a value on the wire. -const ( - WireVarint = 0 - WireFixed64 = 1 - WireBytes = 2 - WireStartGroup = 3 - WireEndGroup = 4 - WireFixed32 = 5 -) - -// tagMap is an optimization over map[int]int for typical protocol buffer -// use-cases. Encoded protocol buffers are often in tag order with small tag -// numbers. -type tagMap struct { - fastTags []int - slowTags map[int]int -} - -// tagMapFastLimit is the upper bound on the tag number that will be stored in -// the tagMap slice rather than its map. -const tagMapFastLimit = 1024 - -func (p *tagMap) get(t int) (int, bool) { - if t > 0 && t < tagMapFastLimit { - if t >= len(p.fastTags) { - return 0, false - } - fi := p.fastTags[t] - return fi, fi >= 0 - } - fi, ok := p.slowTags[t] - return fi, ok -} - -func (p *tagMap) put(t int, fi int) { - if t > 0 && t < tagMapFastLimit { - for len(p.fastTags) < t+1 { - p.fastTags = append(p.fastTags, -1) - } - p.fastTags[t] = fi - return - } - if p.slowTags == nil { - p.slowTags = make(map[int]int) - } - p.slowTags[t] = fi -} - -// StructProperties represents properties for all the fields of a struct. -// decoderTags and decoderOrigNames should only be used by the decoder. -type StructProperties struct { - Prop []*Properties // properties for each field - reqCount int // required count - decoderTags tagMap // map from proto tag to struct field number - decoderOrigNames map[string]int // map from original name to struct field number - order []int // list of struct field numbers in tag order - - // OneofTypes contains information about the oneof fields in this message. - // It is keyed by the original name of a field. - OneofTypes map[string]*OneofProperties -} - -// OneofProperties represents information about a specific field in a oneof. -type OneofProperties struct { - Type reflect.Type // pointer to generated struct type for this oneof field - Field int // struct field number of the containing oneof in the message - Prop *Properties -} - -// Implement the sorting interface so we can sort the fields in tag order, as recommended by the spec. -// See encode.go, (*Buffer).enc_struct. - -func (sp *StructProperties) Len() int { return len(sp.order) } -func (sp *StructProperties) Less(i, j int) bool { - return sp.Prop[sp.order[i]].Tag < sp.Prop[sp.order[j]].Tag -} -func (sp *StructProperties) Swap(i, j int) { sp.order[i], sp.order[j] = sp.order[j], sp.order[i] } - -// Properties represents the protocol-specific behavior of a single struct field. -type Properties struct { - Name string // name of the field, for error messages - OrigName string // original name before protocol compiler (always set) - JSONName string // name to use for JSON; determined by protoc - Wire string - WireType int - Tag int - Required bool - Optional bool - Repeated bool - Packed bool // relevant for repeated primitives only - Enum string // set for enum types only - proto3 bool // whether this is known to be a proto3 field; set for []byte only - oneof bool // whether this is a oneof field - - Default string // default value - HasDefault bool // whether an explicit default was provided - - stype reflect.Type // set for struct types only - sprop *StructProperties // set for struct types only - - mtype reflect.Type // set for map types only - mkeyprop *Properties // set for map types only - mvalprop *Properties // set for map types only -} - -// String formats the properties in the protobuf struct field tag style. -func (p *Properties) String() string { - s := p.Wire - s += "," - s += strconv.Itoa(p.Tag) - if p.Required { - s += ",req" - } - if p.Optional { - s += ",opt" - } - if p.Repeated { - s += ",rep" - } - if p.Packed { - s += ",packed" - } - s += ",name=" + p.OrigName - if p.JSONName != p.OrigName { - s += ",json=" + p.JSONName - } - if p.proto3 { - s += ",proto3" - } - if p.oneof { - s += ",oneof" - } - if len(p.Enum) > 0 { - s += ",enum=" + p.Enum - } - if p.HasDefault { - s += ",def=" + p.Default - } - return s -} - -// Parse populates p by parsing a string in the protobuf struct field tag style. -func (p *Properties) Parse(s string) { - // "bytes,49,opt,name=foo,def=hello!" - fields := strings.Split(s, ",") // breaks def=, but handled below. - if len(fields) < 2 { - fmt.Fprintf(os.Stderr, "proto: tag has too few fields: %q\n", s) - return - } - - p.Wire = fields[0] - switch p.Wire { - case "varint": - p.WireType = WireVarint - case "fixed32": - p.WireType = WireFixed32 - case "fixed64": - p.WireType = WireFixed64 - case "zigzag32": - p.WireType = WireVarint - case "zigzag64": - p.WireType = WireVarint - case "bytes", "group": - p.WireType = WireBytes - // no numeric converter for non-numeric types - default: - fmt.Fprintf(os.Stderr, "proto: tag has unknown wire type: %q\n", s) - return - } - - var err error - p.Tag, err = strconv.Atoi(fields[1]) - if err != nil { - return - } - -outer: - for i := 2; i < len(fields); i++ { - f := fields[i] - switch { - case f == "req": - p.Required = true - case f == "opt": - p.Optional = true - case f == "rep": - p.Repeated = true - case f == "packed": - p.Packed = true - case strings.HasPrefix(f, "name="): - p.OrigName = f[5:] - case strings.HasPrefix(f, "json="): - p.JSONName = f[5:] - case strings.HasPrefix(f, "enum="): - p.Enum = f[5:] - case f == "proto3": - p.proto3 = true - case f == "oneof": - p.oneof = true - case strings.HasPrefix(f, "def="): - p.HasDefault = true - p.Default = f[4:] // rest of string - if i+1 < len(fields) { - // Commas aren't escaped, and def is always last. - p.Default += "," + strings.Join(fields[i+1:], ",") - break outer - } - } - } -} - -var protoMessageType = reflect.TypeOf((*Message)(nil)).Elem() - -// setFieldProps initializes the field properties for submessages and maps. -func (p *Properties) setFieldProps(typ reflect.Type, f *reflect.StructField, lockGetProp bool) { - switch t1 := typ; t1.Kind() { - case reflect.Ptr: - if t1.Elem().Kind() == reflect.Struct { - p.stype = t1.Elem() - } - - case reflect.Slice: - if t2 := t1.Elem(); t2.Kind() == reflect.Ptr && t2.Elem().Kind() == reflect.Struct { - p.stype = t2.Elem() - } - - case reflect.Map: - p.mtype = t1 - p.mkeyprop = &Properties{} - p.mkeyprop.init(reflect.PtrTo(p.mtype.Key()), "Key", f.Tag.Get("protobuf_key"), nil, lockGetProp) - p.mvalprop = &Properties{} - vtype := p.mtype.Elem() - if vtype.Kind() != reflect.Ptr && vtype.Kind() != reflect.Slice { - // The value type is not a message (*T) or bytes ([]byte), - // so we need encoders for the pointer to this type. - vtype = reflect.PtrTo(vtype) - } - p.mvalprop.init(vtype, "Value", f.Tag.Get("protobuf_val"), nil, lockGetProp) - } - - if p.stype != nil { - if lockGetProp { - p.sprop = GetProperties(p.stype) - } else { - p.sprop = getPropertiesLocked(p.stype) - } - } -} - -var ( - marshalerType = reflect.TypeOf((*Marshaler)(nil)).Elem() -) - -// Init populates the properties from a protocol buffer struct tag. -func (p *Properties) Init(typ reflect.Type, name, tag string, f *reflect.StructField) { - p.init(typ, name, tag, f, true) -} - -func (p *Properties) init(typ reflect.Type, name, tag string, f *reflect.StructField, lockGetProp bool) { - // "bytes,49,opt,def=hello!" - p.Name = name - p.OrigName = name - if tag == "" { - return - } - p.Parse(tag) - p.setFieldProps(typ, f, lockGetProp) -} - -var ( - propertiesMu sync.RWMutex - propertiesMap = make(map[reflect.Type]*StructProperties) -) - -// GetProperties returns the list of properties for the type represented by t. -// t must represent a generated struct type of a protocol message. -func GetProperties(t reflect.Type) *StructProperties { - if t.Kind() != reflect.Struct { - panic("proto: type must have kind struct") - } - - // Most calls to GetProperties in a long-running program will be - // retrieving details for types we have seen before. - propertiesMu.RLock() - sprop, ok := propertiesMap[t] - propertiesMu.RUnlock() - if ok { - if collectStats { - stats.Chit++ - } - return sprop - } - - propertiesMu.Lock() - sprop = getPropertiesLocked(t) - propertiesMu.Unlock() - return sprop -} - -// getPropertiesLocked requires that propertiesMu is held. -func getPropertiesLocked(t reflect.Type) *StructProperties { - if prop, ok := propertiesMap[t]; ok { - if collectStats { - stats.Chit++ - } - return prop - } - if collectStats { - stats.Cmiss++ - } - - prop := new(StructProperties) - // in case of recursive protos, fill this in now. - propertiesMap[t] = prop - - // build properties - prop.Prop = make([]*Properties, t.NumField()) - prop.order = make([]int, t.NumField()) - - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - p := new(Properties) - name := f.Name - p.init(f.Type, name, f.Tag.Get("protobuf"), &f, false) - - oneof := f.Tag.Get("protobuf_oneof") // special case - if oneof != "" { - // Oneof fields don't use the traditional protobuf tag. - p.OrigName = oneof - } - prop.Prop[i] = p - prop.order[i] = i - if debug { - print(i, " ", f.Name, " ", t.String(), " ") - if p.Tag > 0 { - print(p.String()) - } - print("\n") - } - } - - // Re-order prop.order. - sort.Sort(prop) - - type oneofMessage interface { - XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) - } - if om, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { - var oots []interface{} - _, _, _, oots = om.XXX_OneofFuncs() - - // Interpret oneof metadata. - prop.OneofTypes = make(map[string]*OneofProperties) - for _, oot := range oots { - oop := &OneofProperties{ - Type: reflect.ValueOf(oot).Type(), // *T - Prop: new(Properties), - } - sft := oop.Type.Elem().Field(0) - oop.Prop.Name = sft.Name - oop.Prop.Parse(sft.Tag.Get("protobuf")) - // There will be exactly one interface field that - // this new value is assignable to. - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if f.Type.Kind() != reflect.Interface { - continue - } - if !oop.Type.AssignableTo(f.Type) { - continue - } - oop.Field = i - break - } - prop.OneofTypes[oop.Prop.OrigName] = oop - } - } - - // build required counts - // build tags - reqCount := 0 - prop.decoderOrigNames = make(map[string]int) - for i, p := range prop.Prop { - if strings.HasPrefix(p.Name, "XXX_") { - // Internal fields should not appear in tags/origNames maps. - // They are handled specially when encoding and decoding. - continue - } - if p.Required { - reqCount++ - } - prop.decoderTags.put(p.Tag, i) - prop.decoderOrigNames[p.OrigName] = i - } - prop.reqCount = reqCount - - return prop -} - -// A global registry of enum types. -// The generated code will register the generated maps by calling RegisterEnum. - -var enumValueMaps = make(map[string]map[string]int32) - -// RegisterEnum is called from the generated code to install the enum descriptor -// maps into the global table to aid parsing text format protocol buffers. -func RegisterEnum(typeName string, unusedNameMap map[int32]string, valueMap map[string]int32) { - if _, ok := enumValueMaps[typeName]; ok { - panic("proto: duplicate enum registered: " + typeName) - } - enumValueMaps[typeName] = valueMap -} - -// EnumValueMap returns the mapping from names to integers of the -// enum type enumType, or a nil if not found. -func EnumValueMap(enumType string) map[string]int32 { - return enumValueMaps[enumType] -} - -// A registry of all linked message types. -// The string is a fully-qualified proto name ("pkg.Message"). -var ( - protoTypedNils = make(map[string]Message) // a map from proto names to typed nil pointers - protoMapTypes = make(map[string]reflect.Type) // a map from proto names to map types - revProtoTypes = make(map[reflect.Type]string) -) - -// RegisterType is called from generated code and maps from the fully qualified -// proto name to the type (pointer to struct) of the protocol buffer. -func RegisterType(x Message, name string) { - if _, ok := protoTypedNils[name]; ok { - // TODO: Some day, make this a panic. - log.Printf("proto: duplicate proto type registered: %s", name) - return - } - t := reflect.TypeOf(x) - if v := reflect.ValueOf(x); v.Kind() == reflect.Ptr && v.Pointer() == 0 { - // Generated code always calls RegisterType with nil x. - // This check is just for extra safety. - protoTypedNils[name] = x - } else { - protoTypedNils[name] = reflect.Zero(t).Interface().(Message) - } - revProtoTypes[t] = name -} - -// RegisterMapType is called from generated code and maps from the fully qualified -// proto name to the native map type of the proto map definition. -func RegisterMapType(x interface{}, name string) { - if reflect.TypeOf(x).Kind() != reflect.Map { - panic(fmt.Sprintf("RegisterMapType(%T, %q); want map", x, name)) - } - if _, ok := protoMapTypes[name]; ok { - log.Printf("proto: duplicate proto type registered: %s", name) - return - } - t := reflect.TypeOf(x) - protoMapTypes[name] = t - revProtoTypes[t] = name -} - -// MessageName returns the fully-qualified proto name for the given message type. -func MessageName(x Message) string { - type xname interface { - XXX_MessageName() string - } - if m, ok := x.(xname); ok { - return m.XXX_MessageName() - } - return revProtoTypes[reflect.TypeOf(x)] -} - -// MessageType returns the message type (pointer to struct) for a named message. -// The type is not guaranteed to implement proto.Message if the name refers to a -// map entry. -func MessageType(name string) reflect.Type { - if t, ok := protoTypedNils[name]; ok { - return reflect.TypeOf(t) - } - return protoMapTypes[name] -} - -// A registry of all linked proto files. -var ( - protoFiles = make(map[string][]byte) // file name => fileDescriptor -) - -// RegisterFile is called from generated code and maps from the -// full file name of a .proto file to its compressed FileDescriptorProto. -func RegisterFile(filename string, fileDescriptor []byte) { - protoFiles[filename] = fileDescriptor -} - -// FileDescriptor returns the compressed FileDescriptorProto for a .proto file. -func FileDescriptor(filename string) []byte { return protoFiles[filename] } diff --git a/vendor/github.com/golang/protobuf/proto/table_marshal.go b/vendor/github.com/golang/protobuf/proto/table_marshal.go deleted file mode 100644 index 0f212b3..0000000 --- a/vendor/github.com/golang/protobuf/proto/table_marshal.go +++ /dev/null @@ -1,2681 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "errors" - "fmt" - "math" - "reflect" - "sort" - "strconv" - "strings" - "sync" - "sync/atomic" - "unicode/utf8" -) - -// a sizer takes a pointer to a field and the size of its tag, computes the size of -// the encoded data. -type sizer func(pointer, int) int - -// a marshaler takes a byte slice, a pointer to a field, and its tag (in wire format), -// marshals the field to the end of the slice, returns the slice and error (if any). -type marshaler func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) - -// marshalInfo is the information used for marshaling a message. -type marshalInfo struct { - typ reflect.Type - fields []*marshalFieldInfo - unrecognized field // offset of XXX_unrecognized - extensions field // offset of XXX_InternalExtensions - v1extensions field // offset of XXX_extensions - sizecache field // offset of XXX_sizecache - initialized int32 // 0 -- only typ is set, 1 -- fully initialized - messageset bool // uses message set wire format - hasmarshaler bool // has custom marshaler - sync.RWMutex // protect extElems map, also for initialization - extElems map[int32]*marshalElemInfo // info of extension elements -} - -// marshalFieldInfo is the information used for marshaling a field of a message. -type marshalFieldInfo struct { - field field - wiretag uint64 // tag in wire format - tagsize int // size of tag in wire format - sizer sizer - marshaler marshaler - isPointer bool - required bool // field is required - name string // name of the field, for error reporting - oneofElems map[reflect.Type]*marshalElemInfo // info of oneof elements -} - -// marshalElemInfo is the information used for marshaling an extension or oneof element. -type marshalElemInfo struct { - wiretag uint64 // tag in wire format - tagsize int // size of tag in wire format - sizer sizer - marshaler marshaler - isptr bool // elem is pointer typed, thus interface of this type is a direct interface (extension only) -} - -var ( - marshalInfoMap = map[reflect.Type]*marshalInfo{} - marshalInfoLock sync.Mutex -) - -// getMarshalInfo returns the information to marshal a given type of message. -// The info it returns may not necessarily initialized. -// t is the type of the message (NOT the pointer to it). -func getMarshalInfo(t reflect.Type) *marshalInfo { - marshalInfoLock.Lock() - u, ok := marshalInfoMap[t] - if !ok { - u = &marshalInfo{typ: t} - marshalInfoMap[t] = u - } - marshalInfoLock.Unlock() - return u -} - -// Size is the entry point from generated code, -// and should be ONLY called by generated code. -// It computes the size of encoded data of msg. -// a is a pointer to a place to store cached marshal info. -func (a *InternalMessageInfo) Size(msg Message) int { - u := getMessageMarshalInfo(msg, a) - ptr := toPointer(&msg) - if ptr.isNil() { - // We get here if msg is a typed nil ((*SomeMessage)(nil)), - // so it satisfies the interface, and msg == nil wouldn't - // catch it. We don't want crash in this case. - return 0 - } - return u.size(ptr) -} - -// Marshal is the entry point from generated code, -// and should be ONLY called by generated code. -// It marshals msg to the end of b. -// a is a pointer to a place to store cached marshal info. -func (a *InternalMessageInfo) Marshal(b []byte, msg Message, deterministic bool) ([]byte, error) { - u := getMessageMarshalInfo(msg, a) - ptr := toPointer(&msg) - if ptr.isNil() { - // We get here if msg is a typed nil ((*SomeMessage)(nil)), - // so it satisfies the interface, and msg == nil wouldn't - // catch it. We don't want crash in this case. - return b, ErrNil - } - return u.marshal(b, ptr, deterministic) -} - -func getMessageMarshalInfo(msg interface{}, a *InternalMessageInfo) *marshalInfo { - // u := a.marshal, but atomically. - // We use an atomic here to ensure memory consistency. - u := atomicLoadMarshalInfo(&a.marshal) - if u == nil { - // Get marshal information from type of message. - t := reflect.ValueOf(msg).Type() - if t.Kind() != reflect.Ptr { - panic(fmt.Sprintf("cannot handle non-pointer message type %v", t)) - } - u = getMarshalInfo(t.Elem()) - // Store it in the cache for later users. - // a.marshal = u, but atomically. - atomicStoreMarshalInfo(&a.marshal, u) - } - return u -} - -// size is the main function to compute the size of the encoded data of a message. -// ptr is the pointer to the message. -func (u *marshalInfo) size(ptr pointer) int { - if atomic.LoadInt32(&u.initialized) == 0 { - u.computeMarshalInfo() - } - - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if u.hasmarshaler { - m := ptr.asPointerTo(u.typ).Interface().(Marshaler) - b, _ := m.Marshal() - return len(b) - } - - n := 0 - for _, f := range u.fields { - if f.isPointer && ptr.offset(f.field).getPointer().isNil() { - // nil pointer always marshals to nothing - continue - } - n += f.sizer(ptr.offset(f.field), f.tagsize) - } - if u.extensions.IsValid() { - e := ptr.offset(u.extensions).toExtensions() - if u.messageset { - n += u.sizeMessageSet(e) - } else { - n += u.sizeExtensions(e) - } - } - if u.v1extensions.IsValid() { - m := *ptr.offset(u.v1extensions).toOldExtensions() - n += u.sizeV1Extensions(m) - } - if u.unrecognized.IsValid() { - s := *ptr.offset(u.unrecognized).toBytes() - n += len(s) - } - // cache the result for use in marshal - if u.sizecache.IsValid() { - atomic.StoreInt32(ptr.offset(u.sizecache).toInt32(), int32(n)) - } - return n -} - -// cachedsize gets the size from cache. If there is no cache (i.e. message is not generated), -// fall back to compute the size. -func (u *marshalInfo) cachedsize(ptr pointer) int { - if u.sizecache.IsValid() { - return int(atomic.LoadInt32(ptr.offset(u.sizecache).toInt32())) - } - return u.size(ptr) -} - -// marshal is the main function to marshal a message. It takes a byte slice and appends -// the encoded data to the end of the slice, returns the slice and error (if any). -// ptr is the pointer to the message. -// If deterministic is true, map is marshaled in deterministic order. -func (u *marshalInfo) marshal(b []byte, ptr pointer, deterministic bool) ([]byte, error) { - if atomic.LoadInt32(&u.initialized) == 0 { - u.computeMarshalInfo() - } - - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if u.hasmarshaler { - m := ptr.asPointerTo(u.typ).Interface().(Marshaler) - b1, err := m.Marshal() - b = append(b, b1...) - return b, err - } - - var err, errreq error - // The old marshaler encodes extensions at beginning. - if u.extensions.IsValid() { - e := ptr.offset(u.extensions).toExtensions() - if u.messageset { - b, err = u.appendMessageSet(b, e, deterministic) - } else { - b, err = u.appendExtensions(b, e, deterministic) - } - if err != nil { - return b, err - } - } - if u.v1extensions.IsValid() { - m := *ptr.offset(u.v1extensions).toOldExtensions() - b, err = u.appendV1Extensions(b, m, deterministic) - if err != nil { - return b, err - } - } - for _, f := range u.fields { - if f.required && errreq == nil { - if ptr.offset(f.field).getPointer().isNil() { - // Required field is not set. - // We record the error but keep going, to give a complete marshaling. - errreq = &RequiredNotSetError{f.name} - continue - } - } - if f.isPointer && ptr.offset(f.field).getPointer().isNil() { - // nil pointer always marshals to nothing - continue - } - b, err = f.marshaler(b, ptr.offset(f.field), f.wiretag, deterministic) - if err != nil { - if err1, ok := err.(*RequiredNotSetError); ok { - // Required field in submessage is not set. - // We record the error but keep going, to give a complete marshaling. - if errreq == nil { - errreq = &RequiredNotSetError{f.name + "." + err1.field} - } - continue - } - if err == errRepeatedHasNil { - err = errors.New("proto: repeated field " + f.name + " has nil element") - } - return b, err - } - } - if u.unrecognized.IsValid() { - s := *ptr.offset(u.unrecognized).toBytes() - b = append(b, s...) - } - return b, errreq -} - -// computeMarshalInfo initializes the marshal info. -func (u *marshalInfo) computeMarshalInfo() { - u.Lock() - defer u.Unlock() - if u.initialized != 0 { // non-atomic read is ok as it is protected by the lock - return - } - - t := u.typ - u.unrecognized = invalidField - u.extensions = invalidField - u.v1extensions = invalidField - u.sizecache = invalidField - - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - if reflect.PtrTo(t).Implements(marshalerType) { - u.hasmarshaler = true - atomic.StoreInt32(&u.initialized, 1) - return - } - - // get oneof implementers - var oneofImplementers []interface{} - if m, ok := reflect.Zero(reflect.PtrTo(t)).Interface().(oneofMessage); ok { - _, _, _, oneofImplementers = m.XXX_OneofFuncs() - } - - n := t.NumField() - - // deal with XXX fields first - for i := 0; i < t.NumField(); i++ { - f := t.Field(i) - if !strings.HasPrefix(f.Name, "XXX_") { - continue - } - switch f.Name { - case "XXX_sizecache": - u.sizecache = toField(&f) - case "XXX_unrecognized": - u.unrecognized = toField(&f) - case "XXX_InternalExtensions": - u.extensions = toField(&f) - u.messageset = f.Tag.Get("protobuf_messageset") == "1" - case "XXX_extensions": - u.v1extensions = toField(&f) - case "XXX_NoUnkeyedLiteral": - // nothing to do - default: - panic("unknown XXX field: " + f.Name) - } - n-- - } - - // normal fields - fields := make([]marshalFieldInfo, n) // batch allocation - u.fields = make([]*marshalFieldInfo, 0, n) - for i, j := 0, 0; i < t.NumField(); i++ { - f := t.Field(i) - - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - field := &fields[j] - j++ - field.name = f.Name - u.fields = append(u.fields, field) - if f.Tag.Get("protobuf_oneof") != "" { - field.computeOneofFieldInfo(&f, oneofImplementers) - continue - } - if f.Tag.Get("protobuf") == "" { - // field has no tag (not in generated message), ignore it - u.fields = u.fields[:len(u.fields)-1] - j-- - continue - } - field.computeMarshalFieldInfo(&f) - } - - // fields are marshaled in tag order on the wire. - sort.Sort(byTag(u.fields)) - - atomic.StoreInt32(&u.initialized, 1) -} - -// helper for sorting fields by tag -type byTag []*marshalFieldInfo - -func (a byTag) Len() int { return len(a) } -func (a byTag) Swap(i, j int) { a[i], a[j] = a[j], a[i] } -func (a byTag) Less(i, j int) bool { return a[i].wiretag < a[j].wiretag } - -// getExtElemInfo returns the information to marshal an extension element. -// The info it returns is initialized. -func (u *marshalInfo) getExtElemInfo(desc *ExtensionDesc) *marshalElemInfo { - // get from cache first - u.RLock() - e, ok := u.extElems[desc.Field] - u.RUnlock() - if ok { - return e - } - - t := reflect.TypeOf(desc.ExtensionType) // pointer or slice to basic type or struct - tags := strings.Split(desc.Tag, ",") - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - sizer, marshaler := typeMarshaler(t, tags, false, false) - e = &marshalElemInfo{ - wiretag: uint64(tag)<<3 | wt, - tagsize: SizeVarint(uint64(tag) << 3), - sizer: sizer, - marshaler: marshaler, - isptr: t.Kind() == reflect.Ptr, - } - - // update cache - u.Lock() - if u.extElems == nil { - u.extElems = make(map[int32]*marshalElemInfo) - } - u.extElems[desc.Field] = e - u.Unlock() - return e -} - -// computeMarshalFieldInfo fills up the information to marshal a field. -func (fi *marshalFieldInfo) computeMarshalFieldInfo(f *reflect.StructField) { - // parse protobuf tag of the field. - // tag has format of "bytes,49,opt,name=foo,def=hello!" - tags := strings.Split(f.Tag.Get("protobuf"), ",") - if tags[0] == "" { - return - } - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - if tags[2] == "req" { - fi.required = true - } - fi.setTag(f, tag, wt) - fi.setMarshaler(f, tags) -} - -func (fi *marshalFieldInfo) computeOneofFieldInfo(f *reflect.StructField, oneofImplementers []interface{}) { - fi.field = toField(f) - fi.wiretag = 1<<31 - 1 // Use a large tag number, make oneofs sorted at the end. This tag will not appear on the wire. - fi.isPointer = true - fi.sizer, fi.marshaler = makeOneOfMarshaler(fi, f) - fi.oneofElems = make(map[reflect.Type]*marshalElemInfo) - - ityp := f.Type // interface type - for _, o := range oneofImplementers { - t := reflect.TypeOf(o) - if !t.Implements(ityp) { - continue - } - sf := t.Elem().Field(0) // oneof implementer is a struct with a single field - tags := strings.Split(sf.Tag.Get("protobuf"), ",") - tag, err := strconv.Atoi(tags[1]) - if err != nil { - panic("tag is not an integer") - } - wt := wiretype(tags[0]) - sizer, marshaler := typeMarshaler(sf.Type, tags, false, true) // oneof should not omit any zero value - fi.oneofElems[t.Elem()] = &marshalElemInfo{ - wiretag: uint64(tag)<<3 | wt, - tagsize: SizeVarint(uint64(tag) << 3), - sizer: sizer, - marshaler: marshaler, - } - } -} - -type oneofMessage interface { - XXX_OneofFuncs() (func(Message, *Buffer) error, func(Message, int, int, *Buffer) (bool, error), func(Message) int, []interface{}) -} - -// wiretype returns the wire encoding of the type. -func wiretype(encoding string) uint64 { - switch encoding { - case "fixed32": - return WireFixed32 - case "fixed64": - return WireFixed64 - case "varint", "zigzag32", "zigzag64": - return WireVarint - case "bytes": - return WireBytes - case "group": - return WireStartGroup - } - panic("unknown wire type " + encoding) -} - -// setTag fills up the tag (in wire format) and its size in the info of a field. -func (fi *marshalFieldInfo) setTag(f *reflect.StructField, tag int, wt uint64) { - fi.field = toField(f) - fi.wiretag = uint64(tag)<<3 | wt - fi.tagsize = SizeVarint(uint64(tag) << 3) -} - -// setMarshaler fills up the sizer and marshaler in the info of a field. -func (fi *marshalFieldInfo) setMarshaler(f *reflect.StructField, tags []string) { - switch f.Type.Kind() { - case reflect.Map: - // map field - fi.isPointer = true - fi.sizer, fi.marshaler = makeMapMarshaler(f) - return - case reflect.Ptr, reflect.Slice: - fi.isPointer = true - } - fi.sizer, fi.marshaler = typeMarshaler(f.Type, tags, true, false) -} - -// typeMarshaler returns the sizer and marshaler of a given field. -// t is the type of the field. -// tags is the generated "protobuf" tag of the field. -// If nozero is true, zero value is not marshaled to the wire. -// If oneof is true, it is a oneof field. -func typeMarshaler(t reflect.Type, tags []string, nozero, oneof bool) (sizer, marshaler) { - encoding := tags[0] - - pointer := false - slice := false - if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { - slice = true - t = t.Elem() - } - if t.Kind() == reflect.Ptr { - pointer = true - t = t.Elem() - } - - packed := false - proto3 := false - for i := 2; i < len(tags); i++ { - if tags[i] == "packed" { - packed = true - } - if tags[i] == "proto3" { - proto3 = true - } - } - - switch t.Kind() { - case reflect.Bool: - if pointer { - return sizeBoolPtr, appendBoolPtr - } - if slice { - if packed { - return sizeBoolPackedSlice, appendBoolPackedSlice - } - return sizeBoolSlice, appendBoolSlice - } - if nozero { - return sizeBoolValueNoZero, appendBoolValueNoZero - } - return sizeBoolValue, appendBoolValue - case reflect.Uint32: - switch encoding { - case "fixed32": - if pointer { - return sizeFixed32Ptr, appendFixed32Ptr - } - if slice { - if packed { - return sizeFixed32PackedSlice, appendFixed32PackedSlice - } - return sizeFixed32Slice, appendFixed32Slice - } - if nozero { - return sizeFixed32ValueNoZero, appendFixed32ValueNoZero - } - return sizeFixed32Value, appendFixed32Value - case "varint": - if pointer { - return sizeVarint32Ptr, appendVarint32Ptr - } - if slice { - if packed { - return sizeVarint32PackedSlice, appendVarint32PackedSlice - } - return sizeVarint32Slice, appendVarint32Slice - } - if nozero { - return sizeVarint32ValueNoZero, appendVarint32ValueNoZero - } - return sizeVarint32Value, appendVarint32Value - } - case reflect.Int32: - switch encoding { - case "fixed32": - if pointer { - return sizeFixedS32Ptr, appendFixedS32Ptr - } - if slice { - if packed { - return sizeFixedS32PackedSlice, appendFixedS32PackedSlice - } - return sizeFixedS32Slice, appendFixedS32Slice - } - if nozero { - return sizeFixedS32ValueNoZero, appendFixedS32ValueNoZero - } - return sizeFixedS32Value, appendFixedS32Value - case "varint": - if pointer { - return sizeVarintS32Ptr, appendVarintS32Ptr - } - if slice { - if packed { - return sizeVarintS32PackedSlice, appendVarintS32PackedSlice - } - return sizeVarintS32Slice, appendVarintS32Slice - } - if nozero { - return sizeVarintS32ValueNoZero, appendVarintS32ValueNoZero - } - return sizeVarintS32Value, appendVarintS32Value - case "zigzag32": - if pointer { - return sizeZigzag32Ptr, appendZigzag32Ptr - } - if slice { - if packed { - return sizeZigzag32PackedSlice, appendZigzag32PackedSlice - } - return sizeZigzag32Slice, appendZigzag32Slice - } - if nozero { - return sizeZigzag32ValueNoZero, appendZigzag32ValueNoZero - } - return sizeZigzag32Value, appendZigzag32Value - } - case reflect.Uint64: - switch encoding { - case "fixed64": - if pointer { - return sizeFixed64Ptr, appendFixed64Ptr - } - if slice { - if packed { - return sizeFixed64PackedSlice, appendFixed64PackedSlice - } - return sizeFixed64Slice, appendFixed64Slice - } - if nozero { - return sizeFixed64ValueNoZero, appendFixed64ValueNoZero - } - return sizeFixed64Value, appendFixed64Value - case "varint": - if pointer { - return sizeVarint64Ptr, appendVarint64Ptr - } - if slice { - if packed { - return sizeVarint64PackedSlice, appendVarint64PackedSlice - } - return sizeVarint64Slice, appendVarint64Slice - } - if nozero { - return sizeVarint64ValueNoZero, appendVarint64ValueNoZero - } - return sizeVarint64Value, appendVarint64Value - } - case reflect.Int64: - switch encoding { - case "fixed64": - if pointer { - return sizeFixedS64Ptr, appendFixedS64Ptr - } - if slice { - if packed { - return sizeFixedS64PackedSlice, appendFixedS64PackedSlice - } - return sizeFixedS64Slice, appendFixedS64Slice - } - if nozero { - return sizeFixedS64ValueNoZero, appendFixedS64ValueNoZero - } - return sizeFixedS64Value, appendFixedS64Value - case "varint": - if pointer { - return sizeVarintS64Ptr, appendVarintS64Ptr - } - if slice { - if packed { - return sizeVarintS64PackedSlice, appendVarintS64PackedSlice - } - return sizeVarintS64Slice, appendVarintS64Slice - } - if nozero { - return sizeVarintS64ValueNoZero, appendVarintS64ValueNoZero - } - return sizeVarintS64Value, appendVarintS64Value - case "zigzag64": - if pointer { - return sizeZigzag64Ptr, appendZigzag64Ptr - } - if slice { - if packed { - return sizeZigzag64PackedSlice, appendZigzag64PackedSlice - } - return sizeZigzag64Slice, appendZigzag64Slice - } - if nozero { - return sizeZigzag64ValueNoZero, appendZigzag64ValueNoZero - } - return sizeZigzag64Value, appendZigzag64Value - } - case reflect.Float32: - if pointer { - return sizeFloat32Ptr, appendFloat32Ptr - } - if slice { - if packed { - return sizeFloat32PackedSlice, appendFloat32PackedSlice - } - return sizeFloat32Slice, appendFloat32Slice - } - if nozero { - return sizeFloat32ValueNoZero, appendFloat32ValueNoZero - } - return sizeFloat32Value, appendFloat32Value - case reflect.Float64: - if pointer { - return sizeFloat64Ptr, appendFloat64Ptr - } - if slice { - if packed { - return sizeFloat64PackedSlice, appendFloat64PackedSlice - } - return sizeFloat64Slice, appendFloat64Slice - } - if nozero { - return sizeFloat64ValueNoZero, appendFloat64ValueNoZero - } - return sizeFloat64Value, appendFloat64Value - case reflect.String: - if pointer { - return sizeStringPtr, appendStringPtr - } - if slice { - return sizeStringSlice, appendStringSlice - } - if nozero { - return sizeStringValueNoZero, appendStringValueNoZero - } - return sizeStringValue, appendStringValue - case reflect.Slice: - if slice { - return sizeBytesSlice, appendBytesSlice - } - if oneof { - // Oneof bytes field may also have "proto3" tag. - // We want to marshal it as a oneof field. Do this - // check before the proto3 check. - return sizeBytesOneof, appendBytesOneof - } - if proto3 { - return sizeBytes3, appendBytes3 - } - return sizeBytes, appendBytes - case reflect.Struct: - switch encoding { - case "group": - if slice { - return makeGroupSliceMarshaler(getMarshalInfo(t)) - } - return makeGroupMarshaler(getMarshalInfo(t)) - case "bytes": - if slice { - return makeMessageSliceMarshaler(getMarshalInfo(t)) - } - return makeMessageMarshaler(getMarshalInfo(t)) - } - } - panic(fmt.Sprintf("unknown or mismatched type: type: %v, wire type: %v", t, encoding)) -} - -// Below are functions to size/marshal a specific type of a field. -// They are stored in the field's info, and called by function pointers. -// They have type sizer or marshaler. - -func sizeFixed32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFixed32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFixed32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFixed32Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - return (4 + tagsize) * len(s) -} -func sizeFixed32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFixedS32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFixedS32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFixedS32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFixedS32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - return (4 + tagsize) * len(s) -} -func sizeFixedS32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFloat32Value(_ pointer, tagsize int) int { - return 4 + tagsize -} -func sizeFloat32ValueNoZero(ptr pointer, tagsize int) int { - v := math.Float32bits(*ptr.toFloat32()) - if v == 0 { - return 0 - } - return 4 + tagsize -} -func sizeFloat32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toFloat32Ptr() - if p == nil { - return 0 - } - return 4 + tagsize -} -func sizeFloat32Slice(ptr pointer, tagsize int) int { - s := *ptr.toFloat32Slice() - return (4 + tagsize) * len(s) -} -func sizeFloat32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toFloat32Slice() - if len(s) == 0 { - return 0 - } - return 4*len(s) + SizeVarint(uint64(4*len(s))) + tagsize -} -func sizeFixed64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFixed64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFixed64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFixed64Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - return (8 + tagsize) * len(s) -} -func sizeFixed64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeFixedS64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFixedS64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFixedS64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFixedS64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - return (8 + tagsize) * len(s) -} -func sizeFixedS64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeFloat64Value(_ pointer, tagsize int) int { - return 8 + tagsize -} -func sizeFloat64ValueNoZero(ptr pointer, tagsize int) int { - v := math.Float64bits(*ptr.toFloat64()) - if v == 0 { - return 0 - } - return 8 + tagsize -} -func sizeFloat64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toFloat64Ptr() - if p == nil { - return 0 - } - return 8 + tagsize -} -func sizeFloat64Slice(ptr pointer, tagsize int) int { - s := *ptr.toFloat64Slice() - return (8 + tagsize) * len(s) -} -func sizeFloat64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toFloat64Slice() - if len(s) == 0 { - return 0 - } - return 8*len(s) + SizeVarint(uint64(8*len(s))) + tagsize -} -func sizeVarint32Value(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarint32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint32() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarint32Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint32Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarint32Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarint32PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarintS32Value(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarintS32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarintS32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarint64Value(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - return SizeVarint(v) + tagsize -} -func sizeVarint64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toUint64() - if v == 0 { - return 0 - } - return SizeVarint(v) + tagsize -} -func sizeVarint64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toUint64Ptr() - if p == nil { - return 0 - } - return SizeVarint(*p) + tagsize -} -func sizeVarint64Slice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(v) + tagsize - } - return n -} -func sizeVarint64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(v) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeVarintS64Value(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v)) + tagsize -} -func sizeVarintS64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - return SizeVarint(uint64(*p)) + tagsize -} -func sizeVarintS64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) + tagsize - } - return n -} -func sizeVarintS64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeZigzag32Value(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt32() - if v == 0 { - return 0 - } - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32Ptr(ptr pointer, tagsize int) int { - p := ptr.getInt32Ptr() - if p == nil { - return 0 - } - v := *p - return SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize -} -func sizeZigzag32Slice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) + tagsize - } - return n -} -func sizeZigzag32PackedSlice(ptr pointer, tagsize int) int { - s := ptr.getInt32Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeZigzag64Value(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64ValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toInt64() - if v == 0 { - return 0 - } - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64Ptr(ptr pointer, tagsize int) int { - p := *ptr.toInt64Ptr() - if p == nil { - return 0 - } - v := *p - return SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize -} -func sizeZigzag64Slice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1)^uint64((int64(v)>>63))) + tagsize - } - return n -} -func sizeZigzag64PackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return 0 - } - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) - } - return n + SizeVarint(uint64(n)) + tagsize -} -func sizeBoolValue(_ pointer, tagsize int) int { - return 1 + tagsize -} -func sizeBoolValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toBool() - if !v { - return 0 - } - return 1 + tagsize -} -func sizeBoolPtr(ptr pointer, tagsize int) int { - p := *ptr.toBoolPtr() - if p == nil { - return 0 - } - return 1 + tagsize -} -func sizeBoolSlice(ptr pointer, tagsize int) int { - s := *ptr.toBoolSlice() - return (1 + tagsize) * len(s) -} -func sizeBoolPackedSlice(ptr pointer, tagsize int) int { - s := *ptr.toBoolSlice() - if len(s) == 0 { - return 0 - } - return len(s) + SizeVarint(uint64(len(s))) + tagsize -} -func sizeStringValue(ptr pointer, tagsize int) int { - v := *ptr.toString() - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringValueNoZero(ptr pointer, tagsize int) int { - v := *ptr.toString() - if v == "" { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringPtr(ptr pointer, tagsize int) int { - p := *ptr.toStringPtr() - if p == nil { - return 0 - } - v := *p - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeStringSlice(ptr pointer, tagsize int) int { - s := *ptr.toStringSlice() - n := 0 - for _, v := range s { - n += len(v) + SizeVarint(uint64(len(v))) + tagsize - } - return n -} -func sizeBytes(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - if v == nil { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytes3(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - if len(v) == 0 { - return 0 - } - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytesOneof(ptr pointer, tagsize int) int { - v := *ptr.toBytes() - return len(v) + SizeVarint(uint64(len(v))) + tagsize -} -func sizeBytesSlice(ptr pointer, tagsize int) int { - s := *ptr.toBytesSlice() - n := 0 - for _, v := range s { - n += len(v) + SizeVarint(uint64(len(v))) + tagsize - } - return n -} - -// appendFixed32 appends an encoded fixed32 to b. -func appendFixed32(b []byte, v uint32) []byte { - b = append(b, - byte(v), - byte(v>>8), - byte(v>>16), - byte(v>>24)) - return b -} - -// appendFixed64 appends an encoded fixed64 to b. -func appendFixed64(b []byte, v uint64) []byte { - b = append(b, - byte(v), - byte(v>>8), - byte(v>>16), - byte(v>>24), - byte(v>>32), - byte(v>>40), - byte(v>>48), - byte(v>>56)) - return b -} - -// appendVarint appends an encoded varint to b. -func appendVarint(b []byte, v uint64) []byte { - // TODO: make 1-byte (maybe 2-byte) case inline-able, once we - // have non-leaf inliner. - switch { - case v < 1<<7: - b = append(b, byte(v)) - case v < 1<<14: - b = append(b, - byte(v&0x7f|0x80), - byte(v>>7)) - case v < 1<<21: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte(v>>14)) - case v < 1<<28: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte(v>>21)) - case v < 1<<35: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte(v>>28)) - case v < 1<<42: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte(v>>35)) - case v < 1<<49: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte(v>>42)) - case v < 1<<56: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte(v>>49)) - case v < 1<<63: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte((v>>49)&0x7f|0x80), - byte(v>>56)) - default: - b = append(b, - byte(v&0x7f|0x80), - byte((v>>7)&0x7f|0x80), - byte((v>>14)&0x7f|0x80), - byte((v>>21)&0x7f|0x80), - byte((v>>28)&0x7f|0x80), - byte((v>>35)&0x7f|0x80), - byte((v>>42)&0x7f|0x80), - byte((v>>49)&0x7f|0x80), - byte((v>>56)&0x7f|0x80), - 1) - } - return b -} - -func appendFixed32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFixed32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFixed32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, *p) - return b, nil -} -func appendFixed32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - } - return b, nil -} -func appendFixed32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, v) - } - return b, nil -} -func appendFixedS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - return b, nil -} -func appendFixedS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - return b, nil -} -func appendFixedS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(*p)) - return b, nil -} -func appendFixedS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, uint32(v)) - } - return b, nil -} -func appendFixedS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, uint32(v)) - } - return b, nil -} -func appendFloat32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float32bits(*ptr.toFloat32()) - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFloat32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float32bits(*ptr.toFloat32()) - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, v) - return b, nil -} -func appendFloat32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toFloat32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed32(b, math.Float32bits(*p)) - return b, nil -} -func appendFloat32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed32(b, math.Float32bits(v)) - } - return b, nil -} -func appendFloat32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(4*len(s))) - for _, v := range s { - b = appendFixed32(b, math.Float32bits(v)) - } - return b, nil -} -func appendFixed64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFixed64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFixed64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, *p) - return b, nil -} -func appendFixed64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - } - return b, nil -} -func appendFixed64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, v) - } - return b, nil -} -func appendFixedS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - return b, nil -} -func appendFixedS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - return b, nil -} -func appendFixedS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(*p)) - return b, nil -} -func appendFixedS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, uint64(v)) - } - return b, nil -} -func appendFixedS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, uint64(v)) - } - return b, nil -} -func appendFloat64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float64bits(*ptr.toFloat64()) - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFloat64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := math.Float64bits(*ptr.toFloat64()) - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, v) - return b, nil -} -func appendFloat64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toFloat64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendFixed64(b, math.Float64bits(*p)) - return b, nil -} -func appendFloat64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendFixed64(b, math.Float64bits(v)) - } - return b, nil -} -func appendFloat64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toFloat64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(8*len(s))) - for _, v := range s { - b = appendFixed64(b, math.Float64bits(v)) - } - return b, nil -} -func appendVarint32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarint32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarint32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarint32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarint32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarintS32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarint64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - return b, nil -} -func appendVarint64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toUint64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - return b, nil -} -func appendVarint64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toUint64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, *p) - return b, nil -} -func appendVarint64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, v) - } - return b, nil -} -func appendVarint64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toUint64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(v) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, v) - } - return b, nil -} -func appendVarintS64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - return b, nil -} -func appendVarintS64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(*p)) - return b, nil -} -func appendVarintS64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendVarintS64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v)) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v)) - } - return b, nil -} -func appendZigzag32Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt32() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := ptr.getInt32Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - v := *p - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - return b, nil -} -func appendZigzag32Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - } - return b, nil -} -func appendZigzag32PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := ptr.getInt32Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64((uint32(v) << 1) ^ uint32((int32(v) >> 31)))) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64((uint32(v)<<1)^uint32((int32(v)>>31)))) - } - return b, nil -} -func appendZigzag64Value(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64ValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toInt64() - if v == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64Ptr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toInt64Ptr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - v := *p - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - return b, nil -} -func appendZigzag64Slice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - } - return b, nil -} -func appendZigzag64PackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toInt64Slice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - // compute size - n := 0 - for _, v := range s { - n += SizeVarint(uint64(v<<1) ^ uint64((int64(v) >> 63))) - } - b = appendVarint(b, uint64(n)) - for _, v := range s { - b = appendVarint(b, uint64(v<<1)^uint64((int64(v)>>63))) - } - return b, nil -} -func appendBoolValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBool() - b = appendVarint(b, wiretag) - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - return b, nil -} -func appendBoolValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBool() - if !v { - return b, nil - } - b = appendVarint(b, wiretag) - b = append(b, 1) - return b, nil -} - -func appendBoolPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toBoolPtr() - if p == nil { - return b, nil - } - b = appendVarint(b, wiretag) - if *p { - b = append(b, 1) - } else { - b = append(b, 0) - } - return b, nil -} -func appendBoolSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBoolSlice() - for _, v := range s { - b = appendVarint(b, wiretag) - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - } - return b, nil -} -func appendBoolPackedSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBoolSlice() - if len(s) == 0 { - return b, nil - } - b = appendVarint(b, wiretag&^7|WireBytes) - b = appendVarint(b, uint64(len(s))) - for _, v := range s { - if v { - b = append(b, 1) - } else { - b = append(b, 0) - } - } - return b, nil -} -func appendStringValue(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toString() - if !utf8.ValidString(v) { - return nil, errInvalidUTF8 - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringValueNoZero(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toString() - if v == "" { - return b, nil - } - if !utf8.ValidString(v) { - return nil, errInvalidUTF8 - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringPtr(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - p := *ptr.toStringPtr() - if p == nil { - return b, nil - } - v := *p - if !utf8.ValidString(v) { - return nil, errInvalidUTF8 - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendStringSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toStringSlice() - for _, v := range s { - if !utf8.ValidString(v) { - return nil, errInvalidUTF8 - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - } - return b, nil -} -func appendBytes(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - if v == nil { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytes3(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - if len(v) == 0 { - return b, nil - } - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytesOneof(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - v := *ptr.toBytes() - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - return b, nil -} -func appendBytesSlice(b []byte, ptr pointer, wiretag uint64, _ bool) ([]byte, error) { - s := *ptr.toBytesSlice() - for _, v := range s { - b = appendVarint(b, wiretag) - b = appendVarint(b, uint64(len(v))) - b = append(b, v...) - } - return b, nil -} - -// makeGroupMarshaler returns the sizer and marshaler for a group. -// u is the marshal info of the underlying message. -func makeGroupMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - p := ptr.getPointer() - if p.isNil() { - return 0 - } - return u.size(p) + 2*tagsize - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - p := ptr.getPointer() - if p.isNil() { - return b, nil - } - var err error - b = appendVarint(b, wiretag) // start group - b, err = u.marshal(b, p, deterministic) - b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group - return b, err - } -} - -// makeGroupSliceMarshaler returns the sizer and marshaler for a group slice. -// u is the marshal info of the underlying message. -func makeGroupSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getPointerSlice() - n := 0 - for _, v := range s { - if v.isNil() { - continue - } - n += u.size(v) + 2*tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getPointerSlice() - var err, errreq error - for _, v := range s { - if v.isNil() { - return b, errRepeatedHasNil - } - b = appendVarint(b, wiretag) // start group - b, err = u.marshal(b, v, deterministic) - b = appendVarint(b, wiretag+(WireEndGroup-WireStartGroup)) // end group - if err != nil { - if _, ok := err.(*RequiredNotSetError); ok { - // Required field in submessage is not set. - // We record the error but keep going, to give a complete marshaling. - if errreq == nil { - errreq = err - } - continue - } - if err == ErrNil { - err = errRepeatedHasNil - } - return b, err - } - } - return b, errreq - } -} - -// makeMessageMarshaler returns the sizer and marshaler for a message field. -// u is the marshal info of the message. -func makeMessageMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - p := ptr.getPointer() - if p.isNil() { - return 0 - } - siz := u.size(p) - return siz + SizeVarint(uint64(siz)) + tagsize - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - p := ptr.getPointer() - if p.isNil() { - return b, nil - } - b = appendVarint(b, wiretag) - siz := u.cachedsize(p) - b = appendVarint(b, uint64(siz)) - return u.marshal(b, p, deterministic) - } -} - -// makeMessageSliceMarshaler returns the sizer and marshaler for a message slice. -// u is the marshal info of the message. -func makeMessageSliceMarshaler(u *marshalInfo) (sizer, marshaler) { - return func(ptr pointer, tagsize int) int { - s := ptr.getPointerSlice() - n := 0 - for _, v := range s { - if v.isNil() { - continue - } - siz := u.size(v) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, wiretag uint64, deterministic bool) ([]byte, error) { - s := ptr.getPointerSlice() - var err, errreq error - for _, v := range s { - if v.isNil() { - return b, errRepeatedHasNil - } - b = appendVarint(b, wiretag) - siz := u.cachedsize(v) - b = appendVarint(b, uint64(siz)) - b, err = u.marshal(b, v, deterministic) - - if err != nil { - if _, ok := err.(*RequiredNotSetError); ok { - // Required field in submessage is not set. - // We record the error but keep going, to give a complete marshaling. - if errreq == nil { - errreq = err - } - continue - } - if err == ErrNil { - err = errRepeatedHasNil - } - return b, err - } - } - return b, errreq - } -} - -// makeMapMarshaler returns the sizer and marshaler for a map field. -// f is the pointer to the reflect data structure of the field. -func makeMapMarshaler(f *reflect.StructField) (sizer, marshaler) { - // figure out key and value type - t := f.Type - keyType := t.Key() - valType := t.Elem() - keyTags := strings.Split(f.Tag.Get("protobuf_key"), ",") - valTags := strings.Split(f.Tag.Get("protobuf_val"), ",") - keySizer, keyMarshaler := typeMarshaler(keyType, keyTags, false, false) // don't omit zero value in map - valSizer, valMarshaler := typeMarshaler(valType, valTags, false, false) // don't omit zero value in map - keyWireTag := 1<<3 | wiretype(keyTags[0]) - valWireTag := 2<<3 | wiretype(valTags[0]) - - // We create an interface to get the addresses of the map key and value. - // If value is pointer-typed, the interface is a direct interface, the - // idata itself is the value. Otherwise, the idata is the pointer to the - // value. - // Key cannot be pointer-typed. - valIsPtr := valType.Kind() == reflect.Ptr - return func(ptr pointer, tagsize int) int { - m := ptr.asPointerTo(t).Elem() // the map - n := 0 - for _, k := range m.MapKeys() { - ki := k.Interface() - vi := m.MapIndex(k).Interface() - kaddr := toAddrPointer(&ki, false) // pointer to key - vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value - siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) - n += siz + SizeVarint(uint64(siz)) + tagsize - } - return n - }, - func(b []byte, ptr pointer, tag uint64, deterministic bool) ([]byte, error) { - m := ptr.asPointerTo(t).Elem() // the map - var err error - keys := m.MapKeys() - if len(keys) > 1 && deterministic { - sort.Sort(mapKeys(keys)) - } - for _, k := range keys { - ki := k.Interface() - vi := m.MapIndex(k).Interface() - kaddr := toAddrPointer(&ki, false) // pointer to key - vaddr := toAddrPointer(&vi, valIsPtr) // pointer to value - b = appendVarint(b, tag) - siz := keySizer(kaddr, 1) + valSizer(vaddr, 1) // tag of key = 1 (size=1), tag of val = 2 (size=1) - b = appendVarint(b, uint64(siz)) - b, err = keyMarshaler(b, kaddr, keyWireTag, deterministic) - if err != nil { - return b, err - } - b, err = valMarshaler(b, vaddr, valWireTag, deterministic) - if err != nil && err != ErrNil { // allow nil value in map - return b, err - } - } - return b, nil - } -} - -// makeOneOfMarshaler returns the sizer and marshaler for a oneof field. -// fi is the marshal info of the field. -// f is the pointer to the reflect data structure of the field. -func makeOneOfMarshaler(fi *marshalFieldInfo, f *reflect.StructField) (sizer, marshaler) { - // Oneof field is an interface. We need to get the actual data type on the fly. - t := f.Type - return func(ptr pointer, _ int) int { - p := ptr.getInterfacePointer() - if p.isNil() { - return 0 - } - v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct - telem := v.Type() - e := fi.oneofElems[telem] - return e.sizer(p, e.tagsize) - }, - func(b []byte, ptr pointer, _ uint64, deterministic bool) ([]byte, error) { - p := ptr.getInterfacePointer() - if p.isNil() { - return b, nil - } - v := ptr.asPointerTo(t).Elem().Elem().Elem() // *interface -> interface -> *struct -> struct - telem := v.Type() - if telem.Field(0).Type.Kind() == reflect.Ptr && p.getPointer().isNil() { - return b, errOneofHasNil - } - e := fi.oneofElems[telem] - return e.marshaler(b, p, e.wiretag, deterministic) - } -} - -// sizeExtensions computes the size of encoded data for a XXX_InternalExtensions field. -func (u *marshalInfo) sizeExtensions(ext *XXX_InternalExtensions) int { - m, mu := ext.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - - n := 0 - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - n += ei.sizer(p, ei.tagsize) - } - mu.Unlock() - return n -} - -// appendExtensions marshals a XXX_InternalExtensions field to the end of byte slice b. -func (u *marshalInfo) appendExtensions(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { - m, mu := ext.extensionsRead() - if m == nil { - return b, nil - } - mu.Lock() - defer mu.Unlock() - - var err error - - // Fast-path for common cases: zero or one extensions. - // Don't bother sorting the keys. - if len(m) <= 1 { - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if err != nil { - return b, err - } - } - return b, nil - } - - // Sort the keys to provide a deterministic encoding. - // Not sure this is required, but the old code does it. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, k := range keys { - e := m[int32(k)] - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if err != nil { - return b, err - } - } - return b, nil -} - -// message set format is: -// message MessageSet { -// repeated group Item = 1 { -// required int32 type_id = 2; -// required string message = 3; -// }; -// } - -// sizeMessageSet computes the size of encoded data for a XXX_InternalExtensions field -// in message set format (above). -func (u *marshalInfo) sizeMessageSet(ext *XXX_InternalExtensions) int { - m, mu := ext.extensionsRead() - if m == nil { - return 0 - } - mu.Lock() - - n := 0 - for id, e := range m { - n += 2 // start group, end group. tag = 1 (size=1) - n += SizeVarint(uint64(id)) + 1 // type_id, tag = 2 (size=1) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - siz := len(msgWithLen) - n += siz + 1 // message, tag = 3 (size=1) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - n += ei.sizer(p, 1) // message, tag = 3 (size=1) - } - mu.Unlock() - return n -} - -// appendMessageSet marshals a XXX_InternalExtensions field in message set format (above) -// to the end of byte slice b. -func (u *marshalInfo) appendMessageSet(b []byte, ext *XXX_InternalExtensions, deterministic bool) ([]byte, error) { - m, mu := ext.extensionsRead() - if m == nil { - return b, nil - } - mu.Lock() - defer mu.Unlock() - - var err error - - // Fast-path for common cases: zero or one extensions. - // Don't bother sorting the keys. - if len(m) <= 1 { - for id, e := range m { - b = append(b, 1<<3|WireStartGroup) - b = append(b, 2<<3|WireVarint) - b = appendVarint(b, uint64(id)) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - b = append(b, 3<<3|WireBytes) - b = append(b, msgWithLen...) - b = append(b, 1<<3|WireEndGroup) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) - if err != nil { - return b, err - } - b = append(b, 1<<3|WireEndGroup) - } - return b, nil - } - - // Sort the keys to provide a deterministic encoding. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - for _, id := range keys { - e := m[int32(id)] - b = append(b, 1<<3|WireStartGroup) - b = append(b, 2<<3|WireVarint) - b = appendVarint(b, uint64(id)) - - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - msgWithLen := skipVarint(e.enc) // skip old tag, but leave the length varint - b = append(b, 3<<3|WireBytes) - b = append(b, msgWithLen...) - b = append(b, 1<<3|WireEndGroup) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, 3<<3|WireBytes, deterministic) - b = append(b, 1<<3|WireEndGroup) - if err != nil { - return b, err - } - } - return b, nil -} - -// sizeV1Extensions computes the size of encoded data for a V1-API extension field. -func (u *marshalInfo) sizeV1Extensions(m map[int32]Extension) int { - if m == nil { - return 0 - } - - n := 0 - for _, e := range m { - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - n += len(e.enc) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - n += ei.sizer(p, ei.tagsize) - } - return n -} - -// appendV1Extensions marshals a V1-API extension field to the end of byte slice b. -func (u *marshalInfo) appendV1Extensions(b []byte, m map[int32]Extension, deterministic bool) ([]byte, error) { - if m == nil { - return b, nil - } - - // Sort the keys to provide a deterministic encoding. - keys := make([]int, 0, len(m)) - for k := range m { - keys = append(keys, int(k)) - } - sort.Ints(keys) - - var err error - for _, k := range keys { - e := m[int32(k)] - if e.value == nil || e.desc == nil { - // Extension is only in its encoded form. - b = append(b, e.enc...) - continue - } - - // We don't skip extensions that have an encoded form set, - // because the extension value may have been mutated after - // the last time this function was called. - - ei := u.getExtElemInfo(e.desc) - v := e.value - p := toAddrPointer(&v, ei.isptr) - b, err = ei.marshaler(b, p, ei.wiretag, deterministic) - if err != nil { - return b, err - } - } - return b, nil -} - -// newMarshaler is the interface representing objects that can marshal themselves. -// -// This exists to support protoc-gen-go generated messages. -// The proto package will stop type-asserting to this interface in the future. -// -// DO NOT DEPEND ON THIS. -type newMarshaler interface { - XXX_Size() int - XXX_Marshal(b []byte, deterministic bool) ([]byte, error) -} - -// Size returns the encoded size of a protocol buffer message. -// This is the main entry point. -func Size(pb Message) int { - if m, ok := pb.(newMarshaler); ok { - return m.XXX_Size() - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - b, _ := m.Marshal() - return len(b) - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return 0 - } - var info InternalMessageInfo - return info.Size(pb) -} - -// Marshal takes a protocol buffer message -// and encodes it into the wire format, returning the data. -// This is the main entry point. -func Marshal(pb Message) ([]byte, error) { - if m, ok := pb.(newMarshaler); ok { - siz := m.XXX_Size() - b := make([]byte, 0, siz) - return m.XXX_Marshal(b, false) - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - return m.Marshal() - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return nil, ErrNil - } - var info InternalMessageInfo - siz := info.Size(pb) - b := make([]byte, 0, siz) - return info.Marshal(b, pb, false) -} - -// Marshal takes a protocol buffer message -// and encodes it into the wire format, writing the result to the -// Buffer. -// This is an alternative entry point. It is not necessary to use -// a Buffer for most applications. -func (p *Buffer) Marshal(pb Message) error { - var err error - if m, ok := pb.(newMarshaler); ok { - siz := m.XXX_Size() - p.grow(siz) // make sure buf has enough capacity - p.buf, err = m.XXX_Marshal(p.buf, p.deterministic) - return err - } - if m, ok := pb.(Marshaler); ok { - // If the message can marshal itself, let it do it, for compatibility. - // NOTE: This is not efficient. - b, err := m.Marshal() - p.buf = append(p.buf, b...) - return err - } - // in case somehow we didn't generate the wrapper - if pb == nil { - return ErrNil - } - var info InternalMessageInfo - siz := info.Size(pb) - p.grow(siz) // make sure buf has enough capacity - p.buf, err = info.Marshal(p.buf, pb, p.deterministic) - return err -} - -// grow grows the buffer's capacity, if necessary, to guarantee space for -// another n bytes. After grow(n), at least n bytes can be written to the -// buffer without another allocation. -func (p *Buffer) grow(n int) { - need := len(p.buf) + n - if need <= cap(p.buf) { - return - } - newCap := len(p.buf) * 2 - if newCap < need { - newCap = need - } - p.buf = append(make([]byte, 0, newCap), p.buf...) -} diff --git a/vendor/github.com/golang/protobuf/proto/table_merge.go b/vendor/github.com/golang/protobuf/proto/table_merge.go deleted file mode 100644 index 5525def..0000000 --- a/vendor/github.com/golang/protobuf/proto/table_merge.go +++ /dev/null @@ -1,654 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "fmt" - "reflect" - "strings" - "sync" - "sync/atomic" -) - -// Merge merges the src message into dst. -// This assumes that dst and src of the same type and are non-nil. -func (a *InternalMessageInfo) Merge(dst, src Message) { - mi := atomicLoadMergeInfo(&a.merge) - if mi == nil { - mi = getMergeInfo(reflect.TypeOf(dst).Elem()) - atomicStoreMergeInfo(&a.merge, mi) - } - mi.merge(toPointer(&dst), toPointer(&src)) -} - -type mergeInfo struct { - typ reflect.Type - - initialized int32 // 0: only typ is valid, 1: everything is valid - lock sync.Mutex - - fields []mergeFieldInfo - unrecognized field // Offset of XXX_unrecognized -} - -type mergeFieldInfo struct { - field field // Offset of field, guaranteed to be valid - - // isPointer reports whether the value in the field is a pointer. - // This is true for the following situations: - // * Pointer to struct - // * Pointer to basic type (proto2 only) - // * Slice (first value in slice header is a pointer) - // * String (first value in string header is a pointer) - isPointer bool - - // basicWidth reports the width of the field assuming that it is directly - // embedded in the struct (as is the case for basic types in proto3). - // The possible values are: - // 0: invalid - // 1: bool - // 4: int32, uint32, float32 - // 8: int64, uint64, float64 - basicWidth int - - // Where dst and src are pointers to the types being merged. - merge func(dst, src pointer) -} - -var ( - mergeInfoMap = map[reflect.Type]*mergeInfo{} - mergeInfoLock sync.Mutex -) - -func getMergeInfo(t reflect.Type) *mergeInfo { - mergeInfoLock.Lock() - defer mergeInfoLock.Unlock() - mi := mergeInfoMap[t] - if mi == nil { - mi = &mergeInfo{typ: t} - mergeInfoMap[t] = mi - } - return mi -} - -// merge merges src into dst assuming they are both of type *mi.typ. -func (mi *mergeInfo) merge(dst, src pointer) { - if dst.isNil() { - panic("proto: nil destination") - } - if src.isNil() { - return // Nothing to do. - } - - if atomic.LoadInt32(&mi.initialized) == 0 { - mi.computeMergeInfo() - } - - for _, fi := range mi.fields { - sfp := src.offset(fi.field) - - // As an optimization, we can avoid the merge function call cost - // if we know for sure that the source will have no effect - // by checking if it is the zero value. - if unsafeAllowed { - if fi.isPointer && sfp.getPointer().isNil() { // Could be slice or string - continue - } - if fi.basicWidth > 0 { - switch { - case fi.basicWidth == 1 && !*sfp.toBool(): - continue - case fi.basicWidth == 4 && *sfp.toUint32() == 0: - continue - case fi.basicWidth == 8 && *sfp.toUint64() == 0: - continue - } - } - } - - dfp := dst.offset(fi.field) - fi.merge(dfp, sfp) - } - - // TODO: Make this faster? - out := dst.asPointerTo(mi.typ).Elem() - in := src.asPointerTo(mi.typ).Elem() - if emIn, err := extendable(in.Addr().Interface()); err == nil { - emOut, _ := extendable(out.Addr().Interface()) - mIn, muIn := emIn.extensionsRead() - if mIn != nil { - mOut := emOut.extensionsWrite() - muIn.Lock() - mergeExtension(mOut, mIn) - muIn.Unlock() - } - } - - if mi.unrecognized.IsValid() { - if b := *src.offset(mi.unrecognized).toBytes(); len(b) > 0 { - *dst.offset(mi.unrecognized).toBytes() = append([]byte(nil), b...) - } - } -} - -func (mi *mergeInfo) computeMergeInfo() { - mi.lock.Lock() - defer mi.lock.Unlock() - if mi.initialized != 0 { - return - } - t := mi.typ - n := t.NumField() - - props := GetProperties(t) - for i := 0; i < n; i++ { - f := t.Field(i) - if strings.HasPrefix(f.Name, "XXX_") { - continue - } - - mfi := mergeFieldInfo{field: toField(&f)} - tf := f.Type - - // As an optimization, we can avoid the merge function call cost - // if we know for sure that the source will have no effect - // by checking if it is the zero value. - if unsafeAllowed { - switch tf.Kind() { - case reflect.Ptr, reflect.Slice, reflect.String: - // As a special case, we assume slices and strings are pointers - // since we know that the first field in the SliceSlice or - // StringHeader is a data pointer. - mfi.isPointer = true - case reflect.Bool: - mfi.basicWidth = 1 - case reflect.Int32, reflect.Uint32, reflect.Float32: - mfi.basicWidth = 4 - case reflect.Int64, reflect.Uint64, reflect.Float64: - mfi.basicWidth = 8 - } - } - - // Unwrap tf to get at its most basic type. - var isPointer, isSlice bool - if tf.Kind() == reflect.Slice && tf.Elem().Kind() != reflect.Uint8 { - isSlice = true - tf = tf.Elem() - } - if tf.Kind() == reflect.Ptr { - isPointer = true - tf = tf.Elem() - } - if isPointer && isSlice && tf.Kind() != reflect.Struct { - panic("both pointer and slice for basic type in " + tf.Name()) - } - - switch tf.Kind() { - case reflect.Int32: - switch { - case isSlice: // E.g., []int32 - mfi.merge = func(dst, src pointer) { - // NOTE: toInt32Slice is not defined (see pointer_reflect.go). - /* - sfsp := src.toInt32Slice() - if *sfsp != nil { - dfsp := dst.toInt32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []int64{} - } - } - */ - sfs := src.getInt32Slice() - if sfs != nil { - dfs := dst.getInt32Slice() - dfs = append(dfs, sfs...) - if dfs == nil { - dfs = []int32{} - } - dst.setInt32Slice(dfs) - } - } - case isPointer: // E.g., *int32 - mfi.merge = func(dst, src pointer) { - // NOTE: toInt32Ptr is not defined (see pointer_reflect.go). - /* - sfpp := src.toInt32Ptr() - if *sfpp != nil { - dfpp := dst.toInt32Ptr() - if *dfpp == nil { - *dfpp = Int32(**sfpp) - } else { - **dfpp = **sfpp - } - } - */ - sfp := src.getInt32Ptr() - if sfp != nil { - dfp := dst.getInt32Ptr() - if dfp == nil { - dst.setInt32Ptr(*sfp) - } else { - *dfp = *sfp - } - } - } - default: // E.g., int32 - mfi.merge = func(dst, src pointer) { - if v := *src.toInt32(); v != 0 { - *dst.toInt32() = v - } - } - } - case reflect.Int64: - switch { - case isSlice: // E.g., []int64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toInt64Slice() - if *sfsp != nil { - dfsp := dst.toInt64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []int64{} - } - } - } - case isPointer: // E.g., *int64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toInt64Ptr() - if *sfpp != nil { - dfpp := dst.toInt64Ptr() - if *dfpp == nil { - *dfpp = Int64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., int64 - mfi.merge = func(dst, src pointer) { - if v := *src.toInt64(); v != 0 { - *dst.toInt64() = v - } - } - } - case reflect.Uint32: - switch { - case isSlice: // E.g., []uint32 - mfi.merge = func(dst, src pointer) { - sfsp := src.toUint32Slice() - if *sfsp != nil { - dfsp := dst.toUint32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []uint32{} - } - } - } - case isPointer: // E.g., *uint32 - mfi.merge = func(dst, src pointer) { - sfpp := src.toUint32Ptr() - if *sfpp != nil { - dfpp := dst.toUint32Ptr() - if *dfpp == nil { - *dfpp = Uint32(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., uint32 - mfi.merge = func(dst, src pointer) { - if v := *src.toUint32(); v != 0 { - *dst.toUint32() = v - } - } - } - case reflect.Uint64: - switch { - case isSlice: // E.g., []uint64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toUint64Slice() - if *sfsp != nil { - dfsp := dst.toUint64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []uint64{} - } - } - } - case isPointer: // E.g., *uint64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toUint64Ptr() - if *sfpp != nil { - dfpp := dst.toUint64Ptr() - if *dfpp == nil { - *dfpp = Uint64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., uint64 - mfi.merge = func(dst, src pointer) { - if v := *src.toUint64(); v != 0 { - *dst.toUint64() = v - } - } - } - case reflect.Float32: - switch { - case isSlice: // E.g., []float32 - mfi.merge = func(dst, src pointer) { - sfsp := src.toFloat32Slice() - if *sfsp != nil { - dfsp := dst.toFloat32Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []float32{} - } - } - } - case isPointer: // E.g., *float32 - mfi.merge = func(dst, src pointer) { - sfpp := src.toFloat32Ptr() - if *sfpp != nil { - dfpp := dst.toFloat32Ptr() - if *dfpp == nil { - *dfpp = Float32(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., float32 - mfi.merge = func(dst, src pointer) { - if v := *src.toFloat32(); v != 0 { - *dst.toFloat32() = v - } - } - } - case reflect.Float64: - switch { - case isSlice: // E.g., []float64 - mfi.merge = func(dst, src pointer) { - sfsp := src.toFloat64Slice() - if *sfsp != nil { - dfsp := dst.toFloat64Slice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []float64{} - } - } - } - case isPointer: // E.g., *float64 - mfi.merge = func(dst, src pointer) { - sfpp := src.toFloat64Ptr() - if *sfpp != nil { - dfpp := dst.toFloat64Ptr() - if *dfpp == nil { - *dfpp = Float64(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., float64 - mfi.merge = func(dst, src pointer) { - if v := *src.toFloat64(); v != 0 { - *dst.toFloat64() = v - } - } - } - case reflect.Bool: - switch { - case isSlice: // E.g., []bool - mfi.merge = func(dst, src pointer) { - sfsp := src.toBoolSlice() - if *sfsp != nil { - dfsp := dst.toBoolSlice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []bool{} - } - } - } - case isPointer: // E.g., *bool - mfi.merge = func(dst, src pointer) { - sfpp := src.toBoolPtr() - if *sfpp != nil { - dfpp := dst.toBoolPtr() - if *dfpp == nil { - *dfpp = Bool(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., bool - mfi.merge = func(dst, src pointer) { - if v := *src.toBool(); v { - *dst.toBool() = v - } - } - } - case reflect.String: - switch { - case isSlice: // E.g., []string - mfi.merge = func(dst, src pointer) { - sfsp := src.toStringSlice() - if *sfsp != nil { - dfsp := dst.toStringSlice() - *dfsp = append(*dfsp, *sfsp...) - if *dfsp == nil { - *dfsp = []string{} - } - } - } - case isPointer: // E.g., *string - mfi.merge = func(dst, src pointer) { - sfpp := src.toStringPtr() - if *sfpp != nil { - dfpp := dst.toStringPtr() - if *dfpp == nil { - *dfpp = String(**sfpp) - } else { - **dfpp = **sfpp - } - } - } - default: // E.g., string - mfi.merge = func(dst, src pointer) { - if v := *src.toString(); v != "" { - *dst.toString() = v - } - } - } - case reflect.Slice: - isProto3 := props.Prop[i].proto3 - switch { - case isPointer: - panic("bad pointer in byte slice case in " + tf.Name()) - case tf.Elem().Kind() != reflect.Uint8: - panic("bad element kind in byte slice case in " + tf.Name()) - case isSlice: // E.g., [][]byte - mfi.merge = func(dst, src pointer) { - sbsp := src.toBytesSlice() - if *sbsp != nil { - dbsp := dst.toBytesSlice() - for _, sb := range *sbsp { - if sb == nil { - *dbsp = append(*dbsp, nil) - } else { - *dbsp = append(*dbsp, append([]byte{}, sb...)) - } - } - if *dbsp == nil { - *dbsp = [][]byte{} - } - } - } - default: // E.g., []byte - mfi.merge = func(dst, src pointer) { - sbp := src.toBytes() - if *sbp != nil { - dbp := dst.toBytes() - if !isProto3 || len(*sbp) > 0 { - *dbp = append([]byte{}, *sbp...) - } - } - } - } - case reflect.Struct: - switch { - case !isPointer: - panic(fmt.Sprintf("message field %s without pointer", tf)) - case isSlice: // E.g., []*pb.T - mi := getMergeInfo(tf) - mfi.merge = func(dst, src pointer) { - sps := src.getPointerSlice() - if sps != nil { - dps := dst.getPointerSlice() - for _, sp := range sps { - var dp pointer - if !sp.isNil() { - dp = valToPointer(reflect.New(tf)) - mi.merge(dp, sp) - } - dps = append(dps, dp) - } - if dps == nil { - dps = []pointer{} - } - dst.setPointerSlice(dps) - } - } - default: // E.g., *pb.T - mi := getMergeInfo(tf) - mfi.merge = func(dst, src pointer) { - sp := src.getPointer() - if !sp.isNil() { - dp := dst.getPointer() - if dp.isNil() { - dp = valToPointer(reflect.New(tf)) - dst.setPointer(dp) - } - mi.merge(dp, sp) - } - } - } - case reflect.Map: - switch { - case isPointer || isSlice: - panic("bad pointer or slice in map case in " + tf.Name()) - default: // E.g., map[K]V - mfi.merge = func(dst, src pointer) { - sm := src.asPointerTo(tf).Elem() - if sm.Len() == 0 { - return - } - dm := dst.asPointerTo(tf).Elem() - if dm.IsNil() { - dm.Set(reflect.MakeMap(tf)) - } - - switch tf.Elem().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - val = reflect.ValueOf(Clone(val.Interface().(Message))) - dm.SetMapIndex(key, val) - } - case reflect.Slice: // E.g. Bytes type (e.g., []byte) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - val = reflect.ValueOf(append([]byte{}, val.Bytes()...)) - dm.SetMapIndex(key, val) - } - default: // Basic type (e.g., string) - for _, key := range sm.MapKeys() { - val := sm.MapIndex(key) - dm.SetMapIndex(key, val) - } - } - } - } - case reflect.Interface: - // Must be oneof field. - switch { - case isPointer || isSlice: - panic("bad pointer or slice in interface case in " + tf.Name()) - default: // E.g., interface{} - // TODO: Make this faster? - mfi.merge = func(dst, src pointer) { - su := src.asPointerTo(tf).Elem() - if !su.IsNil() { - du := dst.asPointerTo(tf).Elem() - typ := su.Elem().Type() - if du.IsNil() || du.Elem().Type() != typ { - du.Set(reflect.New(typ.Elem())) // Initialize interface if empty - } - sv := su.Elem().Elem().Field(0) - if sv.Kind() == reflect.Ptr && sv.IsNil() { - return - } - dv := du.Elem().Elem().Field(0) - if dv.Kind() == reflect.Ptr && dv.IsNil() { - dv.Set(reflect.New(sv.Type().Elem())) // Initialize proto message if empty - } - switch sv.Type().Kind() { - case reflect.Ptr: // Proto struct (e.g., *T) - Merge(dv.Interface().(Message), sv.Interface().(Message)) - case reflect.Slice: // E.g. Bytes type (e.g., []byte) - dv.Set(reflect.ValueOf(append([]byte{}, sv.Bytes()...))) - default: // Basic type (e.g., string) - dv.Set(sv) - } - } - } - } - default: - panic(fmt.Sprintf("merger not found for type:%s", tf)) - } - mi.fields = append(mi.fields, mfi) - } - - mi.unrecognized = invalidField - if f, ok := t.FieldByName("XXX_unrecognized"); ok { - if f.Type != reflect.TypeOf([]byte{}) { - panic("expected XXX_unrecognized to be of type []byte") - } - mi.unrecognized = toField(&f) - } - - atomic.StoreInt32(&mi.initialized, 1) -} diff --git a/vendor/github.com/golang/protobuf/proto/table_unmarshal.go b/vendor/github.com/golang/protobuf/proto/table_unmarshal.go deleted file mode 100644 index 55f0340..0000000 --- a/vendor/github.com/golang/protobuf/proto/table_unmarshal.go +++ /dev/null @@ -1,1967 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -import ( - "errors" - "fmt" - "io" - "math" - "reflect" - "strconv" - "strings" - "sync" - "sync/atomic" - "unicode/utf8" -) - -// Unmarshal is the entry point from the generated .pb.go files. -// This function is not intended to be used by non-generated code. -// This function is not subject to any compatibility guarantee. -// msg contains a pointer to a protocol buffer struct. -// b is the data to be unmarshaled into the protocol buffer. -// a is a pointer to a place to store cached unmarshal information. -func (a *InternalMessageInfo) Unmarshal(msg Message, b []byte) error { - // Load the unmarshal information for this message type. - // The atomic load ensures memory consistency. - u := atomicLoadUnmarshalInfo(&a.unmarshal) - if u == nil { - // Slow path: find unmarshal info for msg, update a with it. - u = getUnmarshalInfo(reflect.TypeOf(msg).Elem()) - atomicStoreUnmarshalInfo(&a.unmarshal, u) - } - // Then do the unmarshaling. - err := u.unmarshal(toPointer(&msg), b) - return err -} - -type unmarshalInfo struct { - typ reflect.Type // type of the protobuf struct - - // 0 = only typ field is initialized - // 1 = completely initialized - initialized int32 - lock sync.Mutex // prevents double initialization - dense []unmarshalFieldInfo // fields indexed by tag # - sparse map[uint64]unmarshalFieldInfo // fields indexed by tag # - reqFields []string // names of required fields - reqMask uint64 // 1< 0 { - // Read tag and wire type. - // Special case 1 and 2 byte varints. - var x uint64 - if b[0] < 128 { - x = uint64(b[0]) - b = b[1:] - } else if len(b) >= 2 && b[1] < 128 { - x = uint64(b[0]&0x7f) + uint64(b[1])<<7 - b = b[2:] - } else { - var n int - x, n = decodeVarint(b) - if n == 0 { - return io.ErrUnexpectedEOF - } - b = b[n:] - } - tag := x >> 3 - wire := int(x) & 7 - - // Dispatch on the tag to one of the unmarshal* functions below. - var f unmarshalFieldInfo - if tag < uint64(len(u.dense)) { - f = u.dense[tag] - } else { - f = u.sparse[tag] - } - if fn := f.unmarshal; fn != nil { - var err error - b, err = fn(b, m.offset(f.field), wire) - if err == nil { - reqMask |= f.reqMask - continue - } - if r, ok := err.(*RequiredNotSetError); ok { - // Remember this error, but keep parsing. We need to produce - // a full parse even if a required field is missing. - rnse = r - reqMask |= f.reqMask - continue - } - if err != errInternalBadWireType { - return err - } - // Fragments with bad wire type are treated as unknown fields. - } - - // Unknown tag. - if !u.unrecognized.IsValid() { - // Don't keep unrecognized data; just skip it. - var err error - b, err = skipField(b, wire) - if err != nil { - return err - } - continue - } - // Keep unrecognized data around. - // maybe in extensions, maybe in the unrecognized field. - z := m.offset(u.unrecognized).toBytes() - var emap map[int32]Extension - var e Extension - for _, r := range u.extensionRanges { - if uint64(r.Start) <= tag && tag <= uint64(r.End) { - if u.extensions.IsValid() { - mp := m.offset(u.extensions).toExtensions() - emap = mp.extensionsWrite() - e = emap[int32(tag)] - z = &e.enc - break - } - if u.oldExtensions.IsValid() { - p := m.offset(u.oldExtensions).toOldExtensions() - emap = *p - if emap == nil { - emap = map[int32]Extension{} - *p = emap - } - e = emap[int32(tag)] - z = &e.enc - break - } - panic("no extensions field available") - } - } - - // Use wire type to skip data. - var err error - b0 := b - b, err = skipField(b, wire) - if err != nil { - return err - } - *z = encodeVarint(*z, tag<<3|uint64(wire)) - *z = append(*z, b0[:len(b0)-len(b)]...) - - if emap != nil { - emap[int32(tag)] = e - } - } - if rnse != nil { - // A required field of a submessage/group is missing. Return that error. - return rnse - } - if reqMask != u.reqMask { - // A required field of this message is missing. - for _, n := range u.reqFields { - if reqMask&1 == 0 { - return &RequiredNotSetError{n} - } - reqMask >>= 1 - } - } - return nil -} - -// computeUnmarshalInfo fills in u with information for use -// in unmarshaling protocol buffers of type u.typ. -func (u *unmarshalInfo) computeUnmarshalInfo() { - u.lock.Lock() - defer u.lock.Unlock() - if u.initialized != 0 { - return - } - t := u.typ - n := t.NumField() - - // Set up the "not found" value for the unrecognized byte buffer. - // This is the default for proto3. - u.unrecognized = invalidField - u.extensions = invalidField - u.oldExtensions = invalidField - - // List of the generated type and offset for each oneof field. - type oneofField struct { - ityp reflect.Type // interface type of oneof field - field field // offset in containing message - } - var oneofFields []oneofField - - for i := 0; i < n; i++ { - f := t.Field(i) - if f.Name == "XXX_unrecognized" { - // The byte slice used to hold unrecognized input is special. - if f.Type != reflect.TypeOf(([]byte)(nil)) { - panic("bad type for XXX_unrecognized field: " + f.Type.Name()) - } - u.unrecognized = toField(&f) - continue - } - if f.Name == "XXX_InternalExtensions" { - // Ditto here. - if f.Type != reflect.TypeOf(XXX_InternalExtensions{}) { - panic("bad type for XXX_InternalExtensions field: " + f.Type.Name()) - } - u.extensions = toField(&f) - if f.Tag.Get("protobuf_messageset") == "1" { - u.isMessageSet = true - } - continue - } - if f.Name == "XXX_extensions" { - // An older form of the extensions field. - if f.Type != reflect.TypeOf((map[int32]Extension)(nil)) { - panic("bad type for XXX_extensions field: " + f.Type.Name()) - } - u.oldExtensions = toField(&f) - continue - } - if f.Name == "XXX_NoUnkeyedLiteral" || f.Name == "XXX_sizecache" { - continue - } - - oneof := f.Tag.Get("protobuf_oneof") - if oneof != "" { - oneofFields = append(oneofFields, oneofField{f.Type, toField(&f)}) - // The rest of oneof processing happens below. - continue - } - - tags := f.Tag.Get("protobuf") - tagArray := strings.Split(tags, ",") - if len(tagArray) < 2 { - panic("protobuf tag not enough fields in " + t.Name() + "." + f.Name + ": " + tags) - } - tag, err := strconv.Atoi(tagArray[1]) - if err != nil { - panic("protobuf tag field not an integer: " + tagArray[1]) - } - - name := "" - for _, tag := range tagArray[3:] { - if strings.HasPrefix(tag, "name=") { - name = tag[5:] - } - } - - // Extract unmarshaling function from the field (its type and tags). - unmarshal := fieldUnmarshaler(&f) - - // Required field? - var reqMask uint64 - if tagArray[2] == "req" { - bit := len(u.reqFields) - u.reqFields = append(u.reqFields, name) - reqMask = uint64(1) << uint(bit) - // TODO: if we have more than 64 required fields, we end up - // not verifying that all required fields are present. - // Fix this, perhaps using a count of required fields? - } - - // Store the info in the correct slot in the message. - u.setTag(tag, toField(&f), unmarshal, reqMask) - } - - // Find any types associated with oneof fields. - // TODO: XXX_OneofFuncs returns more info than we need. Get rid of some of it? - fn := reflect.Zero(reflect.PtrTo(t)).MethodByName("XXX_OneofFuncs") - if fn.IsValid() { - res := fn.Call(nil)[3] // last return value from XXX_OneofFuncs: []interface{} - for i := res.Len() - 1; i >= 0; i-- { - v := res.Index(i) // interface{} - tptr := reflect.ValueOf(v.Interface()).Type() // *Msg_X - typ := tptr.Elem() // Msg_X - - f := typ.Field(0) // oneof implementers have one field - baseUnmarshal := fieldUnmarshaler(&f) - tagstr := strings.Split(f.Tag.Get("protobuf"), ",")[1] - tag, err := strconv.Atoi(tagstr) - if err != nil { - panic("protobuf tag field not an integer: " + tagstr) - } - - // Find the oneof field that this struct implements. - // Might take O(n^2) to process all of the oneofs, but who cares. - for _, of := range oneofFields { - if tptr.Implements(of.ityp) { - // We have found the corresponding interface for this struct. - // That lets us know where this struct should be stored - // when we encounter it during unmarshaling. - unmarshal := makeUnmarshalOneof(typ, of.ityp, baseUnmarshal) - u.setTag(tag, of.field, unmarshal, 0) - } - } - } - } - - // Get extension ranges, if any. - fn = reflect.Zero(reflect.PtrTo(t)).MethodByName("ExtensionRangeArray") - if fn.IsValid() { - if !u.extensions.IsValid() && !u.oldExtensions.IsValid() { - panic("a message with extensions, but no extensions field in " + t.Name()) - } - u.extensionRanges = fn.Call(nil)[0].Interface().([]ExtensionRange) - } - - // Explicitly disallow tag 0. This will ensure we flag an error - // when decoding a buffer of all zeros. Without this code, we - // would decode and skip an all-zero buffer of even length. - // [0 0] is [tag=0/wiretype=varint varint-encoded-0]. - u.setTag(0, zeroField, func(b []byte, f pointer, w int) ([]byte, error) { - return nil, fmt.Errorf("proto: %s: illegal tag 0 (wire type %d)", t, w) - }, 0) - - // Set mask for required field check. - u.reqMask = uint64(1)<= 0 && (tag < 16 || tag < 2*n) { // TODO: what are the right numbers here? - for len(u.dense) <= tag { - u.dense = append(u.dense, unmarshalFieldInfo{}) - } - u.dense[tag] = i - return - } - if u.sparse == nil { - u.sparse = map[uint64]unmarshalFieldInfo{} - } - u.sparse[uint64(tag)] = i -} - -// fieldUnmarshaler returns an unmarshaler for the given field. -func fieldUnmarshaler(f *reflect.StructField) unmarshaler { - if f.Type.Kind() == reflect.Map { - return makeUnmarshalMap(f) - } - return typeUnmarshaler(f.Type, f.Tag.Get("protobuf")) -} - -// typeUnmarshaler returns an unmarshaler for the given field type / field tag pair. -func typeUnmarshaler(t reflect.Type, tags string) unmarshaler { - tagArray := strings.Split(tags, ",") - encoding := tagArray[0] - name := "unknown" - for _, tag := range tagArray[3:] { - if strings.HasPrefix(tag, "name=") { - name = tag[5:] - } - } - - // Figure out packaging (pointer, slice, or both) - slice := false - pointer := false - if t.Kind() == reflect.Slice && t.Elem().Kind() != reflect.Uint8 { - slice = true - t = t.Elem() - } - if t.Kind() == reflect.Ptr { - pointer = true - t = t.Elem() - } - - // We'll never have both pointer and slice for basic types. - if pointer && slice && t.Kind() != reflect.Struct { - panic("both pointer and slice for basic type in " + t.Name()) - } - - switch t.Kind() { - case reflect.Bool: - if pointer { - return unmarshalBoolPtr - } - if slice { - return unmarshalBoolSlice - } - return unmarshalBoolValue - case reflect.Int32: - switch encoding { - case "fixed32": - if pointer { - return unmarshalFixedS32Ptr - } - if slice { - return unmarshalFixedS32Slice - } - return unmarshalFixedS32Value - case "varint": - // this could be int32 or enum - if pointer { - return unmarshalInt32Ptr - } - if slice { - return unmarshalInt32Slice - } - return unmarshalInt32Value - case "zigzag32": - if pointer { - return unmarshalSint32Ptr - } - if slice { - return unmarshalSint32Slice - } - return unmarshalSint32Value - } - case reflect.Int64: - switch encoding { - case "fixed64": - if pointer { - return unmarshalFixedS64Ptr - } - if slice { - return unmarshalFixedS64Slice - } - return unmarshalFixedS64Value - case "varint": - if pointer { - return unmarshalInt64Ptr - } - if slice { - return unmarshalInt64Slice - } - return unmarshalInt64Value - case "zigzag64": - if pointer { - return unmarshalSint64Ptr - } - if slice { - return unmarshalSint64Slice - } - return unmarshalSint64Value - } - case reflect.Uint32: - switch encoding { - case "fixed32": - if pointer { - return unmarshalFixed32Ptr - } - if slice { - return unmarshalFixed32Slice - } - return unmarshalFixed32Value - case "varint": - if pointer { - return unmarshalUint32Ptr - } - if slice { - return unmarshalUint32Slice - } - return unmarshalUint32Value - } - case reflect.Uint64: - switch encoding { - case "fixed64": - if pointer { - return unmarshalFixed64Ptr - } - if slice { - return unmarshalFixed64Slice - } - return unmarshalFixed64Value - case "varint": - if pointer { - return unmarshalUint64Ptr - } - if slice { - return unmarshalUint64Slice - } - return unmarshalUint64Value - } - case reflect.Float32: - if pointer { - return unmarshalFloat32Ptr - } - if slice { - return unmarshalFloat32Slice - } - return unmarshalFloat32Value - case reflect.Float64: - if pointer { - return unmarshalFloat64Ptr - } - if slice { - return unmarshalFloat64Slice - } - return unmarshalFloat64Value - case reflect.Map: - panic("map type in typeUnmarshaler in " + t.Name()) - case reflect.Slice: - if pointer { - panic("bad pointer in slice case in " + t.Name()) - } - if slice { - return unmarshalBytesSlice - } - return unmarshalBytesValue - case reflect.String: - if pointer { - return unmarshalStringPtr - } - if slice { - return unmarshalStringSlice - } - return unmarshalStringValue - case reflect.Struct: - // message or group field - if !pointer { - panic(fmt.Sprintf("message/group field %s:%s without pointer", t, encoding)) - } - switch encoding { - case "bytes": - if slice { - return makeUnmarshalMessageSlicePtr(getUnmarshalInfo(t), name) - } - return makeUnmarshalMessagePtr(getUnmarshalInfo(t), name) - case "group": - if slice { - return makeUnmarshalGroupSlicePtr(getUnmarshalInfo(t), name) - } - return makeUnmarshalGroupPtr(getUnmarshalInfo(t), name) - } - } - panic(fmt.Sprintf("unmarshaler not found type:%s encoding:%s", t, encoding)) -} - -// Below are all the unmarshalers for individual fields of various types. - -func unmarshalInt64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - *f.toInt64() = v - return b, nil -} - -func unmarshalInt64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - *f.toInt64Ptr() = &v - return b, nil -} - -func unmarshalInt64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - s := f.toInt64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x) - s := f.toInt64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalSint64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - *f.toInt64() = v - return b, nil -} - -func unmarshalSint64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - *f.toInt64Ptr() = &v - return b, nil -} - -func unmarshalSint64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - s := f.toInt64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int64(x>>1) ^ int64(x)<<63>>63 - s := f.toInt64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalUint64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - *f.toUint64() = v - return b, nil -} - -func unmarshalUint64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - *f.toUint64Ptr() = &v - return b, nil -} - -func unmarshalUint64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - s := f.toUint64Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint64(x) - s := f.toUint64Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalInt32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - *f.toInt32() = v - return b, nil -} - -func unmarshalInt32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.setInt32Ptr(v) - return b, nil -} - -func unmarshalInt32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.appendInt32Slice(v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x) - f.appendInt32Slice(v) - return b, nil -} - -func unmarshalSint32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - *f.toInt32() = v - return b, nil -} - -func unmarshalSint32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.setInt32Ptr(v) - return b, nil -} - -func unmarshalSint32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.appendInt32Slice(v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := int32(x>>1) ^ int32(x)<<31>>31 - f.appendInt32Slice(v) - return b, nil -} - -func unmarshalUint32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - *f.toUint32() = v - return b, nil -} - -func unmarshalUint32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - *f.toUint32Ptr() = &v - return b, nil -} - -func unmarshalUint32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - s := f.toUint32Slice() - *s = append(*s, v) - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - v := uint32(x) - s := f.toUint32Slice() - *s = append(*s, v) - return b, nil -} - -func unmarshalFixed64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - *f.toUint64() = v - return b[8:], nil -} - -func unmarshalFixed64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - *f.toUint64Ptr() = &v - return b[8:], nil -} - -func unmarshalFixed64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - s := f.toUint64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56 - s := f.toUint64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFixedS64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - *f.toInt64() = v - return b[8:], nil -} - -func unmarshalFixedS64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - *f.toInt64Ptr() = &v - return b[8:], nil -} - -func unmarshalFixedS64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - s := f.toInt64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := int64(b[0]) | int64(b[1])<<8 | int64(b[2])<<16 | int64(b[3])<<24 | int64(b[4])<<32 | int64(b[5])<<40 | int64(b[6])<<48 | int64(b[7])<<56 - s := f.toInt64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFixed32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - *f.toUint32() = v - return b[4:], nil -} - -func unmarshalFixed32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - *f.toUint32Ptr() = &v - return b[4:], nil -} - -func unmarshalFixed32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - s := f.toUint32Slice() - *s = append(*s, v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24 - s := f.toUint32Slice() - *s = append(*s, v) - return b[4:], nil -} - -func unmarshalFixedS32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - *f.toInt32() = v - return b[4:], nil -} - -func unmarshalFixedS32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.setInt32Ptr(v) - return b[4:], nil -} - -func unmarshalFixedS32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.appendInt32Slice(v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := int32(b[0]) | int32(b[1])<<8 | int32(b[2])<<16 | int32(b[3])<<24 - f.appendInt32Slice(v) - return b[4:], nil -} - -func unmarshalBoolValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - // Note: any length varint is allowed, even though any sane - // encoder will use one byte. - // See https://github.com/golang/protobuf/issues/76 - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - // TODO: check if x>1? Tests seem to indicate no. - v := x != 0 - *f.toBool() = v - return b[n:], nil -} - -func unmarshalBoolPtr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - *f.toBoolPtr() = &v - return b[n:], nil -} - -func unmarshalBoolSlice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - x, n = decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - s := f.toBoolSlice() - *s = append(*s, v) - b = b[n:] - } - return res, nil - } - if w != WireVarint { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - v := x != 0 - s := f.toBoolSlice() - *s = append(*s, v) - return b[n:], nil -} - -func unmarshalFloat64Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - *f.toFloat64() = v - return b[8:], nil -} - -func unmarshalFloat64Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - *f.toFloat64Ptr() = &v - return b[8:], nil -} - -func unmarshalFloat64Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - s := f.toFloat64Slice() - *s = append(*s, v) - b = b[8:] - } - return res, nil - } - if w != WireFixed64 { - return b, errInternalBadWireType - } - if len(b) < 8 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float64frombits(uint64(b[0]) | uint64(b[1])<<8 | uint64(b[2])<<16 | uint64(b[3])<<24 | uint64(b[4])<<32 | uint64(b[5])<<40 | uint64(b[6])<<48 | uint64(b[7])<<56) - s := f.toFloat64Slice() - *s = append(*s, v) - return b[8:], nil -} - -func unmarshalFloat32Value(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - *f.toFloat32() = v - return b[4:], nil -} - -func unmarshalFloat32Ptr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - *f.toFloat32Ptr() = &v - return b[4:], nil -} - -func unmarshalFloat32Slice(b []byte, f pointer, w int) ([]byte, error) { - if w == WireBytes { // packed - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - res := b[x:] - b = b[:x] - for len(b) > 0 { - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - s := f.toFloat32Slice() - *s = append(*s, v) - b = b[4:] - } - return res, nil - } - if w != WireFixed32 { - return b, errInternalBadWireType - } - if len(b) < 4 { - return nil, io.ErrUnexpectedEOF - } - v := math.Float32frombits(uint32(b[0]) | uint32(b[1])<<8 | uint32(b[2])<<16 | uint32(b[3])<<24) - s := f.toFloat32Slice() - *s = append(*s, v) - return b[4:], nil -} - -func unmarshalStringValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - if !utf8.ValidString(v) { - return nil, errInvalidUTF8 - } - *f.toString() = v - return b[x:], nil -} - -func unmarshalStringPtr(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - if !utf8.ValidString(v) { - return nil, errInvalidUTF8 - } - *f.toStringPtr() = &v - return b[x:], nil -} - -func unmarshalStringSlice(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := string(b[:x]) - if !utf8.ValidString(v) { - return nil, errInvalidUTF8 - } - s := f.toStringSlice() - *s = append(*s, v) - return b[x:], nil -} - -var emptyBuf [0]byte - -func unmarshalBytesValue(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - // The use of append here is a trick which avoids the zeroing - // that would be required if we used a make/copy pair. - // We append to emptyBuf instead of nil because we want - // a non-nil result even when the length is 0. - v := append(emptyBuf[:], b[:x]...) - *f.toBytes() = v - return b[x:], nil -} - -func unmarshalBytesSlice(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := append(emptyBuf[:], b[:x]...) - s := f.toBytesSlice() - *s = append(*s, v) - return b[x:], nil -} - -func makeUnmarshalMessagePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - // First read the message field to see if something is there. - // The semantics of multiple submessages are weird. Instead of - // the last one winning (as it is for all other fields), multiple - // submessages are merged. - v := f.getPointer() - if v.isNil() { - v = valToPointer(reflect.New(sub.typ)) - f.setPointer(v) - } - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - return b[x:], err - } -} - -func makeUnmarshalMessageSlicePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireBytes { - return b, errInternalBadWireType - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - v := valToPointer(reflect.New(sub.typ)) - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - f.appendPointer(v) - return b[x:], err - } -} - -func makeUnmarshalGroupPtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireStartGroup { - return b, errInternalBadWireType - } - x, y := findEndGroup(b) - if x < 0 { - return nil, io.ErrUnexpectedEOF - } - v := f.getPointer() - if v.isNil() { - v = valToPointer(reflect.New(sub.typ)) - f.setPointer(v) - } - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - return b[y:], err - } -} - -func makeUnmarshalGroupSlicePtr(sub *unmarshalInfo, name string) unmarshaler { - return func(b []byte, f pointer, w int) ([]byte, error) { - if w != WireStartGroup { - return b, errInternalBadWireType - } - x, y := findEndGroup(b) - if x < 0 { - return nil, io.ErrUnexpectedEOF - } - v := valToPointer(reflect.New(sub.typ)) - err := sub.unmarshal(v, b[:x]) - if err != nil { - if r, ok := err.(*RequiredNotSetError); ok { - r.field = name + "." + r.field - } else { - return nil, err - } - } - f.appendPointer(v) - return b[y:], err - } -} - -func makeUnmarshalMap(f *reflect.StructField) unmarshaler { - t := f.Type - kt := t.Key() - vt := t.Elem() - unmarshalKey := typeUnmarshaler(kt, f.Tag.Get("protobuf_key")) - unmarshalVal := typeUnmarshaler(vt, f.Tag.Get("protobuf_val")) - return func(b []byte, f pointer, w int) ([]byte, error) { - // The map entry is a submessage. Figure out how big it is. - if w != WireBytes { - return nil, fmt.Errorf("proto: bad wiretype for map field: got %d want %d", w, WireBytes) - } - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - b = b[n:] - if x > uint64(len(b)) { - return nil, io.ErrUnexpectedEOF - } - r := b[x:] // unused data to return - b = b[:x] // data for map entry - - // Note: we could use #keys * #values ~= 200 functions - // to do map decoding without reflection. Probably not worth it. - // Maps will be somewhat slow. Oh well. - - // Read key and value from data. - k := reflect.New(kt) - v := reflect.New(vt) - for len(b) > 0 { - x, n := decodeVarint(b) - if n == 0 { - return nil, io.ErrUnexpectedEOF - } - wire := int(x) & 7 - b = b[n:] - - var err error - switch x >> 3 { - case 1: - b, err = unmarshalKey(b, valToPointer(k), wire) - case 2: - b, err = unmarshalVal(b, valToPointer(v), wire) - default: - err = errInternalBadWireType // skip unknown tag - } - - if err == nil { - continue - } - if err != errInternalBadWireType { - return nil, err - } - - // Skip past unknown fields. - b, err = skipField(b, wire) - if err != nil { - return nil, err - } - } - - // Get map, allocate if needed. - m := f.asPointerTo(t).Elem() // an addressable map[K]T - if m.IsNil() { - m.Set(reflect.MakeMap(t)) - } - - // Insert into map. - m.SetMapIndex(k.Elem(), v.Elem()) - - return r, nil - } -} - -// makeUnmarshalOneof makes an unmarshaler for oneof fields. -// for: -// message Msg { -// oneof F { -// int64 X = 1; -// float64 Y = 2; -// } -// } -// typ is the type of the concrete entry for a oneof case (e.g. Msg_X). -// ityp is the interface type of the oneof field (e.g. isMsg_F). -// unmarshal is the unmarshaler for the base type of the oneof case (e.g. int64). -// Note that this function will be called once for each case in the oneof. -func makeUnmarshalOneof(typ, ityp reflect.Type, unmarshal unmarshaler) unmarshaler { - sf := typ.Field(0) - field0 := toField(&sf) - return func(b []byte, f pointer, w int) ([]byte, error) { - // Allocate holder for value. - v := reflect.New(typ) - - // Unmarshal data into holder. - // We unmarshal into the first field of the holder object. - var err error - b, err = unmarshal(b, valToPointer(v).offset(field0), w) - if err != nil { - return nil, err - } - - // Write pointer to holder into target field. - f.asPointerTo(ityp).Elem().Set(v) - - return b, nil - } -} - -// Error used by decode internally. -var errInternalBadWireType = errors.New("proto: internal error: bad wiretype") - -// skipField skips past a field of type wire and returns the remaining bytes. -func skipField(b []byte, wire int) ([]byte, error) { - switch wire { - case WireVarint: - _, k := decodeVarint(b) - if k == 0 { - return b, io.ErrUnexpectedEOF - } - b = b[k:] - case WireFixed32: - if len(b) < 4 { - return b, io.ErrUnexpectedEOF - } - b = b[4:] - case WireFixed64: - if len(b) < 8 { - return b, io.ErrUnexpectedEOF - } - b = b[8:] - case WireBytes: - m, k := decodeVarint(b) - if k == 0 || uint64(len(b)-k) < m { - return b, io.ErrUnexpectedEOF - } - b = b[uint64(k)+m:] - case WireStartGroup: - _, i := findEndGroup(b) - if i == -1 { - return b, io.ErrUnexpectedEOF - } - b = b[i:] - default: - return b, fmt.Errorf("proto: can't skip unknown wire type %d", wire) - } - return b, nil -} - -// findEndGroup finds the index of the next EndGroup tag. -// Groups may be nested, so the "next" EndGroup tag is the first -// unpaired EndGroup. -// findEndGroup returns the indexes of the start and end of the EndGroup tag. -// Returns (-1,-1) if it can't find one. -func findEndGroup(b []byte) (int, int) { - depth := 1 - i := 0 - for { - x, n := decodeVarint(b[i:]) - if n == 0 { - return -1, -1 - } - j := i - i += n - switch x & 7 { - case WireVarint: - _, k := decodeVarint(b[i:]) - if k == 0 { - return -1, -1 - } - i += k - case WireFixed32: - if len(b)-4 < i { - return -1, -1 - } - i += 4 - case WireFixed64: - if len(b)-8 < i { - return -1, -1 - } - i += 8 - case WireBytes: - m, k := decodeVarint(b[i:]) - if k == 0 { - return -1, -1 - } - i += k - if uint64(len(b)-i) < m { - return -1, -1 - } - i += int(m) - case WireStartGroup: - depth++ - case WireEndGroup: - depth-- - if depth == 0 { - return j, i - } - default: - return -1, -1 - } - } -} - -// encodeVarint appends a varint-encoded integer to b and returns the result. -func encodeVarint(b []byte, x uint64) []byte { - for x >= 1<<7 { - b = append(b, byte(x&0x7f|0x80)) - x >>= 7 - } - return append(b, byte(x)) -} - -// decodeVarint reads a varint-encoded integer from b. -// Returns the decoded integer and the number of bytes read. -// If there is an error, it returns 0,0. -func decodeVarint(b []byte) (uint64, int) { - var x, y uint64 - if len(b) <= 0 { - goto bad - } - x = uint64(b[0]) - if x < 0x80 { - return x, 1 - } - x -= 0x80 - - if len(b) <= 1 { - goto bad - } - y = uint64(b[1]) - x += y << 7 - if y < 0x80 { - return x, 2 - } - x -= 0x80 << 7 - - if len(b) <= 2 { - goto bad - } - y = uint64(b[2]) - x += y << 14 - if y < 0x80 { - return x, 3 - } - x -= 0x80 << 14 - - if len(b) <= 3 { - goto bad - } - y = uint64(b[3]) - x += y << 21 - if y < 0x80 { - return x, 4 - } - x -= 0x80 << 21 - - if len(b) <= 4 { - goto bad - } - y = uint64(b[4]) - x += y << 28 - if y < 0x80 { - return x, 5 - } - x -= 0x80 << 28 - - if len(b) <= 5 { - goto bad - } - y = uint64(b[5]) - x += y << 35 - if y < 0x80 { - return x, 6 - } - x -= 0x80 << 35 - - if len(b) <= 6 { - goto bad - } - y = uint64(b[6]) - x += y << 42 - if y < 0x80 { - return x, 7 - } - x -= 0x80 << 42 - - if len(b) <= 7 { - goto bad - } - y = uint64(b[7]) - x += y << 49 - if y < 0x80 { - return x, 8 - } - x -= 0x80 << 49 - - if len(b) <= 8 { - goto bad - } - y = uint64(b[8]) - x += y << 56 - if y < 0x80 { - return x, 9 - } - x -= 0x80 << 56 - - if len(b) <= 9 { - goto bad - } - y = uint64(b[9]) - x += y << 63 - if y < 2 { - return x, 10 - } - -bad: - return 0, 0 -} diff --git a/vendor/github.com/golang/protobuf/proto/text.go b/vendor/github.com/golang/protobuf/proto/text.go deleted file mode 100644 index 2205fda..0000000 --- a/vendor/github.com/golang/protobuf/proto/text.go +++ /dev/null @@ -1,843 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// Functions for writing the text protocol buffer format. - -import ( - "bufio" - "bytes" - "encoding" - "errors" - "fmt" - "io" - "log" - "math" - "reflect" - "sort" - "strings" -) - -var ( - newline = []byte("\n") - spaces = []byte(" ") - endBraceNewline = []byte("}\n") - backslashN = []byte{'\\', 'n'} - backslashR = []byte{'\\', 'r'} - backslashT = []byte{'\\', 't'} - backslashDQ = []byte{'\\', '"'} - backslashBS = []byte{'\\', '\\'} - posInf = []byte("inf") - negInf = []byte("-inf") - nan = []byte("nan") -) - -type writer interface { - io.Writer - WriteByte(byte) error -} - -// textWriter is an io.Writer that tracks its indentation level. -type textWriter struct { - ind int - complete bool // if the current position is a complete line - compact bool // whether to write out as a one-liner - w writer -} - -func (w *textWriter) WriteString(s string) (n int, err error) { - if !strings.Contains(s, "\n") { - if !w.compact && w.complete { - w.writeIndent() - } - w.complete = false - return io.WriteString(w.w, s) - } - // WriteString is typically called without newlines, so this - // codepath and its copy are rare. We copy to avoid - // duplicating all of Write's logic here. - return w.Write([]byte(s)) -} - -func (w *textWriter) Write(p []byte) (n int, err error) { - newlines := bytes.Count(p, newline) - if newlines == 0 { - if !w.compact && w.complete { - w.writeIndent() - } - n, err = w.w.Write(p) - w.complete = false - return n, err - } - - frags := bytes.SplitN(p, newline, newlines+1) - if w.compact { - for i, frag := range frags { - if i > 0 { - if err := w.w.WriteByte(' '); err != nil { - return n, err - } - n++ - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - } - return n, nil - } - - for i, frag := range frags { - if w.complete { - w.writeIndent() - } - nn, err := w.w.Write(frag) - n += nn - if err != nil { - return n, err - } - if i+1 < len(frags) { - if err := w.w.WriteByte('\n'); err != nil { - return n, err - } - n++ - } - } - w.complete = len(frags[len(frags)-1]) == 0 - return n, nil -} - -func (w *textWriter) WriteByte(c byte) error { - if w.compact && c == '\n' { - c = ' ' - } - if !w.compact && w.complete { - w.writeIndent() - } - err := w.w.WriteByte(c) - w.complete = c == '\n' - return err -} - -func (w *textWriter) indent() { w.ind++ } - -func (w *textWriter) unindent() { - if w.ind == 0 { - log.Print("proto: textWriter unindented too far") - return - } - w.ind-- -} - -func writeName(w *textWriter, props *Properties) error { - if _, err := w.WriteString(props.OrigName); err != nil { - return err - } - if props.Wire != "group" { - return w.WriteByte(':') - } - return nil -} - -func requiresQuotes(u string) bool { - // When type URL contains any characters except [0-9A-Za-z./\-]*, it must be quoted. - for _, ch := range u { - switch { - case ch == '.' || ch == '/' || ch == '_': - continue - case '0' <= ch && ch <= '9': - continue - case 'A' <= ch && ch <= 'Z': - continue - case 'a' <= ch && ch <= 'z': - continue - default: - return true - } - } - return false -} - -// isAny reports whether sv is a google.protobuf.Any message -func isAny(sv reflect.Value) bool { - type wkt interface { - XXX_WellKnownType() string - } - t, ok := sv.Addr().Interface().(wkt) - return ok && t.XXX_WellKnownType() == "Any" -} - -// writeProto3Any writes an expanded google.protobuf.Any message. -// -// It returns (false, nil) if sv value can't be unmarshaled (e.g. because -// required messages are not linked in). -// -// It returns (true, error) when sv was written in expanded format or an error -// was encountered. -func (tm *TextMarshaler) writeProto3Any(w *textWriter, sv reflect.Value) (bool, error) { - turl := sv.FieldByName("TypeUrl") - val := sv.FieldByName("Value") - if !turl.IsValid() || !val.IsValid() { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - b, ok := val.Interface().([]byte) - if !ok { - return true, errors.New("proto: invalid google.protobuf.Any message") - } - - parts := strings.Split(turl.String(), "/") - mt := MessageType(parts[len(parts)-1]) - if mt == nil { - return false, nil - } - m := reflect.New(mt.Elem()) - if err := Unmarshal(b, m.Interface().(Message)); err != nil { - return false, nil - } - w.Write([]byte("[")) - u := turl.String() - if requiresQuotes(u) { - writeString(w, u) - } else { - w.Write([]byte(u)) - } - if w.compact { - w.Write([]byte("]:<")) - } else { - w.Write([]byte("]: <\n")) - w.ind++ - } - if err := tm.writeStruct(w, m.Elem()); err != nil { - return true, err - } - if w.compact { - w.Write([]byte("> ")) - } else { - w.ind-- - w.Write([]byte(">\n")) - } - return true, nil -} - -func (tm *TextMarshaler) writeStruct(w *textWriter, sv reflect.Value) error { - if tm.ExpandAny && isAny(sv) { - if canExpand, err := tm.writeProto3Any(w, sv); canExpand { - return err - } - } - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < sv.NumField(); i++ { - fv := sv.Field(i) - props := sprops.Prop[i] - name := st.Field(i).Name - - if name == "XXX_NoUnkeyedLiteral" { - continue - } - - if strings.HasPrefix(name, "XXX_") { - // There are two XXX_ fields: - // XXX_unrecognized []byte - // XXX_extensions map[int32]proto.Extension - // The first is handled here; - // the second is handled at the bottom of this function. - if name == "XXX_unrecognized" && !fv.IsNil() { - if err := writeUnknownStruct(w, fv.Interface().([]byte)); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Field not filled in. This could be an optional field or - // a required field that wasn't filled in. Either way, there - // isn't anything we can show for it. - continue - } - if fv.Kind() == reflect.Slice && fv.IsNil() { - // Repeated field that is empty, or a bytes field that is unused. - continue - } - - if props.Repeated && fv.Kind() == reflect.Slice { - // Repeated field. - for j := 0; j < fv.Len(); j++ { - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - v := fv.Index(j) - if v.Kind() == reflect.Ptr && v.IsNil() { - // A nil message in a repeated field is not valid, - // but we can handle that more gracefully than panicking. - if _, err := w.Write([]byte("\n")); err != nil { - return err - } - continue - } - if err := tm.writeAny(w, v, props); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if fv.Kind() == reflect.Map { - // Map fields are rendered as a repeated struct with key/value fields. - keys := fv.MapKeys() - sort.Sort(mapKeys(keys)) - for _, key := range keys { - val := fv.MapIndex(key) - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - // open struct - if err := w.WriteByte('<'); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - // key - if _, err := w.WriteString("key:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, key, props.mkeyprop); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - // nil values aren't legal, but we can avoid panicking because of them. - if val.Kind() != reflect.Ptr || !val.IsNil() { - // value - if _, err := w.WriteString("value:"); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, val, props.mvalprop); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - // close struct - w.unindent() - if err := w.WriteByte('>'); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - } - continue - } - if props.proto3 && fv.Kind() == reflect.Slice && fv.Len() == 0 { - // empty bytes field - continue - } - if fv.Kind() != reflect.Ptr && fv.Kind() != reflect.Slice { - // proto3 non-repeated scalar field; skip if zero value - if isProto3Zero(fv) { - continue - } - } - - if fv.Kind() == reflect.Interface { - // Check if it is a oneof. - if st.Field(i).Tag.Get("protobuf_oneof") != "" { - // fv is nil, or holds a pointer to generated struct. - // That generated struct has exactly one field, - // which has a protobuf struct tag. - if fv.IsNil() { - continue - } - inner := fv.Elem().Elem() // interface -> *T -> T - tag := inner.Type().Field(0).Tag.Get("protobuf") - props = new(Properties) // Overwrite the outer props var, but not its pointee. - props.Parse(tag) - // Write the value in the oneof, not the oneof itself. - fv = inner.Field(0) - - // Special case to cope with malformed messages gracefully: - // If the value in the oneof is a nil pointer, don't panic - // in writeAny. - if fv.Kind() == reflect.Ptr && fv.IsNil() { - // Use errors.New so writeAny won't render quotes. - msg := errors.New("/* nil */") - fv = reflect.ValueOf(&msg).Elem() - } - } - } - - if err := writeName(w, props); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - - // Enums have a String method, so writeAny will work fine. - if err := tm.writeAny(w, fv, props); err != nil { - return err - } - - if err := w.WriteByte('\n'); err != nil { - return err - } - } - - // Extensions (the XXX_extensions field). - pv := sv.Addr() - if _, err := extendable(pv.Interface()); err == nil { - if err := tm.writeExtensions(w, pv); err != nil { - return err - } - } - - return nil -} - -// writeAny writes an arbitrary field. -func (tm *TextMarshaler) writeAny(w *textWriter, v reflect.Value, props *Properties) error { - v = reflect.Indirect(v) - - // Floats have special cases. - if v.Kind() == reflect.Float32 || v.Kind() == reflect.Float64 { - x := v.Float() - var b []byte - switch { - case math.IsInf(x, 1): - b = posInf - case math.IsInf(x, -1): - b = negInf - case math.IsNaN(x): - b = nan - } - if b != nil { - _, err := w.Write(b) - return err - } - // Other values are handled below. - } - - // We don't attempt to serialise every possible value type; only those - // that can occur in protocol buffers. - switch v.Kind() { - case reflect.Slice: - // Should only be a []byte; repeated fields are handled in writeStruct. - if err := writeString(w, string(v.Bytes())); err != nil { - return err - } - case reflect.String: - if err := writeString(w, v.String()); err != nil { - return err - } - case reflect.Struct: - // Required/optional group/message. - var bra, ket byte = '<', '>' - if props != nil && props.Wire == "group" { - bra, ket = '{', '}' - } - if err := w.WriteByte(bra); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte('\n'); err != nil { - return err - } - } - w.indent() - if v.CanAddr() { - // Calling v.Interface on a struct causes the reflect package to - // copy the entire struct. This is racy with the new Marshaler - // since we atomically update the XXX_sizecache. - // - // Thus, we retrieve a pointer to the struct if possible to avoid - // a race since v.Interface on the pointer doesn't copy the struct. - // - // If v is not addressable, then we are not worried about a race - // since it implies that the binary Marshaler cannot possibly be - // mutating this value. - v = v.Addr() - } - if etm, ok := v.Interface().(encoding.TextMarshaler); ok { - text, err := etm.MarshalText() - if err != nil { - return err - } - if _, err = w.Write(text); err != nil { - return err - } - } else { - if v.Kind() == reflect.Ptr { - v = v.Elem() - } - if err := tm.writeStruct(w, v); err != nil { - return err - } - } - w.unindent() - if err := w.WriteByte(ket); err != nil { - return err - } - default: - _, err := fmt.Fprint(w, v.Interface()) - return err - } - return nil -} - -// equivalent to C's isprint. -func isprint(c byte) bool { - return c >= 0x20 && c < 0x7f -} - -// writeString writes a string in the protocol buffer text format. -// It is similar to strconv.Quote except we don't use Go escape sequences, -// we treat the string as a byte sequence, and we use octal escapes. -// These differences are to maintain interoperability with the other -// languages' implementations of the text format. -func writeString(w *textWriter, s string) error { - // use WriteByte here to get any needed indent - if err := w.WriteByte('"'); err != nil { - return err - } - // Loop over the bytes, not the runes. - for i := 0; i < len(s); i++ { - var err error - // Divergence from C++: we don't escape apostrophes. - // There's no need to escape them, and the C++ parser - // copes with a naked apostrophe. - switch c := s[i]; c { - case '\n': - _, err = w.w.Write(backslashN) - case '\r': - _, err = w.w.Write(backslashR) - case '\t': - _, err = w.w.Write(backslashT) - case '"': - _, err = w.w.Write(backslashDQ) - case '\\': - _, err = w.w.Write(backslashBS) - default: - if isprint(c) { - err = w.w.WriteByte(c) - } else { - _, err = fmt.Fprintf(w.w, "\\%03o", c) - } - } - if err != nil { - return err - } - } - return w.WriteByte('"') -} - -func writeUnknownStruct(w *textWriter, data []byte) (err error) { - if !w.compact { - if _, err := fmt.Fprintf(w, "/* %d unknown bytes */\n", len(data)); err != nil { - return err - } - } - b := NewBuffer(data) - for b.index < len(b.buf) { - x, err := b.DecodeVarint() - if err != nil { - _, err := fmt.Fprintf(w, "/* %v */\n", err) - return err - } - wire, tag := x&7, x>>3 - if wire == WireEndGroup { - w.unindent() - if _, err := w.Write(endBraceNewline); err != nil { - return err - } - continue - } - if _, err := fmt.Fprint(w, tag); err != nil { - return err - } - if wire != WireStartGroup { - if err := w.WriteByte(':'); err != nil { - return err - } - } - if !w.compact || wire == WireStartGroup { - if err := w.WriteByte(' '); err != nil { - return err - } - } - switch wire { - case WireBytes: - buf, e := b.DecodeRawBytes(false) - if e == nil { - _, err = fmt.Fprintf(w, "%q", buf) - } else { - _, err = fmt.Fprintf(w, "/* %v */", e) - } - case WireFixed32: - x, err = b.DecodeFixed32() - err = writeUnknownInt(w, x, err) - case WireFixed64: - x, err = b.DecodeFixed64() - err = writeUnknownInt(w, x, err) - case WireStartGroup: - err = w.WriteByte('{') - w.indent() - case WireVarint: - x, err = b.DecodeVarint() - err = writeUnknownInt(w, x, err) - default: - _, err = fmt.Fprintf(w, "/* unknown wire type %d */", wire) - } - if err != nil { - return err - } - if err = w.WriteByte('\n'); err != nil { - return err - } - } - return nil -} - -func writeUnknownInt(w *textWriter, x uint64, err error) error { - if err == nil { - _, err = fmt.Fprint(w, x) - } else { - _, err = fmt.Fprintf(w, "/* %v */", err) - } - return err -} - -type int32Slice []int32 - -func (s int32Slice) Len() int { return len(s) } -func (s int32Slice) Less(i, j int) bool { return s[i] < s[j] } -func (s int32Slice) Swap(i, j int) { s[i], s[j] = s[j], s[i] } - -// writeExtensions writes all the extensions in pv. -// pv is assumed to be a pointer to a protocol message struct that is extendable. -func (tm *TextMarshaler) writeExtensions(w *textWriter, pv reflect.Value) error { - emap := extensionMaps[pv.Type().Elem()] - ep, _ := extendable(pv.Interface()) - - // Order the extensions by ID. - // This isn't strictly necessary, but it will give us - // canonical output, which will also make testing easier. - m, mu := ep.extensionsRead() - if m == nil { - return nil - } - mu.Lock() - ids := make([]int32, 0, len(m)) - for id := range m { - ids = append(ids, id) - } - sort.Sort(int32Slice(ids)) - mu.Unlock() - - for _, extNum := range ids { - ext := m[extNum] - var desc *ExtensionDesc - if emap != nil { - desc = emap[extNum] - } - if desc == nil { - // Unknown extension. - if err := writeUnknownStruct(w, ext.enc); err != nil { - return err - } - continue - } - - pb, err := GetExtension(ep, desc) - if err != nil { - return fmt.Errorf("failed getting extension: %v", err) - } - - // Repeated extensions will appear as a slice. - if !desc.repeated() { - if err := tm.writeExtension(w, desc.Name, pb); err != nil { - return err - } - } else { - v := reflect.ValueOf(pb) - for i := 0; i < v.Len(); i++ { - if err := tm.writeExtension(w, desc.Name, v.Index(i).Interface()); err != nil { - return err - } - } - } - } - return nil -} - -func (tm *TextMarshaler) writeExtension(w *textWriter, name string, pb interface{}) error { - if _, err := fmt.Fprintf(w, "[%s]:", name); err != nil { - return err - } - if !w.compact { - if err := w.WriteByte(' '); err != nil { - return err - } - } - if err := tm.writeAny(w, reflect.ValueOf(pb), nil); err != nil { - return err - } - if err := w.WriteByte('\n'); err != nil { - return err - } - return nil -} - -func (w *textWriter) writeIndent() { - if !w.complete { - return - } - remain := w.ind * 2 - for remain > 0 { - n := remain - if n > len(spaces) { - n = len(spaces) - } - w.w.Write(spaces[:n]) - remain -= n - } - w.complete = false -} - -// TextMarshaler is a configurable text format marshaler. -type TextMarshaler struct { - Compact bool // use compact text format (one line). - ExpandAny bool // expand google.protobuf.Any messages of known types -} - -// Marshal writes a given protocol buffer in text format. -// The only errors returned are from w. -func (tm *TextMarshaler) Marshal(w io.Writer, pb Message) error { - val := reflect.ValueOf(pb) - if pb == nil || val.IsNil() { - w.Write([]byte("")) - return nil - } - var bw *bufio.Writer - ww, ok := w.(writer) - if !ok { - bw = bufio.NewWriter(w) - ww = bw - } - aw := &textWriter{ - w: ww, - complete: true, - compact: tm.Compact, - } - - if etm, ok := pb.(encoding.TextMarshaler); ok { - text, err := etm.MarshalText() - if err != nil { - return err - } - if _, err = aw.Write(text); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil - } - // Dereference the received pointer so we don't have outer < and >. - v := reflect.Indirect(val) - if err := tm.writeStruct(aw, v); err != nil { - return err - } - if bw != nil { - return bw.Flush() - } - return nil -} - -// Text is the same as Marshal, but returns the string directly. -func (tm *TextMarshaler) Text(pb Message) string { - var buf bytes.Buffer - tm.Marshal(&buf, pb) - return buf.String() -} - -var ( - defaultTextMarshaler = TextMarshaler{} - compactTextMarshaler = TextMarshaler{Compact: true} -) - -// TODO: consider removing some of the Marshal functions below. - -// MarshalText writes a given protocol buffer in text format. -// The only errors returned are from w. -func MarshalText(w io.Writer, pb Message) error { return defaultTextMarshaler.Marshal(w, pb) } - -// MarshalTextString is the same as MarshalText, but returns the string directly. -func MarshalTextString(pb Message) string { return defaultTextMarshaler.Text(pb) } - -// CompactText writes a given protocol buffer in compact text format (one line). -func CompactText(w io.Writer, pb Message) error { return compactTextMarshaler.Marshal(w, pb) } - -// CompactTextString is the same as CompactText, but returns the string directly. -func CompactTextString(pb Message) string { return compactTextMarshaler.Text(pb) } diff --git a/vendor/github.com/golang/protobuf/proto/text_parser.go b/vendor/github.com/golang/protobuf/proto/text_parser.go deleted file mode 100644 index 0685bae..0000000 --- a/vendor/github.com/golang/protobuf/proto/text_parser.go +++ /dev/null @@ -1,880 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2010 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package proto - -// Functions for parsing the Text protocol buffer format. -// TODO: message sets. - -import ( - "encoding" - "errors" - "fmt" - "reflect" - "strconv" - "strings" - "unicode/utf8" -) - -// Error string emitted when deserializing Any and fields are already set -const anyRepeatedlyUnpacked = "Any message unpacked multiple times, or %q already set" - -type ParseError struct { - Message string - Line int // 1-based line number - Offset int // 0-based byte offset from start of input -} - -func (p *ParseError) Error() string { - if p.Line == 1 { - // show offset only for first line - return fmt.Sprintf("line 1.%d: %v", p.Offset, p.Message) - } - return fmt.Sprintf("line %d: %v", p.Line, p.Message) -} - -type token struct { - value string - err *ParseError - line int // line number - offset int // byte number from start of input, not start of line - unquoted string // the unquoted version of value, if it was a quoted string -} - -func (t *token) String() string { - if t.err == nil { - return fmt.Sprintf("%q (line=%d, offset=%d)", t.value, t.line, t.offset) - } - return fmt.Sprintf("parse error: %v", t.err) -} - -type textParser struct { - s string // remaining input - done bool // whether the parsing is finished (success or error) - backed bool // whether back() was called - offset, line int - cur token -} - -func newTextParser(s string) *textParser { - p := new(textParser) - p.s = s - p.line = 1 - p.cur.line = 1 - return p -} - -func (p *textParser) errorf(format string, a ...interface{}) *ParseError { - pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset} - p.cur.err = pe - p.done = true - return pe -} - -// Numbers and identifiers are matched by [-+._A-Za-z0-9] -func isIdentOrNumberChar(c byte) bool { - switch { - case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z': - return true - case '0' <= c && c <= '9': - return true - } - switch c { - case '-', '+', '.', '_': - return true - } - return false -} - -func isWhitespace(c byte) bool { - switch c { - case ' ', '\t', '\n', '\r': - return true - } - return false -} - -func isQuote(c byte) bool { - switch c { - case '"', '\'': - return true - } - return false -} - -func (p *textParser) skipWhitespace() { - i := 0 - for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') { - if p.s[i] == '#' { - // comment; skip to end of line or input - for i < len(p.s) && p.s[i] != '\n' { - i++ - } - if i == len(p.s) { - break - } - } - if p.s[i] == '\n' { - p.line++ - } - i++ - } - p.offset += i - p.s = p.s[i:len(p.s)] - if len(p.s) == 0 { - p.done = true - } -} - -func (p *textParser) advance() { - // Skip whitespace - p.skipWhitespace() - if p.done { - return - } - - // Start of non-whitespace - p.cur.err = nil - p.cur.offset, p.cur.line = p.offset, p.line - p.cur.unquoted = "" - switch p.s[0] { - case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/': - // Single symbol - p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)] - case '"', '\'': - // Quoted string - i := 1 - for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' { - if p.s[i] == '\\' && i+1 < len(p.s) { - // skip escaped char - i++ - } - i++ - } - if i >= len(p.s) || p.s[i] != p.s[0] { - p.errorf("unmatched quote") - return - } - unq, err := unquoteC(p.s[1:i], rune(p.s[0])) - if err != nil { - p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err) - return - } - p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)] - p.cur.unquoted = unq - default: - i := 0 - for i < len(p.s) && isIdentOrNumberChar(p.s[i]) { - i++ - } - if i == 0 { - p.errorf("unexpected byte %#x", p.s[0]) - return - } - p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)] - } - p.offset += len(p.cur.value) -} - -var ( - errBadUTF8 = errors.New("proto: bad UTF-8") -) - -func unquoteC(s string, quote rune) (string, error) { - // This is based on C++'s tokenizer.cc. - // Despite its name, this is *not* parsing C syntax. - // For instance, "\0" is an invalid quoted string. - - // Avoid allocation in trivial cases. - simple := true - for _, r := range s { - if r == '\\' || r == quote { - simple = false - break - } - } - if simple { - return s, nil - } - - buf := make([]byte, 0, 3*len(s)/2) - for len(s) > 0 { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", errBadUTF8 - } - s = s[n:] - if r != '\\' { - if r < utf8.RuneSelf { - buf = append(buf, byte(r)) - } else { - buf = append(buf, string(r)...) - } - continue - } - - ch, tail, err := unescape(s) - if err != nil { - return "", err - } - buf = append(buf, ch...) - s = tail - } - return string(buf), nil -} - -func unescape(s string) (ch string, tail string, err error) { - r, n := utf8.DecodeRuneInString(s) - if r == utf8.RuneError && n == 1 { - return "", "", errBadUTF8 - } - s = s[n:] - switch r { - case 'a': - return "\a", s, nil - case 'b': - return "\b", s, nil - case 'f': - return "\f", s, nil - case 'n': - return "\n", s, nil - case 'r': - return "\r", s, nil - case 't': - return "\t", s, nil - case 'v': - return "\v", s, nil - case '?': - return "?", s, nil // trigraph workaround - case '\'', '"', '\\': - return string(r), s, nil - case '0', '1', '2', '3', '4', '5', '6', '7': - if len(s) < 2 { - return "", "", fmt.Errorf(`\%c requires 2 following digits`, r) - } - ss := string(r) + s[:2] - s = s[2:] - i, err := strconv.ParseUint(ss, 8, 8) - if err != nil { - return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss) - } - return string([]byte{byte(i)}), s, nil - case 'x', 'X', 'u', 'U': - var n int - switch r { - case 'x', 'X': - n = 2 - case 'u': - n = 4 - case 'U': - n = 8 - } - if len(s) < n { - return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n) - } - ss := s[:n] - s = s[n:] - i, err := strconv.ParseUint(ss, 16, 64) - if err != nil { - return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss) - } - if r == 'x' || r == 'X' { - return string([]byte{byte(i)}), s, nil - } - if i > utf8.MaxRune { - return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss) - } - return string(i), s, nil - } - return "", "", fmt.Errorf(`unknown escape \%c`, r) -} - -// Back off the parser by one token. Can only be done between calls to next(). -// It makes the next advance() a no-op. -func (p *textParser) back() { p.backed = true } - -// Advances the parser and returns the new current token. -func (p *textParser) next() *token { - if p.backed || p.done { - p.backed = false - return &p.cur - } - p.advance() - if p.done { - p.cur.value = "" - } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) { - // Look for multiple quoted strings separated by whitespace, - // and concatenate them. - cat := p.cur - for { - p.skipWhitespace() - if p.done || !isQuote(p.s[0]) { - break - } - p.advance() - if p.cur.err != nil { - return &p.cur - } - cat.value += " " + p.cur.value - cat.unquoted += p.cur.unquoted - } - p.done = false // parser may have seen EOF, but we want to return cat - p.cur = cat - } - return &p.cur -} - -func (p *textParser) consumeToken(s string) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != s { - p.back() - return p.errorf("expected %q, found %q", s, tok.value) - } - return nil -} - -// Return a RequiredNotSetError indicating which required field was not set. -func (p *textParser) missingRequiredFieldError(sv reflect.Value) *RequiredNotSetError { - st := sv.Type() - sprops := GetProperties(st) - for i := 0; i < st.NumField(); i++ { - if !isNil(sv.Field(i)) { - continue - } - - props := sprops.Prop[i] - if props.Required { - return &RequiredNotSetError{fmt.Sprintf("%v.%v", st, props.OrigName)} - } - } - return &RequiredNotSetError{fmt.Sprintf("%v.", st)} // should not happen -} - -// Returns the index in the struct for the named field, as well as the parsed tag properties. -func structFieldByName(sprops *StructProperties, name string) (int, *Properties, bool) { - i, ok := sprops.decoderOrigNames[name] - if ok { - return i, sprops.Prop[i], true - } - return -1, nil, false -} - -// Consume a ':' from the input stream (if the next token is a colon), -// returning an error if a colon is needed but not present. -func (p *textParser) checkForColon(props *Properties, typ reflect.Type) *ParseError { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ":" { - // Colon is optional when the field is a group or message. - needColon := true - switch props.Wire { - case "group": - needColon = false - case "bytes": - // A "bytes" field is either a message, a string, or a repeated field; - // those three become *T, *string and []T respectively, so we can check for - // this field being a pointer to a non-string. - if typ.Kind() == reflect.Ptr { - // *T or *string - if typ.Elem().Kind() == reflect.String { - break - } - } else if typ.Kind() == reflect.Slice { - // []T or []*T - if typ.Elem().Kind() != reflect.Ptr { - break - } - } else if typ.Kind() == reflect.String { - // The proto3 exception is for a string field, - // which requires a colon. - break - } - needColon = false - } - if needColon { - return p.errorf("expected ':', found %q", tok.value) - } - p.back() - } - return nil -} - -func (p *textParser) readStruct(sv reflect.Value, terminator string) error { - st := sv.Type() - sprops := GetProperties(st) - reqCount := sprops.reqCount - var reqFieldErr error - fieldSet := make(map[string]bool) - // A struct is a sequence of "name: value", terminated by one of - // '>' or '}', or the end of the input. A name may also be - // "[extension]" or "[type/url]". - // - // The whole struct can also be an expanded Any message, like: - // [type/url] < ... struct contents ... > - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - if tok.value == "[" { - // Looks like an extension or an Any. - // - // TODO: Check whether we need to handle - // namespace rooted names (e.g. ".something.Foo"). - extName, err := p.consumeExtName() - if err != nil { - return err - } - - if s := strings.LastIndex(extName, "/"); s >= 0 { - // If it contains a slash, it's an Any type URL. - messageName := extName[s+1:] - mt := MessageType(messageName) - if mt == nil { - return p.errorf("unrecognized message %q in google.protobuf.Any", messageName) - } - tok = p.next() - if tok.err != nil { - return tok.err - } - // consume an optional colon - if tok.value == ":" { - tok = p.next() - if tok.err != nil { - return tok.err - } - } - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - v := reflect.New(mt.Elem()) - if pe := p.readStruct(v.Elem(), terminator); pe != nil { - return pe - } - b, err := Marshal(v.Interface().(Message)) - if err != nil { - return p.errorf("failed to marshal message of type %q: %v", messageName, err) - } - if fieldSet["type_url"] { - return p.errorf(anyRepeatedlyUnpacked, "type_url") - } - if fieldSet["value"] { - return p.errorf(anyRepeatedlyUnpacked, "value") - } - sv.FieldByName("TypeUrl").SetString(extName) - sv.FieldByName("Value").SetBytes(b) - fieldSet["type_url"] = true - fieldSet["value"] = true - continue - } - - var desc *ExtensionDesc - // This could be faster, but it's functional. - // TODO: Do something smarter than a linear scan. - for _, d := range RegisteredExtensions(reflect.New(st).Interface().(Message)) { - if d.Name == extName { - desc = d - break - } - } - if desc == nil { - return p.errorf("unrecognized extension %q", extName) - } - - props := &Properties{} - props.Parse(desc.Tag) - - typ := reflect.TypeOf(desc.ExtensionType) - if err := p.checkForColon(props, typ); err != nil { - return err - } - - rep := desc.repeated() - - // Read the extension structure, and set it in - // the value we're constructing. - var ext reflect.Value - if !rep { - ext = reflect.New(typ).Elem() - } else { - ext = reflect.New(typ.Elem()).Elem() - } - if err := p.readAny(ext, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - ep := sv.Addr().Interface().(Message) - if !rep { - SetExtension(ep, desc, ext.Interface()) - } else { - old, err := GetExtension(ep, desc) - var sl reflect.Value - if err == nil { - sl = reflect.ValueOf(old) // existing slice - } else { - sl = reflect.MakeSlice(typ, 0, 1) - } - sl = reflect.Append(sl, ext) - SetExtension(ep, desc, sl.Interface()) - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - continue - } - - // This is a normal, non-extension field. - name := tok.value - var dst reflect.Value - fi, props, ok := structFieldByName(sprops, name) - if ok { - dst = sv.Field(fi) - } else if oop, ok := sprops.OneofTypes[name]; ok { - // It is a oneof. - props = oop.Prop - nv := reflect.New(oop.Type.Elem()) - dst = nv.Elem().Field(0) - field := sv.Field(oop.Field) - if !field.IsNil() { - return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, sv.Type().Field(oop.Field).Name) - } - field.Set(nv) - } - if !dst.IsValid() { - return p.errorf("unknown field name %q in %v", name, st) - } - - if dst.Kind() == reflect.Map { - // Consume any colon. - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Construct the map if it doesn't already exist. - if dst.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) - } - key := reflect.New(dst.Type().Key()).Elem() - val := reflect.New(dst.Type().Elem()).Elem() - - // The map entry should be this sequence of tokens: - // < key : KEY value : VALUE > - // However, implementations may omit key or value, and technically - // we should support them in any order. See b/28924776 for a time - // this went wrong. - - tok := p.next() - var terminator string - switch tok.value { - case "<": - terminator = ">" - case "{": - terminator = "}" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - for { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == terminator { - break - } - switch tok.value { - case "key": - if err := p.consumeToken(":"); err != nil { - return err - } - if err := p.readAny(key, props.mkeyprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - case "value": - if err := p.checkForColon(props.mvalprop, dst.Type().Elem()); err != nil { - return err - } - if err := p.readAny(val, props.mvalprop); err != nil { - return err - } - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - default: - p.back() - return p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value) - } - } - - dst.SetMapIndex(key, val) - continue - } - - // Check that it's not already set if it's not a repeated field. - if !props.Repeated && fieldSet[name] { - return p.errorf("non-repeated field %q was repeated", name) - } - - if err := p.checkForColon(props, dst.Type()); err != nil { - return err - } - - // Parse into the field. - fieldSet[name] = true - if err := p.readAny(dst, props); err != nil { - if _, ok := err.(*RequiredNotSetError); !ok { - return err - } - reqFieldErr = err - } - if props.Required { - reqCount-- - } - - if err := p.consumeOptionalSeparator(); err != nil { - return err - } - - } - - if reqCount > 0 { - return p.missingRequiredFieldError(sv) - } - return reqFieldErr -} - -// consumeExtName consumes extension name or expanded Any type URL and the -// following ']'. It returns the name or URL consumed. -func (p *textParser) consumeExtName() (string, error) { - tok := p.next() - if tok.err != nil { - return "", tok.err - } - - // If extension name or type url is quoted, it's a single token. - if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] { - name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0])) - if err != nil { - return "", err - } - return name, p.consumeToken("]") - } - - // Consume everything up to "]" - var parts []string - for tok.value != "]" { - parts = append(parts, tok.value) - tok = p.next() - if tok.err != nil { - return "", p.errorf("unrecognized type_url or extension name: %s", tok.err) - } - if p.done && tok.value != "]" { - return "", p.errorf("unclosed type_url or extension name") - } - } - return strings.Join(parts, ""), nil -} - -// consumeOptionalSeparator consumes an optional semicolon or comma. -// It is used in readStruct to provide backward compatibility. -func (p *textParser) consumeOptionalSeparator() error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value != ";" && tok.value != "," { - p.back() - } - return nil -} - -func (p *textParser) readAny(v reflect.Value, props *Properties) error { - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == "" { - return p.errorf("unexpected EOF") - } - - switch fv := v; fv.Kind() { - case reflect.Slice: - at := v.Type() - if at.Elem().Kind() == reflect.Uint8 { - // Special case for []byte - if tok.value[0] != '"' && tok.value[0] != '\'' { - // Deliberately written out here, as the error after - // this switch statement would write "invalid []byte: ...", - // which is not as user-friendly. - return p.errorf("invalid string: %v", tok.value) - } - bytes := []byte(tok.unquoted) - fv.Set(reflect.ValueOf(bytes)) - return nil - } - // Repeated field. - if tok.value == "[" { - // Repeated field with list notation, like [1,2,3]. - for { - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - err := p.readAny(fv.Index(fv.Len()-1), props) - if err != nil { - return err - } - tok := p.next() - if tok.err != nil { - return tok.err - } - if tok.value == "]" { - break - } - if tok.value != "," { - return p.errorf("Expected ']' or ',' found %q", tok.value) - } - } - return nil - } - // One value of the repeated field. - p.back() - fv.Set(reflect.Append(fv, reflect.New(at.Elem()).Elem())) - return p.readAny(fv.Index(fv.Len()-1), props) - case reflect.Bool: - // true/1/t/True or false/f/0/False. - switch tok.value { - case "true", "1", "t", "True": - fv.SetBool(true) - return nil - case "false", "0", "f", "False": - fv.SetBool(false) - return nil - } - case reflect.Float32, reflect.Float64: - v := tok.value - // Ignore 'f' for compatibility with output generated by C++, but don't - // remove 'f' when the value is "-inf" or "inf". - if strings.HasSuffix(v, "f") && tok.value != "-inf" && tok.value != "inf" { - v = v[:len(v)-1] - } - if f, err := strconv.ParseFloat(v, fv.Type().Bits()); err == nil { - fv.SetFloat(f) - return nil - } - case reflect.Int32: - if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil { - fv.SetInt(x) - return nil - } - - if len(props.Enum) == 0 { - break - } - m, ok := enumValueMaps[props.Enum] - if !ok { - break - } - x, ok := m[tok.value] - if !ok { - break - } - fv.SetInt(int64(x)) - return nil - case reflect.Int64: - if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil { - fv.SetInt(x) - return nil - } - - case reflect.Ptr: - // A basic field (indirected through pointer), or a repeated message/group - p.back() - fv.Set(reflect.New(fv.Type().Elem())) - return p.readAny(fv.Elem(), props) - case reflect.String: - if tok.value[0] == '"' || tok.value[0] == '\'' { - fv.SetString(tok.unquoted) - return nil - } - case reflect.Struct: - var terminator string - switch tok.value { - case "{": - terminator = "}" - case "<": - terminator = ">" - default: - return p.errorf("expected '{' or '<', found %q", tok.value) - } - // TODO: Handle nested messages which implement encoding.TextUnmarshaler. - return p.readStruct(fv, terminator) - case reflect.Uint32: - if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil { - fv.SetUint(uint64(x)) - return nil - } - case reflect.Uint64: - if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil { - fv.SetUint(x) - return nil - } - } - return p.errorf("invalid %v: %v", v.Type(), tok.value) -} - -// UnmarshalText reads a protocol buffer in Text format. UnmarshalText resets pb -// before starting to unmarshal, so any existing data in pb is always removed. -// If a required field is not set and no other error occurs, -// UnmarshalText returns *RequiredNotSetError. -func UnmarshalText(s string, pb Message) error { - if um, ok := pb.(encoding.TextUnmarshaler); ok { - return um.UnmarshalText([]byte(s)) - } - pb.Reset() - v := reflect.ValueOf(pb) - return newTextParser(s).readStruct(v.Elem(), "") -} diff --git a/vendor/github.com/golang/protobuf/ptypes/any.go b/vendor/github.com/golang/protobuf/ptypes/any.go deleted file mode 100644 index b2af97f..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/any.go +++ /dev/null @@ -1,139 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package ptypes - -// This file implements functions to marshal proto.Message to/from -// google.protobuf.Any message. - -import ( - "fmt" - "reflect" - "strings" - - "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes/any" -) - -const googleApis = "type.googleapis.com/" - -// AnyMessageName returns the name of the message contained in a google.protobuf.Any message. -// -// Note that regular type assertions should be done using the Is -// function. AnyMessageName is provided for less common use cases like filtering a -// sequence of Any messages based on a set of allowed message type names. -func AnyMessageName(any *any.Any) (string, error) { - if any == nil { - return "", fmt.Errorf("message is nil") - } - slash := strings.LastIndex(any.TypeUrl, "/") - if slash < 0 { - return "", fmt.Errorf("message type url %q is invalid", any.TypeUrl) - } - return any.TypeUrl[slash+1:], nil -} - -// MarshalAny takes the protocol buffer and encodes it into google.protobuf.Any. -func MarshalAny(pb proto.Message) (*any.Any, error) { - value, err := proto.Marshal(pb) - if err != nil { - return nil, err - } - return &any.Any{TypeUrl: googleApis + proto.MessageName(pb), Value: value}, nil -} - -// DynamicAny is a value that can be passed to UnmarshalAny to automatically -// allocate a proto.Message for the type specified in a google.protobuf.Any -// message. The allocated message is stored in the embedded proto.Message. -// -// Example: -// -// var x ptypes.DynamicAny -// if err := ptypes.UnmarshalAny(a, &x); err != nil { ... } -// fmt.Printf("unmarshaled message: %v", x.Message) -type DynamicAny struct { - proto.Message -} - -// Empty returns a new proto.Message of the type specified in a -// google.protobuf.Any message. It returns an error if corresponding message -// type isn't linked in. -func Empty(any *any.Any) (proto.Message, error) { - aname, err := AnyMessageName(any) - if err != nil { - return nil, err - } - - t := proto.MessageType(aname) - if t == nil { - return nil, fmt.Errorf("any: message type %q isn't linked in", aname) - } - return reflect.New(t.Elem()).Interface().(proto.Message), nil -} - -// UnmarshalAny parses the protocol buffer representation in a google.protobuf.Any -// message and places the decoded result in pb. It returns an error if type of -// contents of Any message does not match type of pb message. -// -// pb can be a proto.Message, or a *DynamicAny. -func UnmarshalAny(any *any.Any, pb proto.Message) error { - if d, ok := pb.(*DynamicAny); ok { - if d.Message == nil { - var err error - d.Message, err = Empty(any) - if err != nil { - return err - } - } - return UnmarshalAny(any, d.Message) - } - - aname, err := AnyMessageName(any) - if err != nil { - return err - } - - mname := proto.MessageName(pb) - if aname != mname { - return fmt.Errorf("mismatched message type: got %q want %q", aname, mname) - } - return proto.Unmarshal(any.Value, pb) -} - -// Is returns true if any value contains a given message type. -func Is(any *any.Any, pb proto.Message) bool { - aname, err := AnyMessageName(any) - if err != nil { - return false - } - - return aname == proto.MessageName(pb) -} diff --git a/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go b/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go deleted file mode 100644 index f67edc7..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/any/any.pb.go +++ /dev/null @@ -1,191 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/protobuf/any.proto - -package any // import "github.com/golang/protobuf/ptypes/any" - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -// `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// Example 4: Pack and unpack a message in Go -// -// foo := &pb.Foo{...} -// any, err := ptypes.MarshalAny(foo) -// ... -// foo := &pb.Foo{} -// if err := ptypes.UnmarshalAny(any, foo); err != nil { -// ... -// } -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// -// JSON -// ==== -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -// -type Any struct { - // A URL/resource name whose content describes the type of the - // serialized protocol buffer message. - // - // For URLs which use the scheme `http`, `https`, or no scheme, the - // following restrictions and interpretations apply: - // - // * If no scheme is provided, `https` is assumed. - // * The last segment of the URL's path must represent the fully - // qualified name of the type (as in `path/google.protobuf.Duration`). - // The name should be in a canonical form (e.g., leading "." is - // not accepted). - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - // - TypeUrl string `protobuf:"bytes,1,opt,name=type_url,json=typeUrl" json:"type_url,omitempty"` - // Must be a valid serialized protocol buffer of the above specified type. - Value []byte `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Any) Reset() { *m = Any{} } -func (m *Any) String() string { return proto.CompactTextString(m) } -func (*Any) ProtoMessage() {} -func (*Any) Descriptor() ([]byte, []int) { - return fileDescriptor_any_744b9ca530f228db, []int{0} -} -func (*Any) XXX_WellKnownType() string { return "Any" } -func (m *Any) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Any.Unmarshal(m, b) -} -func (m *Any) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Any.Marshal(b, m, deterministic) -} -func (dst *Any) XXX_Merge(src proto.Message) { - xxx_messageInfo_Any.Merge(dst, src) -} -func (m *Any) XXX_Size() int { - return xxx_messageInfo_Any.Size(m) -} -func (m *Any) XXX_DiscardUnknown() { - xxx_messageInfo_Any.DiscardUnknown(m) -} - -var xxx_messageInfo_Any proto.InternalMessageInfo - -func (m *Any) GetTypeUrl() string { - if m != nil { - return m.TypeUrl - } - return "" -} - -func (m *Any) GetValue() []byte { - if m != nil { - return m.Value - } - return nil -} - -func init() { - proto.RegisterType((*Any)(nil), "google.protobuf.Any") -} - -func init() { proto.RegisterFile("google/protobuf/any.proto", fileDescriptor_any_744b9ca530f228db) } - -var fileDescriptor_any_744b9ca530f228db = []byte{ - // 185 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4c, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0xcc, 0xab, 0xd4, - 0x03, 0x73, 0x84, 0xf8, 0x21, 0x52, 0x7a, 0x30, 0x29, 0x25, 0x33, 0x2e, 0x66, 0xc7, 0xbc, 0x4a, - 0x21, 0x49, 0x2e, 0x8e, 0x92, 0xca, 0x82, 0xd4, 0xf8, 0xd2, 0xa2, 0x1c, 0x09, 0x46, 0x05, 0x46, - 0x0d, 0xce, 0x20, 0x76, 0x10, 0x3f, 0xb4, 0x28, 0x47, 0x48, 0x84, 0x8b, 0xb5, 0x2c, 0x31, 0xa7, - 0x34, 0x55, 0x82, 0x49, 0x81, 0x51, 0x83, 0x27, 0x08, 0xc2, 0x71, 0xca, 0xe7, 0x12, 0x4e, 0xce, - 0xcf, 0xd5, 0x43, 0x33, 0xce, 0x89, 0xc3, 0x31, 0xaf, 0x32, 0x00, 0xc4, 0x09, 0x60, 0x8c, 0x52, - 0x4d, 0xcf, 0x2c, 0xc9, 0x28, 0x4d, 0xd2, 0x4b, 0xce, 0xcf, 0xd5, 0x4f, 0xcf, 0xcf, 0x49, 0xcc, - 0x4b, 0x47, 0xb8, 0xa8, 0x00, 0x64, 0x7a, 0x31, 0xc8, 0x61, 0x8b, 0x98, 0x98, 0xdd, 0x03, 0x9c, - 0x56, 0x31, 0xc9, 0xb9, 0x43, 0x8c, 0x0a, 0x80, 0x2a, 0xd1, 0x0b, 0x4f, 0xcd, 0xc9, 0xf1, 0xce, - 0xcb, 0x2f, 0xcf, 0x0b, 0x01, 0x29, 0x4d, 0x62, 0x03, 0xeb, 0x35, 0x06, 0x04, 0x00, 0x00, 0xff, - 0xff, 0x13, 0xf8, 0xe8, 0x42, 0xdd, 0x00, 0x00, 0x00, -} diff --git a/vendor/github.com/golang/protobuf/ptypes/any/any.proto b/vendor/github.com/golang/protobuf/ptypes/any/any.proto deleted file mode 100644 index c748667..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/any/any.proto +++ /dev/null @@ -1,149 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option go_package = "github.com/golang/protobuf/ptypes/any"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "AnyProto"; -option java_multiple_files = true; -option objc_class_prefix = "GPB"; - -// `Any` contains an arbitrary serialized protocol buffer message along with a -// URL that describes the type of the serialized message. -// -// Protobuf library provides support to pack/unpack Any values in the form -// of utility functions or additional generated methods of the Any type. -// -// Example 1: Pack and unpack a message in C++. -// -// Foo foo = ...; -// Any any; -// any.PackFrom(foo); -// ... -// if (any.UnpackTo(&foo)) { -// ... -// } -// -// Example 2: Pack and unpack a message in Java. -// -// Foo foo = ...; -// Any any = Any.pack(foo); -// ... -// if (any.is(Foo.class)) { -// foo = any.unpack(Foo.class); -// } -// -// Example 3: Pack and unpack a message in Python. -// -// foo = Foo(...) -// any = Any() -// any.Pack(foo) -// ... -// if any.Is(Foo.DESCRIPTOR): -// any.Unpack(foo) -// ... -// -// Example 4: Pack and unpack a message in Go -// -// foo := &pb.Foo{...} -// any, err := ptypes.MarshalAny(foo) -// ... -// foo := &pb.Foo{} -// if err := ptypes.UnmarshalAny(any, foo); err != nil { -// ... -// } -// -// The pack methods provided by protobuf library will by default use -// 'type.googleapis.com/full.type.name' as the type URL and the unpack -// methods only use the fully qualified type name after the last '/' -// in the type URL, for example "foo.bar.com/x/y.z" will yield type -// name "y.z". -// -// -// JSON -// ==== -// The JSON representation of an `Any` value uses the regular -// representation of the deserialized, embedded message, with an -// additional field `@type` which contains the type URL. Example: -// -// package google.profile; -// message Person { -// string first_name = 1; -// string last_name = 2; -// } -// -// { -// "@type": "type.googleapis.com/google.profile.Person", -// "firstName": , -// "lastName": -// } -// -// If the embedded message type is well-known and has a custom JSON -// representation, that representation will be embedded adding a field -// `value` which holds the custom JSON in addition to the `@type` -// field. Example (for message [google.protobuf.Duration][]): -// -// { -// "@type": "type.googleapis.com/google.protobuf.Duration", -// "value": "1.212s" -// } -// -message Any { - // A URL/resource name whose content describes the type of the - // serialized protocol buffer message. - // - // For URLs which use the scheme `http`, `https`, or no scheme, the - // following restrictions and interpretations apply: - // - // * If no scheme is provided, `https` is assumed. - // * The last segment of the URL's path must represent the fully - // qualified name of the type (as in `path/google.protobuf.Duration`). - // The name should be in a canonical form (e.g., leading "." is - // not accepted). - // * An HTTP GET on the URL must yield a [google.protobuf.Type][] - // value in binary format, or produce an error. - // * Applications are allowed to cache lookup results based on the - // URL, or have them precompiled into a binary to avoid any - // lookup. Therefore, binary compatibility needs to be preserved - // on changes to types. (Use versioned type names to manage - // breaking changes.) - // - // Schemes other than `http`, `https` (or the empty scheme) might be - // used with implementation specific semantics. - // - string type_url = 1; - - // Must be a valid serialized protocol buffer of the above specified type. - bytes value = 2; -} diff --git a/vendor/github.com/golang/protobuf/ptypes/doc.go b/vendor/github.com/golang/protobuf/ptypes/doc.go deleted file mode 100644 index c0d595d..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/doc.go +++ /dev/null @@ -1,35 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -/* -Package ptypes contains code for interacting with well-known types. -*/ -package ptypes diff --git a/vendor/github.com/golang/protobuf/ptypes/duration.go b/vendor/github.com/golang/protobuf/ptypes/duration.go deleted file mode 100644 index 65cb0f8..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/duration.go +++ /dev/null @@ -1,102 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package ptypes - -// This file implements conversions between google.protobuf.Duration -// and time.Duration. - -import ( - "errors" - "fmt" - "time" - - durpb "github.com/golang/protobuf/ptypes/duration" -) - -const ( - // Range of a durpb.Duration in seconds, as specified in - // google/protobuf/duration.proto. This is about 10,000 years in seconds. - maxSeconds = int64(10000 * 365.25 * 24 * 60 * 60) - minSeconds = -maxSeconds -) - -// validateDuration determines whether the durpb.Duration is valid according to the -// definition in google/protobuf/duration.proto. A valid durpb.Duration -// may still be too large to fit into a time.Duration (the range of durpb.Duration -// is about 10,000 years, and the range of time.Duration is about 290). -func validateDuration(d *durpb.Duration) error { - if d == nil { - return errors.New("duration: nil Duration") - } - if d.Seconds < minSeconds || d.Seconds > maxSeconds { - return fmt.Errorf("duration: %v: seconds out of range", d) - } - if d.Nanos <= -1e9 || d.Nanos >= 1e9 { - return fmt.Errorf("duration: %v: nanos out of range", d) - } - // Seconds and Nanos must have the same sign, unless d.Nanos is zero. - if (d.Seconds < 0 && d.Nanos > 0) || (d.Seconds > 0 && d.Nanos < 0) { - return fmt.Errorf("duration: %v: seconds and nanos have different signs", d) - } - return nil -} - -// Duration converts a durpb.Duration to a time.Duration. Duration -// returns an error if the durpb.Duration is invalid or is too large to be -// represented in a time.Duration. -func Duration(p *durpb.Duration) (time.Duration, error) { - if err := validateDuration(p); err != nil { - return 0, err - } - d := time.Duration(p.Seconds) * time.Second - if int64(d/time.Second) != p.Seconds { - return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) - } - if p.Nanos != 0 { - d += time.Duration(p.Nanos) - if (d < 0) != (p.Nanos < 0) { - return 0, fmt.Errorf("duration: %v is out of range for time.Duration", p) - } - } - return d, nil -} - -// DurationProto converts a time.Duration to a durpb.Duration. -func DurationProto(d time.Duration) *durpb.Duration { - nanos := d.Nanoseconds() - secs := nanos / 1e9 - nanos -= secs * 1e9 - return &durpb.Duration{ - Seconds: secs, - Nanos: int32(nanos), - } -} diff --git a/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go b/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go deleted file mode 100644 index 4d75473..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/duration/duration.pb.go +++ /dev/null @@ -1,159 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/protobuf/duration.proto - -package duration // import "github.com/golang/protobuf/ptypes/duration" - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -// A Duration represents a signed, fixed-length span of time represented -// as a count of seconds and fractions of seconds at nanosecond -// resolution. It is independent of any calendar and concepts like "day" -// or "month". It is related to Timestamp in that the difference between -// two Timestamp values is a Duration and it can be added or subtracted -// from a Timestamp. Range is approximately +-10,000 years. -// -// # Examples -// -// Example 1: Compute Duration from two Timestamps in pseudo code. -// -// Timestamp start = ...; -// Timestamp end = ...; -// Duration duration = ...; -// -// duration.seconds = end.seconds - start.seconds; -// duration.nanos = end.nanos - start.nanos; -// -// if (duration.seconds < 0 && duration.nanos > 0) { -// duration.seconds += 1; -// duration.nanos -= 1000000000; -// } else if (durations.seconds > 0 && duration.nanos < 0) { -// duration.seconds -= 1; -// duration.nanos += 1000000000; -// } -// -// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. -// -// Timestamp start = ...; -// Duration duration = ...; -// Timestamp end = ...; -// -// end.seconds = start.seconds + duration.seconds; -// end.nanos = start.nanos + duration.nanos; -// -// if (end.nanos < 0) { -// end.seconds -= 1; -// end.nanos += 1000000000; -// } else if (end.nanos >= 1000000000) { -// end.seconds += 1; -// end.nanos -= 1000000000; -// } -// -// Example 3: Compute Duration from datetime.timedelta in Python. -// -// td = datetime.timedelta(days=3, minutes=10) -// duration = Duration() -// duration.FromTimedelta(td) -// -// # JSON Mapping -// -// In JSON format, the Duration type is encoded as a string rather than an -// object, where the string ends in the suffix "s" (indicating seconds) and -// is preceded by the number of seconds, with nanoseconds expressed as -// fractional seconds. For example, 3 seconds with 0 nanoseconds should be -// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should -// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 -// microsecond should be expressed in JSON format as "3.000001s". -// -// -type Duration struct { - // Signed seconds of the span of time. Must be from -315,576,000,000 - // to +315,576,000,000 inclusive. Note: these bounds are computed from: - // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years - Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` - // Signed fractions of a second at nanosecond resolution of the span - // of time. Durations less than one second are represented with a 0 - // `seconds` field and a positive or negative `nanos` field. For durations - // of one second or more, a non-zero value for the `nanos` field must be - // of the same sign as the `seconds` field. Must be from -999,999,999 - // to +999,999,999 inclusive. - Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Duration) Reset() { *m = Duration{} } -func (m *Duration) String() string { return proto.CompactTextString(m) } -func (*Duration) ProtoMessage() {} -func (*Duration) Descriptor() ([]byte, []int) { - return fileDescriptor_duration_e7d612259e3f0613, []int{0} -} -func (*Duration) XXX_WellKnownType() string { return "Duration" } -func (m *Duration) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Duration.Unmarshal(m, b) -} -func (m *Duration) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Duration.Marshal(b, m, deterministic) -} -func (dst *Duration) XXX_Merge(src proto.Message) { - xxx_messageInfo_Duration.Merge(dst, src) -} -func (m *Duration) XXX_Size() int { - return xxx_messageInfo_Duration.Size(m) -} -func (m *Duration) XXX_DiscardUnknown() { - xxx_messageInfo_Duration.DiscardUnknown(m) -} - -var xxx_messageInfo_Duration proto.InternalMessageInfo - -func (m *Duration) GetSeconds() int64 { - if m != nil { - return m.Seconds - } - return 0 -} - -func (m *Duration) GetNanos() int32 { - if m != nil { - return m.Nanos - } - return 0 -} - -func init() { - proto.RegisterType((*Duration)(nil), "google.protobuf.Duration") -} - -func init() { - proto.RegisterFile("google/protobuf/duration.proto", fileDescriptor_duration_e7d612259e3f0613) -} - -var fileDescriptor_duration_e7d612259e3f0613 = []byte{ - // 190 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4b, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x4f, 0x29, 0x2d, 0x4a, - 0x2c, 0xc9, 0xcc, 0xcf, 0xd3, 0x03, 0x8b, 0x08, 0xf1, 0x43, 0xe4, 0xf5, 0x60, 0xf2, 0x4a, 0x56, - 0x5c, 0x1c, 0x2e, 0x50, 0x25, 0x42, 0x12, 0x5c, 0xec, 0xc5, 0xa9, 0xc9, 0xf9, 0x79, 0x29, 0xc5, - 0x12, 0x8c, 0x0a, 0x8c, 0x1a, 0xcc, 0x41, 0x30, 0xae, 0x90, 0x08, 0x17, 0x6b, 0x5e, 0x62, 0x5e, - 0x7e, 0xb1, 0x04, 0x93, 0x02, 0xa3, 0x06, 0x6b, 0x10, 0x84, 0xe3, 0x54, 0xc3, 0x25, 0x9c, 0x9c, - 0x9f, 0xab, 0x87, 0x66, 0xa4, 0x13, 0x2f, 0xcc, 0xc0, 0x00, 0x90, 0x48, 0x00, 0x63, 0x94, 0x56, - 0x7a, 0x66, 0x49, 0x46, 0x69, 0x92, 0x5e, 0x72, 0x7e, 0xae, 0x7e, 0x7a, 0x7e, 0x4e, 0x62, 0x5e, - 0x3a, 0xc2, 0x7d, 0x05, 0x25, 0x95, 0x05, 0xa9, 0xc5, 0x70, 0x67, 0xfe, 0x60, 0x64, 0x5c, 0xc4, - 0xc4, 0xec, 0x1e, 0xe0, 0xb4, 0x8a, 0x49, 0xce, 0x1d, 0x62, 0x6e, 0x00, 0x54, 0xa9, 0x5e, 0x78, - 0x6a, 0x4e, 0x8e, 0x77, 0x5e, 0x7e, 0x79, 0x5e, 0x08, 0x48, 0x4b, 0x12, 0x1b, 0xd8, 0x0c, 0x63, - 0x40, 0x00, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x84, 0x30, 0xff, 0xf3, 0x00, 0x00, 0x00, -} diff --git a/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto b/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto deleted file mode 100644 index 975fce4..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/duration/duration.proto +++ /dev/null @@ -1,117 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option cc_enable_arenas = true; -option go_package = "github.com/golang/protobuf/ptypes/duration"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "DurationProto"; -option java_multiple_files = true; -option objc_class_prefix = "GPB"; - -// A Duration represents a signed, fixed-length span of time represented -// as a count of seconds and fractions of seconds at nanosecond -// resolution. It is independent of any calendar and concepts like "day" -// or "month". It is related to Timestamp in that the difference between -// two Timestamp values is a Duration and it can be added or subtracted -// from a Timestamp. Range is approximately +-10,000 years. -// -// # Examples -// -// Example 1: Compute Duration from two Timestamps in pseudo code. -// -// Timestamp start = ...; -// Timestamp end = ...; -// Duration duration = ...; -// -// duration.seconds = end.seconds - start.seconds; -// duration.nanos = end.nanos - start.nanos; -// -// if (duration.seconds < 0 && duration.nanos > 0) { -// duration.seconds += 1; -// duration.nanos -= 1000000000; -// } else if (durations.seconds > 0 && duration.nanos < 0) { -// duration.seconds -= 1; -// duration.nanos += 1000000000; -// } -// -// Example 2: Compute Timestamp from Timestamp + Duration in pseudo code. -// -// Timestamp start = ...; -// Duration duration = ...; -// Timestamp end = ...; -// -// end.seconds = start.seconds + duration.seconds; -// end.nanos = start.nanos + duration.nanos; -// -// if (end.nanos < 0) { -// end.seconds -= 1; -// end.nanos += 1000000000; -// } else if (end.nanos >= 1000000000) { -// end.seconds += 1; -// end.nanos -= 1000000000; -// } -// -// Example 3: Compute Duration from datetime.timedelta in Python. -// -// td = datetime.timedelta(days=3, minutes=10) -// duration = Duration() -// duration.FromTimedelta(td) -// -// # JSON Mapping -// -// In JSON format, the Duration type is encoded as a string rather than an -// object, where the string ends in the suffix "s" (indicating seconds) and -// is preceded by the number of seconds, with nanoseconds expressed as -// fractional seconds. For example, 3 seconds with 0 nanoseconds should be -// encoded in JSON format as "3s", while 3 seconds and 1 nanosecond should -// be expressed in JSON format as "3.000000001s", and 3 seconds and 1 -// microsecond should be expressed in JSON format as "3.000001s". -// -// -message Duration { - - // Signed seconds of the span of time. Must be from -315,576,000,000 - // to +315,576,000,000 inclusive. Note: these bounds are computed from: - // 60 sec/min * 60 min/hr * 24 hr/day * 365.25 days/year * 10000 years - int64 seconds = 1; - - // Signed fractions of a second at nanosecond resolution of the span - // of time. Durations less than one second are represented with a 0 - // `seconds` field and a positive or negative `nanos` field. For durations - // of one second or more, a non-zero value for the `nanos` field must be - // of the same sign as the `seconds` field. Must be from -999,999,999 - // to +999,999,999 inclusive. - int32 nanos = 2; -} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp.go b/vendor/github.com/golang/protobuf/ptypes/timestamp.go deleted file mode 100644 index 47f10db..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/timestamp.go +++ /dev/null @@ -1,134 +0,0 @@ -// Go support for Protocol Buffers - Google's data interchange format -// -// Copyright 2016 The Go Authors. All rights reserved. -// https://github.com/golang/protobuf -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -package ptypes - -// This file implements operations on google.protobuf.Timestamp. - -import ( - "errors" - "fmt" - "time" - - tspb "github.com/golang/protobuf/ptypes/timestamp" -) - -const ( - // Seconds field of the earliest valid Timestamp. - // This is time.Date(1, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). - minValidSeconds = -62135596800 - // Seconds field just after the latest valid Timestamp. - // This is time.Date(10000, 1, 1, 0, 0, 0, 0, time.UTC).Unix(). - maxValidSeconds = 253402300800 -) - -// validateTimestamp determines whether a Timestamp is valid. -// A valid timestamp represents a time in the range -// [0001-01-01, 10000-01-01) and has a Nanos field -// in the range [0, 1e9). -// -// If the Timestamp is valid, validateTimestamp returns nil. -// Otherwise, it returns an error that describes -// the problem. -// -// Every valid Timestamp can be represented by a time.Time, but the converse is not true. -func validateTimestamp(ts *tspb.Timestamp) error { - if ts == nil { - return errors.New("timestamp: nil Timestamp") - } - if ts.Seconds < minValidSeconds { - return fmt.Errorf("timestamp: %v before 0001-01-01", ts) - } - if ts.Seconds >= maxValidSeconds { - return fmt.Errorf("timestamp: %v after 10000-01-01", ts) - } - if ts.Nanos < 0 || ts.Nanos >= 1e9 { - return fmt.Errorf("timestamp: %v: nanos not in range [0, 1e9)", ts) - } - return nil -} - -// Timestamp converts a google.protobuf.Timestamp proto to a time.Time. -// It returns an error if the argument is invalid. -// -// Unlike most Go functions, if Timestamp returns an error, the first return value -// is not the zero time.Time. Instead, it is the value obtained from the -// time.Unix function when passed the contents of the Timestamp, in the UTC -// locale. This may or may not be a meaningful time; many invalid Timestamps -// do map to valid time.Times. -// -// A nil Timestamp returns an error. The first return value in that case is -// undefined. -func Timestamp(ts *tspb.Timestamp) (time.Time, error) { - // Don't return the zero value on error, because corresponds to a valid - // timestamp. Instead return whatever time.Unix gives us. - var t time.Time - if ts == nil { - t = time.Unix(0, 0).UTC() // treat nil like the empty Timestamp - } else { - t = time.Unix(ts.Seconds, int64(ts.Nanos)).UTC() - } - return t, validateTimestamp(ts) -} - -// TimestampNow returns a google.protobuf.Timestamp for the current time. -func TimestampNow() *tspb.Timestamp { - ts, err := TimestampProto(time.Now()) - if err != nil { - panic("ptypes: time.Now() out of Timestamp range") - } - return ts -} - -// TimestampProto converts the time.Time to a google.protobuf.Timestamp proto. -// It returns an error if the resulting Timestamp is invalid. -func TimestampProto(t time.Time) (*tspb.Timestamp, error) { - seconds := t.Unix() - nanos := int32(t.Sub(time.Unix(seconds, 0))) - ts := &tspb.Timestamp{ - Seconds: seconds, - Nanos: nanos, - } - if err := validateTimestamp(ts); err != nil { - return nil, err - } - return ts, nil -} - -// TimestampString returns the RFC 3339 string for valid Timestamps. For invalid -// Timestamps, it returns an error message in parentheses. -func TimestampString(ts *tspb.Timestamp) string { - t, err := Timestamp(ts) - if err != nil { - return fmt.Sprintf("(%v)", err) - } - return t.Format(time.RFC3339Nano) -} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go deleted file mode 100644 index e9c2222..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.pb.go +++ /dev/null @@ -1,175 +0,0 @@ -// Code generated by protoc-gen-go. DO NOT EDIT. -// source: google/protobuf/timestamp.proto - -package timestamp // import "github.com/golang/protobuf/ptypes/timestamp" - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -// A Timestamp represents a point in time independent of any time zone -// or calendar, represented as seconds and fractions of seconds at -// nanosecond resolution in UTC Epoch time. It is encoded using the -// Proleptic Gregorian Calendar which extends the Gregorian calendar -// backwards to year one. It is encoded assuming all minutes are 60 -// seconds long, i.e. leap seconds are "smeared" so that no leap second -// table is needed for interpretation. Range is from -// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. -// By restricting to that range, we ensure that we can convert to -// and from RFC 3339 date strings. -// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). -// -// # Examples -// -// Example 1: Compute Timestamp from POSIX `time()`. -// -// Timestamp timestamp; -// timestamp.set_seconds(time(NULL)); -// timestamp.set_nanos(0); -// -// Example 2: Compute Timestamp from POSIX `gettimeofday()`. -// -// struct timeval tv; -// gettimeofday(&tv, NULL); -// -// Timestamp timestamp; -// timestamp.set_seconds(tv.tv_sec); -// timestamp.set_nanos(tv.tv_usec * 1000); -// -// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. -// -// FILETIME ft; -// GetSystemTimeAsFileTime(&ft); -// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; -// -// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z -// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. -// Timestamp timestamp; -// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); -// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); -// -// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. -// -// long millis = System.currentTimeMillis(); -// -// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) -// .setNanos((int) ((millis % 1000) * 1000000)).build(); -// -// -// Example 5: Compute Timestamp from current time in Python. -// -// timestamp = Timestamp() -// timestamp.GetCurrentTime() -// -// # JSON Mapping -// -// In JSON format, the Timestamp type is encoded as a string in the -// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the -// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" -// where {year} is always expressed using four digits while {month}, {day}, -// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional -// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), -// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone -// is required, though only UTC (as indicated by "Z") is presently supported. -// -// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past -// 01:30 UTC on January 15, 2017. -// -// In JavaScript, one can convert a Date object to this format using the -// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] -// method. In Python, a standard `datetime.datetime` object can be converted -// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) -// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one -// can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( -// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--) -// to obtain a formatter capable of generating timestamps in this format. -// -// -type Timestamp struct { - // Represents seconds of UTC time since Unix epoch - // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - // 9999-12-31T23:59:59Z inclusive. - Seconds int64 `protobuf:"varint,1,opt,name=seconds" json:"seconds,omitempty"` - // Non-negative fractions of a second at nanosecond resolution. Negative - // second values with fractions must still have non-negative nanos values - // that count forward in time. Must be from 0 to 999,999,999 - // inclusive. - Nanos int32 `protobuf:"varint,2,opt,name=nanos" json:"nanos,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Timestamp) Reset() { *m = Timestamp{} } -func (m *Timestamp) String() string { return proto.CompactTextString(m) } -func (*Timestamp) ProtoMessage() {} -func (*Timestamp) Descriptor() ([]byte, []int) { - return fileDescriptor_timestamp_b826e8e5fba671a8, []int{0} -} -func (*Timestamp) XXX_WellKnownType() string { return "Timestamp" } -func (m *Timestamp) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Timestamp.Unmarshal(m, b) -} -func (m *Timestamp) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Timestamp.Marshal(b, m, deterministic) -} -func (dst *Timestamp) XXX_Merge(src proto.Message) { - xxx_messageInfo_Timestamp.Merge(dst, src) -} -func (m *Timestamp) XXX_Size() int { - return xxx_messageInfo_Timestamp.Size(m) -} -func (m *Timestamp) XXX_DiscardUnknown() { - xxx_messageInfo_Timestamp.DiscardUnknown(m) -} - -var xxx_messageInfo_Timestamp proto.InternalMessageInfo - -func (m *Timestamp) GetSeconds() int64 { - if m != nil { - return m.Seconds - } - return 0 -} - -func (m *Timestamp) GetNanos() int32 { - if m != nil { - return m.Nanos - } - return 0 -} - -func init() { - proto.RegisterType((*Timestamp)(nil), "google.protobuf.Timestamp") -} - -func init() { - proto.RegisterFile("google/protobuf/timestamp.proto", fileDescriptor_timestamp_b826e8e5fba671a8) -} - -var fileDescriptor_timestamp_b826e8e5fba671a8 = []byte{ - // 191 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x92, 0x4f, 0xcf, 0xcf, 0x4f, - 0xcf, 0x49, 0xd5, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0x4f, 0x2a, 0x4d, 0xd3, 0x2f, 0xc9, 0xcc, 0x4d, - 0x2d, 0x2e, 0x49, 0xcc, 0x2d, 0xd0, 0x03, 0x0b, 0x09, 0xf1, 0x43, 0x14, 0xe8, 0xc1, 0x14, 0x28, - 0x59, 0x73, 0x71, 0x86, 0xc0, 0xd4, 0x08, 0x49, 0x70, 0xb1, 0x17, 0xa7, 0x26, 0xe7, 0xe7, 0xa5, - 0x14, 0x4b, 0x30, 0x2a, 0x30, 0x6a, 0x30, 0x07, 0xc1, 0xb8, 0x42, 0x22, 0x5c, 0xac, 0x79, 0x89, - 0x79, 0xf9, 0xc5, 0x12, 0x4c, 0x0a, 0x8c, 0x1a, 0xac, 0x41, 0x10, 0x8e, 0x53, 0x1d, 0x97, 0x70, - 0x72, 0x7e, 0xae, 0x1e, 0x9a, 0x99, 0x4e, 0x7c, 0x70, 0x13, 0x03, 0x40, 0x42, 0x01, 0x8c, 0x51, - 0xda, 0xe9, 0x99, 0x25, 0x19, 0xa5, 0x49, 0x7a, 0xc9, 0xf9, 0xb9, 0xfa, 0xe9, 0xf9, 0x39, 0x89, - 0x79, 0xe9, 0x08, 0x27, 0x16, 0x94, 0x54, 0x16, 0xa4, 0x16, 0x23, 0x5c, 0xfa, 0x83, 0x91, 0x71, - 0x11, 0x13, 0xb3, 0x7b, 0x80, 0xd3, 0x2a, 0x26, 0x39, 0x77, 0x88, 0xc9, 0x01, 0x50, 0xb5, 0x7a, - 0xe1, 0xa9, 0x39, 0x39, 0xde, 0x79, 0xf9, 0xe5, 0x79, 0x21, 0x20, 0x3d, 0x49, 0x6c, 0x60, 0x43, - 0x8c, 0x01, 0x01, 0x00, 0x00, 0xff, 0xff, 0xbc, 0x77, 0x4a, 0x07, 0xf7, 0x00, 0x00, 0x00, -} diff --git a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto b/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto deleted file mode 100644 index 06750ab..0000000 --- a/vendor/github.com/golang/protobuf/ptypes/timestamp/timestamp.proto +++ /dev/null @@ -1,133 +0,0 @@ -// Protocol Buffers - Google's data interchange format -// Copyright 2008 Google Inc. All rights reserved. -// https://developers.google.com/protocol-buffers/ -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following disclaimer -// in the documentation and/or other materials provided with the -// distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived from -// this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -syntax = "proto3"; - -package google.protobuf; - -option csharp_namespace = "Google.Protobuf.WellKnownTypes"; -option cc_enable_arenas = true; -option go_package = "github.com/golang/protobuf/ptypes/timestamp"; -option java_package = "com.google.protobuf"; -option java_outer_classname = "TimestampProto"; -option java_multiple_files = true; -option objc_class_prefix = "GPB"; - -// A Timestamp represents a point in time independent of any time zone -// or calendar, represented as seconds and fractions of seconds at -// nanosecond resolution in UTC Epoch time. It is encoded using the -// Proleptic Gregorian Calendar which extends the Gregorian calendar -// backwards to year one. It is encoded assuming all minutes are 60 -// seconds long, i.e. leap seconds are "smeared" so that no leap second -// table is needed for interpretation. Range is from -// 0001-01-01T00:00:00Z to 9999-12-31T23:59:59.999999999Z. -// By restricting to that range, we ensure that we can convert to -// and from RFC 3339 date strings. -// See [https://www.ietf.org/rfc/rfc3339.txt](https://www.ietf.org/rfc/rfc3339.txt). -// -// # Examples -// -// Example 1: Compute Timestamp from POSIX `time()`. -// -// Timestamp timestamp; -// timestamp.set_seconds(time(NULL)); -// timestamp.set_nanos(0); -// -// Example 2: Compute Timestamp from POSIX `gettimeofday()`. -// -// struct timeval tv; -// gettimeofday(&tv, NULL); -// -// Timestamp timestamp; -// timestamp.set_seconds(tv.tv_sec); -// timestamp.set_nanos(tv.tv_usec * 1000); -// -// Example 3: Compute Timestamp from Win32 `GetSystemTimeAsFileTime()`. -// -// FILETIME ft; -// GetSystemTimeAsFileTime(&ft); -// UINT64 ticks = (((UINT64)ft.dwHighDateTime) << 32) | ft.dwLowDateTime; -// -// // A Windows tick is 100 nanoseconds. Windows epoch 1601-01-01T00:00:00Z -// // is 11644473600 seconds before Unix epoch 1970-01-01T00:00:00Z. -// Timestamp timestamp; -// timestamp.set_seconds((INT64) ((ticks / 10000000) - 11644473600LL)); -// timestamp.set_nanos((INT32) ((ticks % 10000000) * 100)); -// -// Example 4: Compute Timestamp from Java `System.currentTimeMillis()`. -// -// long millis = System.currentTimeMillis(); -// -// Timestamp timestamp = Timestamp.newBuilder().setSeconds(millis / 1000) -// .setNanos((int) ((millis % 1000) * 1000000)).build(); -// -// -// Example 5: Compute Timestamp from current time in Python. -// -// timestamp = Timestamp() -// timestamp.GetCurrentTime() -// -// # JSON Mapping -// -// In JSON format, the Timestamp type is encoded as a string in the -// [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) format. That is, the -// format is "{year}-{month}-{day}T{hour}:{min}:{sec}[.{frac_sec}]Z" -// where {year} is always expressed using four digits while {month}, {day}, -// {hour}, {min}, and {sec} are zero-padded to two digits each. The fractional -// seconds, which can go up to 9 digits (i.e. up to 1 nanosecond resolution), -// are optional. The "Z" suffix indicates the timezone ("UTC"); the timezone -// is required, though only UTC (as indicated by "Z") is presently supported. -// -// For example, "2017-01-15T01:30:15.01Z" encodes 15.01 seconds past -// 01:30 UTC on January 15, 2017. -// -// In JavaScript, one can convert a Date object to this format using the -// standard [toISOString()](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/toISOString] -// method. In Python, a standard `datetime.datetime` object can be converted -// to this format using [`strftime`](https://docs.python.org/2/library/time.html#time.strftime) -// with the time format spec '%Y-%m-%dT%H:%M:%S.%fZ'. Likewise, in Java, one -// can use the Joda Time's [`ISODateTimeFormat.dateTime()`]( -// http://www.joda.org/joda-time/apidocs/org/joda/time/format/ISODateTimeFormat.html#dateTime--) -// to obtain a formatter capable of generating timestamps in this format. -// -// -message Timestamp { - - // Represents seconds of UTC time since Unix epoch - // 1970-01-01T00:00:00Z. Must be from 0001-01-01T00:00:00Z to - // 9999-12-31T23:59:59Z inclusive. - int64 seconds = 1; - - // Non-negative fractions of a second at nanosecond resolution. Negative - // second values with fractions must still have non-negative nanos values - // that count forward in time. Must be from 0 to 999,999,999 - // inclusive. - int32 nanos = 2; -} diff --git a/vendor/github.com/google/btree/.travis.yml b/vendor/github.com/google/btree/.travis.yml deleted file mode 100644 index 4f2ee4d..0000000 --- a/vendor/github.com/google/btree/.travis.yml +++ /dev/null @@ -1 +0,0 @@ -language: go diff --git a/vendor/github.com/google/btree/LICENSE b/vendor/github.com/google/btree/LICENSE deleted file mode 100644 index d645695..0000000 --- a/vendor/github.com/google/btree/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/google/btree/README.md b/vendor/github.com/google/btree/README.md deleted file mode 100644 index 6062a4d..0000000 --- a/vendor/github.com/google/btree/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# BTree implementation for Go - -![Travis CI Build Status](https://api.travis-ci.org/google/btree.svg?branch=master) - -This package provides an in-memory B-Tree implementation for Go, useful as -an ordered, mutable data structure. - -The API is based off of the wonderful -http://godoc.org/github.com/petar/GoLLRB/llrb, and is meant to allow btree to -act as a drop-in replacement for gollrb trees. - -See http://godoc.org/github.com/google/btree for documentation. diff --git a/vendor/github.com/google/btree/btree.go b/vendor/github.com/google/btree/btree.go deleted file mode 100644 index 6ff062f..0000000 --- a/vendor/github.com/google/btree/btree.go +++ /dev/null @@ -1,890 +0,0 @@ -// Copyright 2014 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package btree implements in-memory B-Trees of arbitrary degree. -// -// btree implements an in-memory B-Tree for use as an ordered data structure. -// It is not meant for persistent storage solutions. -// -// It has a flatter structure than an equivalent red-black or other binary tree, -// which in some cases yields better memory usage and/or performance. -// See some discussion on the matter here: -// http://google-opensource.blogspot.com/2013/01/c-containers-that-save-memory-and-time.html -// Note, though, that this project is in no way related to the C++ B-Tree -// implementation written about there. -// -// Within this tree, each node contains a slice of items and a (possibly nil) -// slice of children. For basic numeric values or raw structs, this can cause -// efficiency differences when compared to equivalent C++ template code that -// stores values in arrays within the node: -// * Due to the overhead of storing values as interfaces (each -// value needs to be stored as the value itself, then 2 words for the -// interface pointing to that value and its type), resulting in higher -// memory use. -// * Since interfaces can point to values anywhere in memory, values are -// most likely not stored in contiguous blocks, resulting in a higher -// number of cache misses. -// These issues don't tend to matter, though, when working with strings or other -// heap-allocated structures, since C++-equivalent structures also must store -// pointers and also distribute their values across the heap. -// -// This implementation is designed to be a drop-in replacement to gollrb.LLRB -// trees, (http://github.com/petar/gollrb), an excellent and probably the most -// widely used ordered tree implementation in the Go ecosystem currently. -// Its functions, therefore, exactly mirror those of -// llrb.LLRB where possible. Unlike gollrb, though, we currently don't -// support storing multiple equivalent values. -package btree - -import ( - "fmt" - "io" - "sort" - "strings" - "sync" -) - -// Item represents a single object in the tree. -type Item interface { - // Less tests whether the current item is less than the given argument. - // - // This must provide a strict weak ordering. - // If !a.Less(b) && !b.Less(a), we treat this to mean a == b (i.e. we can only - // hold one of either a or b in the tree). - Less(than Item) bool -} - -const ( - DefaultFreeListSize = 32 -) - -var ( - nilItems = make(items, 16) - nilChildren = make(children, 16) -) - -// FreeList represents a free list of btree nodes. By default each -// BTree has its own FreeList, but multiple BTrees can share the same -// FreeList. -// Two Btrees using the same freelist are safe for concurrent write access. -type FreeList struct { - mu sync.Mutex - freelist []*node -} - -// NewFreeList creates a new free list. -// size is the maximum size of the returned free list. -func NewFreeList(size int) *FreeList { - return &FreeList{freelist: make([]*node, 0, size)} -} - -func (f *FreeList) newNode() (n *node) { - f.mu.Lock() - index := len(f.freelist) - 1 - if index < 0 { - f.mu.Unlock() - return new(node) - } - n = f.freelist[index] - f.freelist[index] = nil - f.freelist = f.freelist[:index] - f.mu.Unlock() - return -} - -// freeNode adds the given node to the list, returning true if it was added -// and false if it was discarded. -func (f *FreeList) freeNode(n *node) (out bool) { - f.mu.Lock() - if len(f.freelist) < cap(f.freelist) { - f.freelist = append(f.freelist, n) - out = true - } - f.mu.Unlock() - return -} - -// ItemIterator allows callers of Ascend* to iterate in-order over portions of -// the tree. When this function returns false, iteration will stop and the -// associated Ascend* function will immediately return. -type ItemIterator func(i Item) bool - -// New creates a new B-Tree with the given degree. -// -// New(2), for example, will create a 2-3-4 tree (each node contains 1-3 items -// and 2-4 children). -func New(degree int) *BTree { - return NewWithFreeList(degree, NewFreeList(DefaultFreeListSize)) -} - -// NewWithFreeList creates a new B-Tree that uses the given node free list. -func NewWithFreeList(degree int, f *FreeList) *BTree { - if degree <= 1 { - panic("bad degree") - } - return &BTree{ - degree: degree, - cow: ©OnWriteContext{freelist: f}, - } -} - -// items stores items in a node. -type items []Item - -// insertAt inserts a value into the given index, pushing all subsequent values -// forward. -func (s *items) insertAt(index int, item Item) { - *s = append(*s, nil) - if index < len(*s) { - copy((*s)[index+1:], (*s)[index:]) - } - (*s)[index] = item -} - -// removeAt removes a value at a given index, pulling all subsequent values -// back. -func (s *items) removeAt(index int) Item { - item := (*s)[index] - copy((*s)[index:], (*s)[index+1:]) - (*s)[len(*s)-1] = nil - *s = (*s)[:len(*s)-1] - return item -} - -// pop removes and returns the last element in the list. -func (s *items) pop() (out Item) { - index := len(*s) - 1 - out = (*s)[index] - (*s)[index] = nil - *s = (*s)[:index] - return -} - -// truncate truncates this instance at index so that it contains only the -// first index items. index must be less than or equal to length. -func (s *items) truncate(index int) { - var toClear items - *s, toClear = (*s)[:index], (*s)[index:] - for len(toClear) > 0 { - toClear = toClear[copy(toClear, nilItems):] - } -} - -// find returns the index where the given item should be inserted into this -// list. 'found' is true if the item already exists in the list at the given -// index. -func (s items) find(item Item) (index int, found bool) { - i := sort.Search(len(s), func(i int) bool { - return item.Less(s[i]) - }) - if i > 0 && !s[i-1].Less(item) { - return i - 1, true - } - return i, false -} - -// children stores child nodes in a node. -type children []*node - -// insertAt inserts a value into the given index, pushing all subsequent values -// forward. -func (s *children) insertAt(index int, n *node) { - *s = append(*s, nil) - if index < len(*s) { - copy((*s)[index+1:], (*s)[index:]) - } - (*s)[index] = n -} - -// removeAt removes a value at a given index, pulling all subsequent values -// back. -func (s *children) removeAt(index int) *node { - n := (*s)[index] - copy((*s)[index:], (*s)[index+1:]) - (*s)[len(*s)-1] = nil - *s = (*s)[:len(*s)-1] - return n -} - -// pop removes and returns the last element in the list. -func (s *children) pop() (out *node) { - index := len(*s) - 1 - out = (*s)[index] - (*s)[index] = nil - *s = (*s)[:index] - return -} - -// truncate truncates this instance at index so that it contains only the -// first index children. index must be less than or equal to length. -func (s *children) truncate(index int) { - var toClear children - *s, toClear = (*s)[:index], (*s)[index:] - for len(toClear) > 0 { - toClear = toClear[copy(toClear, nilChildren):] - } -} - -// node is an internal node in a tree. -// -// It must at all times maintain the invariant that either -// * len(children) == 0, len(items) unconstrained -// * len(children) == len(items) + 1 -type node struct { - items items - children children - cow *copyOnWriteContext -} - -func (n *node) mutableFor(cow *copyOnWriteContext) *node { - if n.cow == cow { - return n - } - out := cow.newNode() - if cap(out.items) >= len(n.items) { - out.items = out.items[:len(n.items)] - } else { - out.items = make(items, len(n.items), cap(n.items)) - } - copy(out.items, n.items) - // Copy children - if cap(out.children) >= len(n.children) { - out.children = out.children[:len(n.children)] - } else { - out.children = make(children, len(n.children), cap(n.children)) - } - copy(out.children, n.children) - return out -} - -func (n *node) mutableChild(i int) *node { - c := n.children[i].mutableFor(n.cow) - n.children[i] = c - return c -} - -// split splits the given node at the given index. The current node shrinks, -// and this function returns the item that existed at that index and a new node -// containing all items/children after it. -func (n *node) split(i int) (Item, *node) { - item := n.items[i] - next := n.cow.newNode() - next.items = append(next.items, n.items[i+1:]...) - n.items.truncate(i) - if len(n.children) > 0 { - next.children = append(next.children, n.children[i+1:]...) - n.children.truncate(i + 1) - } - return item, next -} - -// maybeSplitChild checks if a child should be split, and if so splits it. -// Returns whether or not a split occurred. -func (n *node) maybeSplitChild(i, maxItems int) bool { - if len(n.children[i].items) < maxItems { - return false - } - first := n.mutableChild(i) - item, second := first.split(maxItems / 2) - n.items.insertAt(i, item) - n.children.insertAt(i+1, second) - return true -} - -// insert inserts an item into the subtree rooted at this node, making sure -// no nodes in the subtree exceed maxItems items. Should an equivalent item be -// be found/replaced by insert, it will be returned. -func (n *node) insert(item Item, maxItems int) Item { - i, found := n.items.find(item) - if found { - out := n.items[i] - n.items[i] = item - return out - } - if len(n.children) == 0 { - n.items.insertAt(i, item) - return nil - } - if n.maybeSplitChild(i, maxItems) { - inTree := n.items[i] - switch { - case item.Less(inTree): - // no change, we want first split node - case inTree.Less(item): - i++ // we want second split node - default: - out := n.items[i] - n.items[i] = item - return out - } - } - return n.mutableChild(i).insert(item, maxItems) -} - -// get finds the given key in the subtree and returns it. -func (n *node) get(key Item) Item { - i, found := n.items.find(key) - if found { - return n.items[i] - } else if len(n.children) > 0 { - return n.children[i].get(key) - } - return nil -} - -// min returns the first item in the subtree. -func min(n *node) Item { - if n == nil { - return nil - } - for len(n.children) > 0 { - n = n.children[0] - } - if len(n.items) == 0 { - return nil - } - return n.items[0] -} - -// max returns the last item in the subtree. -func max(n *node) Item { - if n == nil { - return nil - } - for len(n.children) > 0 { - n = n.children[len(n.children)-1] - } - if len(n.items) == 0 { - return nil - } - return n.items[len(n.items)-1] -} - -// toRemove details what item to remove in a node.remove call. -type toRemove int - -const ( - removeItem toRemove = iota // removes the given item - removeMin // removes smallest item in the subtree - removeMax // removes largest item in the subtree -) - -// remove removes an item from the subtree rooted at this node. -func (n *node) remove(item Item, minItems int, typ toRemove) Item { - var i int - var found bool - switch typ { - case removeMax: - if len(n.children) == 0 { - return n.items.pop() - } - i = len(n.items) - case removeMin: - if len(n.children) == 0 { - return n.items.removeAt(0) - } - i = 0 - case removeItem: - i, found = n.items.find(item) - if len(n.children) == 0 { - if found { - return n.items.removeAt(i) - } - return nil - } - default: - panic("invalid type") - } - // If we get to here, we have children. - if len(n.children[i].items) <= minItems { - return n.growChildAndRemove(i, item, minItems, typ) - } - child := n.mutableChild(i) - // Either we had enough items to begin with, or we've done some - // merging/stealing, because we've got enough now and we're ready to return - // stuff. - if found { - // The item exists at index 'i', and the child we've selected can give us a - // predecessor, since if we've gotten here it's got > minItems items in it. - out := n.items[i] - // We use our special-case 'remove' call with typ=maxItem to pull the - // predecessor of item i (the rightmost leaf of our immediate left child) - // and set it into where we pulled the item from. - n.items[i] = child.remove(nil, minItems, removeMax) - return out - } - // Final recursive call. Once we're here, we know that the item isn't in this - // node and that the child is big enough to remove from. - return child.remove(item, minItems, typ) -} - -// growChildAndRemove grows child 'i' to make sure it's possible to remove an -// item from it while keeping it at minItems, then calls remove to actually -// remove it. -// -// Most documentation says we have to do two sets of special casing: -// 1) item is in this node -// 2) item is in child -// In both cases, we need to handle the two subcases: -// A) node has enough values that it can spare one -// B) node doesn't have enough values -// For the latter, we have to check: -// a) left sibling has node to spare -// b) right sibling has node to spare -// c) we must merge -// To simplify our code here, we handle cases #1 and #2 the same: -// If a node doesn't have enough items, we make sure it does (using a,b,c). -// We then simply redo our remove call, and the second time (regardless of -// whether we're in case 1 or 2), we'll have enough items and can guarantee -// that we hit case A. -func (n *node) growChildAndRemove(i int, item Item, minItems int, typ toRemove) Item { - if i > 0 && len(n.children[i-1].items) > minItems { - // Steal from left child - child := n.mutableChild(i) - stealFrom := n.mutableChild(i - 1) - stolenItem := stealFrom.items.pop() - child.items.insertAt(0, n.items[i-1]) - n.items[i-1] = stolenItem - if len(stealFrom.children) > 0 { - child.children.insertAt(0, stealFrom.children.pop()) - } - } else if i < len(n.items) && len(n.children[i+1].items) > minItems { - // steal from right child - child := n.mutableChild(i) - stealFrom := n.mutableChild(i + 1) - stolenItem := stealFrom.items.removeAt(0) - child.items = append(child.items, n.items[i]) - n.items[i] = stolenItem - if len(stealFrom.children) > 0 { - child.children = append(child.children, stealFrom.children.removeAt(0)) - } - } else { - if i >= len(n.items) { - i-- - } - child := n.mutableChild(i) - // merge with right child - mergeItem := n.items.removeAt(i) - mergeChild := n.children.removeAt(i + 1) - child.items = append(child.items, mergeItem) - child.items = append(child.items, mergeChild.items...) - child.children = append(child.children, mergeChild.children...) - n.cow.freeNode(mergeChild) - } - return n.remove(item, minItems, typ) -} - -type direction int - -const ( - descend = direction(-1) - ascend = direction(+1) -) - -// iterate provides a simple method for iterating over elements in the tree. -// -// When ascending, the 'start' should be less than 'stop' and when descending, -// the 'start' should be greater than 'stop'. Setting 'includeStart' to true -// will force the iterator to include the first item when it equals 'start', -// thus creating a "greaterOrEqual" or "lessThanEqual" rather than just a -// "greaterThan" or "lessThan" queries. -func (n *node) iterate(dir direction, start, stop Item, includeStart bool, hit bool, iter ItemIterator) (bool, bool) { - var ok, found bool - var index int - switch dir { - case ascend: - if start != nil { - index, _ = n.items.find(start) - } - for i := index; i < len(n.items); i++ { - if len(n.children) > 0 { - if hit, ok = n.children[i].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - if !includeStart && !hit && start != nil && !start.Less(n.items[i]) { - hit = true - continue - } - hit = true - if stop != nil && !n.items[i].Less(stop) { - return hit, false - } - if !iter(n.items[i]) { - return hit, false - } - } - if len(n.children) > 0 { - if hit, ok = n.children[len(n.children)-1].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - case descend: - if start != nil { - index, found = n.items.find(start) - if !found { - index = index - 1 - } - } else { - index = len(n.items) - 1 - } - for i := index; i >= 0; i-- { - if start != nil && !n.items[i].Less(start) { - if !includeStart || hit || start.Less(n.items[i]) { - continue - } - } - if len(n.children) > 0 { - if hit, ok = n.children[i+1].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - if stop != nil && !stop.Less(n.items[i]) { - return hit, false // continue - } - hit = true - if !iter(n.items[i]) { - return hit, false - } - } - if len(n.children) > 0 { - if hit, ok = n.children[0].iterate(dir, start, stop, includeStart, hit, iter); !ok { - return hit, false - } - } - } - return hit, true -} - -// Used for testing/debugging purposes. -func (n *node) print(w io.Writer, level int) { - fmt.Fprintf(w, "%sNODE:%v\n", strings.Repeat(" ", level), n.items) - for _, c := range n.children { - c.print(w, level+1) - } -} - -// BTree is an implementation of a B-Tree. -// -// BTree stores Item instances in an ordered structure, allowing easy insertion, -// removal, and iteration. -// -// Write operations are not safe for concurrent mutation by multiple -// goroutines, but Read operations are. -type BTree struct { - degree int - length int - root *node - cow *copyOnWriteContext -} - -// copyOnWriteContext pointers determine node ownership... a tree with a write -// context equivalent to a node's write context is allowed to modify that node. -// A tree whose write context does not match a node's is not allowed to modify -// it, and must create a new, writable copy (IE: it's a Clone). -// -// When doing any write operation, we maintain the invariant that the current -// node's context is equal to the context of the tree that requested the write. -// We do this by, before we descend into any node, creating a copy with the -// correct context if the contexts don't match. -// -// Since the node we're currently visiting on any write has the requesting -// tree's context, that node is modifiable in place. Children of that node may -// not share context, but before we descend into them, we'll make a mutable -// copy. -type copyOnWriteContext struct { - freelist *FreeList -} - -// Clone clones the btree, lazily. Clone should not be called concurrently, -// but the original tree (t) and the new tree (t2) can be used concurrently -// once the Clone call completes. -// -// The internal tree structure of b is marked read-only and shared between t and -// t2. Writes to both t and t2 use copy-on-write logic, creating new nodes -// whenever one of b's original nodes would have been modified. Read operations -// should have no performance degredation. Write operations for both t and t2 -// will initially experience minor slow-downs caused by additional allocs and -// copies due to the aforementioned copy-on-write logic, but should converge to -// the original performance characteristics of the original tree. -func (t *BTree) Clone() (t2 *BTree) { - // Create two entirely new copy-on-write contexts. - // This operation effectively creates three trees: - // the original, shared nodes (old b.cow) - // the new b.cow nodes - // the new out.cow nodes - cow1, cow2 := *t.cow, *t.cow - out := *t - t.cow = &cow1 - out.cow = &cow2 - return &out -} - -// maxItems returns the max number of items to allow per node. -func (t *BTree) maxItems() int { - return t.degree*2 - 1 -} - -// minItems returns the min number of items to allow per node (ignored for the -// root node). -func (t *BTree) minItems() int { - return t.degree - 1 -} - -func (c *copyOnWriteContext) newNode() (n *node) { - n = c.freelist.newNode() - n.cow = c - return -} - -type freeType int - -const ( - ftFreelistFull freeType = iota // node was freed (available for GC, not stored in freelist) - ftStored // node was stored in the freelist for later use - ftNotOwned // node was ignored by COW, since it's owned by another one -) - -// freeNode frees a node within a given COW context, if it's owned by that -// context. It returns what happened to the node (see freeType const -// documentation). -func (c *copyOnWriteContext) freeNode(n *node) freeType { - if n.cow == c { - // clear to allow GC - n.items.truncate(0) - n.children.truncate(0) - n.cow = nil - if c.freelist.freeNode(n) { - return ftStored - } else { - return ftFreelistFull - } - } else { - return ftNotOwned - } -} - -// ReplaceOrInsert adds the given item to the tree. If an item in the tree -// already equals the given one, it is removed from the tree and returned. -// Otherwise, nil is returned. -// -// nil cannot be added to the tree (will panic). -func (t *BTree) ReplaceOrInsert(item Item) Item { - if item == nil { - panic("nil item being added to BTree") - } - if t.root == nil { - t.root = t.cow.newNode() - t.root.items = append(t.root.items, item) - t.length++ - return nil - } else { - t.root = t.root.mutableFor(t.cow) - if len(t.root.items) >= t.maxItems() { - item2, second := t.root.split(t.maxItems() / 2) - oldroot := t.root - t.root = t.cow.newNode() - t.root.items = append(t.root.items, item2) - t.root.children = append(t.root.children, oldroot, second) - } - } - out := t.root.insert(item, t.maxItems()) - if out == nil { - t.length++ - } - return out -} - -// Delete removes an item equal to the passed in item from the tree, returning -// it. If no such item exists, returns nil. -func (t *BTree) Delete(item Item) Item { - return t.deleteItem(item, removeItem) -} - -// DeleteMin removes the smallest item in the tree and returns it. -// If no such item exists, returns nil. -func (t *BTree) DeleteMin() Item { - return t.deleteItem(nil, removeMin) -} - -// DeleteMax removes the largest item in the tree and returns it. -// If no such item exists, returns nil. -func (t *BTree) DeleteMax() Item { - return t.deleteItem(nil, removeMax) -} - -func (t *BTree) deleteItem(item Item, typ toRemove) Item { - if t.root == nil || len(t.root.items) == 0 { - return nil - } - t.root = t.root.mutableFor(t.cow) - out := t.root.remove(item, t.minItems(), typ) - if len(t.root.items) == 0 && len(t.root.children) > 0 { - oldroot := t.root - t.root = t.root.children[0] - t.cow.freeNode(oldroot) - } - if out != nil { - t.length-- - } - return out -} - -// AscendRange calls the iterator for every value in the tree within the range -// [greaterOrEqual, lessThan), until iterator returns false. -func (t *BTree) AscendRange(greaterOrEqual, lessThan Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, greaterOrEqual, lessThan, true, false, iterator) -} - -// AscendLessThan calls the iterator for every value in the tree within the range -// [first, pivot), until iterator returns false. -func (t *BTree) AscendLessThan(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, nil, pivot, false, false, iterator) -} - -// AscendGreaterOrEqual calls the iterator for every value in the tree within -// the range [pivot, last], until iterator returns false. -func (t *BTree) AscendGreaterOrEqual(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, pivot, nil, true, false, iterator) -} - -// Ascend calls the iterator for every value in the tree within the range -// [first, last], until iterator returns false. -func (t *BTree) Ascend(iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(ascend, nil, nil, false, false, iterator) -} - -// DescendRange calls the iterator for every value in the tree within the range -// [lessOrEqual, greaterThan), until iterator returns false. -func (t *BTree) DescendRange(lessOrEqual, greaterThan Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, lessOrEqual, greaterThan, true, false, iterator) -} - -// DescendLessOrEqual calls the iterator for every value in the tree within the range -// [pivot, first], until iterator returns false. -func (t *BTree) DescendLessOrEqual(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, pivot, nil, true, false, iterator) -} - -// DescendGreaterThan calls the iterator for every value in the tree within -// the range (pivot, last], until iterator returns false. -func (t *BTree) DescendGreaterThan(pivot Item, iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, nil, pivot, false, false, iterator) -} - -// Descend calls the iterator for every value in the tree within the range -// [last, first], until iterator returns false. -func (t *BTree) Descend(iterator ItemIterator) { - if t.root == nil { - return - } - t.root.iterate(descend, nil, nil, false, false, iterator) -} - -// Get looks for the key item in the tree, returning it. It returns nil if -// unable to find that item. -func (t *BTree) Get(key Item) Item { - if t.root == nil { - return nil - } - return t.root.get(key) -} - -// Min returns the smallest item in the tree, or nil if the tree is empty. -func (t *BTree) Min() Item { - return min(t.root) -} - -// Max returns the largest item in the tree, or nil if the tree is empty. -func (t *BTree) Max() Item { - return max(t.root) -} - -// Has returns true if the given key is in the tree. -func (t *BTree) Has(key Item) bool { - return t.Get(key) != nil -} - -// Len returns the number of items currently in the tree. -func (t *BTree) Len() int { - return t.length -} - -// Clear removes all items from the btree. If addNodesToFreelist is true, -// t's nodes are added to its freelist as part of this call, until the freelist -// is full. Otherwise, the root node is simply dereferenced and the subtree -// left to Go's normal GC processes. -// -// This can be much faster -// than calling Delete on all elements, because that requires finding/removing -// each element in the tree and updating the tree accordingly. It also is -// somewhat faster than creating a new tree to replace the old one, because -// nodes from the old tree are reclaimed into the freelist for use by the new -// one, instead of being lost to the garbage collector. -// -// This call takes: -// O(1): when addNodesToFreelist is false, this is a single operation. -// O(1): when the freelist is already full, it breaks out immediately -// O(freelist size): when the freelist is empty and the nodes are all owned -// by this tree, nodes are added to the freelist until full. -// O(tree size): when all nodes are owned by another tree, all nodes are -// iterated over looking for nodes to add to the freelist, and due to -// ownership, none are. -func (t *BTree) Clear(addNodesToFreelist bool) { - if t.root != nil && addNodesToFreelist { - t.root.reset(t.cow) - } - t.root, t.length = nil, 0 -} - -// reset returns a subtree to the freelist. It breaks out immediately if the -// freelist is full, since the only benefit of iterating is to fill that -// freelist up. Returns true if parent reset call should continue. -func (n *node) reset(c *copyOnWriteContext) bool { - for _, child := range n.children { - if !child.reset(c) { - return false - } - } - return c.freeNode(n) != ftFreelistFull -} - -// Int implements the Item interface for integers. -type Int int - -// Less returns true if int(a) < int(b). -func (a Int) Less(b Item) bool { - return a < b.(Int) -} diff --git a/vendor/github.com/google/btree/btree_mem.go b/vendor/github.com/google/btree/btree_mem.go deleted file mode 100644 index cb95b7f..0000000 --- a/vendor/github.com/google/btree/btree_mem.go +++ /dev/null @@ -1,76 +0,0 @@ -// Copyright 2014 Google Inc. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// +build ignore - -// This binary compares memory usage between btree and gollrb. -package main - -import ( - "flag" - "fmt" - "math/rand" - "runtime" - "time" - - "github.com/google/btree" - "github.com/petar/GoLLRB/llrb" -) - -var ( - size = flag.Int("size", 1000000, "size of the tree to build") - degree = flag.Int("degree", 8, "degree of btree") - gollrb = flag.Bool("llrb", false, "use llrb instead of btree") -) - -func main() { - flag.Parse() - vals := rand.Perm(*size) - var t, v interface{} - v = vals - var stats runtime.MemStats - for i := 0; i < 10; i++ { - runtime.GC() - } - fmt.Println("-------- BEFORE ----------") - runtime.ReadMemStats(&stats) - fmt.Printf("%+v\n", stats) - start := time.Now() - if *gollrb { - tr := llrb.New() - for _, v := range vals { - tr.ReplaceOrInsert(llrb.Int(v)) - } - t = tr // keep it around - } else { - tr := btree.New(*degree) - for _, v := range vals { - tr.ReplaceOrInsert(btree.Int(v)) - } - t = tr // keep it around - } - fmt.Printf("%v inserts in %v\n", *size, time.Since(start)) - fmt.Println("-------- AFTER ----------") - runtime.ReadMemStats(&stats) - fmt.Printf("%+v\n", stats) - for i := 0; i < 10; i++ { - runtime.GC() - } - fmt.Println("-------- AFTER GC ----------") - runtime.ReadMemStats(&stats) - fmt.Printf("%+v\n", stats) - if t == v { - fmt.Println("to make sure vals and tree aren't GC'd") - } -} diff --git a/vendor/github.com/google/gofuzz/.travis.yml b/vendor/github.com/google/gofuzz/.travis.yml deleted file mode 100644 index f8684d9..0000000 --- a/vendor/github.com/google/gofuzz/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -language: go - -go: - - 1.4 - - 1.3 - - 1.2 - - tip - -install: - - if ! go get code.google.com/p/go.tools/cmd/cover; then go get golang.org/x/tools/cmd/cover; fi - -script: - - go test -cover diff --git a/vendor/github.com/google/gofuzz/CONTRIBUTING.md b/vendor/github.com/google/gofuzz/CONTRIBUTING.md deleted file mode 100644 index 51cf5cd..0000000 --- a/vendor/github.com/google/gofuzz/CONTRIBUTING.md +++ /dev/null @@ -1,67 +0,0 @@ -# How to contribute # - -We'd love to accept your patches and contributions to this project. There are -a just a few small guidelines you need to follow. - - -## Contributor License Agreement ## - -Contributions to any Google project must be accompanied by a Contributor -License Agreement. This is not a copyright **assignment**, it simply gives -Google permission to use and redistribute your contributions as part of the -project. - - * If you are an individual writing original source code and you're sure you - own the intellectual property, then you'll need to sign an [individual - CLA][]. - - * If you work for a company that wants to allow you to contribute your work, - then you'll need to sign a [corporate CLA][]. - -You generally only need to submit a CLA once, so if you've already submitted -one (even if it was for a different project), you probably don't need to do it -again. - -[individual CLA]: https://developers.google.com/open-source/cla/individual -[corporate CLA]: https://developers.google.com/open-source/cla/corporate - - -## Submitting a patch ## - - 1. It's generally best to start by opening a new issue describing the bug or - feature you're intending to fix. Even if you think it's relatively minor, - it's helpful to know what people are working on. Mention in the initial - issue that you are planning to work on that bug or feature so that it can - be assigned to you. - - 1. Follow the normal process of [forking][] the project, and setup a new - branch to work in. It's important that each group of changes be done in - separate branches in order to ensure that a pull request only includes the - commits related to that bug or feature. - - 1. Go makes it very simple to ensure properly formatted code, so always run - `go fmt` on your code before committing it. You should also run - [golint][] over your code. As noted in the [golint readme][], it's not - strictly necessary that your code be completely "lint-free", but this will - help you find common style issues. - - 1. Any significant changes should almost always be accompanied by tests. The - project already has good test coverage, so look at some of the existing - tests if you're unsure how to go about it. [gocov][] and [gocov-html][] - are invaluable tools for seeing which parts of your code aren't being - exercised by your tests. - - 1. Do your best to have [well-formed commit messages][] for each change. - This provides consistency throughout the project, and ensures that commit - messages are able to be formatted properly by various git tools. - - 1. Finally, push the commits to your fork and submit a [pull request][]. - -[forking]: https://help.github.com/articles/fork-a-repo -[golint]: https://github.com/golang/lint -[golint readme]: https://github.com/golang/lint/blob/master/README -[gocov]: https://github.com/axw/gocov -[gocov-html]: https://github.com/matm/gocov-html -[well-formed commit messages]: http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html -[squash]: http://git-scm.com/book/en/Git-Tools-Rewriting-History#Squashing-Commits -[pull request]: https://help.github.com/articles/creating-a-pull-request diff --git a/vendor/github.com/google/gofuzz/LICENSE b/vendor/github.com/google/gofuzz/LICENSE deleted file mode 100644 index d645695..0000000 --- a/vendor/github.com/google/gofuzz/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. diff --git a/vendor/github.com/google/gofuzz/README.md b/vendor/github.com/google/gofuzz/README.md deleted file mode 100644 index 64869af..0000000 --- a/vendor/github.com/google/gofuzz/README.md +++ /dev/null @@ -1,71 +0,0 @@ -gofuzz -====== - -gofuzz is a library for populating go objects with random values. - -[![GoDoc](https://godoc.org/github.com/google/gofuzz?status.png)](https://godoc.org/github.com/google/gofuzz) -[![Travis](https://travis-ci.org/google/gofuzz.svg?branch=master)](https://travis-ci.org/google/gofuzz) - -This is useful for testing: - -* Do your project's objects really serialize/unserialize correctly in all cases? -* Is there an incorrectly formatted object that will cause your project to panic? - -Import with ```import "github.com/google/gofuzz"``` - -You can use it on single variables: -```go -f := fuzz.New() -var myInt int -f.Fuzz(&myInt) // myInt gets a random value. -``` - -You can use it on maps: -```go -f := fuzz.New().NilChance(0).NumElements(1, 1) -var myMap map[ComplexKeyType]string -f.Fuzz(&myMap) // myMap will have exactly one element. -``` - -Customize the chance of getting a nil pointer: -```go -f := fuzz.New().NilChance(.5) -var fancyStruct struct { - A, B, C, D *string -} -f.Fuzz(&fancyStruct) // About half the pointers should be set. -``` - -You can even customize the randomization completely if needed: -```go -type MyEnum string -const ( - A MyEnum = "A" - B MyEnum = "B" -) -type MyInfo struct { - Type MyEnum - AInfo *string - BInfo *string -} - -f := fuzz.New().NilChance(0).Funcs( - func(e *MyInfo, c fuzz.Continue) { - switch c.Intn(2) { - case 0: - e.Type = A - c.Fuzz(&e.AInfo) - case 1: - e.Type = B - c.Fuzz(&e.BInfo) - } - }, -) - -var myObject MyInfo -f.Fuzz(&myObject) // Type will correspond to whether A or B info is set. -``` - -See more examples in ```example_test.go```. - -Happy testing! diff --git a/vendor/github.com/google/gofuzz/doc.go b/vendor/github.com/google/gofuzz/doc.go deleted file mode 100644 index 9f9956d..0000000 --- a/vendor/github.com/google/gofuzz/doc.go +++ /dev/null @@ -1,18 +0,0 @@ -/* -Copyright 2014 Google Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -// Package fuzz is a library for populating go objects with random values. -package fuzz diff --git a/vendor/github.com/google/gofuzz/fuzz.go b/vendor/github.com/google/gofuzz/fuzz.go deleted file mode 100644 index 4f888fb..0000000 --- a/vendor/github.com/google/gofuzz/fuzz.go +++ /dev/null @@ -1,453 +0,0 @@ -/* -Copyright 2014 Google Inc. All rights reserved. - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -package fuzz - -import ( - "fmt" - "math/rand" - "reflect" - "time" -) - -// fuzzFuncMap is a map from a type to a fuzzFunc that handles that type. -type fuzzFuncMap map[reflect.Type]reflect.Value - -// Fuzzer knows how to fill any object with random fields. -type Fuzzer struct { - fuzzFuncs fuzzFuncMap - defaultFuzzFuncs fuzzFuncMap - r *rand.Rand - nilChance float64 - minElements int - maxElements int -} - -// New returns a new Fuzzer. Customize your Fuzzer further by calling Funcs, -// RandSource, NilChance, or NumElements in any order. -func New() *Fuzzer { - f := &Fuzzer{ - defaultFuzzFuncs: fuzzFuncMap{ - reflect.TypeOf(&time.Time{}): reflect.ValueOf(fuzzTime), - }, - - fuzzFuncs: fuzzFuncMap{}, - r: rand.New(rand.NewSource(time.Now().UnixNano())), - nilChance: .2, - minElements: 1, - maxElements: 10, - } - return f -} - -// Funcs adds each entry in fuzzFuncs as a custom fuzzing function. -// -// Each entry in fuzzFuncs must be a function taking two parameters. -// The first parameter must be a pointer or map. It is the variable that -// function will fill with random data. The second parameter must be a -// fuzz.Continue, which will provide a source of randomness and a way -// to automatically continue fuzzing smaller pieces of the first parameter. -// -// These functions are called sensibly, e.g., if you wanted custom string -// fuzzing, the function `func(s *string, c fuzz.Continue)` would get -// called and passed the address of strings. Maps and pointers will always -// be made/new'd for you, ignoring the NilChange option. For slices, it -// doesn't make much sense to pre-create them--Fuzzer doesn't know how -// long you want your slice--so take a pointer to a slice, and make it -// yourself. (If you don't want your map/pointer type pre-made, take a -// pointer to it, and make it yourself.) See the examples for a range of -// custom functions. -func (f *Fuzzer) Funcs(fuzzFuncs ...interface{}) *Fuzzer { - for i := range fuzzFuncs { - v := reflect.ValueOf(fuzzFuncs[i]) - if v.Kind() != reflect.Func { - panic("Need only funcs!") - } - t := v.Type() - if t.NumIn() != 2 || t.NumOut() != 0 { - panic("Need 2 in and 0 out params!") - } - argT := t.In(0) - switch argT.Kind() { - case reflect.Ptr, reflect.Map: - default: - panic("fuzzFunc must take pointer or map type") - } - if t.In(1) != reflect.TypeOf(Continue{}) { - panic("fuzzFunc's second parameter must be type fuzz.Continue") - } - f.fuzzFuncs[argT] = v - } - return f -} - -// RandSource causes f to get values from the given source of randomness. -// Use if you want deterministic fuzzing. -func (f *Fuzzer) RandSource(s rand.Source) *Fuzzer { - f.r = rand.New(s) - return f -} - -// NilChance sets the probability of creating a nil pointer, map, or slice to -// 'p'. 'p' should be between 0 (no nils) and 1 (all nils), inclusive. -func (f *Fuzzer) NilChance(p float64) *Fuzzer { - if p < 0 || p > 1 { - panic("p should be between 0 and 1, inclusive.") - } - f.nilChance = p - return f -} - -// NumElements sets the minimum and maximum number of elements that will be -// added to a non-nil map or slice. -func (f *Fuzzer) NumElements(atLeast, atMost int) *Fuzzer { - if atLeast > atMost { - panic("atLeast must be <= atMost") - } - if atLeast < 0 { - panic("atLeast must be >= 0") - } - f.minElements = atLeast - f.maxElements = atMost - return f -} - -func (f *Fuzzer) genElementCount() int { - if f.minElements == f.maxElements { - return f.minElements - } - return f.minElements + f.r.Intn(f.maxElements-f.minElements+1) -} - -func (f *Fuzzer) genShouldFill() bool { - return f.r.Float64() > f.nilChance -} - -// Fuzz recursively fills all of obj's fields with something random. First -// this tries to find a custom fuzz function (see Funcs). If there is no -// custom function this tests whether the object implements fuzz.Interface and, -// if so, calls Fuzz on it to fuzz itself. If that fails, this will see if -// there is a default fuzz function provided by this package. If all of that -// fails, this will generate random values for all primitive fields and then -// recurse for all non-primitives. -// -// Not safe for cyclic or tree-like structs! -// -// obj must be a pointer. Only exported (public) fields can be set (thanks, golang :/ ) -// Intended for tests, so will panic on bad input or unimplemented fields. -func (f *Fuzzer) Fuzz(obj interface{}) { - v := reflect.ValueOf(obj) - if v.Kind() != reflect.Ptr { - panic("needed ptr!") - } - v = v.Elem() - f.doFuzz(v, 0) -} - -// FuzzNoCustom is just like Fuzz, except that any custom fuzz function for -// obj's type will not be called and obj will not be tested for fuzz.Interface -// conformance. This applies only to obj and not other instances of obj's -// type. -// Not safe for cyclic or tree-like structs! -// obj must be a pointer. Only exported (public) fields can be set (thanks, golang :/ ) -// Intended for tests, so will panic on bad input or unimplemented fields. -func (f *Fuzzer) FuzzNoCustom(obj interface{}) { - v := reflect.ValueOf(obj) - if v.Kind() != reflect.Ptr { - panic("needed ptr!") - } - v = v.Elem() - f.doFuzz(v, flagNoCustomFuzz) -} - -const ( - // Do not try to find a custom fuzz function. Does not apply recursively. - flagNoCustomFuzz uint64 = 1 << iota -) - -func (f *Fuzzer) doFuzz(v reflect.Value, flags uint64) { - if !v.CanSet() { - return - } - - if flags&flagNoCustomFuzz == 0 { - // Check for both pointer and non-pointer custom functions. - if v.CanAddr() && f.tryCustom(v.Addr()) { - return - } - if f.tryCustom(v) { - return - } - } - - if fn, ok := fillFuncMap[v.Kind()]; ok { - fn(v, f.r) - return - } - switch v.Kind() { - case reflect.Map: - if f.genShouldFill() { - v.Set(reflect.MakeMap(v.Type())) - n := f.genElementCount() - for i := 0; i < n; i++ { - key := reflect.New(v.Type().Key()).Elem() - f.doFuzz(key, 0) - val := reflect.New(v.Type().Elem()).Elem() - f.doFuzz(val, 0) - v.SetMapIndex(key, val) - } - return - } - v.Set(reflect.Zero(v.Type())) - case reflect.Ptr: - if f.genShouldFill() { - v.Set(reflect.New(v.Type().Elem())) - f.doFuzz(v.Elem(), 0) - return - } - v.Set(reflect.Zero(v.Type())) - case reflect.Slice: - if f.genShouldFill() { - n := f.genElementCount() - v.Set(reflect.MakeSlice(v.Type(), n, n)) - for i := 0; i < n; i++ { - f.doFuzz(v.Index(i), 0) - } - return - } - v.Set(reflect.Zero(v.Type())) - case reflect.Array: - if f.genShouldFill() { - n := v.Len() - for i := 0; i < n; i++ { - f.doFuzz(v.Index(i), 0) - } - return - } - v.Set(reflect.Zero(v.Type())) - case reflect.Struct: - for i := 0; i < v.NumField(); i++ { - f.doFuzz(v.Field(i), 0) - } - case reflect.Chan: - fallthrough - case reflect.Func: - fallthrough - case reflect.Interface: - fallthrough - default: - panic(fmt.Sprintf("Can't handle %#v", v.Interface())) - } -} - -// tryCustom searches for custom handlers, and returns true iff it finds a match -// and successfully randomizes v. -func (f *Fuzzer) tryCustom(v reflect.Value) bool { - // First: see if we have a fuzz function for it. - doCustom, ok := f.fuzzFuncs[v.Type()] - if !ok { - // Second: see if it can fuzz itself. - if v.CanInterface() { - intf := v.Interface() - if fuzzable, ok := intf.(Interface); ok { - fuzzable.Fuzz(Continue{f: f, Rand: f.r}) - return true - } - } - // Finally: see if there is a default fuzz function. - doCustom, ok = f.defaultFuzzFuncs[v.Type()] - if !ok { - return false - } - } - - switch v.Kind() { - case reflect.Ptr: - if v.IsNil() { - if !v.CanSet() { - return false - } - v.Set(reflect.New(v.Type().Elem())) - } - case reflect.Map: - if v.IsNil() { - if !v.CanSet() { - return false - } - v.Set(reflect.MakeMap(v.Type())) - } - default: - return false - } - - doCustom.Call([]reflect.Value{v, reflect.ValueOf(Continue{ - f: f, - Rand: f.r, - })}) - return true -} - -// Interface represents an object that knows how to fuzz itself. Any time we -// find a type that implements this interface we will delegate the act of -// fuzzing itself. -type Interface interface { - Fuzz(c Continue) -} - -// Continue can be passed to custom fuzzing functions to allow them to use -// the correct source of randomness and to continue fuzzing their members. -type Continue struct { - f *Fuzzer - - // For convenience, Continue implements rand.Rand via embedding. - // Use this for generating any randomness if you want your fuzzing - // to be repeatable for a given seed. - *rand.Rand -} - -// Fuzz continues fuzzing obj. obj must be a pointer. -func (c Continue) Fuzz(obj interface{}) { - v := reflect.ValueOf(obj) - if v.Kind() != reflect.Ptr { - panic("needed ptr!") - } - v = v.Elem() - c.f.doFuzz(v, 0) -} - -// FuzzNoCustom continues fuzzing obj, except that any custom fuzz function for -// obj's type will not be called and obj will not be tested for fuzz.Interface -// conformance. This applies only to obj and not other instances of obj's -// type. -func (c Continue) FuzzNoCustom(obj interface{}) { - v := reflect.ValueOf(obj) - if v.Kind() != reflect.Ptr { - panic("needed ptr!") - } - v = v.Elem() - c.f.doFuzz(v, flagNoCustomFuzz) -} - -// RandString makes a random string up to 20 characters long. The returned string -// may include a variety of (valid) UTF-8 encodings. -func (c Continue) RandString() string { - return randString(c.Rand) -} - -// RandUint64 makes random 64 bit numbers. -// Weirdly, rand doesn't have a function that gives you 64 random bits. -func (c Continue) RandUint64() uint64 { - return randUint64(c.Rand) -} - -// RandBool returns true or false randomly. -func (c Continue) RandBool() bool { - return randBool(c.Rand) -} - -func fuzzInt(v reflect.Value, r *rand.Rand) { - v.SetInt(int64(randUint64(r))) -} - -func fuzzUint(v reflect.Value, r *rand.Rand) { - v.SetUint(randUint64(r)) -} - -func fuzzTime(t *time.Time, c Continue) { - var sec, nsec int64 - // Allow for about 1000 years of random time values, which keeps things - // like JSON parsing reasonably happy. - sec = c.Rand.Int63n(1000 * 365 * 24 * 60 * 60) - c.Fuzz(&nsec) - *t = time.Unix(sec, nsec) -} - -var fillFuncMap = map[reflect.Kind]func(reflect.Value, *rand.Rand){ - reflect.Bool: func(v reflect.Value, r *rand.Rand) { - v.SetBool(randBool(r)) - }, - reflect.Int: fuzzInt, - reflect.Int8: fuzzInt, - reflect.Int16: fuzzInt, - reflect.Int32: fuzzInt, - reflect.Int64: fuzzInt, - reflect.Uint: fuzzUint, - reflect.Uint8: fuzzUint, - reflect.Uint16: fuzzUint, - reflect.Uint32: fuzzUint, - reflect.Uint64: fuzzUint, - reflect.Uintptr: fuzzUint, - reflect.Float32: func(v reflect.Value, r *rand.Rand) { - v.SetFloat(float64(r.Float32())) - }, - reflect.Float64: func(v reflect.Value, r *rand.Rand) { - v.SetFloat(r.Float64()) - }, - reflect.Complex64: func(v reflect.Value, r *rand.Rand) { - panic("unimplemented") - }, - reflect.Complex128: func(v reflect.Value, r *rand.Rand) { - panic("unimplemented") - }, - reflect.String: func(v reflect.Value, r *rand.Rand) { - v.SetString(randString(r)) - }, - reflect.UnsafePointer: func(v reflect.Value, r *rand.Rand) { - panic("unimplemented") - }, -} - -// randBool returns true or false randomly. -func randBool(r *rand.Rand) bool { - if r.Int()&1 == 1 { - return true - } - return false -} - -type charRange struct { - first, last rune -} - -// choose returns a random unicode character from the given range, using the -// given randomness source. -func (r *charRange) choose(rand *rand.Rand) rune { - count := int64(r.last - r.first) - return r.first + rune(rand.Int63n(count)) -} - -var unicodeRanges = []charRange{ - {' ', '~'}, // ASCII characters - {'\u00a0', '\u02af'}, // Multi-byte encoded characters - {'\u4e00', '\u9fff'}, // Common CJK (even longer encodings) -} - -// randString makes a random string up to 20 characters long. The returned string -// may include a variety of (valid) UTF-8 encodings. -func randString(r *rand.Rand) string { - n := r.Intn(20) - runes := make([]rune, n) - for i := range runes { - runes[i] = unicodeRanges[r.Intn(len(unicodeRanges))].choose(r) - } - return string(runes) -} - -// randUint64 makes random 64 bit numbers. -// Weirdly, rand doesn't have a function that gives you 64 random bits. -func randUint64(r *rand.Rand) uint64 { - return uint64(r.Uint32())<<32 | uint64(r.Uint32()) -} diff --git a/vendor/github.com/googleapis/gnostic/LICENSE b/vendor/github.com/googleapis/gnostic/LICENSE deleted file mode 100644 index 6b0b127..0000000 --- a/vendor/github.com/googleapis/gnostic/LICENSE +++ /dev/null @@ -1,203 +0,0 @@ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright [yyyy] [name of copyright owner] - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - diff --git a/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.go b/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.go deleted file mode 100644 index 0e32451..0000000 --- a/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.go +++ /dev/null @@ -1,8728 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// THIS FILE IS AUTOMATICALLY GENERATED. - -package openapi_v2 - -import ( - "fmt" - "github.com/googleapis/gnostic/compiler" - "gopkg.in/yaml.v2" - "regexp" - "strings" -) - -// Version returns the package name (and OpenAPI version). -func Version() string { - return "openapi_v2" -} - -// NewAdditionalPropertiesItem creates an object of type AdditionalPropertiesItem if possible, returning an error if not. -func NewAdditionalPropertiesItem(in interface{}, context *compiler.Context) (*AdditionalPropertiesItem, error) { - errors := make([]error, 0) - x := &AdditionalPropertiesItem{} - matched := false - // Schema schema = 1; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewSchema(m, compiler.NewContext("schema", context)) - if matchingError == nil { - x.Oneof = &AdditionalPropertiesItem_Schema{Schema: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - // bool boolean = 2; - boolValue, ok := in.(bool) - if ok { - x.Oneof = &AdditionalPropertiesItem_Boolean{Boolean: boolValue} - } - if matched { - // since the oneof matched one of its possibilities, discard any matching errors - errors = make([]error, 0) - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewAny creates an object of type Any if possible, returning an error if not. -func NewAny(in interface{}, context *compiler.Context) (*Any, error) { - errors := make([]error, 0) - x := &Any{} - bytes, _ := yaml.Marshal(in) - x.Yaml = string(bytes) - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewApiKeySecurity creates an object of type ApiKeySecurity if possible, returning an error if not. -func NewApiKeySecurity(in interface{}, context *compiler.Context) (*ApiKeySecurity, error) { - errors := make([]error, 0) - x := &ApiKeySecurity{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"in", "name", "type"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"description", "in", "name", "type"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string type = 1; - v1 := compiler.MapValueForKey(m, "type") - if v1 != nil { - x.Type, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [apiKey] - if ok && !compiler.StringArrayContainsValue([]string{"apiKey"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string name = 2; - v2 := compiler.MapValueForKey(m, "name") - if v2 != nil { - x.Name, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string in = 3; - v3 := compiler.MapValueForKey(m, "in") - if v3 != nil { - x.In, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [header query] - if ok && !compiler.StringArrayContainsValue([]string{"header", "query"}, x.In) { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 4; - v4 := compiler.MapValueForKey(m, "description") - if v4 != nil { - x.Description, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 5; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewBasicAuthenticationSecurity creates an object of type BasicAuthenticationSecurity if possible, returning an error if not. -func NewBasicAuthenticationSecurity(in interface{}, context *compiler.Context) (*BasicAuthenticationSecurity, error) { - errors := make([]error, 0) - x := &BasicAuthenticationSecurity{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"type"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"description", "type"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string type = 1; - v1 := compiler.MapValueForKey(m, "type") - if v1 != nil { - x.Type, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [basic] - if ok && !compiler.StringArrayContainsValue([]string{"basic"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 2; - v2 := compiler.MapValueForKey(m, "description") - if v2 != nil { - x.Description, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 3; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewBodyParameter creates an object of type BodyParameter if possible, returning an error if not. -func NewBodyParameter(in interface{}, context *compiler.Context) (*BodyParameter, error) { - errors := make([]error, 0) - x := &BodyParameter{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"in", "name", "schema"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"description", "in", "name", "required", "schema"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string description = 1; - v1 := compiler.MapValueForKey(m, "description") - if v1 != nil { - x.Description, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string name = 2; - v2 := compiler.MapValueForKey(m, "name") - if v2 != nil { - x.Name, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string in = 3; - v3 := compiler.MapValueForKey(m, "in") - if v3 != nil { - x.In, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [body] - if ok && !compiler.StringArrayContainsValue([]string{"body"}, x.In) { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool required = 4; - v4 := compiler.MapValueForKey(m, "required") - if v4 != nil { - x.Required, ok = v4.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Schema schema = 5; - v5 := compiler.MapValueForKey(m, "schema") - if v5 != nil { - var err error - x.Schema, err = NewSchema(v5, compiler.NewContext("schema", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated NamedAny vendor_extension = 6; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewContact creates an object of type Contact if possible, returning an error if not. -func NewContact(in interface{}, context *compiler.Context) (*Contact, error) { - errors := make([]error, 0) - x := &Contact{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"email", "name", "url"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string url = 2; - v2 := compiler.MapValueForKey(m, "url") - if v2 != nil { - x.Url, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for url: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string email = 3; - v3 := compiler.MapValueForKey(m, "email") - if v3 != nil { - x.Email, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for email: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 4; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewDefault creates an object of type Default if possible, returning an error if not. -func NewDefault(in interface{}, context *compiler.Context) (*Default, error) { - errors := make([]error, 0) - x := &Default{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - // repeated NamedAny additional_properties = 1; - // MAP: Any - x.AdditionalProperties = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.AdditionalProperties = append(x.AdditionalProperties, pair) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewDefinitions creates an object of type Definitions if possible, returning an error if not. -func NewDefinitions(in interface{}, context *compiler.Context) (*Definitions, error) { - errors := make([]error, 0) - x := &Definitions{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - // repeated NamedSchema additional_properties = 1; - // MAP: Schema - x.AdditionalProperties = make([]*NamedSchema, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - pair := &NamedSchema{} - pair.Name = k - var err error - pair.Value, err = NewSchema(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - x.AdditionalProperties = append(x.AdditionalProperties, pair) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewDocument creates an object of type Document if possible, returning an error if not. -func NewDocument(in interface{}, context *compiler.Context) (*Document, error) { - errors := make([]error, 0) - x := &Document{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"info", "paths", "swagger"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"basePath", "consumes", "definitions", "externalDocs", "host", "info", "parameters", "paths", "produces", "responses", "schemes", "security", "securityDefinitions", "swagger", "tags"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string swagger = 1; - v1 := compiler.MapValueForKey(m, "swagger") - if v1 != nil { - x.Swagger, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for swagger: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [2.0] - if ok && !compiler.StringArrayContainsValue([]string{"2.0"}, x.Swagger) { - message := fmt.Sprintf("has unexpected value for swagger: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Info info = 2; - v2 := compiler.MapValueForKey(m, "info") - if v2 != nil { - var err error - x.Info, err = NewInfo(v2, compiler.NewContext("info", context)) - if err != nil { - errors = append(errors, err) - } - } - // string host = 3; - v3 := compiler.MapValueForKey(m, "host") - if v3 != nil { - x.Host, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for host: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string base_path = 4; - v4 := compiler.MapValueForKey(m, "basePath") - if v4 != nil { - x.BasePath, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for basePath: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated string schemes = 5; - v5 := compiler.MapValueForKey(m, "schemes") - if v5 != nil { - v, ok := v5.([]interface{}) - if ok { - x.Schemes = compiler.ConvertInterfaceArrayToStringArray(v) - } else { - message := fmt.Sprintf("has unexpected value for schemes: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [http https ws wss] - if ok && !compiler.StringArrayContainsValues([]string{"http", "https", "ws", "wss"}, x.Schemes) { - message := fmt.Sprintf("has unexpected value for schemes: %+v", v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated string consumes = 6; - v6 := compiler.MapValueForKey(m, "consumes") - if v6 != nil { - v, ok := v6.([]interface{}) - if ok { - x.Consumes = compiler.ConvertInterfaceArrayToStringArray(v) - } else { - message := fmt.Sprintf("has unexpected value for consumes: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated string produces = 7; - v7 := compiler.MapValueForKey(m, "produces") - if v7 != nil { - v, ok := v7.([]interface{}) - if ok { - x.Produces = compiler.ConvertInterfaceArrayToStringArray(v) - } else { - message := fmt.Sprintf("has unexpected value for produces: %+v (%T)", v7, v7) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Paths paths = 8; - v8 := compiler.MapValueForKey(m, "paths") - if v8 != nil { - var err error - x.Paths, err = NewPaths(v8, compiler.NewContext("paths", context)) - if err != nil { - errors = append(errors, err) - } - } - // Definitions definitions = 9; - v9 := compiler.MapValueForKey(m, "definitions") - if v9 != nil { - var err error - x.Definitions, err = NewDefinitions(v9, compiler.NewContext("definitions", context)) - if err != nil { - errors = append(errors, err) - } - } - // ParameterDefinitions parameters = 10; - v10 := compiler.MapValueForKey(m, "parameters") - if v10 != nil { - var err error - x.Parameters, err = NewParameterDefinitions(v10, compiler.NewContext("parameters", context)) - if err != nil { - errors = append(errors, err) - } - } - // ResponseDefinitions responses = 11; - v11 := compiler.MapValueForKey(m, "responses") - if v11 != nil { - var err error - x.Responses, err = NewResponseDefinitions(v11, compiler.NewContext("responses", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated SecurityRequirement security = 12; - v12 := compiler.MapValueForKey(m, "security") - if v12 != nil { - // repeated SecurityRequirement - x.Security = make([]*SecurityRequirement, 0) - a, ok := v12.([]interface{}) - if ok { - for _, item := range a { - y, err := NewSecurityRequirement(item, compiler.NewContext("security", context)) - if err != nil { - errors = append(errors, err) - } - x.Security = append(x.Security, y) - } - } - } - // SecurityDefinitions security_definitions = 13; - v13 := compiler.MapValueForKey(m, "securityDefinitions") - if v13 != nil { - var err error - x.SecurityDefinitions, err = NewSecurityDefinitions(v13, compiler.NewContext("securityDefinitions", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated Tag tags = 14; - v14 := compiler.MapValueForKey(m, "tags") - if v14 != nil { - // repeated Tag - x.Tags = make([]*Tag, 0) - a, ok := v14.([]interface{}) - if ok { - for _, item := range a { - y, err := NewTag(item, compiler.NewContext("tags", context)) - if err != nil { - errors = append(errors, err) - } - x.Tags = append(x.Tags, y) - } - } - } - // ExternalDocs external_docs = 15; - v15 := compiler.MapValueForKey(m, "externalDocs") - if v15 != nil { - var err error - x.ExternalDocs, err = NewExternalDocs(v15, compiler.NewContext("externalDocs", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated NamedAny vendor_extension = 16; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewExamples creates an object of type Examples if possible, returning an error if not. -func NewExamples(in interface{}, context *compiler.Context) (*Examples, error) { - errors := make([]error, 0) - x := &Examples{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - // repeated NamedAny additional_properties = 1; - // MAP: Any - x.AdditionalProperties = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.AdditionalProperties = append(x.AdditionalProperties, pair) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewExternalDocs creates an object of type ExternalDocs if possible, returning an error if not. -func NewExternalDocs(in interface{}, context *compiler.Context) (*ExternalDocs, error) { - errors := make([]error, 0) - x := &ExternalDocs{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"url"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"description", "url"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string description = 1; - v1 := compiler.MapValueForKey(m, "description") - if v1 != nil { - x.Description, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string url = 2; - v2 := compiler.MapValueForKey(m, "url") - if v2 != nil { - x.Url, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for url: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 3; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewFileSchema creates an object of type FileSchema if possible, returning an error if not. -func NewFileSchema(in interface{}, context *compiler.Context) (*FileSchema, error) { - errors := make([]error, 0) - x := &FileSchema{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"type"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"default", "description", "example", "externalDocs", "format", "readOnly", "required", "title", "type"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string format = 1; - v1 := compiler.MapValueForKey(m, "format") - if v1 != nil { - x.Format, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string title = 2; - v2 := compiler.MapValueForKey(m, "title") - if v2 != nil { - x.Title, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for title: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 3; - v3 := compiler.MapValueForKey(m, "description") - if v3 != nil { - x.Description, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Any default = 4; - v4 := compiler.MapValueForKey(m, "default") - if v4 != nil { - var err error - x.Default, err = NewAny(v4, compiler.NewContext("default", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated string required = 5; - v5 := compiler.MapValueForKey(m, "required") - if v5 != nil { - v, ok := v5.([]interface{}) - if ok { - x.Required = compiler.ConvertInterfaceArrayToStringArray(v) - } else { - message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string type = 6; - v6 := compiler.MapValueForKey(m, "type") - if v6 != nil { - x.Type, ok = v6.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [file] - if ok && !compiler.StringArrayContainsValue([]string{"file"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool read_only = 7; - v7 := compiler.MapValueForKey(m, "readOnly") - if v7 != nil { - x.ReadOnly, ok = v7.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for readOnly: %+v (%T)", v7, v7) - errors = append(errors, compiler.NewError(context, message)) - } - } - // ExternalDocs external_docs = 8; - v8 := compiler.MapValueForKey(m, "externalDocs") - if v8 != nil { - var err error - x.ExternalDocs, err = NewExternalDocs(v8, compiler.NewContext("externalDocs", context)) - if err != nil { - errors = append(errors, err) - } - } - // Any example = 9; - v9 := compiler.MapValueForKey(m, "example") - if v9 != nil { - var err error - x.Example, err = NewAny(v9, compiler.NewContext("example", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated NamedAny vendor_extension = 10; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewFormDataParameterSubSchema creates an object of type FormDataParameterSubSchema if possible, returning an error if not. -func NewFormDataParameterSubSchema(in interface{}, context *compiler.Context) (*FormDataParameterSubSchema, error) { - errors := make([]error, 0) - x := &FormDataParameterSubSchema{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"allowEmptyValue", "collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // bool required = 1; - v1 := compiler.MapValueForKey(m, "required") - if v1 != nil { - x.Required, ok = v1.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string in = 2; - v2 := compiler.MapValueForKey(m, "in") - if v2 != nil { - x.In, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [formData] - if ok && !compiler.StringArrayContainsValue([]string{"formData"}, x.In) { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 3; - v3 := compiler.MapValueForKey(m, "description") - if v3 != nil { - x.Description, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string name = 4; - v4 := compiler.MapValueForKey(m, "name") - if v4 != nil { - x.Name, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool allow_empty_value = 5; - v5 := compiler.MapValueForKey(m, "allowEmptyValue") - if v5 != nil { - x.AllowEmptyValue, ok = v5.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for allowEmptyValue: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string type = 6; - v6 := compiler.MapValueForKey(m, "type") - if v6 != nil { - x.Type, ok = v6.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [string number boolean integer array file] - if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array", "file"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string format = 7; - v7 := compiler.MapValueForKey(m, "format") - if v7 != nil { - x.Format, ok = v7.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v7, v7) - errors = append(errors, compiler.NewError(context, message)) - } - } - // PrimitivesItems items = 8; - v8 := compiler.MapValueForKey(m, "items") - if v8 != nil { - var err error - x.Items, err = NewPrimitivesItems(v8, compiler.NewContext("items", context)) - if err != nil { - errors = append(errors, err) - } - } - // string collection_format = 9; - v9 := compiler.MapValueForKey(m, "collectionFormat") - if v9 != nil { - x.CollectionFormat, ok = v9.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v9, v9) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [csv ssv tsv pipes multi] - if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes", "multi"}, x.CollectionFormat) { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v9, v9) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Any default = 10; - v10 := compiler.MapValueForKey(m, "default") - if v10 != nil { - var err error - x.Default, err = NewAny(v10, compiler.NewContext("default", context)) - if err != nil { - errors = append(errors, err) - } - } - // float maximum = 11; - v11 := compiler.MapValueForKey(m, "maximum") - if v11 != nil { - switch v11 := v11.(type) { - case float64: - x.Maximum = v11 - case float32: - x.Maximum = float64(v11) - case uint64: - x.Maximum = float64(v11) - case uint32: - x.Maximum = float64(v11) - case int64: - x.Maximum = float64(v11) - case int32: - x.Maximum = float64(v11) - case int: - x.Maximum = float64(v11) - default: - message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v11, v11) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_maximum = 12; - v12 := compiler.MapValueForKey(m, "exclusiveMaximum") - if v12 != nil { - x.ExclusiveMaximum, ok = v12.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v12, v12) - errors = append(errors, compiler.NewError(context, message)) - } - } - // float minimum = 13; - v13 := compiler.MapValueForKey(m, "minimum") - if v13 != nil { - switch v13 := v13.(type) { - case float64: - x.Minimum = v13 - case float32: - x.Minimum = float64(v13) - case uint64: - x.Minimum = float64(v13) - case uint32: - x.Minimum = float64(v13) - case int64: - x.Minimum = float64(v13) - case int32: - x.Minimum = float64(v13) - case int: - x.Minimum = float64(v13) - default: - message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v13, v13) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_minimum = 14; - v14 := compiler.MapValueForKey(m, "exclusiveMinimum") - if v14 != nil { - x.ExclusiveMinimum, ok = v14.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v14, v14) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_length = 15; - v15 := compiler.MapValueForKey(m, "maxLength") - if v15 != nil { - t, ok := v15.(int) - if ok { - x.MaxLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v15, v15) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_length = 16; - v16 := compiler.MapValueForKey(m, "minLength") - if v16 != nil { - t, ok := v16.(int) - if ok { - x.MinLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v16, v16) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string pattern = 17; - v17 := compiler.MapValueForKey(m, "pattern") - if v17 != nil { - x.Pattern, ok = v17.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v17, v17) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_items = 18; - v18 := compiler.MapValueForKey(m, "maxItems") - if v18 != nil { - t, ok := v18.(int) - if ok { - x.MaxItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v18, v18) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_items = 19; - v19 := compiler.MapValueForKey(m, "minItems") - if v19 != nil { - t, ok := v19.(int) - if ok { - x.MinItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v19, v19) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool unique_items = 20; - v20 := compiler.MapValueForKey(m, "uniqueItems") - if v20 != nil { - x.UniqueItems, ok = v20.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v20, v20) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated Any enum = 21; - v21 := compiler.MapValueForKey(m, "enum") - if v21 != nil { - // repeated Any - x.Enum = make([]*Any, 0) - a, ok := v21.([]interface{}) - if ok { - for _, item := range a { - y, err := NewAny(item, compiler.NewContext("enum", context)) - if err != nil { - errors = append(errors, err) - } - x.Enum = append(x.Enum, y) - } - } - } - // float multiple_of = 22; - v22 := compiler.MapValueForKey(m, "multipleOf") - if v22 != nil { - switch v22 := v22.(type) { - case float64: - x.MultipleOf = v22 - case float32: - x.MultipleOf = float64(v22) - case uint64: - x.MultipleOf = float64(v22) - case uint32: - x.MultipleOf = float64(v22) - case int64: - x.MultipleOf = float64(v22) - case int32: - x.MultipleOf = float64(v22) - case int: - x.MultipleOf = float64(v22) - default: - message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v22, v22) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 23; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewHeader creates an object of type Header if possible, returning an error if not. -func NewHeader(in interface{}, context *compiler.Context) (*Header, error) { - errors := make([]error, 0) - x := &Header{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"type"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "pattern", "type", "uniqueItems"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string type = 1; - v1 := compiler.MapValueForKey(m, "type") - if v1 != nil { - x.Type, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [string number integer boolean array] - if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "integer", "boolean", "array"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string format = 2; - v2 := compiler.MapValueForKey(m, "format") - if v2 != nil { - x.Format, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // PrimitivesItems items = 3; - v3 := compiler.MapValueForKey(m, "items") - if v3 != nil { - var err error - x.Items, err = NewPrimitivesItems(v3, compiler.NewContext("items", context)) - if err != nil { - errors = append(errors, err) - } - } - // string collection_format = 4; - v4 := compiler.MapValueForKey(m, "collectionFormat") - if v4 != nil { - x.CollectionFormat, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [csv ssv tsv pipes] - if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Any default = 5; - v5 := compiler.MapValueForKey(m, "default") - if v5 != nil { - var err error - x.Default, err = NewAny(v5, compiler.NewContext("default", context)) - if err != nil { - errors = append(errors, err) - } - } - // float maximum = 6; - v6 := compiler.MapValueForKey(m, "maximum") - if v6 != nil { - switch v6 := v6.(type) { - case float64: - x.Maximum = v6 - case float32: - x.Maximum = float64(v6) - case uint64: - x.Maximum = float64(v6) - case uint32: - x.Maximum = float64(v6) - case int64: - x.Maximum = float64(v6) - case int32: - x.Maximum = float64(v6) - case int: - x.Maximum = float64(v6) - default: - message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_maximum = 7; - v7 := compiler.MapValueForKey(m, "exclusiveMaximum") - if v7 != nil { - x.ExclusiveMaximum, ok = v7.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v7, v7) - errors = append(errors, compiler.NewError(context, message)) - } - } - // float minimum = 8; - v8 := compiler.MapValueForKey(m, "minimum") - if v8 != nil { - switch v8 := v8.(type) { - case float64: - x.Minimum = v8 - case float32: - x.Minimum = float64(v8) - case uint64: - x.Minimum = float64(v8) - case uint32: - x.Minimum = float64(v8) - case int64: - x.Minimum = float64(v8) - case int32: - x.Minimum = float64(v8) - case int: - x.Minimum = float64(v8) - default: - message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v8, v8) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_minimum = 9; - v9 := compiler.MapValueForKey(m, "exclusiveMinimum") - if v9 != nil { - x.ExclusiveMinimum, ok = v9.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v9, v9) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_length = 10; - v10 := compiler.MapValueForKey(m, "maxLength") - if v10 != nil { - t, ok := v10.(int) - if ok { - x.MaxLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v10, v10) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_length = 11; - v11 := compiler.MapValueForKey(m, "minLength") - if v11 != nil { - t, ok := v11.(int) - if ok { - x.MinLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v11, v11) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string pattern = 12; - v12 := compiler.MapValueForKey(m, "pattern") - if v12 != nil { - x.Pattern, ok = v12.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v12, v12) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_items = 13; - v13 := compiler.MapValueForKey(m, "maxItems") - if v13 != nil { - t, ok := v13.(int) - if ok { - x.MaxItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v13, v13) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_items = 14; - v14 := compiler.MapValueForKey(m, "minItems") - if v14 != nil { - t, ok := v14.(int) - if ok { - x.MinItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v14, v14) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool unique_items = 15; - v15 := compiler.MapValueForKey(m, "uniqueItems") - if v15 != nil { - x.UniqueItems, ok = v15.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v15, v15) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated Any enum = 16; - v16 := compiler.MapValueForKey(m, "enum") - if v16 != nil { - // repeated Any - x.Enum = make([]*Any, 0) - a, ok := v16.([]interface{}) - if ok { - for _, item := range a { - y, err := NewAny(item, compiler.NewContext("enum", context)) - if err != nil { - errors = append(errors, err) - } - x.Enum = append(x.Enum, y) - } - } - } - // float multiple_of = 17; - v17 := compiler.MapValueForKey(m, "multipleOf") - if v17 != nil { - switch v17 := v17.(type) { - case float64: - x.MultipleOf = v17 - case float32: - x.MultipleOf = float64(v17) - case uint64: - x.MultipleOf = float64(v17) - case uint32: - x.MultipleOf = float64(v17) - case int64: - x.MultipleOf = float64(v17) - case int32: - x.MultipleOf = float64(v17) - case int: - x.MultipleOf = float64(v17) - default: - message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v17, v17) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 18; - v18 := compiler.MapValueForKey(m, "description") - if v18 != nil { - x.Description, ok = v18.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v18, v18) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 19; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewHeaderParameterSubSchema creates an object of type HeaderParameterSubSchema if possible, returning an error if not. -func NewHeaderParameterSubSchema(in interface{}, context *compiler.Context) (*HeaderParameterSubSchema, error) { - errors := make([]error, 0) - x := &HeaderParameterSubSchema{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // bool required = 1; - v1 := compiler.MapValueForKey(m, "required") - if v1 != nil { - x.Required, ok = v1.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string in = 2; - v2 := compiler.MapValueForKey(m, "in") - if v2 != nil { - x.In, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [header] - if ok && !compiler.StringArrayContainsValue([]string{"header"}, x.In) { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 3; - v3 := compiler.MapValueForKey(m, "description") - if v3 != nil { - x.Description, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string name = 4; - v4 := compiler.MapValueForKey(m, "name") - if v4 != nil { - x.Name, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string type = 5; - v5 := compiler.MapValueForKey(m, "type") - if v5 != nil { - x.Type, ok = v5.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [string number boolean integer array] - if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string format = 6; - v6 := compiler.MapValueForKey(m, "format") - if v6 != nil { - x.Format, ok = v6.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - } - // PrimitivesItems items = 7; - v7 := compiler.MapValueForKey(m, "items") - if v7 != nil { - var err error - x.Items, err = NewPrimitivesItems(v7, compiler.NewContext("items", context)) - if err != nil { - errors = append(errors, err) - } - } - // string collection_format = 8; - v8 := compiler.MapValueForKey(m, "collectionFormat") - if v8 != nil { - x.CollectionFormat, ok = v8.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v8, v8) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [csv ssv tsv pipes] - if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v8, v8) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Any default = 9; - v9 := compiler.MapValueForKey(m, "default") - if v9 != nil { - var err error - x.Default, err = NewAny(v9, compiler.NewContext("default", context)) - if err != nil { - errors = append(errors, err) - } - } - // float maximum = 10; - v10 := compiler.MapValueForKey(m, "maximum") - if v10 != nil { - switch v10 := v10.(type) { - case float64: - x.Maximum = v10 - case float32: - x.Maximum = float64(v10) - case uint64: - x.Maximum = float64(v10) - case uint32: - x.Maximum = float64(v10) - case int64: - x.Maximum = float64(v10) - case int32: - x.Maximum = float64(v10) - case int: - x.Maximum = float64(v10) - default: - message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v10, v10) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_maximum = 11; - v11 := compiler.MapValueForKey(m, "exclusiveMaximum") - if v11 != nil { - x.ExclusiveMaximum, ok = v11.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v11, v11) - errors = append(errors, compiler.NewError(context, message)) - } - } - // float minimum = 12; - v12 := compiler.MapValueForKey(m, "minimum") - if v12 != nil { - switch v12 := v12.(type) { - case float64: - x.Minimum = v12 - case float32: - x.Minimum = float64(v12) - case uint64: - x.Minimum = float64(v12) - case uint32: - x.Minimum = float64(v12) - case int64: - x.Minimum = float64(v12) - case int32: - x.Minimum = float64(v12) - case int: - x.Minimum = float64(v12) - default: - message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v12, v12) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_minimum = 13; - v13 := compiler.MapValueForKey(m, "exclusiveMinimum") - if v13 != nil { - x.ExclusiveMinimum, ok = v13.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v13, v13) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_length = 14; - v14 := compiler.MapValueForKey(m, "maxLength") - if v14 != nil { - t, ok := v14.(int) - if ok { - x.MaxLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v14, v14) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_length = 15; - v15 := compiler.MapValueForKey(m, "minLength") - if v15 != nil { - t, ok := v15.(int) - if ok { - x.MinLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v15, v15) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string pattern = 16; - v16 := compiler.MapValueForKey(m, "pattern") - if v16 != nil { - x.Pattern, ok = v16.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v16, v16) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_items = 17; - v17 := compiler.MapValueForKey(m, "maxItems") - if v17 != nil { - t, ok := v17.(int) - if ok { - x.MaxItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v17, v17) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_items = 18; - v18 := compiler.MapValueForKey(m, "minItems") - if v18 != nil { - t, ok := v18.(int) - if ok { - x.MinItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v18, v18) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool unique_items = 19; - v19 := compiler.MapValueForKey(m, "uniqueItems") - if v19 != nil { - x.UniqueItems, ok = v19.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v19, v19) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated Any enum = 20; - v20 := compiler.MapValueForKey(m, "enum") - if v20 != nil { - // repeated Any - x.Enum = make([]*Any, 0) - a, ok := v20.([]interface{}) - if ok { - for _, item := range a { - y, err := NewAny(item, compiler.NewContext("enum", context)) - if err != nil { - errors = append(errors, err) - } - x.Enum = append(x.Enum, y) - } - } - } - // float multiple_of = 21; - v21 := compiler.MapValueForKey(m, "multipleOf") - if v21 != nil { - switch v21 := v21.(type) { - case float64: - x.MultipleOf = v21 - case float32: - x.MultipleOf = float64(v21) - case uint64: - x.MultipleOf = float64(v21) - case uint32: - x.MultipleOf = float64(v21) - case int64: - x.MultipleOf = float64(v21) - case int32: - x.MultipleOf = float64(v21) - case int: - x.MultipleOf = float64(v21) - default: - message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v21, v21) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 22; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewHeaders creates an object of type Headers if possible, returning an error if not. -func NewHeaders(in interface{}, context *compiler.Context) (*Headers, error) { - errors := make([]error, 0) - x := &Headers{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - // repeated NamedHeader additional_properties = 1; - // MAP: Header - x.AdditionalProperties = make([]*NamedHeader, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - pair := &NamedHeader{} - pair.Name = k - var err error - pair.Value, err = NewHeader(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - x.AdditionalProperties = append(x.AdditionalProperties, pair) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewInfo creates an object of type Info if possible, returning an error if not. -func NewInfo(in interface{}, context *compiler.Context) (*Info, error) { - errors := make([]error, 0) - x := &Info{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"title", "version"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"contact", "description", "license", "termsOfService", "title", "version"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string title = 1; - v1 := compiler.MapValueForKey(m, "title") - if v1 != nil { - x.Title, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for title: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string version = 2; - v2 := compiler.MapValueForKey(m, "version") - if v2 != nil { - x.Version, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for version: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 3; - v3 := compiler.MapValueForKey(m, "description") - if v3 != nil { - x.Description, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string terms_of_service = 4; - v4 := compiler.MapValueForKey(m, "termsOfService") - if v4 != nil { - x.TermsOfService, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for termsOfService: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Contact contact = 5; - v5 := compiler.MapValueForKey(m, "contact") - if v5 != nil { - var err error - x.Contact, err = NewContact(v5, compiler.NewContext("contact", context)) - if err != nil { - errors = append(errors, err) - } - } - // License license = 6; - v6 := compiler.MapValueForKey(m, "license") - if v6 != nil { - var err error - x.License, err = NewLicense(v6, compiler.NewContext("license", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated NamedAny vendor_extension = 7; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewItemsItem creates an object of type ItemsItem if possible, returning an error if not. -func NewItemsItem(in interface{}, context *compiler.Context) (*ItemsItem, error) { - errors := make([]error, 0) - x := &ItemsItem{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value for item array: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - x.Schema = make([]*Schema, 0) - y, err := NewSchema(m, compiler.NewContext("", context)) - if err != nil { - return nil, err - } - x.Schema = append(x.Schema, y) - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewJsonReference creates an object of type JsonReference if possible, returning an error if not. -func NewJsonReference(in interface{}, context *compiler.Context) (*JsonReference, error) { - errors := make([]error, 0) - x := &JsonReference{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"$ref"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"$ref", "description"} - var allowedPatterns []*regexp.Regexp - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string _ref = 1; - v1 := compiler.MapValueForKey(m, "$ref") - if v1 != nil { - x.XRef, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 2; - v2 := compiler.MapValueForKey(m, "description") - if v2 != nil { - x.Description, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewLicense creates an object of type License if possible, returning an error if not. -func NewLicense(in interface{}, context *compiler.Context) (*License, error) { - errors := make([]error, 0) - x := &License{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"name"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"name", "url"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string url = 2; - v2 := compiler.MapValueForKey(m, "url") - if v2 != nil { - x.Url, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for url: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 3; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewNamedAny creates an object of type NamedAny if possible, returning an error if not. -func NewNamedAny(in interface{}, context *compiler.Context) (*NamedAny, error) { - errors := make([]error, 0) - x := &NamedAny{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"name", "value"} - var allowedPatterns []*regexp.Regexp - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Any value = 2; - v2 := compiler.MapValueForKey(m, "value") - if v2 != nil { - var err error - x.Value, err = NewAny(v2, compiler.NewContext("value", context)) - if err != nil { - errors = append(errors, err) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewNamedHeader creates an object of type NamedHeader if possible, returning an error if not. -func NewNamedHeader(in interface{}, context *compiler.Context) (*NamedHeader, error) { - errors := make([]error, 0) - x := &NamedHeader{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"name", "value"} - var allowedPatterns []*regexp.Regexp - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Header value = 2; - v2 := compiler.MapValueForKey(m, "value") - if v2 != nil { - var err error - x.Value, err = NewHeader(v2, compiler.NewContext("value", context)) - if err != nil { - errors = append(errors, err) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewNamedParameter creates an object of type NamedParameter if possible, returning an error if not. -func NewNamedParameter(in interface{}, context *compiler.Context) (*NamedParameter, error) { - errors := make([]error, 0) - x := &NamedParameter{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"name", "value"} - var allowedPatterns []*regexp.Regexp - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Parameter value = 2; - v2 := compiler.MapValueForKey(m, "value") - if v2 != nil { - var err error - x.Value, err = NewParameter(v2, compiler.NewContext("value", context)) - if err != nil { - errors = append(errors, err) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewNamedPathItem creates an object of type NamedPathItem if possible, returning an error if not. -func NewNamedPathItem(in interface{}, context *compiler.Context) (*NamedPathItem, error) { - errors := make([]error, 0) - x := &NamedPathItem{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"name", "value"} - var allowedPatterns []*regexp.Regexp - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // PathItem value = 2; - v2 := compiler.MapValueForKey(m, "value") - if v2 != nil { - var err error - x.Value, err = NewPathItem(v2, compiler.NewContext("value", context)) - if err != nil { - errors = append(errors, err) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewNamedResponse creates an object of type NamedResponse if possible, returning an error if not. -func NewNamedResponse(in interface{}, context *compiler.Context) (*NamedResponse, error) { - errors := make([]error, 0) - x := &NamedResponse{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"name", "value"} - var allowedPatterns []*regexp.Regexp - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Response value = 2; - v2 := compiler.MapValueForKey(m, "value") - if v2 != nil { - var err error - x.Value, err = NewResponse(v2, compiler.NewContext("value", context)) - if err != nil { - errors = append(errors, err) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewNamedResponseValue creates an object of type NamedResponseValue if possible, returning an error if not. -func NewNamedResponseValue(in interface{}, context *compiler.Context) (*NamedResponseValue, error) { - errors := make([]error, 0) - x := &NamedResponseValue{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"name", "value"} - var allowedPatterns []*regexp.Regexp - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // ResponseValue value = 2; - v2 := compiler.MapValueForKey(m, "value") - if v2 != nil { - var err error - x.Value, err = NewResponseValue(v2, compiler.NewContext("value", context)) - if err != nil { - errors = append(errors, err) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewNamedSchema creates an object of type NamedSchema if possible, returning an error if not. -func NewNamedSchema(in interface{}, context *compiler.Context) (*NamedSchema, error) { - errors := make([]error, 0) - x := &NamedSchema{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"name", "value"} - var allowedPatterns []*regexp.Regexp - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Schema value = 2; - v2 := compiler.MapValueForKey(m, "value") - if v2 != nil { - var err error - x.Value, err = NewSchema(v2, compiler.NewContext("value", context)) - if err != nil { - errors = append(errors, err) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewNamedSecurityDefinitionsItem creates an object of type NamedSecurityDefinitionsItem if possible, returning an error if not. -func NewNamedSecurityDefinitionsItem(in interface{}, context *compiler.Context) (*NamedSecurityDefinitionsItem, error) { - errors := make([]error, 0) - x := &NamedSecurityDefinitionsItem{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"name", "value"} - var allowedPatterns []*regexp.Regexp - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // SecurityDefinitionsItem value = 2; - v2 := compiler.MapValueForKey(m, "value") - if v2 != nil { - var err error - x.Value, err = NewSecurityDefinitionsItem(v2, compiler.NewContext("value", context)) - if err != nil { - errors = append(errors, err) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewNamedString creates an object of type NamedString if possible, returning an error if not. -func NewNamedString(in interface{}, context *compiler.Context) (*NamedString, error) { - errors := make([]error, 0) - x := &NamedString{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"name", "value"} - var allowedPatterns []*regexp.Regexp - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string value = 2; - v2 := compiler.MapValueForKey(m, "value") - if v2 != nil { - x.Value, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for value: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewNamedStringArray creates an object of type NamedStringArray if possible, returning an error if not. -func NewNamedStringArray(in interface{}, context *compiler.Context) (*NamedStringArray, error) { - errors := make([]error, 0) - x := &NamedStringArray{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"name", "value"} - var allowedPatterns []*regexp.Regexp - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // StringArray value = 2; - v2 := compiler.MapValueForKey(m, "value") - if v2 != nil { - var err error - x.Value, err = NewStringArray(v2, compiler.NewContext("value", context)) - if err != nil { - errors = append(errors, err) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewNonBodyParameter creates an object of type NonBodyParameter if possible, returning an error if not. -func NewNonBodyParameter(in interface{}, context *compiler.Context) (*NonBodyParameter, error) { - errors := make([]error, 0) - x := &NonBodyParameter{} - matched := false - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"in", "name", "type"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // HeaderParameterSubSchema header_parameter_sub_schema = 1; - { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewHeaderParameterSubSchema(m, compiler.NewContext("headerParameterSubSchema", context)) - if matchingError == nil { - x.Oneof = &NonBodyParameter_HeaderParameterSubSchema{HeaderParameterSubSchema: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - // FormDataParameterSubSchema form_data_parameter_sub_schema = 2; - { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewFormDataParameterSubSchema(m, compiler.NewContext("formDataParameterSubSchema", context)) - if matchingError == nil { - x.Oneof = &NonBodyParameter_FormDataParameterSubSchema{FormDataParameterSubSchema: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - // QueryParameterSubSchema query_parameter_sub_schema = 3; - { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewQueryParameterSubSchema(m, compiler.NewContext("queryParameterSubSchema", context)) - if matchingError == nil { - x.Oneof = &NonBodyParameter_QueryParameterSubSchema{QueryParameterSubSchema: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - // PathParameterSubSchema path_parameter_sub_schema = 4; - { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewPathParameterSubSchema(m, compiler.NewContext("pathParameterSubSchema", context)) - if matchingError == nil { - x.Oneof = &NonBodyParameter_PathParameterSubSchema{PathParameterSubSchema: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - if matched { - // since the oneof matched one of its possibilities, discard any matching errors - errors = make([]error, 0) - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewOauth2AccessCodeSecurity creates an object of type Oauth2AccessCodeSecurity if possible, returning an error if not. -func NewOauth2AccessCodeSecurity(in interface{}, context *compiler.Context) (*Oauth2AccessCodeSecurity, error) { - errors := make([]error, 0) - x := &Oauth2AccessCodeSecurity{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"authorizationUrl", "flow", "tokenUrl", "type"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"authorizationUrl", "description", "flow", "scopes", "tokenUrl", "type"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string type = 1; - v1 := compiler.MapValueForKey(m, "type") - if v1 != nil { - x.Type, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [oauth2] - if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string flow = 2; - v2 := compiler.MapValueForKey(m, "flow") - if v2 != nil { - x.Flow, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [accessCode] - if ok && !compiler.StringArrayContainsValue([]string{"accessCode"}, x.Flow) { - message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Oauth2Scopes scopes = 3; - v3 := compiler.MapValueForKey(m, "scopes") - if v3 != nil { - var err error - x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", context)) - if err != nil { - errors = append(errors, err) - } - } - // string authorization_url = 4; - v4 := compiler.MapValueForKey(m, "authorizationUrl") - if v4 != nil { - x.AuthorizationUrl, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for authorizationUrl: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string token_url = 5; - v5 := compiler.MapValueForKey(m, "tokenUrl") - if v5 != nil { - x.TokenUrl, ok = v5.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for tokenUrl: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 6; - v6 := compiler.MapValueForKey(m, "description") - if v6 != nil { - x.Description, ok = v6.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 7; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewOauth2ApplicationSecurity creates an object of type Oauth2ApplicationSecurity if possible, returning an error if not. -func NewOauth2ApplicationSecurity(in interface{}, context *compiler.Context) (*Oauth2ApplicationSecurity, error) { - errors := make([]error, 0) - x := &Oauth2ApplicationSecurity{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"flow", "tokenUrl", "type"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"description", "flow", "scopes", "tokenUrl", "type"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string type = 1; - v1 := compiler.MapValueForKey(m, "type") - if v1 != nil { - x.Type, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [oauth2] - if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string flow = 2; - v2 := compiler.MapValueForKey(m, "flow") - if v2 != nil { - x.Flow, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [application] - if ok && !compiler.StringArrayContainsValue([]string{"application"}, x.Flow) { - message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Oauth2Scopes scopes = 3; - v3 := compiler.MapValueForKey(m, "scopes") - if v3 != nil { - var err error - x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", context)) - if err != nil { - errors = append(errors, err) - } - } - // string token_url = 4; - v4 := compiler.MapValueForKey(m, "tokenUrl") - if v4 != nil { - x.TokenUrl, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for tokenUrl: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 5; - v5 := compiler.MapValueForKey(m, "description") - if v5 != nil { - x.Description, ok = v5.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 6; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewOauth2ImplicitSecurity creates an object of type Oauth2ImplicitSecurity if possible, returning an error if not. -func NewOauth2ImplicitSecurity(in interface{}, context *compiler.Context) (*Oauth2ImplicitSecurity, error) { - errors := make([]error, 0) - x := &Oauth2ImplicitSecurity{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"authorizationUrl", "flow", "type"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"authorizationUrl", "description", "flow", "scopes", "type"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string type = 1; - v1 := compiler.MapValueForKey(m, "type") - if v1 != nil { - x.Type, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [oauth2] - if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string flow = 2; - v2 := compiler.MapValueForKey(m, "flow") - if v2 != nil { - x.Flow, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [implicit] - if ok && !compiler.StringArrayContainsValue([]string{"implicit"}, x.Flow) { - message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Oauth2Scopes scopes = 3; - v3 := compiler.MapValueForKey(m, "scopes") - if v3 != nil { - var err error - x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", context)) - if err != nil { - errors = append(errors, err) - } - } - // string authorization_url = 4; - v4 := compiler.MapValueForKey(m, "authorizationUrl") - if v4 != nil { - x.AuthorizationUrl, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for authorizationUrl: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 5; - v5 := compiler.MapValueForKey(m, "description") - if v5 != nil { - x.Description, ok = v5.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 6; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewOauth2PasswordSecurity creates an object of type Oauth2PasswordSecurity if possible, returning an error if not. -func NewOauth2PasswordSecurity(in interface{}, context *compiler.Context) (*Oauth2PasswordSecurity, error) { - errors := make([]error, 0) - x := &Oauth2PasswordSecurity{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"flow", "tokenUrl", "type"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"description", "flow", "scopes", "tokenUrl", "type"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string type = 1; - v1 := compiler.MapValueForKey(m, "type") - if v1 != nil { - x.Type, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [oauth2] - if ok && !compiler.StringArrayContainsValue([]string{"oauth2"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string flow = 2; - v2 := compiler.MapValueForKey(m, "flow") - if v2 != nil { - x.Flow, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [password] - if ok && !compiler.StringArrayContainsValue([]string{"password"}, x.Flow) { - message := fmt.Sprintf("has unexpected value for flow: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Oauth2Scopes scopes = 3; - v3 := compiler.MapValueForKey(m, "scopes") - if v3 != nil { - var err error - x.Scopes, err = NewOauth2Scopes(v3, compiler.NewContext("scopes", context)) - if err != nil { - errors = append(errors, err) - } - } - // string token_url = 4; - v4 := compiler.MapValueForKey(m, "tokenUrl") - if v4 != nil { - x.TokenUrl, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for tokenUrl: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 5; - v5 := compiler.MapValueForKey(m, "description") - if v5 != nil { - x.Description, ok = v5.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 6; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewOauth2Scopes creates an object of type Oauth2Scopes if possible, returning an error if not. -func NewOauth2Scopes(in interface{}, context *compiler.Context) (*Oauth2Scopes, error) { - errors := make([]error, 0) - x := &Oauth2Scopes{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - // repeated NamedString additional_properties = 1; - // MAP: string - x.AdditionalProperties = make([]*NamedString, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - pair := &NamedString{} - pair.Name = k - pair.Value = v.(string) - x.AdditionalProperties = append(x.AdditionalProperties, pair) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewOperation creates an object of type Operation if possible, returning an error if not. -func NewOperation(in interface{}, context *compiler.Context) (*Operation, error) { - errors := make([]error, 0) - x := &Operation{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"responses"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"consumes", "deprecated", "description", "externalDocs", "operationId", "parameters", "produces", "responses", "schemes", "security", "summary", "tags"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // repeated string tags = 1; - v1 := compiler.MapValueForKey(m, "tags") - if v1 != nil { - v, ok := v1.([]interface{}) - if ok { - x.Tags = compiler.ConvertInterfaceArrayToStringArray(v) - } else { - message := fmt.Sprintf("has unexpected value for tags: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string summary = 2; - v2 := compiler.MapValueForKey(m, "summary") - if v2 != nil { - x.Summary, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for summary: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 3; - v3 := compiler.MapValueForKey(m, "description") - if v3 != nil { - x.Description, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // ExternalDocs external_docs = 4; - v4 := compiler.MapValueForKey(m, "externalDocs") - if v4 != nil { - var err error - x.ExternalDocs, err = NewExternalDocs(v4, compiler.NewContext("externalDocs", context)) - if err != nil { - errors = append(errors, err) - } - } - // string operation_id = 5; - v5 := compiler.MapValueForKey(m, "operationId") - if v5 != nil { - x.OperationId, ok = v5.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for operationId: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated string produces = 6; - v6 := compiler.MapValueForKey(m, "produces") - if v6 != nil { - v, ok := v6.([]interface{}) - if ok { - x.Produces = compiler.ConvertInterfaceArrayToStringArray(v) - } else { - message := fmt.Sprintf("has unexpected value for produces: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated string consumes = 7; - v7 := compiler.MapValueForKey(m, "consumes") - if v7 != nil { - v, ok := v7.([]interface{}) - if ok { - x.Consumes = compiler.ConvertInterfaceArrayToStringArray(v) - } else { - message := fmt.Sprintf("has unexpected value for consumes: %+v (%T)", v7, v7) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated ParametersItem parameters = 8; - v8 := compiler.MapValueForKey(m, "parameters") - if v8 != nil { - // repeated ParametersItem - x.Parameters = make([]*ParametersItem, 0) - a, ok := v8.([]interface{}) - if ok { - for _, item := range a { - y, err := NewParametersItem(item, compiler.NewContext("parameters", context)) - if err != nil { - errors = append(errors, err) - } - x.Parameters = append(x.Parameters, y) - } - } - } - // Responses responses = 9; - v9 := compiler.MapValueForKey(m, "responses") - if v9 != nil { - var err error - x.Responses, err = NewResponses(v9, compiler.NewContext("responses", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated string schemes = 10; - v10 := compiler.MapValueForKey(m, "schemes") - if v10 != nil { - v, ok := v10.([]interface{}) - if ok { - x.Schemes = compiler.ConvertInterfaceArrayToStringArray(v) - } else { - message := fmt.Sprintf("has unexpected value for schemes: %+v (%T)", v10, v10) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [http https ws wss] - if ok && !compiler.StringArrayContainsValues([]string{"http", "https", "ws", "wss"}, x.Schemes) { - message := fmt.Sprintf("has unexpected value for schemes: %+v", v10) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool deprecated = 11; - v11 := compiler.MapValueForKey(m, "deprecated") - if v11 != nil { - x.Deprecated, ok = v11.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for deprecated: %+v (%T)", v11, v11) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated SecurityRequirement security = 12; - v12 := compiler.MapValueForKey(m, "security") - if v12 != nil { - // repeated SecurityRequirement - x.Security = make([]*SecurityRequirement, 0) - a, ok := v12.([]interface{}) - if ok { - for _, item := range a { - y, err := NewSecurityRequirement(item, compiler.NewContext("security", context)) - if err != nil { - errors = append(errors, err) - } - x.Security = append(x.Security, y) - } - } - } - // repeated NamedAny vendor_extension = 13; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewParameter creates an object of type Parameter if possible, returning an error if not. -func NewParameter(in interface{}, context *compiler.Context) (*Parameter, error) { - errors := make([]error, 0) - x := &Parameter{} - matched := false - // BodyParameter body_parameter = 1; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewBodyParameter(m, compiler.NewContext("bodyParameter", context)) - if matchingError == nil { - x.Oneof = &Parameter_BodyParameter{BodyParameter: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - // NonBodyParameter non_body_parameter = 2; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewNonBodyParameter(m, compiler.NewContext("nonBodyParameter", context)) - if matchingError == nil { - x.Oneof = &Parameter_NonBodyParameter{NonBodyParameter: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - if matched { - // since the oneof matched one of its possibilities, discard any matching errors - errors = make([]error, 0) - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewParameterDefinitions creates an object of type ParameterDefinitions if possible, returning an error if not. -func NewParameterDefinitions(in interface{}, context *compiler.Context) (*ParameterDefinitions, error) { - errors := make([]error, 0) - x := &ParameterDefinitions{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - // repeated NamedParameter additional_properties = 1; - // MAP: Parameter - x.AdditionalProperties = make([]*NamedParameter, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - pair := &NamedParameter{} - pair.Name = k - var err error - pair.Value, err = NewParameter(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - x.AdditionalProperties = append(x.AdditionalProperties, pair) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewParametersItem creates an object of type ParametersItem if possible, returning an error if not. -func NewParametersItem(in interface{}, context *compiler.Context) (*ParametersItem, error) { - errors := make([]error, 0) - x := &ParametersItem{} - matched := false - // Parameter parameter = 1; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewParameter(m, compiler.NewContext("parameter", context)) - if matchingError == nil { - x.Oneof = &ParametersItem_Parameter{Parameter: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - // JsonReference json_reference = 2; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewJsonReference(m, compiler.NewContext("jsonReference", context)) - if matchingError == nil { - x.Oneof = &ParametersItem_JsonReference{JsonReference: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - if matched { - // since the oneof matched one of its possibilities, discard any matching errors - errors = make([]error, 0) - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewPathItem creates an object of type PathItem if possible, returning an error if not. -func NewPathItem(in interface{}, context *compiler.Context) (*PathItem, error) { - errors := make([]error, 0) - x := &PathItem{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"$ref", "delete", "get", "head", "options", "parameters", "patch", "post", "put"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string _ref = 1; - v1 := compiler.MapValueForKey(m, "$ref") - if v1 != nil { - x.XRef, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Operation get = 2; - v2 := compiler.MapValueForKey(m, "get") - if v2 != nil { - var err error - x.Get, err = NewOperation(v2, compiler.NewContext("get", context)) - if err != nil { - errors = append(errors, err) - } - } - // Operation put = 3; - v3 := compiler.MapValueForKey(m, "put") - if v3 != nil { - var err error - x.Put, err = NewOperation(v3, compiler.NewContext("put", context)) - if err != nil { - errors = append(errors, err) - } - } - // Operation post = 4; - v4 := compiler.MapValueForKey(m, "post") - if v4 != nil { - var err error - x.Post, err = NewOperation(v4, compiler.NewContext("post", context)) - if err != nil { - errors = append(errors, err) - } - } - // Operation delete = 5; - v5 := compiler.MapValueForKey(m, "delete") - if v5 != nil { - var err error - x.Delete, err = NewOperation(v5, compiler.NewContext("delete", context)) - if err != nil { - errors = append(errors, err) - } - } - // Operation options = 6; - v6 := compiler.MapValueForKey(m, "options") - if v6 != nil { - var err error - x.Options, err = NewOperation(v6, compiler.NewContext("options", context)) - if err != nil { - errors = append(errors, err) - } - } - // Operation head = 7; - v7 := compiler.MapValueForKey(m, "head") - if v7 != nil { - var err error - x.Head, err = NewOperation(v7, compiler.NewContext("head", context)) - if err != nil { - errors = append(errors, err) - } - } - // Operation patch = 8; - v8 := compiler.MapValueForKey(m, "patch") - if v8 != nil { - var err error - x.Patch, err = NewOperation(v8, compiler.NewContext("patch", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated ParametersItem parameters = 9; - v9 := compiler.MapValueForKey(m, "parameters") - if v9 != nil { - // repeated ParametersItem - x.Parameters = make([]*ParametersItem, 0) - a, ok := v9.([]interface{}) - if ok { - for _, item := range a { - y, err := NewParametersItem(item, compiler.NewContext("parameters", context)) - if err != nil { - errors = append(errors, err) - } - x.Parameters = append(x.Parameters, y) - } - } - } - // repeated NamedAny vendor_extension = 10; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewPathParameterSubSchema creates an object of type PathParameterSubSchema if possible, returning an error if not. -func NewPathParameterSubSchema(in interface{}, context *compiler.Context) (*PathParameterSubSchema, error) { - errors := make([]error, 0) - x := &PathParameterSubSchema{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"required"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // bool required = 1; - v1 := compiler.MapValueForKey(m, "required") - if v1 != nil { - x.Required, ok = v1.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string in = 2; - v2 := compiler.MapValueForKey(m, "in") - if v2 != nil { - x.In, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [path] - if ok && !compiler.StringArrayContainsValue([]string{"path"}, x.In) { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 3; - v3 := compiler.MapValueForKey(m, "description") - if v3 != nil { - x.Description, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string name = 4; - v4 := compiler.MapValueForKey(m, "name") - if v4 != nil { - x.Name, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string type = 5; - v5 := compiler.MapValueForKey(m, "type") - if v5 != nil { - x.Type, ok = v5.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [string number boolean integer array] - if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string format = 6; - v6 := compiler.MapValueForKey(m, "format") - if v6 != nil { - x.Format, ok = v6.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - } - // PrimitivesItems items = 7; - v7 := compiler.MapValueForKey(m, "items") - if v7 != nil { - var err error - x.Items, err = NewPrimitivesItems(v7, compiler.NewContext("items", context)) - if err != nil { - errors = append(errors, err) - } - } - // string collection_format = 8; - v8 := compiler.MapValueForKey(m, "collectionFormat") - if v8 != nil { - x.CollectionFormat, ok = v8.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v8, v8) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [csv ssv tsv pipes] - if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v8, v8) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Any default = 9; - v9 := compiler.MapValueForKey(m, "default") - if v9 != nil { - var err error - x.Default, err = NewAny(v9, compiler.NewContext("default", context)) - if err != nil { - errors = append(errors, err) - } - } - // float maximum = 10; - v10 := compiler.MapValueForKey(m, "maximum") - if v10 != nil { - switch v10 := v10.(type) { - case float64: - x.Maximum = v10 - case float32: - x.Maximum = float64(v10) - case uint64: - x.Maximum = float64(v10) - case uint32: - x.Maximum = float64(v10) - case int64: - x.Maximum = float64(v10) - case int32: - x.Maximum = float64(v10) - case int: - x.Maximum = float64(v10) - default: - message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v10, v10) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_maximum = 11; - v11 := compiler.MapValueForKey(m, "exclusiveMaximum") - if v11 != nil { - x.ExclusiveMaximum, ok = v11.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v11, v11) - errors = append(errors, compiler.NewError(context, message)) - } - } - // float minimum = 12; - v12 := compiler.MapValueForKey(m, "minimum") - if v12 != nil { - switch v12 := v12.(type) { - case float64: - x.Minimum = v12 - case float32: - x.Minimum = float64(v12) - case uint64: - x.Minimum = float64(v12) - case uint32: - x.Minimum = float64(v12) - case int64: - x.Minimum = float64(v12) - case int32: - x.Minimum = float64(v12) - case int: - x.Minimum = float64(v12) - default: - message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v12, v12) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_minimum = 13; - v13 := compiler.MapValueForKey(m, "exclusiveMinimum") - if v13 != nil { - x.ExclusiveMinimum, ok = v13.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v13, v13) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_length = 14; - v14 := compiler.MapValueForKey(m, "maxLength") - if v14 != nil { - t, ok := v14.(int) - if ok { - x.MaxLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v14, v14) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_length = 15; - v15 := compiler.MapValueForKey(m, "minLength") - if v15 != nil { - t, ok := v15.(int) - if ok { - x.MinLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v15, v15) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string pattern = 16; - v16 := compiler.MapValueForKey(m, "pattern") - if v16 != nil { - x.Pattern, ok = v16.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v16, v16) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_items = 17; - v17 := compiler.MapValueForKey(m, "maxItems") - if v17 != nil { - t, ok := v17.(int) - if ok { - x.MaxItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v17, v17) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_items = 18; - v18 := compiler.MapValueForKey(m, "minItems") - if v18 != nil { - t, ok := v18.(int) - if ok { - x.MinItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v18, v18) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool unique_items = 19; - v19 := compiler.MapValueForKey(m, "uniqueItems") - if v19 != nil { - x.UniqueItems, ok = v19.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v19, v19) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated Any enum = 20; - v20 := compiler.MapValueForKey(m, "enum") - if v20 != nil { - // repeated Any - x.Enum = make([]*Any, 0) - a, ok := v20.([]interface{}) - if ok { - for _, item := range a { - y, err := NewAny(item, compiler.NewContext("enum", context)) - if err != nil { - errors = append(errors, err) - } - x.Enum = append(x.Enum, y) - } - } - } - // float multiple_of = 21; - v21 := compiler.MapValueForKey(m, "multipleOf") - if v21 != nil { - switch v21 := v21.(type) { - case float64: - x.MultipleOf = v21 - case float32: - x.MultipleOf = float64(v21) - case uint64: - x.MultipleOf = float64(v21) - case uint32: - x.MultipleOf = float64(v21) - case int64: - x.MultipleOf = float64(v21) - case int32: - x.MultipleOf = float64(v21) - case int: - x.MultipleOf = float64(v21) - default: - message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v21, v21) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 22; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewPaths creates an object of type Paths if possible, returning an error if not. -func NewPaths(in interface{}, context *compiler.Context) (*Paths, error) { - errors := make([]error, 0) - x := &Paths{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{} - allowedPatterns := []*regexp.Regexp{pattern0, pattern1} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // repeated NamedAny vendor_extension = 1; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - // repeated NamedPathItem path = 2; - // MAP: PathItem ^/ - x.Path = make([]*NamedPathItem, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "/") { - pair := &NamedPathItem{} - pair.Name = k - var err error - pair.Value, err = NewPathItem(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - x.Path = append(x.Path, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewPrimitivesItems creates an object of type PrimitivesItems if possible, returning an error if not. -func NewPrimitivesItems(in interface{}, context *compiler.Context) (*PrimitivesItems, error) { - errors := make([]error, 0) - x := &PrimitivesItems{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"collectionFormat", "default", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "pattern", "type", "uniqueItems"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string type = 1; - v1 := compiler.MapValueForKey(m, "type") - if v1 != nil { - x.Type, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [string number integer boolean array] - if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "integer", "boolean", "array"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string format = 2; - v2 := compiler.MapValueForKey(m, "format") - if v2 != nil { - x.Format, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // PrimitivesItems items = 3; - v3 := compiler.MapValueForKey(m, "items") - if v3 != nil { - var err error - x.Items, err = NewPrimitivesItems(v3, compiler.NewContext("items", context)) - if err != nil { - errors = append(errors, err) - } - } - // string collection_format = 4; - v4 := compiler.MapValueForKey(m, "collectionFormat") - if v4 != nil { - x.CollectionFormat, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [csv ssv tsv pipes] - if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes"}, x.CollectionFormat) { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Any default = 5; - v5 := compiler.MapValueForKey(m, "default") - if v5 != nil { - var err error - x.Default, err = NewAny(v5, compiler.NewContext("default", context)) - if err != nil { - errors = append(errors, err) - } - } - // float maximum = 6; - v6 := compiler.MapValueForKey(m, "maximum") - if v6 != nil { - switch v6 := v6.(type) { - case float64: - x.Maximum = v6 - case float32: - x.Maximum = float64(v6) - case uint64: - x.Maximum = float64(v6) - case uint32: - x.Maximum = float64(v6) - case int64: - x.Maximum = float64(v6) - case int32: - x.Maximum = float64(v6) - case int: - x.Maximum = float64(v6) - default: - message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_maximum = 7; - v7 := compiler.MapValueForKey(m, "exclusiveMaximum") - if v7 != nil { - x.ExclusiveMaximum, ok = v7.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v7, v7) - errors = append(errors, compiler.NewError(context, message)) - } - } - // float minimum = 8; - v8 := compiler.MapValueForKey(m, "minimum") - if v8 != nil { - switch v8 := v8.(type) { - case float64: - x.Minimum = v8 - case float32: - x.Minimum = float64(v8) - case uint64: - x.Minimum = float64(v8) - case uint32: - x.Minimum = float64(v8) - case int64: - x.Minimum = float64(v8) - case int32: - x.Minimum = float64(v8) - case int: - x.Minimum = float64(v8) - default: - message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v8, v8) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_minimum = 9; - v9 := compiler.MapValueForKey(m, "exclusiveMinimum") - if v9 != nil { - x.ExclusiveMinimum, ok = v9.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v9, v9) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_length = 10; - v10 := compiler.MapValueForKey(m, "maxLength") - if v10 != nil { - t, ok := v10.(int) - if ok { - x.MaxLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v10, v10) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_length = 11; - v11 := compiler.MapValueForKey(m, "minLength") - if v11 != nil { - t, ok := v11.(int) - if ok { - x.MinLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v11, v11) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string pattern = 12; - v12 := compiler.MapValueForKey(m, "pattern") - if v12 != nil { - x.Pattern, ok = v12.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v12, v12) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_items = 13; - v13 := compiler.MapValueForKey(m, "maxItems") - if v13 != nil { - t, ok := v13.(int) - if ok { - x.MaxItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v13, v13) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_items = 14; - v14 := compiler.MapValueForKey(m, "minItems") - if v14 != nil { - t, ok := v14.(int) - if ok { - x.MinItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v14, v14) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool unique_items = 15; - v15 := compiler.MapValueForKey(m, "uniqueItems") - if v15 != nil { - x.UniqueItems, ok = v15.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v15, v15) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated Any enum = 16; - v16 := compiler.MapValueForKey(m, "enum") - if v16 != nil { - // repeated Any - x.Enum = make([]*Any, 0) - a, ok := v16.([]interface{}) - if ok { - for _, item := range a { - y, err := NewAny(item, compiler.NewContext("enum", context)) - if err != nil { - errors = append(errors, err) - } - x.Enum = append(x.Enum, y) - } - } - } - // float multiple_of = 17; - v17 := compiler.MapValueForKey(m, "multipleOf") - if v17 != nil { - switch v17 := v17.(type) { - case float64: - x.MultipleOf = v17 - case float32: - x.MultipleOf = float64(v17) - case uint64: - x.MultipleOf = float64(v17) - case uint32: - x.MultipleOf = float64(v17) - case int64: - x.MultipleOf = float64(v17) - case int32: - x.MultipleOf = float64(v17) - case int: - x.MultipleOf = float64(v17) - default: - message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v17, v17) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 18; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewProperties creates an object of type Properties if possible, returning an error if not. -func NewProperties(in interface{}, context *compiler.Context) (*Properties, error) { - errors := make([]error, 0) - x := &Properties{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - // repeated NamedSchema additional_properties = 1; - // MAP: Schema - x.AdditionalProperties = make([]*NamedSchema, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - pair := &NamedSchema{} - pair.Name = k - var err error - pair.Value, err = NewSchema(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - x.AdditionalProperties = append(x.AdditionalProperties, pair) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewQueryParameterSubSchema creates an object of type QueryParameterSubSchema if possible, returning an error if not. -func NewQueryParameterSubSchema(in interface{}, context *compiler.Context) (*QueryParameterSubSchema, error) { - errors := make([]error, 0) - x := &QueryParameterSubSchema{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"allowEmptyValue", "collectionFormat", "default", "description", "enum", "exclusiveMaximum", "exclusiveMinimum", "format", "in", "items", "maxItems", "maxLength", "maximum", "minItems", "minLength", "minimum", "multipleOf", "name", "pattern", "required", "type", "uniqueItems"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // bool required = 1; - v1 := compiler.MapValueForKey(m, "required") - if v1 != nil { - x.Required, ok = v1.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string in = 2; - v2 := compiler.MapValueForKey(m, "in") - if v2 != nil { - x.In, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [query] - if ok && !compiler.StringArrayContainsValue([]string{"query"}, x.In) { - message := fmt.Sprintf("has unexpected value for in: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 3; - v3 := compiler.MapValueForKey(m, "description") - if v3 != nil { - x.Description, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string name = 4; - v4 := compiler.MapValueForKey(m, "name") - if v4 != nil { - x.Name, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool allow_empty_value = 5; - v5 := compiler.MapValueForKey(m, "allowEmptyValue") - if v5 != nil { - x.AllowEmptyValue, ok = v5.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for allowEmptyValue: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string type = 6; - v6 := compiler.MapValueForKey(m, "type") - if v6 != nil { - x.Type, ok = v6.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [string number boolean integer array] - if ok && !compiler.StringArrayContainsValue([]string{"string", "number", "boolean", "integer", "array"}, x.Type) { - message := fmt.Sprintf("has unexpected value for type: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string format = 7; - v7 := compiler.MapValueForKey(m, "format") - if v7 != nil { - x.Format, ok = v7.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v7, v7) - errors = append(errors, compiler.NewError(context, message)) - } - } - // PrimitivesItems items = 8; - v8 := compiler.MapValueForKey(m, "items") - if v8 != nil { - var err error - x.Items, err = NewPrimitivesItems(v8, compiler.NewContext("items", context)) - if err != nil { - errors = append(errors, err) - } - } - // string collection_format = 9; - v9 := compiler.MapValueForKey(m, "collectionFormat") - if v9 != nil { - x.CollectionFormat, ok = v9.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v9, v9) - errors = append(errors, compiler.NewError(context, message)) - } - // check for valid enum values - // [csv ssv tsv pipes multi] - if ok && !compiler.StringArrayContainsValue([]string{"csv", "ssv", "tsv", "pipes", "multi"}, x.CollectionFormat) { - message := fmt.Sprintf("has unexpected value for collectionFormat: %+v (%T)", v9, v9) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Any default = 10; - v10 := compiler.MapValueForKey(m, "default") - if v10 != nil { - var err error - x.Default, err = NewAny(v10, compiler.NewContext("default", context)) - if err != nil { - errors = append(errors, err) - } - } - // float maximum = 11; - v11 := compiler.MapValueForKey(m, "maximum") - if v11 != nil { - switch v11 := v11.(type) { - case float64: - x.Maximum = v11 - case float32: - x.Maximum = float64(v11) - case uint64: - x.Maximum = float64(v11) - case uint32: - x.Maximum = float64(v11) - case int64: - x.Maximum = float64(v11) - case int32: - x.Maximum = float64(v11) - case int: - x.Maximum = float64(v11) - default: - message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v11, v11) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_maximum = 12; - v12 := compiler.MapValueForKey(m, "exclusiveMaximum") - if v12 != nil { - x.ExclusiveMaximum, ok = v12.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v12, v12) - errors = append(errors, compiler.NewError(context, message)) - } - } - // float minimum = 13; - v13 := compiler.MapValueForKey(m, "minimum") - if v13 != nil { - switch v13 := v13.(type) { - case float64: - x.Minimum = v13 - case float32: - x.Minimum = float64(v13) - case uint64: - x.Minimum = float64(v13) - case uint32: - x.Minimum = float64(v13) - case int64: - x.Minimum = float64(v13) - case int32: - x.Minimum = float64(v13) - case int: - x.Minimum = float64(v13) - default: - message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v13, v13) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_minimum = 14; - v14 := compiler.MapValueForKey(m, "exclusiveMinimum") - if v14 != nil { - x.ExclusiveMinimum, ok = v14.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v14, v14) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_length = 15; - v15 := compiler.MapValueForKey(m, "maxLength") - if v15 != nil { - t, ok := v15.(int) - if ok { - x.MaxLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v15, v15) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_length = 16; - v16 := compiler.MapValueForKey(m, "minLength") - if v16 != nil { - t, ok := v16.(int) - if ok { - x.MinLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v16, v16) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string pattern = 17; - v17 := compiler.MapValueForKey(m, "pattern") - if v17 != nil { - x.Pattern, ok = v17.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v17, v17) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_items = 18; - v18 := compiler.MapValueForKey(m, "maxItems") - if v18 != nil { - t, ok := v18.(int) - if ok { - x.MaxItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v18, v18) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_items = 19; - v19 := compiler.MapValueForKey(m, "minItems") - if v19 != nil { - t, ok := v19.(int) - if ok { - x.MinItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v19, v19) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool unique_items = 20; - v20 := compiler.MapValueForKey(m, "uniqueItems") - if v20 != nil { - x.UniqueItems, ok = v20.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v20, v20) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated Any enum = 21; - v21 := compiler.MapValueForKey(m, "enum") - if v21 != nil { - // repeated Any - x.Enum = make([]*Any, 0) - a, ok := v21.([]interface{}) - if ok { - for _, item := range a { - y, err := NewAny(item, compiler.NewContext("enum", context)) - if err != nil { - errors = append(errors, err) - } - x.Enum = append(x.Enum, y) - } - } - } - // float multiple_of = 22; - v22 := compiler.MapValueForKey(m, "multipleOf") - if v22 != nil { - switch v22 := v22.(type) { - case float64: - x.MultipleOf = v22 - case float32: - x.MultipleOf = float64(v22) - case uint64: - x.MultipleOf = float64(v22) - case uint32: - x.MultipleOf = float64(v22) - case int64: - x.MultipleOf = float64(v22) - case int32: - x.MultipleOf = float64(v22) - case int: - x.MultipleOf = float64(v22) - default: - message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v22, v22) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 23; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewResponse creates an object of type Response if possible, returning an error if not. -func NewResponse(in interface{}, context *compiler.Context) (*Response, error) { - errors := make([]error, 0) - x := &Response{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"description"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"description", "examples", "headers", "schema"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string description = 1; - v1 := compiler.MapValueForKey(m, "description") - if v1 != nil { - x.Description, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // SchemaItem schema = 2; - v2 := compiler.MapValueForKey(m, "schema") - if v2 != nil { - var err error - x.Schema, err = NewSchemaItem(v2, compiler.NewContext("schema", context)) - if err != nil { - errors = append(errors, err) - } - } - // Headers headers = 3; - v3 := compiler.MapValueForKey(m, "headers") - if v3 != nil { - var err error - x.Headers, err = NewHeaders(v3, compiler.NewContext("headers", context)) - if err != nil { - errors = append(errors, err) - } - } - // Examples examples = 4; - v4 := compiler.MapValueForKey(m, "examples") - if v4 != nil { - var err error - x.Examples, err = NewExamples(v4, compiler.NewContext("examples", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated NamedAny vendor_extension = 5; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewResponseDefinitions creates an object of type ResponseDefinitions if possible, returning an error if not. -func NewResponseDefinitions(in interface{}, context *compiler.Context) (*ResponseDefinitions, error) { - errors := make([]error, 0) - x := &ResponseDefinitions{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - // repeated NamedResponse additional_properties = 1; - // MAP: Response - x.AdditionalProperties = make([]*NamedResponse, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - pair := &NamedResponse{} - pair.Name = k - var err error - pair.Value, err = NewResponse(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - x.AdditionalProperties = append(x.AdditionalProperties, pair) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewResponseValue creates an object of type ResponseValue if possible, returning an error if not. -func NewResponseValue(in interface{}, context *compiler.Context) (*ResponseValue, error) { - errors := make([]error, 0) - x := &ResponseValue{} - matched := false - // Response response = 1; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewResponse(m, compiler.NewContext("response", context)) - if matchingError == nil { - x.Oneof = &ResponseValue_Response{Response: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - // JsonReference json_reference = 2; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewJsonReference(m, compiler.NewContext("jsonReference", context)) - if matchingError == nil { - x.Oneof = &ResponseValue_JsonReference{JsonReference: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - if matched { - // since the oneof matched one of its possibilities, discard any matching errors - errors = make([]error, 0) - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewResponses creates an object of type Responses if possible, returning an error if not. -func NewResponses(in interface{}, context *compiler.Context) (*Responses, error) { - errors := make([]error, 0) - x := &Responses{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{} - allowedPatterns := []*regexp.Regexp{pattern2, pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // repeated NamedResponseValue response_code = 1; - // MAP: ResponseValue ^([0-9]{3})$|^(default)$ - x.ResponseCode = make([]*NamedResponseValue, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if pattern2.MatchString(k) { - pair := &NamedResponseValue{} - pair.Name = k - var err error - pair.Value, err = NewResponseValue(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - x.ResponseCode = append(x.ResponseCode, pair) - } - } - } - // repeated NamedAny vendor_extension = 2; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewSchema creates an object of type Schema if possible, returning an error if not. -func NewSchema(in interface{}, context *compiler.Context) (*Schema, error) { - errors := make([]error, 0) - x := &Schema{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"$ref", "additionalProperties", "allOf", "default", "description", "discriminator", "enum", "example", "exclusiveMaximum", "exclusiveMinimum", "externalDocs", "format", "items", "maxItems", "maxLength", "maxProperties", "maximum", "minItems", "minLength", "minProperties", "minimum", "multipleOf", "pattern", "properties", "readOnly", "required", "title", "type", "uniqueItems", "xml"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string _ref = 1; - v1 := compiler.MapValueForKey(m, "$ref") - if v1 != nil { - x.XRef, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for $ref: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string format = 2; - v2 := compiler.MapValueForKey(m, "format") - if v2 != nil { - x.Format, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for format: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string title = 3; - v3 := compiler.MapValueForKey(m, "title") - if v3 != nil { - x.Title, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for title: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 4; - v4 := compiler.MapValueForKey(m, "description") - if v4 != nil { - x.Description, ok = v4.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Any default = 5; - v5 := compiler.MapValueForKey(m, "default") - if v5 != nil { - var err error - x.Default, err = NewAny(v5, compiler.NewContext("default", context)) - if err != nil { - errors = append(errors, err) - } - } - // float multiple_of = 6; - v6 := compiler.MapValueForKey(m, "multipleOf") - if v6 != nil { - switch v6 := v6.(type) { - case float64: - x.MultipleOf = v6 - case float32: - x.MultipleOf = float64(v6) - case uint64: - x.MultipleOf = float64(v6) - case uint32: - x.MultipleOf = float64(v6) - case int64: - x.MultipleOf = float64(v6) - case int32: - x.MultipleOf = float64(v6) - case int: - x.MultipleOf = float64(v6) - default: - message := fmt.Sprintf("has unexpected value for multipleOf: %+v (%T)", v6, v6) - errors = append(errors, compiler.NewError(context, message)) - } - } - // float maximum = 7; - v7 := compiler.MapValueForKey(m, "maximum") - if v7 != nil { - switch v7 := v7.(type) { - case float64: - x.Maximum = v7 - case float32: - x.Maximum = float64(v7) - case uint64: - x.Maximum = float64(v7) - case uint32: - x.Maximum = float64(v7) - case int64: - x.Maximum = float64(v7) - case int32: - x.Maximum = float64(v7) - case int: - x.Maximum = float64(v7) - default: - message := fmt.Sprintf("has unexpected value for maximum: %+v (%T)", v7, v7) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_maximum = 8; - v8 := compiler.MapValueForKey(m, "exclusiveMaximum") - if v8 != nil { - x.ExclusiveMaximum, ok = v8.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMaximum: %+v (%T)", v8, v8) - errors = append(errors, compiler.NewError(context, message)) - } - } - // float minimum = 9; - v9 := compiler.MapValueForKey(m, "minimum") - if v9 != nil { - switch v9 := v9.(type) { - case float64: - x.Minimum = v9 - case float32: - x.Minimum = float64(v9) - case uint64: - x.Minimum = float64(v9) - case uint32: - x.Minimum = float64(v9) - case int64: - x.Minimum = float64(v9) - case int32: - x.Minimum = float64(v9) - case int: - x.Minimum = float64(v9) - default: - message := fmt.Sprintf("has unexpected value for minimum: %+v (%T)", v9, v9) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool exclusive_minimum = 10; - v10 := compiler.MapValueForKey(m, "exclusiveMinimum") - if v10 != nil { - x.ExclusiveMinimum, ok = v10.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for exclusiveMinimum: %+v (%T)", v10, v10) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_length = 11; - v11 := compiler.MapValueForKey(m, "maxLength") - if v11 != nil { - t, ok := v11.(int) - if ok { - x.MaxLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxLength: %+v (%T)", v11, v11) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_length = 12; - v12 := compiler.MapValueForKey(m, "minLength") - if v12 != nil { - t, ok := v12.(int) - if ok { - x.MinLength = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minLength: %+v (%T)", v12, v12) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string pattern = 13; - v13 := compiler.MapValueForKey(m, "pattern") - if v13 != nil { - x.Pattern, ok = v13.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for pattern: %+v (%T)", v13, v13) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_items = 14; - v14 := compiler.MapValueForKey(m, "maxItems") - if v14 != nil { - t, ok := v14.(int) - if ok { - x.MaxItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxItems: %+v (%T)", v14, v14) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_items = 15; - v15 := compiler.MapValueForKey(m, "minItems") - if v15 != nil { - t, ok := v15.(int) - if ok { - x.MinItems = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minItems: %+v (%T)", v15, v15) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool unique_items = 16; - v16 := compiler.MapValueForKey(m, "uniqueItems") - if v16 != nil { - x.UniqueItems, ok = v16.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for uniqueItems: %+v (%T)", v16, v16) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 max_properties = 17; - v17 := compiler.MapValueForKey(m, "maxProperties") - if v17 != nil { - t, ok := v17.(int) - if ok { - x.MaxProperties = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for maxProperties: %+v (%T)", v17, v17) - errors = append(errors, compiler.NewError(context, message)) - } - } - // int64 min_properties = 18; - v18 := compiler.MapValueForKey(m, "minProperties") - if v18 != nil { - t, ok := v18.(int) - if ok { - x.MinProperties = int64(t) - } else { - message := fmt.Sprintf("has unexpected value for minProperties: %+v (%T)", v18, v18) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated string required = 19; - v19 := compiler.MapValueForKey(m, "required") - if v19 != nil { - v, ok := v19.([]interface{}) - if ok { - x.Required = compiler.ConvertInterfaceArrayToStringArray(v) - } else { - message := fmt.Sprintf("has unexpected value for required: %+v (%T)", v19, v19) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated Any enum = 20; - v20 := compiler.MapValueForKey(m, "enum") - if v20 != nil { - // repeated Any - x.Enum = make([]*Any, 0) - a, ok := v20.([]interface{}) - if ok { - for _, item := range a { - y, err := NewAny(item, compiler.NewContext("enum", context)) - if err != nil { - errors = append(errors, err) - } - x.Enum = append(x.Enum, y) - } - } - } - // AdditionalPropertiesItem additional_properties = 21; - v21 := compiler.MapValueForKey(m, "additionalProperties") - if v21 != nil { - var err error - x.AdditionalProperties, err = NewAdditionalPropertiesItem(v21, compiler.NewContext("additionalProperties", context)) - if err != nil { - errors = append(errors, err) - } - } - // TypeItem type = 22; - v22 := compiler.MapValueForKey(m, "type") - if v22 != nil { - var err error - x.Type, err = NewTypeItem(v22, compiler.NewContext("type", context)) - if err != nil { - errors = append(errors, err) - } - } - // ItemsItem items = 23; - v23 := compiler.MapValueForKey(m, "items") - if v23 != nil { - var err error - x.Items, err = NewItemsItem(v23, compiler.NewContext("items", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated Schema all_of = 24; - v24 := compiler.MapValueForKey(m, "allOf") - if v24 != nil { - // repeated Schema - x.AllOf = make([]*Schema, 0) - a, ok := v24.([]interface{}) - if ok { - for _, item := range a { - y, err := NewSchema(item, compiler.NewContext("allOf", context)) - if err != nil { - errors = append(errors, err) - } - x.AllOf = append(x.AllOf, y) - } - } - } - // Properties properties = 25; - v25 := compiler.MapValueForKey(m, "properties") - if v25 != nil { - var err error - x.Properties, err = NewProperties(v25, compiler.NewContext("properties", context)) - if err != nil { - errors = append(errors, err) - } - } - // string discriminator = 26; - v26 := compiler.MapValueForKey(m, "discriminator") - if v26 != nil { - x.Discriminator, ok = v26.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for discriminator: %+v (%T)", v26, v26) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool read_only = 27; - v27 := compiler.MapValueForKey(m, "readOnly") - if v27 != nil { - x.ReadOnly, ok = v27.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for readOnly: %+v (%T)", v27, v27) - errors = append(errors, compiler.NewError(context, message)) - } - } - // Xml xml = 28; - v28 := compiler.MapValueForKey(m, "xml") - if v28 != nil { - var err error - x.Xml, err = NewXml(v28, compiler.NewContext("xml", context)) - if err != nil { - errors = append(errors, err) - } - } - // ExternalDocs external_docs = 29; - v29 := compiler.MapValueForKey(m, "externalDocs") - if v29 != nil { - var err error - x.ExternalDocs, err = NewExternalDocs(v29, compiler.NewContext("externalDocs", context)) - if err != nil { - errors = append(errors, err) - } - } - // Any example = 30; - v30 := compiler.MapValueForKey(m, "example") - if v30 != nil { - var err error - x.Example, err = NewAny(v30, compiler.NewContext("example", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated NamedAny vendor_extension = 31; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewSchemaItem creates an object of type SchemaItem if possible, returning an error if not. -func NewSchemaItem(in interface{}, context *compiler.Context) (*SchemaItem, error) { - errors := make([]error, 0) - x := &SchemaItem{} - matched := false - // Schema schema = 1; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewSchema(m, compiler.NewContext("schema", context)) - if matchingError == nil { - x.Oneof = &SchemaItem_Schema{Schema: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - // FileSchema file_schema = 2; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewFileSchema(m, compiler.NewContext("fileSchema", context)) - if matchingError == nil { - x.Oneof = &SchemaItem_FileSchema{FileSchema: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - if matched { - // since the oneof matched one of its possibilities, discard any matching errors - errors = make([]error, 0) - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewSecurityDefinitions creates an object of type SecurityDefinitions if possible, returning an error if not. -func NewSecurityDefinitions(in interface{}, context *compiler.Context) (*SecurityDefinitions, error) { - errors := make([]error, 0) - x := &SecurityDefinitions{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - // repeated NamedSecurityDefinitionsItem additional_properties = 1; - // MAP: SecurityDefinitionsItem - x.AdditionalProperties = make([]*NamedSecurityDefinitionsItem, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - pair := &NamedSecurityDefinitionsItem{} - pair.Name = k - var err error - pair.Value, err = NewSecurityDefinitionsItem(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - x.AdditionalProperties = append(x.AdditionalProperties, pair) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewSecurityDefinitionsItem creates an object of type SecurityDefinitionsItem if possible, returning an error if not. -func NewSecurityDefinitionsItem(in interface{}, context *compiler.Context) (*SecurityDefinitionsItem, error) { - errors := make([]error, 0) - x := &SecurityDefinitionsItem{} - matched := false - // BasicAuthenticationSecurity basic_authentication_security = 1; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewBasicAuthenticationSecurity(m, compiler.NewContext("basicAuthenticationSecurity", context)) - if matchingError == nil { - x.Oneof = &SecurityDefinitionsItem_BasicAuthenticationSecurity{BasicAuthenticationSecurity: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - // ApiKeySecurity api_key_security = 2; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewApiKeySecurity(m, compiler.NewContext("apiKeySecurity", context)) - if matchingError == nil { - x.Oneof = &SecurityDefinitionsItem_ApiKeySecurity{ApiKeySecurity: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - // Oauth2ImplicitSecurity oauth2_implicit_security = 3; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewOauth2ImplicitSecurity(m, compiler.NewContext("oauth2ImplicitSecurity", context)) - if matchingError == nil { - x.Oneof = &SecurityDefinitionsItem_Oauth2ImplicitSecurity{Oauth2ImplicitSecurity: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - // Oauth2PasswordSecurity oauth2_password_security = 4; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewOauth2PasswordSecurity(m, compiler.NewContext("oauth2PasswordSecurity", context)) - if matchingError == nil { - x.Oneof = &SecurityDefinitionsItem_Oauth2PasswordSecurity{Oauth2PasswordSecurity: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - // Oauth2ApplicationSecurity oauth2_application_security = 5; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewOauth2ApplicationSecurity(m, compiler.NewContext("oauth2ApplicationSecurity", context)) - if matchingError == nil { - x.Oneof = &SecurityDefinitionsItem_Oauth2ApplicationSecurity{Oauth2ApplicationSecurity: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - // Oauth2AccessCodeSecurity oauth2_access_code_security = 6; - { - m, ok := compiler.UnpackMap(in) - if ok { - // errors might be ok here, they mean we just don't have the right subtype - t, matchingError := NewOauth2AccessCodeSecurity(m, compiler.NewContext("oauth2AccessCodeSecurity", context)) - if matchingError == nil { - x.Oneof = &SecurityDefinitionsItem_Oauth2AccessCodeSecurity{Oauth2AccessCodeSecurity: t} - matched = true - } else { - errors = append(errors, matchingError) - } - } - } - if matched { - // since the oneof matched one of its possibilities, discard any matching errors - errors = make([]error, 0) - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewSecurityRequirement creates an object of type SecurityRequirement if possible, returning an error if not. -func NewSecurityRequirement(in interface{}, context *compiler.Context) (*SecurityRequirement, error) { - errors := make([]error, 0) - x := &SecurityRequirement{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - // repeated NamedStringArray additional_properties = 1; - // MAP: StringArray - x.AdditionalProperties = make([]*NamedStringArray, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - pair := &NamedStringArray{} - pair.Name = k - var err error - pair.Value, err = NewStringArray(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - x.AdditionalProperties = append(x.AdditionalProperties, pair) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewStringArray creates an object of type StringArray if possible, returning an error if not. -func NewStringArray(in interface{}, context *compiler.Context) (*StringArray, error) { - errors := make([]error, 0) - x := &StringArray{} - a, ok := in.([]interface{}) - if !ok { - message := fmt.Sprintf("has unexpected value for StringArray: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - x.Value = make([]string, 0) - for _, s := range a { - x.Value = append(x.Value, s.(string)) - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewTag creates an object of type Tag if possible, returning an error if not. -func NewTag(in interface{}, context *compiler.Context) (*Tag, error) { - errors := make([]error, 0) - x := &Tag{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - requiredKeys := []string{"name"} - missingKeys := compiler.MissingKeysInMap(m, requiredKeys) - if len(missingKeys) > 0 { - message := fmt.Sprintf("is missing required %s: %+v", compiler.PluralProperties(len(missingKeys)), strings.Join(missingKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - allowedKeys := []string{"description", "externalDocs", "name"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string description = 2; - v2 := compiler.MapValueForKey(m, "description") - if v2 != nil { - x.Description, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for description: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // ExternalDocs external_docs = 3; - v3 := compiler.MapValueForKey(m, "externalDocs") - if v3 != nil { - var err error - x.ExternalDocs, err = NewExternalDocs(v3, compiler.NewContext("externalDocs", context)) - if err != nil { - errors = append(errors, err) - } - } - // repeated NamedAny vendor_extension = 4; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewTypeItem creates an object of type TypeItem if possible, returning an error if not. -func NewTypeItem(in interface{}, context *compiler.Context) (*TypeItem, error) { - errors := make([]error, 0) - x := &TypeItem{} - switch in := in.(type) { - case string: - x.Value = make([]string, 0) - x.Value = append(x.Value, in) - case []interface{}: - x.Value = make([]string, 0) - for _, v := range in { - value, ok := v.(string) - if ok { - x.Value = append(x.Value, value) - } else { - message := fmt.Sprintf("has unexpected value for string array element: %+v (%T)", value, value) - errors = append(errors, compiler.NewError(context, message)) - } - } - default: - message := fmt.Sprintf("has unexpected value for string array: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewVendorExtension creates an object of type VendorExtension if possible, returning an error if not. -func NewVendorExtension(in interface{}, context *compiler.Context) (*VendorExtension, error) { - errors := make([]error, 0) - x := &VendorExtension{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - // repeated NamedAny additional_properties = 1; - // MAP: Any - x.AdditionalProperties = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.AdditionalProperties = append(x.AdditionalProperties, pair) - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// NewXml creates an object of type Xml if possible, returning an error if not. -func NewXml(in interface{}, context *compiler.Context) (*Xml, error) { - errors := make([]error, 0) - x := &Xml{} - m, ok := compiler.UnpackMap(in) - if !ok { - message := fmt.Sprintf("has unexpected value: %+v (%T)", in, in) - errors = append(errors, compiler.NewError(context, message)) - } else { - allowedKeys := []string{"attribute", "name", "namespace", "prefix", "wrapped"} - allowedPatterns := []*regexp.Regexp{pattern0} - invalidKeys := compiler.InvalidKeysInMap(m, allowedKeys, allowedPatterns) - if len(invalidKeys) > 0 { - message := fmt.Sprintf("has invalid %s: %+v", compiler.PluralProperties(len(invalidKeys)), strings.Join(invalidKeys, ", ")) - errors = append(errors, compiler.NewError(context, message)) - } - // string name = 1; - v1 := compiler.MapValueForKey(m, "name") - if v1 != nil { - x.Name, ok = v1.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for name: %+v (%T)", v1, v1) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string namespace = 2; - v2 := compiler.MapValueForKey(m, "namespace") - if v2 != nil { - x.Namespace, ok = v2.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for namespace: %+v (%T)", v2, v2) - errors = append(errors, compiler.NewError(context, message)) - } - } - // string prefix = 3; - v3 := compiler.MapValueForKey(m, "prefix") - if v3 != nil { - x.Prefix, ok = v3.(string) - if !ok { - message := fmt.Sprintf("has unexpected value for prefix: %+v (%T)", v3, v3) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool attribute = 4; - v4 := compiler.MapValueForKey(m, "attribute") - if v4 != nil { - x.Attribute, ok = v4.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for attribute: %+v (%T)", v4, v4) - errors = append(errors, compiler.NewError(context, message)) - } - } - // bool wrapped = 5; - v5 := compiler.MapValueForKey(m, "wrapped") - if v5 != nil { - x.Wrapped, ok = v5.(bool) - if !ok { - message := fmt.Sprintf("has unexpected value for wrapped: %+v (%T)", v5, v5) - errors = append(errors, compiler.NewError(context, message)) - } - } - // repeated NamedAny vendor_extension = 6; - // MAP: Any ^x- - x.VendorExtension = make([]*NamedAny, 0) - for _, item := range m { - k, ok := compiler.StringValue(item.Key) - if ok { - v := item.Value - if strings.HasPrefix(k, "x-") { - pair := &NamedAny{} - pair.Name = k - result := &Any{} - handled, resultFromExt, err := compiler.HandleExtension(context, v, k) - if handled { - if err != nil { - errors = append(errors, err) - } else { - bytes, _ := yaml.Marshal(v) - result.Yaml = string(bytes) - result.Value = resultFromExt - pair.Value = result - } - } else { - pair.Value, err = NewAny(v, compiler.NewContext(k, context)) - if err != nil { - errors = append(errors, err) - } - } - x.VendorExtension = append(x.VendorExtension, pair) - } - } - } - } - return x, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside AdditionalPropertiesItem objects. -func (m *AdditionalPropertiesItem) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - { - p, ok := m.Oneof.(*AdditionalPropertiesItem_Schema) - if ok { - _, err := p.Schema.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Any objects. -func (m *Any) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside ApiKeySecurity objects. -func (m *ApiKeySecurity) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside BasicAuthenticationSecurity objects. -func (m *BasicAuthenticationSecurity) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside BodyParameter objects. -func (m *BodyParameter) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Schema != nil { - _, err := m.Schema.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Contact objects. -func (m *Contact) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Default objects. -func (m *Default) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.AdditionalProperties { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Definitions objects. -func (m *Definitions) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.AdditionalProperties { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Document objects. -func (m *Document) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Info != nil { - _, err := m.Info.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Paths != nil { - _, err := m.Paths.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Definitions != nil { - _, err := m.Definitions.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Parameters != nil { - _, err := m.Parameters.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Responses != nil { - _, err := m.Responses.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Security { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - if m.SecurityDefinitions != nil { - _, err := m.SecurityDefinitions.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Tags { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - if m.ExternalDocs != nil { - _, err := m.ExternalDocs.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Examples objects. -func (m *Examples) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.AdditionalProperties { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside ExternalDocs objects. -func (m *ExternalDocs) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside FileSchema objects. -func (m *FileSchema) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Default != nil { - _, err := m.Default.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.ExternalDocs != nil { - _, err := m.ExternalDocs.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Example != nil { - _, err := m.Example.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside FormDataParameterSubSchema objects. -func (m *FormDataParameterSubSchema) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Items != nil { - _, err := m.Items.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Default != nil { - _, err := m.Default.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Enum { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Header objects. -func (m *Header) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Items != nil { - _, err := m.Items.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Default != nil { - _, err := m.Default.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Enum { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside HeaderParameterSubSchema objects. -func (m *HeaderParameterSubSchema) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Items != nil { - _, err := m.Items.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Default != nil { - _, err := m.Default.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Enum { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Headers objects. -func (m *Headers) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.AdditionalProperties { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Info objects. -func (m *Info) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Contact != nil { - _, err := m.Contact.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.License != nil { - _, err := m.License.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside ItemsItem objects. -func (m *ItemsItem) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.Schema { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside JsonReference objects. -func (m *JsonReference) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.XRef != "" { - info, err := compiler.ReadInfoForRef(root, m.XRef) - if err != nil { - return nil, err - } - if info != nil { - replacement, err := NewJsonReference(info, nil) - if err == nil { - *m = *replacement - return m.ResolveReferences(root) - } - } - return info, nil - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside License objects. -func (m *License) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside NamedAny objects. -func (m *NamedAny) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Value != nil { - _, err := m.Value.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside NamedHeader objects. -func (m *NamedHeader) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Value != nil { - _, err := m.Value.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside NamedParameter objects. -func (m *NamedParameter) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Value != nil { - _, err := m.Value.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside NamedPathItem objects. -func (m *NamedPathItem) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Value != nil { - _, err := m.Value.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside NamedResponse objects. -func (m *NamedResponse) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Value != nil { - _, err := m.Value.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside NamedResponseValue objects. -func (m *NamedResponseValue) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Value != nil { - _, err := m.Value.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside NamedSchema objects. -func (m *NamedSchema) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Value != nil { - _, err := m.Value.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside NamedSecurityDefinitionsItem objects. -func (m *NamedSecurityDefinitionsItem) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Value != nil { - _, err := m.Value.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside NamedString objects. -func (m *NamedString) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside NamedStringArray objects. -func (m *NamedStringArray) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Value != nil { - _, err := m.Value.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside NonBodyParameter objects. -func (m *NonBodyParameter) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - { - p, ok := m.Oneof.(*NonBodyParameter_HeaderParameterSubSchema) - if ok { - _, err := p.HeaderParameterSubSchema.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*NonBodyParameter_FormDataParameterSubSchema) - if ok { - _, err := p.FormDataParameterSubSchema.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*NonBodyParameter_QueryParameterSubSchema) - if ok { - _, err := p.QueryParameterSubSchema.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*NonBodyParameter_PathParameterSubSchema) - if ok { - _, err := p.PathParameterSubSchema.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Oauth2AccessCodeSecurity objects. -func (m *Oauth2AccessCodeSecurity) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Scopes != nil { - _, err := m.Scopes.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Oauth2ApplicationSecurity objects. -func (m *Oauth2ApplicationSecurity) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Scopes != nil { - _, err := m.Scopes.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Oauth2ImplicitSecurity objects. -func (m *Oauth2ImplicitSecurity) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Scopes != nil { - _, err := m.Scopes.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Oauth2PasswordSecurity objects. -func (m *Oauth2PasswordSecurity) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Scopes != nil { - _, err := m.Scopes.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Oauth2Scopes objects. -func (m *Oauth2Scopes) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.AdditionalProperties { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Operation objects. -func (m *Operation) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.ExternalDocs != nil { - _, err := m.ExternalDocs.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Parameters { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - if m.Responses != nil { - _, err := m.Responses.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Security { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Parameter objects. -func (m *Parameter) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - { - p, ok := m.Oneof.(*Parameter_BodyParameter) - if ok { - _, err := p.BodyParameter.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*Parameter_NonBodyParameter) - if ok { - _, err := p.NonBodyParameter.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside ParameterDefinitions objects. -func (m *ParameterDefinitions) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.AdditionalProperties { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside ParametersItem objects. -func (m *ParametersItem) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - { - p, ok := m.Oneof.(*ParametersItem_Parameter) - if ok { - _, err := p.Parameter.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*ParametersItem_JsonReference) - if ok { - info, err := p.JsonReference.ResolveReferences(root) - if err != nil { - return nil, err - } else if info != nil { - n, err := NewParametersItem(info, nil) - if err != nil { - return nil, err - } else if n != nil { - *m = *n - return nil, nil - } - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside PathItem objects. -func (m *PathItem) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.XRef != "" { - info, err := compiler.ReadInfoForRef(root, m.XRef) - if err != nil { - return nil, err - } - if info != nil { - replacement, err := NewPathItem(info, nil) - if err == nil { - *m = *replacement - return m.ResolveReferences(root) - } - } - return info, nil - } - if m.Get != nil { - _, err := m.Get.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Put != nil { - _, err := m.Put.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Post != nil { - _, err := m.Post.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Delete != nil { - _, err := m.Delete.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Options != nil { - _, err := m.Options.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Head != nil { - _, err := m.Head.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Patch != nil { - _, err := m.Patch.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Parameters { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside PathParameterSubSchema objects. -func (m *PathParameterSubSchema) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Items != nil { - _, err := m.Items.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Default != nil { - _, err := m.Default.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Enum { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Paths objects. -func (m *Paths) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - for _, item := range m.Path { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside PrimitivesItems objects. -func (m *PrimitivesItems) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Items != nil { - _, err := m.Items.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Default != nil { - _, err := m.Default.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Enum { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Properties objects. -func (m *Properties) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.AdditionalProperties { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside QueryParameterSubSchema objects. -func (m *QueryParameterSubSchema) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Items != nil { - _, err := m.Items.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Default != nil { - _, err := m.Default.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Enum { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Response objects. -func (m *Response) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.Schema != nil { - _, err := m.Schema.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Headers != nil { - _, err := m.Headers.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Examples != nil { - _, err := m.Examples.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside ResponseDefinitions objects. -func (m *ResponseDefinitions) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.AdditionalProperties { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside ResponseValue objects. -func (m *ResponseValue) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - { - p, ok := m.Oneof.(*ResponseValue_Response) - if ok { - _, err := p.Response.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*ResponseValue_JsonReference) - if ok { - info, err := p.JsonReference.ResolveReferences(root) - if err != nil { - return nil, err - } else if info != nil { - n, err := NewResponseValue(info, nil) - if err != nil { - return nil, err - } else if n != nil { - *m = *n - return nil, nil - } - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Responses objects. -func (m *Responses) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.ResponseCode { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Schema objects. -func (m *Schema) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.XRef != "" { - info, err := compiler.ReadInfoForRef(root, m.XRef) - if err != nil { - return nil, err - } - if info != nil { - replacement, err := NewSchema(info, nil) - if err == nil { - *m = *replacement - return m.ResolveReferences(root) - } - } - return info, nil - } - if m.Default != nil { - _, err := m.Default.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.Enum { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - if m.AdditionalProperties != nil { - _, err := m.AdditionalProperties.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Type != nil { - _, err := m.Type.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Items != nil { - _, err := m.Items.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.AllOf { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - if m.Properties != nil { - _, err := m.Properties.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Xml != nil { - _, err := m.Xml.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.ExternalDocs != nil { - _, err := m.ExternalDocs.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - if m.Example != nil { - _, err := m.Example.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside SchemaItem objects. -func (m *SchemaItem) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - { - p, ok := m.Oneof.(*SchemaItem_Schema) - if ok { - _, err := p.Schema.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*SchemaItem_FileSchema) - if ok { - _, err := p.FileSchema.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside SecurityDefinitions objects. -func (m *SecurityDefinitions) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.AdditionalProperties { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside SecurityDefinitionsItem objects. -func (m *SecurityDefinitionsItem) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - { - p, ok := m.Oneof.(*SecurityDefinitionsItem_BasicAuthenticationSecurity) - if ok { - _, err := p.BasicAuthenticationSecurity.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*SecurityDefinitionsItem_ApiKeySecurity) - if ok { - _, err := p.ApiKeySecurity.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2ImplicitSecurity) - if ok { - _, err := p.Oauth2ImplicitSecurity.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2PasswordSecurity) - if ok { - _, err := p.Oauth2PasswordSecurity.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2ApplicationSecurity) - if ok { - _, err := p.Oauth2ApplicationSecurity.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - { - p, ok := m.Oneof.(*SecurityDefinitionsItem_Oauth2AccessCodeSecurity) - if ok { - _, err := p.Oauth2AccessCodeSecurity.ResolveReferences(root) - if err != nil { - return nil, err - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside SecurityRequirement objects. -func (m *SecurityRequirement) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.AdditionalProperties { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside StringArray objects. -func (m *StringArray) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Tag objects. -func (m *Tag) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - if m.ExternalDocs != nil { - _, err := m.ExternalDocs.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside TypeItem objects. -func (m *TypeItem) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside VendorExtension objects. -func (m *VendorExtension) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.AdditionalProperties { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ResolveReferences resolves references found inside Xml objects. -func (m *Xml) ResolveReferences(root string) (interface{}, error) { - errors := make([]error, 0) - for _, item := range m.VendorExtension { - if item != nil { - _, err := item.ResolveReferences(root) - if err != nil { - errors = append(errors, err) - } - } - } - return nil, compiler.NewErrorGroupOrNil(errors) -} - -// ToRawInfo returns a description of AdditionalPropertiesItem suitable for JSON or YAML export. -func (m *AdditionalPropertiesItem) ToRawInfo() interface{} { - // ONE OF WRAPPER - // AdditionalPropertiesItem - // {Name:schema Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v0 := m.GetSchema() - if v0 != nil { - return v0.ToRawInfo() - } - // {Name:boolean Type:bool StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if v1, ok := m.GetOneof().(*AdditionalPropertiesItem_Boolean); ok { - return v1.Boolean - } - return nil -} - -// ToRawInfo returns a description of Any suitable for JSON or YAML export. -func (m *Any) ToRawInfo() interface{} { - var err error - var info1 []yaml.MapSlice - err = yaml.Unmarshal([]byte(m.Yaml), &info1) - if err == nil { - return info1 - } - var info2 yaml.MapSlice - err = yaml.Unmarshal([]byte(m.Yaml), &info2) - if err == nil { - return info2 - } - var info3 interface{} - err = yaml.Unmarshal([]byte(m.Yaml), &info3) - if err == nil { - return info3 - } - return nil -} - -// ToRawInfo returns a description of ApiKeySecurity suitable for JSON or YAML export. -func (m *ApiKeySecurity) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - if m.In != "" { - info = append(info, yaml.MapItem{"in", m.In}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of BasicAuthenticationSecurity suitable for JSON or YAML export. -func (m *BasicAuthenticationSecurity) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of BodyParameter suitable for JSON or YAML export. -func (m *BodyParameter) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - if m.In != "" { - info = append(info, yaml.MapItem{"in", m.In}) - } - if m.Required != false { - info = append(info, yaml.MapItem{"required", m.Required}) - } - if m.Schema != nil { - info = append(info, yaml.MapItem{"schema", m.Schema.ToRawInfo()}) - } - // &{Name:schema Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Contact suitable for JSON or YAML export. -func (m *Contact) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - if m.Url != "" { - info = append(info, yaml.MapItem{"url", m.Url}) - } - if m.Email != "" { - info = append(info, yaml.MapItem{"email", m.Email}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Default suitable for JSON or YAML export. -func (m *Default) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.AdditionalProperties != nil { - for _, item := range m.AdditionalProperties { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:additionalProperties Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern: Implicit:false Description:} - return info -} - -// ToRawInfo returns a description of Definitions suitable for JSON or YAML export. -func (m *Definitions) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.AdditionalProperties != nil { - for _, item := range m.AdditionalProperties { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:additionalProperties Type:NamedSchema StringEnumValues:[] MapType:Schema Repeated:true Pattern: Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Document suitable for JSON or YAML export. -func (m *Document) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Swagger != "" { - info = append(info, yaml.MapItem{"swagger", m.Swagger}) - } - if m.Info != nil { - info = append(info, yaml.MapItem{"info", m.Info.ToRawInfo()}) - } - // &{Name:info Type:Info StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Host != "" { - info = append(info, yaml.MapItem{"host", m.Host}) - } - if m.BasePath != "" { - info = append(info, yaml.MapItem{"basePath", m.BasePath}) - } - if len(m.Schemes) != 0 { - info = append(info, yaml.MapItem{"schemes", m.Schemes}) - } - if len(m.Consumes) != 0 { - info = append(info, yaml.MapItem{"consumes", m.Consumes}) - } - if len(m.Produces) != 0 { - info = append(info, yaml.MapItem{"produces", m.Produces}) - } - if m.Paths != nil { - info = append(info, yaml.MapItem{"paths", m.Paths.ToRawInfo()}) - } - // &{Name:paths Type:Paths StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Definitions != nil { - info = append(info, yaml.MapItem{"definitions", m.Definitions.ToRawInfo()}) - } - // &{Name:definitions Type:Definitions StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Parameters != nil { - info = append(info, yaml.MapItem{"parameters", m.Parameters.ToRawInfo()}) - } - // &{Name:parameters Type:ParameterDefinitions StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Responses != nil { - info = append(info, yaml.MapItem{"responses", m.Responses.ToRawInfo()}) - } - // &{Name:responses Type:ResponseDefinitions StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if len(m.Security) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Security { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"security", items}) - } - // &{Name:security Type:SecurityRequirement StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - if m.SecurityDefinitions != nil { - info = append(info, yaml.MapItem{"securityDefinitions", m.SecurityDefinitions.ToRawInfo()}) - } - // &{Name:securityDefinitions Type:SecurityDefinitions StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if len(m.Tags) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Tags { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"tags", items}) - } - // &{Name:tags Type:Tag StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - if m.ExternalDocs != nil { - info = append(info, yaml.MapItem{"externalDocs", m.ExternalDocs.ToRawInfo()}) - } - // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Examples suitable for JSON or YAML export. -func (m *Examples) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.AdditionalProperties != nil { - for _, item := range m.AdditionalProperties { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:additionalProperties Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern: Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of ExternalDocs suitable for JSON or YAML export. -func (m *ExternalDocs) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.Url != "" { - info = append(info, yaml.MapItem{"url", m.Url}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of FileSchema suitable for JSON or YAML export. -func (m *FileSchema) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Format != "" { - info = append(info, yaml.MapItem{"format", m.Format}) - } - if m.Title != "" { - info = append(info, yaml.MapItem{"title", m.Title}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.Default != nil { - info = append(info, yaml.MapItem{"default", m.Default.ToRawInfo()}) - } - // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if len(m.Required) != 0 { - info = append(info, yaml.MapItem{"required", m.Required}) - } - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.ReadOnly != false { - info = append(info, yaml.MapItem{"readOnly", m.ReadOnly}) - } - if m.ExternalDocs != nil { - info = append(info, yaml.MapItem{"externalDocs", m.ExternalDocs.ToRawInfo()}) - } - // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Example != nil { - info = append(info, yaml.MapItem{"example", m.Example.ToRawInfo()}) - } - // &{Name:example Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of FormDataParameterSubSchema suitable for JSON or YAML export. -func (m *FormDataParameterSubSchema) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Required != false { - info = append(info, yaml.MapItem{"required", m.Required}) - } - if m.In != "" { - info = append(info, yaml.MapItem{"in", m.In}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - if m.AllowEmptyValue != false { - info = append(info, yaml.MapItem{"allowEmptyValue", m.AllowEmptyValue}) - } - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Format != "" { - info = append(info, yaml.MapItem{"format", m.Format}) - } - if m.Items != nil { - info = append(info, yaml.MapItem{"items", m.Items.ToRawInfo()}) - } - // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.CollectionFormat != "" { - info = append(info, yaml.MapItem{"collectionFormat", m.CollectionFormat}) - } - if m.Default != nil { - info = append(info, yaml.MapItem{"default", m.Default.ToRawInfo()}) - } - // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Maximum != 0.0 { - info = append(info, yaml.MapItem{"maximum", m.Maximum}) - } - if m.ExclusiveMaximum != false { - info = append(info, yaml.MapItem{"exclusiveMaximum", m.ExclusiveMaximum}) - } - if m.Minimum != 0.0 { - info = append(info, yaml.MapItem{"minimum", m.Minimum}) - } - if m.ExclusiveMinimum != false { - info = append(info, yaml.MapItem{"exclusiveMinimum", m.ExclusiveMinimum}) - } - if m.MaxLength != 0 { - info = append(info, yaml.MapItem{"maxLength", m.MaxLength}) - } - if m.MinLength != 0 { - info = append(info, yaml.MapItem{"minLength", m.MinLength}) - } - if m.Pattern != "" { - info = append(info, yaml.MapItem{"pattern", m.Pattern}) - } - if m.MaxItems != 0 { - info = append(info, yaml.MapItem{"maxItems", m.MaxItems}) - } - if m.MinItems != 0 { - info = append(info, yaml.MapItem{"minItems", m.MinItems}) - } - if m.UniqueItems != false { - info = append(info, yaml.MapItem{"uniqueItems", m.UniqueItems}) - } - if len(m.Enum) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Enum { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"enum", items}) - } - // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - if m.MultipleOf != 0.0 { - info = append(info, yaml.MapItem{"multipleOf", m.MultipleOf}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Header suitable for JSON or YAML export. -func (m *Header) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Format != "" { - info = append(info, yaml.MapItem{"format", m.Format}) - } - if m.Items != nil { - info = append(info, yaml.MapItem{"items", m.Items.ToRawInfo()}) - } - // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.CollectionFormat != "" { - info = append(info, yaml.MapItem{"collectionFormat", m.CollectionFormat}) - } - if m.Default != nil { - info = append(info, yaml.MapItem{"default", m.Default.ToRawInfo()}) - } - // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Maximum != 0.0 { - info = append(info, yaml.MapItem{"maximum", m.Maximum}) - } - if m.ExclusiveMaximum != false { - info = append(info, yaml.MapItem{"exclusiveMaximum", m.ExclusiveMaximum}) - } - if m.Minimum != 0.0 { - info = append(info, yaml.MapItem{"minimum", m.Minimum}) - } - if m.ExclusiveMinimum != false { - info = append(info, yaml.MapItem{"exclusiveMinimum", m.ExclusiveMinimum}) - } - if m.MaxLength != 0 { - info = append(info, yaml.MapItem{"maxLength", m.MaxLength}) - } - if m.MinLength != 0 { - info = append(info, yaml.MapItem{"minLength", m.MinLength}) - } - if m.Pattern != "" { - info = append(info, yaml.MapItem{"pattern", m.Pattern}) - } - if m.MaxItems != 0 { - info = append(info, yaml.MapItem{"maxItems", m.MaxItems}) - } - if m.MinItems != 0 { - info = append(info, yaml.MapItem{"minItems", m.MinItems}) - } - if m.UniqueItems != false { - info = append(info, yaml.MapItem{"uniqueItems", m.UniqueItems}) - } - if len(m.Enum) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Enum { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"enum", items}) - } - // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - if m.MultipleOf != 0.0 { - info = append(info, yaml.MapItem{"multipleOf", m.MultipleOf}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of HeaderParameterSubSchema suitable for JSON or YAML export. -func (m *HeaderParameterSubSchema) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Required != false { - info = append(info, yaml.MapItem{"required", m.Required}) - } - if m.In != "" { - info = append(info, yaml.MapItem{"in", m.In}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Format != "" { - info = append(info, yaml.MapItem{"format", m.Format}) - } - if m.Items != nil { - info = append(info, yaml.MapItem{"items", m.Items.ToRawInfo()}) - } - // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.CollectionFormat != "" { - info = append(info, yaml.MapItem{"collectionFormat", m.CollectionFormat}) - } - if m.Default != nil { - info = append(info, yaml.MapItem{"default", m.Default.ToRawInfo()}) - } - // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Maximum != 0.0 { - info = append(info, yaml.MapItem{"maximum", m.Maximum}) - } - if m.ExclusiveMaximum != false { - info = append(info, yaml.MapItem{"exclusiveMaximum", m.ExclusiveMaximum}) - } - if m.Minimum != 0.0 { - info = append(info, yaml.MapItem{"minimum", m.Minimum}) - } - if m.ExclusiveMinimum != false { - info = append(info, yaml.MapItem{"exclusiveMinimum", m.ExclusiveMinimum}) - } - if m.MaxLength != 0 { - info = append(info, yaml.MapItem{"maxLength", m.MaxLength}) - } - if m.MinLength != 0 { - info = append(info, yaml.MapItem{"minLength", m.MinLength}) - } - if m.Pattern != "" { - info = append(info, yaml.MapItem{"pattern", m.Pattern}) - } - if m.MaxItems != 0 { - info = append(info, yaml.MapItem{"maxItems", m.MaxItems}) - } - if m.MinItems != 0 { - info = append(info, yaml.MapItem{"minItems", m.MinItems}) - } - if m.UniqueItems != false { - info = append(info, yaml.MapItem{"uniqueItems", m.UniqueItems}) - } - if len(m.Enum) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Enum { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"enum", items}) - } - // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - if m.MultipleOf != 0.0 { - info = append(info, yaml.MapItem{"multipleOf", m.MultipleOf}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Headers suitable for JSON or YAML export. -func (m *Headers) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.AdditionalProperties != nil { - for _, item := range m.AdditionalProperties { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:additionalProperties Type:NamedHeader StringEnumValues:[] MapType:Header Repeated:true Pattern: Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Info suitable for JSON or YAML export. -func (m *Info) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Title != "" { - info = append(info, yaml.MapItem{"title", m.Title}) - } - if m.Version != "" { - info = append(info, yaml.MapItem{"version", m.Version}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.TermsOfService != "" { - info = append(info, yaml.MapItem{"termsOfService", m.TermsOfService}) - } - if m.Contact != nil { - info = append(info, yaml.MapItem{"contact", m.Contact.ToRawInfo()}) - } - // &{Name:contact Type:Contact StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.License != nil { - info = append(info, yaml.MapItem{"license", m.License.ToRawInfo()}) - } - // &{Name:license Type:License StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of ItemsItem suitable for JSON or YAML export. -func (m *ItemsItem) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if len(m.Schema) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Schema { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"schema", items}) - } - // &{Name:schema Type:Schema StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - return info -} - -// ToRawInfo returns a description of JsonReference suitable for JSON or YAML export. -func (m *JsonReference) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.XRef != "" { - info = append(info, yaml.MapItem{"$ref", m.XRef}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - return info -} - -// ToRawInfo returns a description of License suitable for JSON or YAML export. -func (m *License) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - if m.Url != "" { - info = append(info, yaml.MapItem{"url", m.Url}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of NamedAny suitable for JSON or YAML export. -func (m *NamedAny) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - // &{Name:value Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} - return info -} - -// ToRawInfo returns a description of NamedHeader suitable for JSON or YAML export. -func (m *NamedHeader) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - // &{Name:value Type:Header StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} - return info -} - -// ToRawInfo returns a description of NamedParameter suitable for JSON or YAML export. -func (m *NamedParameter) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - // &{Name:value Type:Parameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} - return info -} - -// ToRawInfo returns a description of NamedPathItem suitable for JSON or YAML export. -func (m *NamedPathItem) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - // &{Name:value Type:PathItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} - return info -} - -// ToRawInfo returns a description of NamedResponse suitable for JSON or YAML export. -func (m *NamedResponse) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - // &{Name:value Type:Response StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} - return info -} - -// ToRawInfo returns a description of NamedResponseValue suitable for JSON or YAML export. -func (m *NamedResponseValue) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - // &{Name:value Type:ResponseValue StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} - return info -} - -// ToRawInfo returns a description of NamedSchema suitable for JSON or YAML export. -func (m *NamedSchema) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - // &{Name:value Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} - return info -} - -// ToRawInfo returns a description of NamedSecurityDefinitionsItem suitable for JSON or YAML export. -func (m *NamedSecurityDefinitionsItem) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - // &{Name:value Type:SecurityDefinitionsItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} - return info -} - -// ToRawInfo returns a description of NamedString suitable for JSON or YAML export. -func (m *NamedString) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - if m.Value != "" { - info = append(info, yaml.MapItem{"value", m.Value}) - } - return info -} - -// ToRawInfo returns a description of NamedStringArray suitable for JSON or YAML export. -func (m *NamedStringArray) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - // &{Name:value Type:StringArray StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:Mapped value} - return info -} - -// ToRawInfo returns a description of NonBodyParameter suitable for JSON or YAML export. -func (m *NonBodyParameter) ToRawInfo() interface{} { - // ONE OF WRAPPER - // NonBodyParameter - // {Name:headerParameterSubSchema Type:HeaderParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v0 := m.GetHeaderParameterSubSchema() - if v0 != nil { - return v0.ToRawInfo() - } - // {Name:formDataParameterSubSchema Type:FormDataParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v1 := m.GetFormDataParameterSubSchema() - if v1 != nil { - return v1.ToRawInfo() - } - // {Name:queryParameterSubSchema Type:QueryParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v2 := m.GetQueryParameterSubSchema() - if v2 != nil { - return v2.ToRawInfo() - } - // {Name:pathParameterSubSchema Type:PathParameterSubSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v3 := m.GetPathParameterSubSchema() - if v3 != nil { - return v3.ToRawInfo() - } - return nil -} - -// ToRawInfo returns a description of Oauth2AccessCodeSecurity suitable for JSON or YAML export. -func (m *Oauth2AccessCodeSecurity) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Flow != "" { - info = append(info, yaml.MapItem{"flow", m.Flow}) - } - if m.Scopes != nil { - info = append(info, yaml.MapItem{"scopes", m.Scopes.ToRawInfo()}) - } - // &{Name:scopes Type:Oauth2Scopes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.AuthorizationUrl != "" { - info = append(info, yaml.MapItem{"authorizationUrl", m.AuthorizationUrl}) - } - if m.TokenUrl != "" { - info = append(info, yaml.MapItem{"tokenUrl", m.TokenUrl}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Oauth2ApplicationSecurity suitable for JSON or YAML export. -func (m *Oauth2ApplicationSecurity) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Flow != "" { - info = append(info, yaml.MapItem{"flow", m.Flow}) - } - if m.Scopes != nil { - info = append(info, yaml.MapItem{"scopes", m.Scopes.ToRawInfo()}) - } - // &{Name:scopes Type:Oauth2Scopes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.TokenUrl != "" { - info = append(info, yaml.MapItem{"tokenUrl", m.TokenUrl}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Oauth2ImplicitSecurity suitable for JSON or YAML export. -func (m *Oauth2ImplicitSecurity) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Flow != "" { - info = append(info, yaml.MapItem{"flow", m.Flow}) - } - if m.Scopes != nil { - info = append(info, yaml.MapItem{"scopes", m.Scopes.ToRawInfo()}) - } - // &{Name:scopes Type:Oauth2Scopes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.AuthorizationUrl != "" { - info = append(info, yaml.MapItem{"authorizationUrl", m.AuthorizationUrl}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Oauth2PasswordSecurity suitable for JSON or YAML export. -func (m *Oauth2PasswordSecurity) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Flow != "" { - info = append(info, yaml.MapItem{"flow", m.Flow}) - } - if m.Scopes != nil { - info = append(info, yaml.MapItem{"scopes", m.Scopes.ToRawInfo()}) - } - // &{Name:scopes Type:Oauth2Scopes StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.TokenUrl != "" { - info = append(info, yaml.MapItem{"tokenUrl", m.TokenUrl}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Oauth2Scopes suitable for JSON or YAML export. -func (m *Oauth2Scopes) ToRawInfo() interface{} { - info := yaml.MapSlice{} - // &{Name:additionalProperties Type:NamedString StringEnumValues:[] MapType:string Repeated:true Pattern: Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Operation suitable for JSON or YAML export. -func (m *Operation) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if len(m.Tags) != 0 { - info = append(info, yaml.MapItem{"tags", m.Tags}) - } - if m.Summary != "" { - info = append(info, yaml.MapItem{"summary", m.Summary}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.ExternalDocs != nil { - info = append(info, yaml.MapItem{"externalDocs", m.ExternalDocs.ToRawInfo()}) - } - // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.OperationId != "" { - info = append(info, yaml.MapItem{"operationId", m.OperationId}) - } - if len(m.Produces) != 0 { - info = append(info, yaml.MapItem{"produces", m.Produces}) - } - if len(m.Consumes) != 0 { - info = append(info, yaml.MapItem{"consumes", m.Consumes}) - } - if len(m.Parameters) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Parameters { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"parameters", items}) - } - // &{Name:parameters Type:ParametersItem StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:The parameters needed to send a valid API call.} - if m.Responses != nil { - info = append(info, yaml.MapItem{"responses", m.Responses.ToRawInfo()}) - } - // &{Name:responses Type:Responses StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if len(m.Schemes) != 0 { - info = append(info, yaml.MapItem{"schemes", m.Schemes}) - } - if m.Deprecated != false { - info = append(info, yaml.MapItem{"deprecated", m.Deprecated}) - } - if len(m.Security) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Security { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"security", items}) - } - // &{Name:security Type:SecurityRequirement StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Parameter suitable for JSON or YAML export. -func (m *Parameter) ToRawInfo() interface{} { - // ONE OF WRAPPER - // Parameter - // {Name:bodyParameter Type:BodyParameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v0 := m.GetBodyParameter() - if v0 != nil { - return v0.ToRawInfo() - } - // {Name:nonBodyParameter Type:NonBodyParameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v1 := m.GetNonBodyParameter() - if v1 != nil { - return v1.ToRawInfo() - } - return nil -} - -// ToRawInfo returns a description of ParameterDefinitions suitable for JSON or YAML export. -func (m *ParameterDefinitions) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.AdditionalProperties != nil { - for _, item := range m.AdditionalProperties { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:additionalProperties Type:NamedParameter StringEnumValues:[] MapType:Parameter Repeated:true Pattern: Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of ParametersItem suitable for JSON or YAML export. -func (m *ParametersItem) ToRawInfo() interface{} { - // ONE OF WRAPPER - // ParametersItem - // {Name:parameter Type:Parameter StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v0 := m.GetParameter() - if v0 != nil { - return v0.ToRawInfo() - } - // {Name:jsonReference Type:JsonReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v1 := m.GetJsonReference() - if v1 != nil { - return v1.ToRawInfo() - } - return nil -} - -// ToRawInfo returns a description of PathItem suitable for JSON or YAML export. -func (m *PathItem) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.XRef != "" { - info = append(info, yaml.MapItem{"$ref", m.XRef}) - } - if m.Get != nil { - info = append(info, yaml.MapItem{"get", m.Get.ToRawInfo()}) - } - // &{Name:get Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Put != nil { - info = append(info, yaml.MapItem{"put", m.Put.ToRawInfo()}) - } - // &{Name:put Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Post != nil { - info = append(info, yaml.MapItem{"post", m.Post.ToRawInfo()}) - } - // &{Name:post Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Delete != nil { - info = append(info, yaml.MapItem{"delete", m.Delete.ToRawInfo()}) - } - // &{Name:delete Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Options != nil { - info = append(info, yaml.MapItem{"options", m.Options.ToRawInfo()}) - } - // &{Name:options Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Head != nil { - info = append(info, yaml.MapItem{"head", m.Head.ToRawInfo()}) - } - // &{Name:head Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Patch != nil { - info = append(info, yaml.MapItem{"patch", m.Patch.ToRawInfo()}) - } - // &{Name:patch Type:Operation StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if len(m.Parameters) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Parameters { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"parameters", items}) - } - // &{Name:parameters Type:ParametersItem StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:The parameters needed to send a valid API call.} - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of PathParameterSubSchema suitable for JSON or YAML export. -func (m *PathParameterSubSchema) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Required != false { - info = append(info, yaml.MapItem{"required", m.Required}) - } - if m.In != "" { - info = append(info, yaml.MapItem{"in", m.In}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Format != "" { - info = append(info, yaml.MapItem{"format", m.Format}) - } - if m.Items != nil { - info = append(info, yaml.MapItem{"items", m.Items.ToRawInfo()}) - } - // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.CollectionFormat != "" { - info = append(info, yaml.MapItem{"collectionFormat", m.CollectionFormat}) - } - if m.Default != nil { - info = append(info, yaml.MapItem{"default", m.Default.ToRawInfo()}) - } - // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Maximum != 0.0 { - info = append(info, yaml.MapItem{"maximum", m.Maximum}) - } - if m.ExclusiveMaximum != false { - info = append(info, yaml.MapItem{"exclusiveMaximum", m.ExclusiveMaximum}) - } - if m.Minimum != 0.0 { - info = append(info, yaml.MapItem{"minimum", m.Minimum}) - } - if m.ExclusiveMinimum != false { - info = append(info, yaml.MapItem{"exclusiveMinimum", m.ExclusiveMinimum}) - } - if m.MaxLength != 0 { - info = append(info, yaml.MapItem{"maxLength", m.MaxLength}) - } - if m.MinLength != 0 { - info = append(info, yaml.MapItem{"minLength", m.MinLength}) - } - if m.Pattern != "" { - info = append(info, yaml.MapItem{"pattern", m.Pattern}) - } - if m.MaxItems != 0 { - info = append(info, yaml.MapItem{"maxItems", m.MaxItems}) - } - if m.MinItems != 0 { - info = append(info, yaml.MapItem{"minItems", m.MinItems}) - } - if m.UniqueItems != false { - info = append(info, yaml.MapItem{"uniqueItems", m.UniqueItems}) - } - if len(m.Enum) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Enum { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"enum", items}) - } - // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - if m.MultipleOf != 0.0 { - info = append(info, yaml.MapItem{"multipleOf", m.MultipleOf}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Paths suitable for JSON or YAML export. -func (m *Paths) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - if m.Path != nil { - for _, item := range m.Path { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:Path Type:NamedPathItem StringEnumValues:[] MapType:PathItem Repeated:true Pattern:^/ Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of PrimitivesItems suitable for JSON or YAML export. -func (m *PrimitivesItems) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Format != "" { - info = append(info, yaml.MapItem{"format", m.Format}) - } - if m.Items != nil { - info = append(info, yaml.MapItem{"items", m.Items.ToRawInfo()}) - } - // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.CollectionFormat != "" { - info = append(info, yaml.MapItem{"collectionFormat", m.CollectionFormat}) - } - if m.Default != nil { - info = append(info, yaml.MapItem{"default", m.Default.ToRawInfo()}) - } - // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Maximum != 0.0 { - info = append(info, yaml.MapItem{"maximum", m.Maximum}) - } - if m.ExclusiveMaximum != false { - info = append(info, yaml.MapItem{"exclusiveMaximum", m.ExclusiveMaximum}) - } - if m.Minimum != 0.0 { - info = append(info, yaml.MapItem{"minimum", m.Minimum}) - } - if m.ExclusiveMinimum != false { - info = append(info, yaml.MapItem{"exclusiveMinimum", m.ExclusiveMinimum}) - } - if m.MaxLength != 0 { - info = append(info, yaml.MapItem{"maxLength", m.MaxLength}) - } - if m.MinLength != 0 { - info = append(info, yaml.MapItem{"minLength", m.MinLength}) - } - if m.Pattern != "" { - info = append(info, yaml.MapItem{"pattern", m.Pattern}) - } - if m.MaxItems != 0 { - info = append(info, yaml.MapItem{"maxItems", m.MaxItems}) - } - if m.MinItems != 0 { - info = append(info, yaml.MapItem{"minItems", m.MinItems}) - } - if m.UniqueItems != false { - info = append(info, yaml.MapItem{"uniqueItems", m.UniqueItems}) - } - if len(m.Enum) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Enum { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"enum", items}) - } - // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - if m.MultipleOf != 0.0 { - info = append(info, yaml.MapItem{"multipleOf", m.MultipleOf}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Properties suitable for JSON or YAML export. -func (m *Properties) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.AdditionalProperties != nil { - for _, item := range m.AdditionalProperties { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:additionalProperties Type:NamedSchema StringEnumValues:[] MapType:Schema Repeated:true Pattern: Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of QueryParameterSubSchema suitable for JSON or YAML export. -func (m *QueryParameterSubSchema) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Required != false { - info = append(info, yaml.MapItem{"required", m.Required}) - } - if m.In != "" { - info = append(info, yaml.MapItem{"in", m.In}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - if m.AllowEmptyValue != false { - info = append(info, yaml.MapItem{"allowEmptyValue", m.AllowEmptyValue}) - } - if m.Type != "" { - info = append(info, yaml.MapItem{"type", m.Type}) - } - if m.Format != "" { - info = append(info, yaml.MapItem{"format", m.Format}) - } - if m.Items != nil { - info = append(info, yaml.MapItem{"items", m.Items.ToRawInfo()}) - } - // &{Name:items Type:PrimitivesItems StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.CollectionFormat != "" { - info = append(info, yaml.MapItem{"collectionFormat", m.CollectionFormat}) - } - if m.Default != nil { - info = append(info, yaml.MapItem{"default", m.Default.ToRawInfo()}) - } - // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Maximum != 0.0 { - info = append(info, yaml.MapItem{"maximum", m.Maximum}) - } - if m.ExclusiveMaximum != false { - info = append(info, yaml.MapItem{"exclusiveMaximum", m.ExclusiveMaximum}) - } - if m.Minimum != 0.0 { - info = append(info, yaml.MapItem{"minimum", m.Minimum}) - } - if m.ExclusiveMinimum != false { - info = append(info, yaml.MapItem{"exclusiveMinimum", m.ExclusiveMinimum}) - } - if m.MaxLength != 0 { - info = append(info, yaml.MapItem{"maxLength", m.MaxLength}) - } - if m.MinLength != 0 { - info = append(info, yaml.MapItem{"minLength", m.MinLength}) - } - if m.Pattern != "" { - info = append(info, yaml.MapItem{"pattern", m.Pattern}) - } - if m.MaxItems != 0 { - info = append(info, yaml.MapItem{"maxItems", m.MaxItems}) - } - if m.MinItems != 0 { - info = append(info, yaml.MapItem{"minItems", m.MinItems}) - } - if m.UniqueItems != false { - info = append(info, yaml.MapItem{"uniqueItems", m.UniqueItems}) - } - if len(m.Enum) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Enum { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"enum", items}) - } - // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - if m.MultipleOf != 0.0 { - info = append(info, yaml.MapItem{"multipleOf", m.MultipleOf}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Response suitable for JSON or YAML export. -func (m *Response) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.Schema != nil { - info = append(info, yaml.MapItem{"schema", m.Schema.ToRawInfo()}) - } - // &{Name:schema Type:SchemaItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Headers != nil { - info = append(info, yaml.MapItem{"headers", m.Headers.ToRawInfo()}) - } - // &{Name:headers Type:Headers StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Examples != nil { - info = append(info, yaml.MapItem{"examples", m.Examples.ToRawInfo()}) - } - // &{Name:examples Type:Examples StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of ResponseDefinitions suitable for JSON or YAML export. -func (m *ResponseDefinitions) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.AdditionalProperties != nil { - for _, item := range m.AdditionalProperties { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:additionalProperties Type:NamedResponse StringEnumValues:[] MapType:Response Repeated:true Pattern: Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of ResponseValue suitable for JSON or YAML export. -func (m *ResponseValue) ToRawInfo() interface{} { - // ONE OF WRAPPER - // ResponseValue - // {Name:response Type:Response StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v0 := m.GetResponse() - if v0 != nil { - return v0.ToRawInfo() - } - // {Name:jsonReference Type:JsonReference StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v1 := m.GetJsonReference() - if v1 != nil { - return v1.ToRawInfo() - } - return nil -} - -// ToRawInfo returns a description of Responses suitable for JSON or YAML export. -func (m *Responses) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.ResponseCode != nil { - for _, item := range m.ResponseCode { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:ResponseCode Type:NamedResponseValue StringEnumValues:[] MapType:ResponseValue Repeated:true Pattern:^([0-9]{3})$|^(default)$ Implicit:true Description:} - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Schema suitable for JSON or YAML export. -func (m *Schema) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.XRef != "" { - info = append(info, yaml.MapItem{"$ref", m.XRef}) - } - if m.Format != "" { - info = append(info, yaml.MapItem{"format", m.Format}) - } - if m.Title != "" { - info = append(info, yaml.MapItem{"title", m.Title}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.Default != nil { - info = append(info, yaml.MapItem{"default", m.Default.ToRawInfo()}) - } - // &{Name:default Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.MultipleOf != 0.0 { - info = append(info, yaml.MapItem{"multipleOf", m.MultipleOf}) - } - if m.Maximum != 0.0 { - info = append(info, yaml.MapItem{"maximum", m.Maximum}) - } - if m.ExclusiveMaximum != false { - info = append(info, yaml.MapItem{"exclusiveMaximum", m.ExclusiveMaximum}) - } - if m.Minimum != 0.0 { - info = append(info, yaml.MapItem{"minimum", m.Minimum}) - } - if m.ExclusiveMinimum != false { - info = append(info, yaml.MapItem{"exclusiveMinimum", m.ExclusiveMinimum}) - } - if m.MaxLength != 0 { - info = append(info, yaml.MapItem{"maxLength", m.MaxLength}) - } - if m.MinLength != 0 { - info = append(info, yaml.MapItem{"minLength", m.MinLength}) - } - if m.Pattern != "" { - info = append(info, yaml.MapItem{"pattern", m.Pattern}) - } - if m.MaxItems != 0 { - info = append(info, yaml.MapItem{"maxItems", m.MaxItems}) - } - if m.MinItems != 0 { - info = append(info, yaml.MapItem{"minItems", m.MinItems}) - } - if m.UniqueItems != false { - info = append(info, yaml.MapItem{"uniqueItems", m.UniqueItems}) - } - if m.MaxProperties != 0 { - info = append(info, yaml.MapItem{"maxProperties", m.MaxProperties}) - } - if m.MinProperties != 0 { - info = append(info, yaml.MapItem{"minProperties", m.MinProperties}) - } - if len(m.Required) != 0 { - info = append(info, yaml.MapItem{"required", m.Required}) - } - if len(m.Enum) != 0 { - items := make([]interface{}, 0) - for _, item := range m.Enum { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"enum", items}) - } - // &{Name:enum Type:Any StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - if m.AdditionalProperties != nil { - info = append(info, yaml.MapItem{"additionalProperties", m.AdditionalProperties.ToRawInfo()}) - } - // &{Name:additionalProperties Type:AdditionalPropertiesItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Type != nil { - if len(m.Type.Value) == 1 { - info = append(info, yaml.MapItem{"type", m.Type.Value[0]}) - } else { - info = append(info, yaml.MapItem{"type", m.Type.Value}) - } - } - // &{Name:type Type:TypeItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Items != nil { - items := make([]interface{}, 0) - for _, item := range m.Items.Schema { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"items", items[0]}) - } - // &{Name:items Type:ItemsItem StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if len(m.AllOf) != 0 { - items := make([]interface{}, 0) - for _, item := range m.AllOf { - items = append(items, item.ToRawInfo()) - } - info = append(info, yaml.MapItem{"allOf", items}) - } - // &{Name:allOf Type:Schema StringEnumValues:[] MapType: Repeated:true Pattern: Implicit:false Description:} - if m.Properties != nil { - info = append(info, yaml.MapItem{"properties", m.Properties.ToRawInfo()}) - } - // &{Name:properties Type:Properties StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Discriminator != "" { - info = append(info, yaml.MapItem{"discriminator", m.Discriminator}) - } - if m.ReadOnly != false { - info = append(info, yaml.MapItem{"readOnly", m.ReadOnly}) - } - if m.Xml != nil { - info = append(info, yaml.MapItem{"xml", m.Xml.ToRawInfo()}) - } - // &{Name:xml Type:Xml StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.ExternalDocs != nil { - info = append(info, yaml.MapItem{"externalDocs", m.ExternalDocs.ToRawInfo()}) - } - // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.Example != nil { - info = append(info, yaml.MapItem{"example", m.Example.ToRawInfo()}) - } - // &{Name:example Type:Any StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of SchemaItem suitable for JSON or YAML export. -func (m *SchemaItem) ToRawInfo() interface{} { - // ONE OF WRAPPER - // SchemaItem - // {Name:schema Type:Schema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v0 := m.GetSchema() - if v0 != nil { - return v0.ToRawInfo() - } - // {Name:fileSchema Type:FileSchema StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v1 := m.GetFileSchema() - if v1 != nil { - return v1.ToRawInfo() - } - return nil -} - -// ToRawInfo returns a description of SecurityDefinitions suitable for JSON or YAML export. -func (m *SecurityDefinitions) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.AdditionalProperties != nil { - for _, item := range m.AdditionalProperties { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:additionalProperties Type:NamedSecurityDefinitionsItem StringEnumValues:[] MapType:SecurityDefinitionsItem Repeated:true Pattern: Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of SecurityDefinitionsItem suitable for JSON or YAML export. -func (m *SecurityDefinitionsItem) ToRawInfo() interface{} { - // ONE OF WRAPPER - // SecurityDefinitionsItem - // {Name:basicAuthenticationSecurity Type:BasicAuthenticationSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v0 := m.GetBasicAuthenticationSecurity() - if v0 != nil { - return v0.ToRawInfo() - } - // {Name:apiKeySecurity Type:ApiKeySecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v1 := m.GetApiKeySecurity() - if v1 != nil { - return v1.ToRawInfo() - } - // {Name:oauth2ImplicitSecurity Type:Oauth2ImplicitSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v2 := m.GetOauth2ImplicitSecurity() - if v2 != nil { - return v2.ToRawInfo() - } - // {Name:oauth2PasswordSecurity Type:Oauth2PasswordSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v3 := m.GetOauth2PasswordSecurity() - if v3 != nil { - return v3.ToRawInfo() - } - // {Name:oauth2ApplicationSecurity Type:Oauth2ApplicationSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v4 := m.GetOauth2ApplicationSecurity() - if v4 != nil { - return v4.ToRawInfo() - } - // {Name:oauth2AccessCodeSecurity Type:Oauth2AccessCodeSecurity StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - v5 := m.GetOauth2AccessCodeSecurity() - if v5 != nil { - return v5.ToRawInfo() - } - return nil -} - -// ToRawInfo returns a description of SecurityRequirement suitable for JSON or YAML export. -func (m *SecurityRequirement) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.AdditionalProperties != nil { - for _, item := range m.AdditionalProperties { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:additionalProperties Type:NamedStringArray StringEnumValues:[] MapType:StringArray Repeated:true Pattern: Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of StringArray suitable for JSON or YAML export. -func (m *StringArray) ToRawInfo() interface{} { - return m.Value -} - -// ToRawInfo returns a description of Tag suitable for JSON or YAML export. -func (m *Tag) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - if m.Description != "" { - info = append(info, yaml.MapItem{"description", m.Description}) - } - if m.ExternalDocs != nil { - info = append(info, yaml.MapItem{"externalDocs", m.ExternalDocs.ToRawInfo()}) - } - // &{Name:externalDocs Type:ExternalDocs StringEnumValues:[] MapType: Repeated:false Pattern: Implicit:false Description:} - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of TypeItem suitable for JSON or YAML export. -func (m *TypeItem) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if len(m.Value) != 0 { - info = append(info, yaml.MapItem{"value", m.Value}) - } - return info -} - -// ToRawInfo returns a description of VendorExtension suitable for JSON or YAML export. -func (m *VendorExtension) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.AdditionalProperties != nil { - for _, item := range m.AdditionalProperties { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:additionalProperties Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern: Implicit:true Description:} - return info -} - -// ToRawInfo returns a description of Xml suitable for JSON or YAML export. -func (m *Xml) ToRawInfo() interface{} { - info := yaml.MapSlice{} - if m.Name != "" { - info = append(info, yaml.MapItem{"name", m.Name}) - } - if m.Namespace != "" { - info = append(info, yaml.MapItem{"namespace", m.Namespace}) - } - if m.Prefix != "" { - info = append(info, yaml.MapItem{"prefix", m.Prefix}) - } - if m.Attribute != false { - info = append(info, yaml.MapItem{"attribute", m.Attribute}) - } - if m.Wrapped != false { - info = append(info, yaml.MapItem{"wrapped", m.Wrapped}) - } - if m.VendorExtension != nil { - for _, item := range m.VendorExtension { - info = append(info, yaml.MapItem{item.Name, item.Value.ToRawInfo()}) - } - } - // &{Name:VendorExtension Type:NamedAny StringEnumValues:[] MapType:Any Repeated:true Pattern:^x- Implicit:true Description:} - return info -} - -var ( - pattern0 = regexp.MustCompile("^x-") - pattern1 = regexp.MustCompile("^/") - pattern2 = regexp.MustCompile("^([0-9]{3})$|^(default)$") -) diff --git a/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.pb.go b/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.pb.go deleted file mode 100644 index 37da7df..0000000 --- a/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.pb.go +++ /dev/null @@ -1,4456 +0,0 @@ -// Code generated by protoc-gen-go. -// source: OpenAPIv2/OpenAPIv2.proto -// DO NOT EDIT! - -/* -Package openapi_v2 is a generated protocol buffer package. - -It is generated from these files: - OpenAPIv2/OpenAPIv2.proto - -It has these top-level messages: - AdditionalPropertiesItem - Any - ApiKeySecurity - BasicAuthenticationSecurity - BodyParameter - Contact - Default - Definitions - Document - Examples - ExternalDocs - FileSchema - FormDataParameterSubSchema - Header - HeaderParameterSubSchema - Headers - Info - ItemsItem - JsonReference - License - NamedAny - NamedHeader - NamedParameter - NamedPathItem - NamedResponse - NamedResponseValue - NamedSchema - NamedSecurityDefinitionsItem - NamedString - NamedStringArray - NonBodyParameter - Oauth2AccessCodeSecurity - Oauth2ApplicationSecurity - Oauth2ImplicitSecurity - Oauth2PasswordSecurity - Oauth2Scopes - Operation - Parameter - ParameterDefinitions - ParametersItem - PathItem - PathParameterSubSchema - Paths - PrimitivesItems - Properties - QueryParameterSubSchema - Response - ResponseDefinitions - ResponseValue - Responses - Schema - SchemaItem - SecurityDefinitions - SecurityDefinitionsItem - SecurityRequirement - StringArray - Tag - TypeItem - VendorExtension - Xml -*/ -package openapi_v2 - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import google_protobuf "github.com/golang/protobuf/ptypes/any" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -type AdditionalPropertiesItem struct { - // Types that are valid to be assigned to Oneof: - // *AdditionalPropertiesItem_Schema - // *AdditionalPropertiesItem_Boolean - Oneof isAdditionalPropertiesItem_Oneof `protobuf_oneof:"oneof"` -} - -func (m *AdditionalPropertiesItem) Reset() { *m = AdditionalPropertiesItem{} } -func (m *AdditionalPropertiesItem) String() string { return proto.CompactTextString(m) } -func (*AdditionalPropertiesItem) ProtoMessage() {} -func (*AdditionalPropertiesItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -type isAdditionalPropertiesItem_Oneof interface { - isAdditionalPropertiesItem_Oneof() -} - -type AdditionalPropertiesItem_Schema struct { - Schema *Schema `protobuf:"bytes,1,opt,name=schema,oneof"` -} -type AdditionalPropertiesItem_Boolean struct { - Boolean bool `protobuf:"varint,2,opt,name=boolean,oneof"` -} - -func (*AdditionalPropertiesItem_Schema) isAdditionalPropertiesItem_Oneof() {} -func (*AdditionalPropertiesItem_Boolean) isAdditionalPropertiesItem_Oneof() {} - -func (m *AdditionalPropertiesItem) GetOneof() isAdditionalPropertiesItem_Oneof { - if m != nil { - return m.Oneof - } - return nil -} - -func (m *AdditionalPropertiesItem) GetSchema() *Schema { - if x, ok := m.GetOneof().(*AdditionalPropertiesItem_Schema); ok { - return x.Schema - } - return nil -} - -func (m *AdditionalPropertiesItem) GetBoolean() bool { - if x, ok := m.GetOneof().(*AdditionalPropertiesItem_Boolean); ok { - return x.Boolean - } - return false -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*AdditionalPropertiesItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _AdditionalPropertiesItem_OneofMarshaler, _AdditionalPropertiesItem_OneofUnmarshaler, _AdditionalPropertiesItem_OneofSizer, []interface{}{ - (*AdditionalPropertiesItem_Schema)(nil), - (*AdditionalPropertiesItem_Boolean)(nil), - } -} - -func _AdditionalPropertiesItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*AdditionalPropertiesItem) - // oneof - switch x := m.Oneof.(type) { - case *AdditionalPropertiesItem_Schema: - b.EncodeVarint(1<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.Schema); err != nil { - return err - } - case *AdditionalPropertiesItem_Boolean: - t := uint64(0) - if x.Boolean { - t = 1 - } - b.EncodeVarint(2<<3 | proto.WireVarint) - b.EncodeVarint(t) - case nil: - default: - return fmt.Errorf("AdditionalPropertiesItem.Oneof has unexpected type %T", x) - } - return nil -} - -func _AdditionalPropertiesItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*AdditionalPropertiesItem) - switch tag { - case 1: // oneof.schema - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Schema) - err := b.DecodeMessage(msg) - m.Oneof = &AdditionalPropertiesItem_Schema{msg} - return true, err - case 2: // oneof.boolean - if wire != proto.WireVarint { - return true, proto.ErrInternalBadWireType - } - x, err := b.DecodeVarint() - m.Oneof = &AdditionalPropertiesItem_Boolean{x != 0} - return true, err - default: - return false, nil - } -} - -func _AdditionalPropertiesItem_OneofSizer(msg proto.Message) (n int) { - m := msg.(*AdditionalPropertiesItem) - // oneof - switch x := m.Oneof.(type) { - case *AdditionalPropertiesItem_Schema: - s := proto.Size(x.Schema) - n += proto.SizeVarint(1<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *AdditionalPropertiesItem_Boolean: - n += proto.SizeVarint(2<<3 | proto.WireVarint) - n += 1 - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - -type Any struct { - Value *google_protobuf.Any `protobuf:"bytes,1,opt,name=value" json:"value,omitempty"` - Yaml string `protobuf:"bytes,2,opt,name=yaml" json:"yaml,omitempty"` -} - -func (m *Any) Reset() { *m = Any{} } -func (m *Any) String() string { return proto.CompactTextString(m) } -func (*Any) ProtoMessage() {} -func (*Any) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - -func (m *Any) GetValue() *google_protobuf.Any { - if m != nil { - return m.Value - } - return nil -} - -func (m *Any) GetYaml() string { - if m != nil { - return m.Yaml - } - return "" -} - -type ApiKeySecurity struct { - Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` - Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` - In string `protobuf:"bytes,3,opt,name=in" json:"in,omitempty"` - Description string `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,5,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *ApiKeySecurity) Reset() { *m = ApiKeySecurity{} } -func (m *ApiKeySecurity) String() string { return proto.CompactTextString(m) } -func (*ApiKeySecurity) ProtoMessage() {} -func (*ApiKeySecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } - -func (m *ApiKeySecurity) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *ApiKeySecurity) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *ApiKeySecurity) GetIn() string { - if m != nil { - return m.In - } - return "" -} - -func (m *ApiKeySecurity) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *ApiKeySecurity) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type BasicAuthenticationSecurity struct { - Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description" json:"description,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *BasicAuthenticationSecurity) Reset() { *m = BasicAuthenticationSecurity{} } -func (m *BasicAuthenticationSecurity) String() string { return proto.CompactTextString(m) } -func (*BasicAuthenticationSecurity) ProtoMessage() {} -func (*BasicAuthenticationSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } - -func (m *BasicAuthenticationSecurity) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *BasicAuthenticationSecurity) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *BasicAuthenticationSecurity) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type BodyParameter struct { - // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. - Description string `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"` - // The name of the parameter. - Name string `protobuf:"bytes,2,opt,name=name" json:"name,omitempty"` - // Determines the location of the parameter. - In string `protobuf:"bytes,3,opt,name=in" json:"in,omitempty"` - // Determines whether or not this parameter is required or optional. - Required bool `protobuf:"varint,4,opt,name=required" json:"required,omitempty"` - Schema *Schema `protobuf:"bytes,5,opt,name=schema" json:"schema,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *BodyParameter) Reset() { *m = BodyParameter{} } -func (m *BodyParameter) String() string { return proto.CompactTextString(m) } -func (*BodyParameter) ProtoMessage() {} -func (*BodyParameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{4} } - -func (m *BodyParameter) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *BodyParameter) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *BodyParameter) GetIn() string { - if m != nil { - return m.In - } - return "" -} - -func (m *BodyParameter) GetRequired() bool { - if m != nil { - return m.Required - } - return false -} - -func (m *BodyParameter) GetSchema() *Schema { - if m != nil { - return m.Schema - } - return nil -} - -func (m *BodyParameter) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -// Contact information for the owners of the API. -type Contact struct { - // The identifying name of the contact person/organization. - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // The URL pointing to the contact information. - Url string `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"` - // The email address of the contact person/organization. - Email string `protobuf:"bytes,3,opt,name=email" json:"email,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,4,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Contact) Reset() { *m = Contact{} } -func (m *Contact) String() string { return proto.CompactTextString(m) } -func (*Contact) ProtoMessage() {} -func (*Contact) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{5} } - -func (m *Contact) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Contact) GetUrl() string { - if m != nil { - return m.Url - } - return "" -} - -func (m *Contact) GetEmail() string { - if m != nil { - return m.Email - } - return "" -} - -func (m *Contact) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type Default struct { - AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` -} - -func (m *Default) Reset() { *m = Default{} } -func (m *Default) String() string { return proto.CompactTextString(m) } -func (*Default) ProtoMessage() {} -func (*Default) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{6} } - -func (m *Default) GetAdditionalProperties() []*NamedAny { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -// One or more JSON objects describing the schemas being consumed and produced by the API. -type Definitions struct { - AdditionalProperties []*NamedSchema `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` -} - -func (m *Definitions) Reset() { *m = Definitions{} } -func (m *Definitions) String() string { return proto.CompactTextString(m) } -func (*Definitions) ProtoMessage() {} -func (*Definitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{7} } - -func (m *Definitions) GetAdditionalProperties() []*NamedSchema { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -type Document struct { - // The Swagger version of this document. - Swagger string `protobuf:"bytes,1,opt,name=swagger" json:"swagger,omitempty"` - Info *Info `protobuf:"bytes,2,opt,name=info" json:"info,omitempty"` - // The host (name or ip) of the API. Example: 'swagger.io' - Host string `protobuf:"bytes,3,opt,name=host" json:"host,omitempty"` - // The base path to the API. Example: '/api'. - BasePath string `protobuf:"bytes,4,opt,name=base_path,json=basePath" json:"base_path,omitempty"` - // The transfer protocol of the API. - Schemes []string `protobuf:"bytes,5,rep,name=schemes" json:"schemes,omitempty"` - // A list of MIME types accepted by the API. - Consumes []string `protobuf:"bytes,6,rep,name=consumes" json:"consumes,omitempty"` - // A list of MIME types the API can produce. - Produces []string `protobuf:"bytes,7,rep,name=produces" json:"produces,omitempty"` - Paths *Paths `protobuf:"bytes,8,opt,name=paths" json:"paths,omitempty"` - Definitions *Definitions `protobuf:"bytes,9,opt,name=definitions" json:"definitions,omitempty"` - Parameters *ParameterDefinitions `protobuf:"bytes,10,opt,name=parameters" json:"parameters,omitempty"` - Responses *ResponseDefinitions `protobuf:"bytes,11,opt,name=responses" json:"responses,omitempty"` - Security []*SecurityRequirement `protobuf:"bytes,12,rep,name=security" json:"security,omitempty"` - SecurityDefinitions *SecurityDefinitions `protobuf:"bytes,13,opt,name=security_definitions,json=securityDefinitions" json:"security_definitions,omitempty"` - Tags []*Tag `protobuf:"bytes,14,rep,name=tags" json:"tags,omitempty"` - ExternalDocs *ExternalDocs `protobuf:"bytes,15,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,16,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Document) Reset() { *m = Document{} } -func (m *Document) String() string { return proto.CompactTextString(m) } -func (*Document) ProtoMessage() {} -func (*Document) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{8} } - -func (m *Document) GetSwagger() string { - if m != nil { - return m.Swagger - } - return "" -} - -func (m *Document) GetInfo() *Info { - if m != nil { - return m.Info - } - return nil -} - -func (m *Document) GetHost() string { - if m != nil { - return m.Host - } - return "" -} - -func (m *Document) GetBasePath() string { - if m != nil { - return m.BasePath - } - return "" -} - -func (m *Document) GetSchemes() []string { - if m != nil { - return m.Schemes - } - return nil -} - -func (m *Document) GetConsumes() []string { - if m != nil { - return m.Consumes - } - return nil -} - -func (m *Document) GetProduces() []string { - if m != nil { - return m.Produces - } - return nil -} - -func (m *Document) GetPaths() *Paths { - if m != nil { - return m.Paths - } - return nil -} - -func (m *Document) GetDefinitions() *Definitions { - if m != nil { - return m.Definitions - } - return nil -} - -func (m *Document) GetParameters() *ParameterDefinitions { - if m != nil { - return m.Parameters - } - return nil -} - -func (m *Document) GetResponses() *ResponseDefinitions { - if m != nil { - return m.Responses - } - return nil -} - -func (m *Document) GetSecurity() []*SecurityRequirement { - if m != nil { - return m.Security - } - return nil -} - -func (m *Document) GetSecurityDefinitions() *SecurityDefinitions { - if m != nil { - return m.SecurityDefinitions - } - return nil -} - -func (m *Document) GetTags() []*Tag { - if m != nil { - return m.Tags - } - return nil -} - -func (m *Document) GetExternalDocs() *ExternalDocs { - if m != nil { - return m.ExternalDocs - } - return nil -} - -func (m *Document) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type Examples struct { - AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` -} - -func (m *Examples) Reset() { *m = Examples{} } -func (m *Examples) String() string { return proto.CompactTextString(m) } -func (*Examples) ProtoMessage() {} -func (*Examples) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{9} } - -func (m *Examples) GetAdditionalProperties() []*NamedAny { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -// information about external documentation -type ExternalDocs struct { - Description string `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"` - Url string `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *ExternalDocs) Reset() { *m = ExternalDocs{} } -func (m *ExternalDocs) String() string { return proto.CompactTextString(m) } -func (*ExternalDocs) ProtoMessage() {} -func (*ExternalDocs) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{10} } - -func (m *ExternalDocs) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *ExternalDocs) GetUrl() string { - if m != nil { - return m.Url - } - return "" -} - -func (m *ExternalDocs) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -// A deterministic version of a JSON Schema object. -type FileSchema struct { - Format string `protobuf:"bytes,1,opt,name=format" json:"format,omitempty"` - Title string `protobuf:"bytes,2,opt,name=title" json:"title,omitempty"` - Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` - Default *Any `protobuf:"bytes,4,opt,name=default" json:"default,omitempty"` - Required []string `protobuf:"bytes,5,rep,name=required" json:"required,omitempty"` - Type string `protobuf:"bytes,6,opt,name=type" json:"type,omitempty"` - ReadOnly bool `protobuf:"varint,7,opt,name=read_only,json=readOnly" json:"read_only,omitempty"` - ExternalDocs *ExternalDocs `protobuf:"bytes,8,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"` - Example *Any `protobuf:"bytes,9,opt,name=example" json:"example,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,10,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *FileSchema) Reset() { *m = FileSchema{} } -func (m *FileSchema) String() string { return proto.CompactTextString(m) } -func (*FileSchema) ProtoMessage() {} -func (*FileSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{11} } - -func (m *FileSchema) GetFormat() string { - if m != nil { - return m.Format - } - return "" -} - -func (m *FileSchema) GetTitle() string { - if m != nil { - return m.Title - } - return "" -} - -func (m *FileSchema) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *FileSchema) GetDefault() *Any { - if m != nil { - return m.Default - } - return nil -} - -func (m *FileSchema) GetRequired() []string { - if m != nil { - return m.Required - } - return nil -} - -func (m *FileSchema) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *FileSchema) GetReadOnly() bool { - if m != nil { - return m.ReadOnly - } - return false -} - -func (m *FileSchema) GetExternalDocs() *ExternalDocs { - if m != nil { - return m.ExternalDocs - } - return nil -} - -func (m *FileSchema) GetExample() *Any { - if m != nil { - return m.Example - } - return nil -} - -func (m *FileSchema) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type FormDataParameterSubSchema struct { - // Determines whether or not this parameter is required or optional. - Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"` - // Determines the location of the parameter. - In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"` - // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. - Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` - // The name of the parameter. - Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` - // allows sending a parameter by name only or with an empty value. - AllowEmptyValue bool `protobuf:"varint,5,opt,name=allow_empty_value,json=allowEmptyValue" json:"allow_empty_value,omitempty"` - Type string `protobuf:"bytes,6,opt,name=type" json:"type,omitempty"` - Format string `protobuf:"bytes,7,opt,name=format" json:"format,omitempty"` - Items *PrimitivesItems `protobuf:"bytes,8,opt,name=items" json:"items,omitempty"` - CollectionFormat string `protobuf:"bytes,9,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` - Default *Any `protobuf:"bytes,10,opt,name=default" json:"default,omitempty"` - Maximum float64 `protobuf:"fixed64,11,opt,name=maximum" json:"maximum,omitempty"` - ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` - Minimum float64 `protobuf:"fixed64,13,opt,name=minimum" json:"minimum,omitempty"` - ExclusiveMinimum bool `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` - MaxLength int64 `protobuf:"varint,15,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` - MinLength int64 `protobuf:"varint,16,opt,name=min_length,json=minLength" json:"min_length,omitempty"` - Pattern string `protobuf:"bytes,17,opt,name=pattern" json:"pattern,omitempty"` - MaxItems int64 `protobuf:"varint,18,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` - MinItems int64 `protobuf:"varint,19,opt,name=min_items,json=minItems" json:"min_items,omitempty"` - UniqueItems bool `protobuf:"varint,20,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` - Enum []*Any `protobuf:"bytes,21,rep,name=enum" json:"enum,omitempty"` - MultipleOf float64 `protobuf:"fixed64,22,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,23,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *FormDataParameterSubSchema) Reset() { *m = FormDataParameterSubSchema{} } -func (m *FormDataParameterSubSchema) String() string { return proto.CompactTextString(m) } -func (*FormDataParameterSubSchema) ProtoMessage() {} -func (*FormDataParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{12} } - -func (m *FormDataParameterSubSchema) GetRequired() bool { - if m != nil { - return m.Required - } - return false -} - -func (m *FormDataParameterSubSchema) GetIn() string { - if m != nil { - return m.In - } - return "" -} - -func (m *FormDataParameterSubSchema) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *FormDataParameterSubSchema) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *FormDataParameterSubSchema) GetAllowEmptyValue() bool { - if m != nil { - return m.AllowEmptyValue - } - return false -} - -func (m *FormDataParameterSubSchema) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *FormDataParameterSubSchema) GetFormat() string { - if m != nil { - return m.Format - } - return "" -} - -func (m *FormDataParameterSubSchema) GetItems() *PrimitivesItems { - if m != nil { - return m.Items - } - return nil -} - -func (m *FormDataParameterSubSchema) GetCollectionFormat() string { - if m != nil { - return m.CollectionFormat - } - return "" -} - -func (m *FormDataParameterSubSchema) GetDefault() *Any { - if m != nil { - return m.Default - } - return nil -} - -func (m *FormDataParameterSubSchema) GetMaximum() float64 { - if m != nil { - return m.Maximum - } - return 0 -} - -func (m *FormDataParameterSubSchema) GetExclusiveMaximum() bool { - if m != nil { - return m.ExclusiveMaximum - } - return false -} - -func (m *FormDataParameterSubSchema) GetMinimum() float64 { - if m != nil { - return m.Minimum - } - return 0 -} - -func (m *FormDataParameterSubSchema) GetExclusiveMinimum() bool { - if m != nil { - return m.ExclusiveMinimum - } - return false -} - -func (m *FormDataParameterSubSchema) GetMaxLength() int64 { - if m != nil { - return m.MaxLength - } - return 0 -} - -func (m *FormDataParameterSubSchema) GetMinLength() int64 { - if m != nil { - return m.MinLength - } - return 0 -} - -func (m *FormDataParameterSubSchema) GetPattern() string { - if m != nil { - return m.Pattern - } - return "" -} - -func (m *FormDataParameterSubSchema) GetMaxItems() int64 { - if m != nil { - return m.MaxItems - } - return 0 -} - -func (m *FormDataParameterSubSchema) GetMinItems() int64 { - if m != nil { - return m.MinItems - } - return 0 -} - -func (m *FormDataParameterSubSchema) GetUniqueItems() bool { - if m != nil { - return m.UniqueItems - } - return false -} - -func (m *FormDataParameterSubSchema) GetEnum() []*Any { - if m != nil { - return m.Enum - } - return nil -} - -func (m *FormDataParameterSubSchema) GetMultipleOf() float64 { - if m != nil { - return m.MultipleOf - } - return 0 -} - -func (m *FormDataParameterSubSchema) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type Header struct { - Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` - Format string `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"` - Items *PrimitivesItems `protobuf:"bytes,3,opt,name=items" json:"items,omitempty"` - CollectionFormat string `protobuf:"bytes,4,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` - Default *Any `protobuf:"bytes,5,opt,name=default" json:"default,omitempty"` - Maximum float64 `protobuf:"fixed64,6,opt,name=maximum" json:"maximum,omitempty"` - ExclusiveMaximum bool `protobuf:"varint,7,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` - Minimum float64 `protobuf:"fixed64,8,opt,name=minimum" json:"minimum,omitempty"` - ExclusiveMinimum bool `protobuf:"varint,9,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` - MaxLength int64 `protobuf:"varint,10,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` - MinLength int64 `protobuf:"varint,11,opt,name=min_length,json=minLength" json:"min_length,omitempty"` - Pattern string `protobuf:"bytes,12,opt,name=pattern" json:"pattern,omitempty"` - MaxItems int64 `protobuf:"varint,13,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` - MinItems int64 `protobuf:"varint,14,opt,name=min_items,json=minItems" json:"min_items,omitempty"` - UniqueItems bool `protobuf:"varint,15,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` - Enum []*Any `protobuf:"bytes,16,rep,name=enum" json:"enum,omitempty"` - MultipleOf float64 `protobuf:"fixed64,17,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` - Description string `protobuf:"bytes,18,opt,name=description" json:"description,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,19,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Header) Reset() { *m = Header{} } -func (m *Header) String() string { return proto.CompactTextString(m) } -func (*Header) ProtoMessage() {} -func (*Header) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{13} } - -func (m *Header) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *Header) GetFormat() string { - if m != nil { - return m.Format - } - return "" -} - -func (m *Header) GetItems() *PrimitivesItems { - if m != nil { - return m.Items - } - return nil -} - -func (m *Header) GetCollectionFormat() string { - if m != nil { - return m.CollectionFormat - } - return "" -} - -func (m *Header) GetDefault() *Any { - if m != nil { - return m.Default - } - return nil -} - -func (m *Header) GetMaximum() float64 { - if m != nil { - return m.Maximum - } - return 0 -} - -func (m *Header) GetExclusiveMaximum() bool { - if m != nil { - return m.ExclusiveMaximum - } - return false -} - -func (m *Header) GetMinimum() float64 { - if m != nil { - return m.Minimum - } - return 0 -} - -func (m *Header) GetExclusiveMinimum() bool { - if m != nil { - return m.ExclusiveMinimum - } - return false -} - -func (m *Header) GetMaxLength() int64 { - if m != nil { - return m.MaxLength - } - return 0 -} - -func (m *Header) GetMinLength() int64 { - if m != nil { - return m.MinLength - } - return 0 -} - -func (m *Header) GetPattern() string { - if m != nil { - return m.Pattern - } - return "" -} - -func (m *Header) GetMaxItems() int64 { - if m != nil { - return m.MaxItems - } - return 0 -} - -func (m *Header) GetMinItems() int64 { - if m != nil { - return m.MinItems - } - return 0 -} - -func (m *Header) GetUniqueItems() bool { - if m != nil { - return m.UniqueItems - } - return false -} - -func (m *Header) GetEnum() []*Any { - if m != nil { - return m.Enum - } - return nil -} - -func (m *Header) GetMultipleOf() float64 { - if m != nil { - return m.MultipleOf - } - return 0 -} - -func (m *Header) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *Header) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type HeaderParameterSubSchema struct { - // Determines whether or not this parameter is required or optional. - Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"` - // Determines the location of the parameter. - In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"` - // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. - Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` - // The name of the parameter. - Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` - Type string `protobuf:"bytes,5,opt,name=type" json:"type,omitempty"` - Format string `protobuf:"bytes,6,opt,name=format" json:"format,omitempty"` - Items *PrimitivesItems `protobuf:"bytes,7,opt,name=items" json:"items,omitempty"` - CollectionFormat string `protobuf:"bytes,8,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` - Default *Any `protobuf:"bytes,9,opt,name=default" json:"default,omitempty"` - Maximum float64 `protobuf:"fixed64,10,opt,name=maximum" json:"maximum,omitempty"` - ExclusiveMaximum bool `protobuf:"varint,11,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` - Minimum float64 `protobuf:"fixed64,12,opt,name=minimum" json:"minimum,omitempty"` - ExclusiveMinimum bool `protobuf:"varint,13,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` - MaxLength int64 `protobuf:"varint,14,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` - MinLength int64 `protobuf:"varint,15,opt,name=min_length,json=minLength" json:"min_length,omitempty"` - Pattern string `protobuf:"bytes,16,opt,name=pattern" json:"pattern,omitempty"` - MaxItems int64 `protobuf:"varint,17,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` - MinItems int64 `protobuf:"varint,18,opt,name=min_items,json=minItems" json:"min_items,omitempty"` - UniqueItems bool `protobuf:"varint,19,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` - Enum []*Any `protobuf:"bytes,20,rep,name=enum" json:"enum,omitempty"` - MultipleOf float64 `protobuf:"fixed64,21,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,22,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *HeaderParameterSubSchema) Reset() { *m = HeaderParameterSubSchema{} } -func (m *HeaderParameterSubSchema) String() string { return proto.CompactTextString(m) } -func (*HeaderParameterSubSchema) ProtoMessage() {} -func (*HeaderParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} } - -func (m *HeaderParameterSubSchema) GetRequired() bool { - if m != nil { - return m.Required - } - return false -} - -func (m *HeaderParameterSubSchema) GetIn() string { - if m != nil { - return m.In - } - return "" -} - -func (m *HeaderParameterSubSchema) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *HeaderParameterSubSchema) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *HeaderParameterSubSchema) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *HeaderParameterSubSchema) GetFormat() string { - if m != nil { - return m.Format - } - return "" -} - -func (m *HeaderParameterSubSchema) GetItems() *PrimitivesItems { - if m != nil { - return m.Items - } - return nil -} - -func (m *HeaderParameterSubSchema) GetCollectionFormat() string { - if m != nil { - return m.CollectionFormat - } - return "" -} - -func (m *HeaderParameterSubSchema) GetDefault() *Any { - if m != nil { - return m.Default - } - return nil -} - -func (m *HeaderParameterSubSchema) GetMaximum() float64 { - if m != nil { - return m.Maximum - } - return 0 -} - -func (m *HeaderParameterSubSchema) GetExclusiveMaximum() bool { - if m != nil { - return m.ExclusiveMaximum - } - return false -} - -func (m *HeaderParameterSubSchema) GetMinimum() float64 { - if m != nil { - return m.Minimum - } - return 0 -} - -func (m *HeaderParameterSubSchema) GetExclusiveMinimum() bool { - if m != nil { - return m.ExclusiveMinimum - } - return false -} - -func (m *HeaderParameterSubSchema) GetMaxLength() int64 { - if m != nil { - return m.MaxLength - } - return 0 -} - -func (m *HeaderParameterSubSchema) GetMinLength() int64 { - if m != nil { - return m.MinLength - } - return 0 -} - -func (m *HeaderParameterSubSchema) GetPattern() string { - if m != nil { - return m.Pattern - } - return "" -} - -func (m *HeaderParameterSubSchema) GetMaxItems() int64 { - if m != nil { - return m.MaxItems - } - return 0 -} - -func (m *HeaderParameterSubSchema) GetMinItems() int64 { - if m != nil { - return m.MinItems - } - return 0 -} - -func (m *HeaderParameterSubSchema) GetUniqueItems() bool { - if m != nil { - return m.UniqueItems - } - return false -} - -func (m *HeaderParameterSubSchema) GetEnum() []*Any { - if m != nil { - return m.Enum - } - return nil -} - -func (m *HeaderParameterSubSchema) GetMultipleOf() float64 { - if m != nil { - return m.MultipleOf - } - return 0 -} - -func (m *HeaderParameterSubSchema) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type Headers struct { - AdditionalProperties []*NamedHeader `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` -} - -func (m *Headers) Reset() { *m = Headers{} } -func (m *Headers) String() string { return proto.CompactTextString(m) } -func (*Headers) ProtoMessage() {} -func (*Headers) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} } - -func (m *Headers) GetAdditionalProperties() []*NamedHeader { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -// General information about the API. -type Info struct { - // A unique and precise title of the API. - Title string `protobuf:"bytes,1,opt,name=title" json:"title,omitempty"` - // A semantic version number of the API. - Version string `protobuf:"bytes,2,opt,name=version" json:"version,omitempty"` - // A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed. - Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` - // The terms of service for the API. - TermsOfService string `protobuf:"bytes,4,opt,name=terms_of_service,json=termsOfService" json:"terms_of_service,omitempty"` - Contact *Contact `protobuf:"bytes,5,opt,name=contact" json:"contact,omitempty"` - License *License `protobuf:"bytes,6,opt,name=license" json:"license,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,7,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Info) Reset() { *m = Info{} } -func (m *Info) String() string { return proto.CompactTextString(m) } -func (*Info) ProtoMessage() {} -func (*Info) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} } - -func (m *Info) GetTitle() string { - if m != nil { - return m.Title - } - return "" -} - -func (m *Info) GetVersion() string { - if m != nil { - return m.Version - } - return "" -} - -func (m *Info) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *Info) GetTermsOfService() string { - if m != nil { - return m.TermsOfService - } - return "" -} - -func (m *Info) GetContact() *Contact { - if m != nil { - return m.Contact - } - return nil -} - -func (m *Info) GetLicense() *License { - if m != nil { - return m.License - } - return nil -} - -func (m *Info) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type ItemsItem struct { - Schema []*Schema `protobuf:"bytes,1,rep,name=schema" json:"schema,omitempty"` -} - -func (m *ItemsItem) Reset() { *m = ItemsItem{} } -func (m *ItemsItem) String() string { return proto.CompactTextString(m) } -func (*ItemsItem) ProtoMessage() {} -func (*ItemsItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} } - -func (m *ItemsItem) GetSchema() []*Schema { - if m != nil { - return m.Schema - } - return nil -} - -type JsonReference struct { - XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref" json:"_ref,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description" json:"description,omitempty"` -} - -func (m *JsonReference) Reset() { *m = JsonReference{} } -func (m *JsonReference) String() string { return proto.CompactTextString(m) } -func (*JsonReference) ProtoMessage() {} -func (*JsonReference) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} } - -func (m *JsonReference) GetXRef() string { - if m != nil { - return m.XRef - } - return "" -} - -func (m *JsonReference) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -type License struct { - // The name of the license type. It's encouraged to use an OSI compatible license. - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // The URL pointing to the license. - Url string `protobuf:"bytes,2,opt,name=url" json:"url,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,3,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *License) Reset() { *m = License{} } -func (m *License) String() string { return proto.CompactTextString(m) } -func (*License) ProtoMessage() {} -func (*License) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} } - -func (m *License) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *License) GetUrl() string { - if m != nil { - return m.Url - } - return "" -} - -func (m *License) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs. -type NamedAny struct { - // Map key - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // Mapped value - Value *Any `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *NamedAny) Reset() { *m = NamedAny{} } -func (m *NamedAny) String() string { return proto.CompactTextString(m) } -func (*NamedAny) ProtoMessage() {} -func (*NamedAny) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} } - -func (m *NamedAny) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NamedAny) GetValue() *Any { - if m != nil { - return m.Value - } - return nil -} - -// Automatically-generated message used to represent maps of Header as ordered (name,value) pairs. -type NamedHeader struct { - // Map key - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // Mapped value - Value *Header `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *NamedHeader) Reset() { *m = NamedHeader{} } -func (m *NamedHeader) String() string { return proto.CompactTextString(m) } -func (*NamedHeader) ProtoMessage() {} -func (*NamedHeader) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} } - -func (m *NamedHeader) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NamedHeader) GetValue() *Header { - if m != nil { - return m.Value - } - return nil -} - -// Automatically-generated message used to represent maps of Parameter as ordered (name,value) pairs. -type NamedParameter struct { - // Map key - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // Mapped value - Value *Parameter `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *NamedParameter) Reset() { *m = NamedParameter{} } -func (m *NamedParameter) String() string { return proto.CompactTextString(m) } -func (*NamedParameter) ProtoMessage() {} -func (*NamedParameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} } - -func (m *NamedParameter) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NamedParameter) GetValue() *Parameter { - if m != nil { - return m.Value - } - return nil -} - -// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs. -type NamedPathItem struct { - // Map key - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // Mapped value - Value *PathItem `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *NamedPathItem) Reset() { *m = NamedPathItem{} } -func (m *NamedPathItem) String() string { return proto.CompactTextString(m) } -func (*NamedPathItem) ProtoMessage() {} -func (*NamedPathItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} } - -func (m *NamedPathItem) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NamedPathItem) GetValue() *PathItem { - if m != nil { - return m.Value - } - return nil -} - -// Automatically-generated message used to represent maps of Response as ordered (name,value) pairs. -type NamedResponse struct { - // Map key - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // Mapped value - Value *Response `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *NamedResponse) Reset() { *m = NamedResponse{} } -func (m *NamedResponse) String() string { return proto.CompactTextString(m) } -func (*NamedResponse) ProtoMessage() {} -func (*NamedResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} } - -func (m *NamedResponse) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NamedResponse) GetValue() *Response { - if m != nil { - return m.Value - } - return nil -} - -// Automatically-generated message used to represent maps of ResponseValue as ordered (name,value) pairs. -type NamedResponseValue struct { - // Map key - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // Mapped value - Value *ResponseValue `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *NamedResponseValue) Reset() { *m = NamedResponseValue{} } -func (m *NamedResponseValue) String() string { return proto.CompactTextString(m) } -func (*NamedResponseValue) ProtoMessage() {} -func (*NamedResponseValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} } - -func (m *NamedResponseValue) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NamedResponseValue) GetValue() *ResponseValue { - if m != nil { - return m.Value - } - return nil -} - -// Automatically-generated message used to represent maps of Schema as ordered (name,value) pairs. -type NamedSchema struct { - // Map key - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // Mapped value - Value *Schema `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *NamedSchema) Reset() { *m = NamedSchema{} } -func (m *NamedSchema) String() string { return proto.CompactTextString(m) } -func (*NamedSchema) ProtoMessage() {} -func (*NamedSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} } - -func (m *NamedSchema) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NamedSchema) GetValue() *Schema { - if m != nil { - return m.Value - } - return nil -} - -// Automatically-generated message used to represent maps of SecurityDefinitionsItem as ordered (name,value) pairs. -type NamedSecurityDefinitionsItem struct { - // Map key - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // Mapped value - Value *SecurityDefinitionsItem `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *NamedSecurityDefinitionsItem) Reset() { *m = NamedSecurityDefinitionsItem{} } -func (m *NamedSecurityDefinitionsItem) String() string { return proto.CompactTextString(m) } -func (*NamedSecurityDefinitionsItem) ProtoMessage() {} -func (*NamedSecurityDefinitionsItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} } - -func (m *NamedSecurityDefinitionsItem) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NamedSecurityDefinitionsItem) GetValue() *SecurityDefinitionsItem { - if m != nil { - return m.Value - } - return nil -} - -// Automatically-generated message used to represent maps of string as ordered (name,value) pairs. -type NamedString struct { - // Map key - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // Mapped value - Value string `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *NamedString) Reset() { *m = NamedString{} } -func (m *NamedString) String() string { return proto.CompactTextString(m) } -func (*NamedString) ProtoMessage() {} -func (*NamedString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} } - -func (m *NamedString) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NamedString) GetValue() string { - if m != nil { - return m.Value - } - return "" -} - -// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs. -type NamedStringArray struct { - // Map key - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - // Mapped value - Value *StringArray `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` -} - -func (m *NamedStringArray) Reset() { *m = NamedStringArray{} } -func (m *NamedStringArray) String() string { return proto.CompactTextString(m) } -func (*NamedStringArray) ProtoMessage() {} -func (*NamedStringArray) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} } - -func (m *NamedStringArray) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *NamedStringArray) GetValue() *StringArray { - if m != nil { - return m.Value - } - return nil -} - -type NonBodyParameter struct { - // Types that are valid to be assigned to Oneof: - // *NonBodyParameter_HeaderParameterSubSchema - // *NonBodyParameter_FormDataParameterSubSchema - // *NonBodyParameter_QueryParameterSubSchema - // *NonBodyParameter_PathParameterSubSchema - Oneof isNonBodyParameter_Oneof `protobuf_oneof:"oneof"` -} - -func (m *NonBodyParameter) Reset() { *m = NonBodyParameter{} } -func (m *NonBodyParameter) String() string { return proto.CompactTextString(m) } -func (*NonBodyParameter) ProtoMessage() {} -func (*NonBodyParameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} } - -type isNonBodyParameter_Oneof interface { - isNonBodyParameter_Oneof() -} - -type NonBodyParameter_HeaderParameterSubSchema struct { - HeaderParameterSubSchema *HeaderParameterSubSchema `protobuf:"bytes,1,opt,name=header_parameter_sub_schema,json=headerParameterSubSchema,oneof"` -} -type NonBodyParameter_FormDataParameterSubSchema struct { - FormDataParameterSubSchema *FormDataParameterSubSchema `protobuf:"bytes,2,opt,name=form_data_parameter_sub_schema,json=formDataParameterSubSchema,oneof"` -} -type NonBodyParameter_QueryParameterSubSchema struct { - QueryParameterSubSchema *QueryParameterSubSchema `protobuf:"bytes,3,opt,name=query_parameter_sub_schema,json=queryParameterSubSchema,oneof"` -} -type NonBodyParameter_PathParameterSubSchema struct { - PathParameterSubSchema *PathParameterSubSchema `protobuf:"bytes,4,opt,name=path_parameter_sub_schema,json=pathParameterSubSchema,oneof"` -} - -func (*NonBodyParameter_HeaderParameterSubSchema) isNonBodyParameter_Oneof() {} -func (*NonBodyParameter_FormDataParameterSubSchema) isNonBodyParameter_Oneof() {} -func (*NonBodyParameter_QueryParameterSubSchema) isNonBodyParameter_Oneof() {} -func (*NonBodyParameter_PathParameterSubSchema) isNonBodyParameter_Oneof() {} - -func (m *NonBodyParameter) GetOneof() isNonBodyParameter_Oneof { - if m != nil { - return m.Oneof - } - return nil -} - -func (m *NonBodyParameter) GetHeaderParameterSubSchema() *HeaderParameterSubSchema { - if x, ok := m.GetOneof().(*NonBodyParameter_HeaderParameterSubSchema); ok { - return x.HeaderParameterSubSchema - } - return nil -} - -func (m *NonBodyParameter) GetFormDataParameterSubSchema() *FormDataParameterSubSchema { - if x, ok := m.GetOneof().(*NonBodyParameter_FormDataParameterSubSchema); ok { - return x.FormDataParameterSubSchema - } - return nil -} - -func (m *NonBodyParameter) GetQueryParameterSubSchema() *QueryParameterSubSchema { - if x, ok := m.GetOneof().(*NonBodyParameter_QueryParameterSubSchema); ok { - return x.QueryParameterSubSchema - } - return nil -} - -func (m *NonBodyParameter) GetPathParameterSubSchema() *PathParameterSubSchema { - if x, ok := m.GetOneof().(*NonBodyParameter_PathParameterSubSchema); ok { - return x.PathParameterSubSchema - } - return nil -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*NonBodyParameter) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _NonBodyParameter_OneofMarshaler, _NonBodyParameter_OneofUnmarshaler, _NonBodyParameter_OneofSizer, []interface{}{ - (*NonBodyParameter_HeaderParameterSubSchema)(nil), - (*NonBodyParameter_FormDataParameterSubSchema)(nil), - (*NonBodyParameter_QueryParameterSubSchema)(nil), - (*NonBodyParameter_PathParameterSubSchema)(nil), - } -} - -func _NonBodyParameter_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*NonBodyParameter) - // oneof - switch x := m.Oneof.(type) { - case *NonBodyParameter_HeaderParameterSubSchema: - b.EncodeVarint(1<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.HeaderParameterSubSchema); err != nil { - return err - } - case *NonBodyParameter_FormDataParameterSubSchema: - b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.FormDataParameterSubSchema); err != nil { - return err - } - case *NonBodyParameter_QueryParameterSubSchema: - b.EncodeVarint(3<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.QueryParameterSubSchema); err != nil { - return err - } - case *NonBodyParameter_PathParameterSubSchema: - b.EncodeVarint(4<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.PathParameterSubSchema); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("NonBodyParameter.Oneof has unexpected type %T", x) - } - return nil -} - -func _NonBodyParameter_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*NonBodyParameter) - switch tag { - case 1: // oneof.header_parameter_sub_schema - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(HeaderParameterSubSchema) - err := b.DecodeMessage(msg) - m.Oneof = &NonBodyParameter_HeaderParameterSubSchema{msg} - return true, err - case 2: // oneof.form_data_parameter_sub_schema - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(FormDataParameterSubSchema) - err := b.DecodeMessage(msg) - m.Oneof = &NonBodyParameter_FormDataParameterSubSchema{msg} - return true, err - case 3: // oneof.query_parameter_sub_schema - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(QueryParameterSubSchema) - err := b.DecodeMessage(msg) - m.Oneof = &NonBodyParameter_QueryParameterSubSchema{msg} - return true, err - case 4: // oneof.path_parameter_sub_schema - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(PathParameterSubSchema) - err := b.DecodeMessage(msg) - m.Oneof = &NonBodyParameter_PathParameterSubSchema{msg} - return true, err - default: - return false, nil - } -} - -func _NonBodyParameter_OneofSizer(msg proto.Message) (n int) { - m := msg.(*NonBodyParameter) - // oneof - switch x := m.Oneof.(type) { - case *NonBodyParameter_HeaderParameterSubSchema: - s := proto.Size(x.HeaderParameterSubSchema) - n += proto.SizeVarint(1<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *NonBodyParameter_FormDataParameterSubSchema: - s := proto.Size(x.FormDataParameterSubSchema) - n += proto.SizeVarint(2<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *NonBodyParameter_QueryParameterSubSchema: - s := proto.Size(x.QueryParameterSubSchema) - n += proto.SizeVarint(3<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *NonBodyParameter_PathParameterSubSchema: - s := proto.Size(x.PathParameterSubSchema) - n += proto.SizeVarint(4<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - -type Oauth2AccessCodeSecurity struct { - Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` - Flow string `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"` - Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"` - AuthorizationUrl string `protobuf:"bytes,4,opt,name=authorization_url,json=authorizationUrl" json:"authorization_url,omitempty"` - TokenUrl string `protobuf:"bytes,5,opt,name=token_url,json=tokenUrl" json:"token_url,omitempty"` - Description string `protobuf:"bytes,6,opt,name=description" json:"description,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,7,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Oauth2AccessCodeSecurity) Reset() { *m = Oauth2AccessCodeSecurity{} } -func (m *Oauth2AccessCodeSecurity) String() string { return proto.CompactTextString(m) } -func (*Oauth2AccessCodeSecurity) ProtoMessage() {} -func (*Oauth2AccessCodeSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} } - -func (m *Oauth2AccessCodeSecurity) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *Oauth2AccessCodeSecurity) GetFlow() string { - if m != nil { - return m.Flow - } - return "" -} - -func (m *Oauth2AccessCodeSecurity) GetScopes() *Oauth2Scopes { - if m != nil { - return m.Scopes - } - return nil -} - -func (m *Oauth2AccessCodeSecurity) GetAuthorizationUrl() string { - if m != nil { - return m.AuthorizationUrl - } - return "" -} - -func (m *Oauth2AccessCodeSecurity) GetTokenUrl() string { - if m != nil { - return m.TokenUrl - } - return "" -} - -func (m *Oauth2AccessCodeSecurity) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *Oauth2AccessCodeSecurity) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type Oauth2ApplicationSecurity struct { - Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` - Flow string `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"` - Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"` - TokenUrl string `protobuf:"bytes,4,opt,name=token_url,json=tokenUrl" json:"token_url,omitempty"` - Description string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Oauth2ApplicationSecurity) Reset() { *m = Oauth2ApplicationSecurity{} } -func (m *Oauth2ApplicationSecurity) String() string { return proto.CompactTextString(m) } -func (*Oauth2ApplicationSecurity) ProtoMessage() {} -func (*Oauth2ApplicationSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} } - -func (m *Oauth2ApplicationSecurity) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *Oauth2ApplicationSecurity) GetFlow() string { - if m != nil { - return m.Flow - } - return "" -} - -func (m *Oauth2ApplicationSecurity) GetScopes() *Oauth2Scopes { - if m != nil { - return m.Scopes - } - return nil -} - -func (m *Oauth2ApplicationSecurity) GetTokenUrl() string { - if m != nil { - return m.TokenUrl - } - return "" -} - -func (m *Oauth2ApplicationSecurity) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *Oauth2ApplicationSecurity) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type Oauth2ImplicitSecurity struct { - Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` - Flow string `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"` - Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"` - AuthorizationUrl string `protobuf:"bytes,4,opt,name=authorization_url,json=authorizationUrl" json:"authorization_url,omitempty"` - Description string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Oauth2ImplicitSecurity) Reset() { *m = Oauth2ImplicitSecurity{} } -func (m *Oauth2ImplicitSecurity) String() string { return proto.CompactTextString(m) } -func (*Oauth2ImplicitSecurity) ProtoMessage() {} -func (*Oauth2ImplicitSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} } - -func (m *Oauth2ImplicitSecurity) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *Oauth2ImplicitSecurity) GetFlow() string { - if m != nil { - return m.Flow - } - return "" -} - -func (m *Oauth2ImplicitSecurity) GetScopes() *Oauth2Scopes { - if m != nil { - return m.Scopes - } - return nil -} - -func (m *Oauth2ImplicitSecurity) GetAuthorizationUrl() string { - if m != nil { - return m.AuthorizationUrl - } - return "" -} - -func (m *Oauth2ImplicitSecurity) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *Oauth2ImplicitSecurity) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type Oauth2PasswordSecurity struct { - Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` - Flow string `protobuf:"bytes,2,opt,name=flow" json:"flow,omitempty"` - Scopes *Oauth2Scopes `protobuf:"bytes,3,opt,name=scopes" json:"scopes,omitempty"` - TokenUrl string `protobuf:"bytes,4,opt,name=token_url,json=tokenUrl" json:"token_url,omitempty"` - Description string `protobuf:"bytes,5,opt,name=description" json:"description,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Oauth2PasswordSecurity) Reset() { *m = Oauth2PasswordSecurity{} } -func (m *Oauth2PasswordSecurity) String() string { return proto.CompactTextString(m) } -func (*Oauth2PasswordSecurity) ProtoMessage() {} -func (*Oauth2PasswordSecurity) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} } - -func (m *Oauth2PasswordSecurity) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *Oauth2PasswordSecurity) GetFlow() string { - if m != nil { - return m.Flow - } - return "" -} - -func (m *Oauth2PasswordSecurity) GetScopes() *Oauth2Scopes { - if m != nil { - return m.Scopes - } - return nil -} - -func (m *Oauth2PasswordSecurity) GetTokenUrl() string { - if m != nil { - return m.TokenUrl - } - return "" -} - -func (m *Oauth2PasswordSecurity) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *Oauth2PasswordSecurity) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type Oauth2Scopes struct { - AdditionalProperties []*NamedString `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` -} - -func (m *Oauth2Scopes) Reset() { *m = Oauth2Scopes{} } -func (m *Oauth2Scopes) String() string { return proto.CompactTextString(m) } -func (*Oauth2Scopes) ProtoMessage() {} -func (*Oauth2Scopes) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} } - -func (m *Oauth2Scopes) GetAdditionalProperties() []*NamedString { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -type Operation struct { - Tags []string `protobuf:"bytes,1,rep,name=tags" json:"tags,omitempty"` - // A brief summary of the operation. - Summary string `protobuf:"bytes,2,opt,name=summary" json:"summary,omitempty"` - // A longer description of the operation, GitHub Flavored Markdown is allowed. - Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` - ExternalDocs *ExternalDocs `protobuf:"bytes,4,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"` - // A unique identifier of the operation. - OperationId string `protobuf:"bytes,5,opt,name=operation_id,json=operationId" json:"operation_id,omitempty"` - // A list of MIME types the API can produce. - Produces []string `protobuf:"bytes,6,rep,name=produces" json:"produces,omitempty"` - // A list of MIME types the API can consume. - Consumes []string `protobuf:"bytes,7,rep,name=consumes" json:"consumes,omitempty"` - // The parameters needed to send a valid API call. - Parameters []*ParametersItem `protobuf:"bytes,8,rep,name=parameters" json:"parameters,omitempty"` - Responses *Responses `protobuf:"bytes,9,opt,name=responses" json:"responses,omitempty"` - // The transfer protocol of the API. - Schemes []string `protobuf:"bytes,10,rep,name=schemes" json:"schemes,omitempty"` - Deprecated bool `protobuf:"varint,11,opt,name=deprecated" json:"deprecated,omitempty"` - Security []*SecurityRequirement `protobuf:"bytes,12,rep,name=security" json:"security,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,13,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Operation) Reset() { *m = Operation{} } -func (m *Operation) String() string { return proto.CompactTextString(m) } -func (*Operation) ProtoMessage() {} -func (*Operation) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} } - -func (m *Operation) GetTags() []string { - if m != nil { - return m.Tags - } - return nil -} - -func (m *Operation) GetSummary() string { - if m != nil { - return m.Summary - } - return "" -} - -func (m *Operation) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *Operation) GetExternalDocs() *ExternalDocs { - if m != nil { - return m.ExternalDocs - } - return nil -} - -func (m *Operation) GetOperationId() string { - if m != nil { - return m.OperationId - } - return "" -} - -func (m *Operation) GetProduces() []string { - if m != nil { - return m.Produces - } - return nil -} - -func (m *Operation) GetConsumes() []string { - if m != nil { - return m.Consumes - } - return nil -} - -func (m *Operation) GetParameters() []*ParametersItem { - if m != nil { - return m.Parameters - } - return nil -} - -func (m *Operation) GetResponses() *Responses { - if m != nil { - return m.Responses - } - return nil -} - -func (m *Operation) GetSchemes() []string { - if m != nil { - return m.Schemes - } - return nil -} - -func (m *Operation) GetDeprecated() bool { - if m != nil { - return m.Deprecated - } - return false -} - -func (m *Operation) GetSecurity() []*SecurityRequirement { - if m != nil { - return m.Security - } - return nil -} - -func (m *Operation) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type Parameter struct { - // Types that are valid to be assigned to Oneof: - // *Parameter_BodyParameter - // *Parameter_NonBodyParameter - Oneof isParameter_Oneof `protobuf_oneof:"oneof"` -} - -func (m *Parameter) Reset() { *m = Parameter{} } -func (m *Parameter) String() string { return proto.CompactTextString(m) } -func (*Parameter) ProtoMessage() {} -func (*Parameter) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} } - -type isParameter_Oneof interface { - isParameter_Oneof() -} - -type Parameter_BodyParameter struct { - BodyParameter *BodyParameter `protobuf:"bytes,1,opt,name=body_parameter,json=bodyParameter,oneof"` -} -type Parameter_NonBodyParameter struct { - NonBodyParameter *NonBodyParameter `protobuf:"bytes,2,opt,name=non_body_parameter,json=nonBodyParameter,oneof"` -} - -func (*Parameter_BodyParameter) isParameter_Oneof() {} -func (*Parameter_NonBodyParameter) isParameter_Oneof() {} - -func (m *Parameter) GetOneof() isParameter_Oneof { - if m != nil { - return m.Oneof - } - return nil -} - -func (m *Parameter) GetBodyParameter() *BodyParameter { - if x, ok := m.GetOneof().(*Parameter_BodyParameter); ok { - return x.BodyParameter - } - return nil -} - -func (m *Parameter) GetNonBodyParameter() *NonBodyParameter { - if x, ok := m.GetOneof().(*Parameter_NonBodyParameter); ok { - return x.NonBodyParameter - } - return nil -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*Parameter) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _Parameter_OneofMarshaler, _Parameter_OneofUnmarshaler, _Parameter_OneofSizer, []interface{}{ - (*Parameter_BodyParameter)(nil), - (*Parameter_NonBodyParameter)(nil), - } -} - -func _Parameter_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*Parameter) - // oneof - switch x := m.Oneof.(type) { - case *Parameter_BodyParameter: - b.EncodeVarint(1<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.BodyParameter); err != nil { - return err - } - case *Parameter_NonBodyParameter: - b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.NonBodyParameter); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("Parameter.Oneof has unexpected type %T", x) - } - return nil -} - -func _Parameter_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*Parameter) - switch tag { - case 1: // oneof.body_parameter - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(BodyParameter) - err := b.DecodeMessage(msg) - m.Oneof = &Parameter_BodyParameter{msg} - return true, err - case 2: // oneof.non_body_parameter - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(NonBodyParameter) - err := b.DecodeMessage(msg) - m.Oneof = &Parameter_NonBodyParameter{msg} - return true, err - default: - return false, nil - } -} - -func _Parameter_OneofSizer(msg proto.Message) (n int) { - m := msg.(*Parameter) - // oneof - switch x := m.Oneof.(type) { - case *Parameter_BodyParameter: - s := proto.Size(x.BodyParameter) - n += proto.SizeVarint(1<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *Parameter_NonBodyParameter: - s := proto.Size(x.NonBodyParameter) - n += proto.SizeVarint(2<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - -// One or more JSON representations for parameters -type ParameterDefinitions struct { - AdditionalProperties []*NamedParameter `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` -} - -func (m *ParameterDefinitions) Reset() { *m = ParameterDefinitions{} } -func (m *ParameterDefinitions) String() string { return proto.CompactTextString(m) } -func (*ParameterDefinitions) ProtoMessage() {} -func (*ParameterDefinitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} } - -func (m *ParameterDefinitions) GetAdditionalProperties() []*NamedParameter { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -type ParametersItem struct { - // Types that are valid to be assigned to Oneof: - // *ParametersItem_Parameter - // *ParametersItem_JsonReference - Oneof isParametersItem_Oneof `protobuf_oneof:"oneof"` -} - -func (m *ParametersItem) Reset() { *m = ParametersItem{} } -func (m *ParametersItem) String() string { return proto.CompactTextString(m) } -func (*ParametersItem) ProtoMessage() {} -func (*ParametersItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} } - -type isParametersItem_Oneof interface { - isParametersItem_Oneof() -} - -type ParametersItem_Parameter struct { - Parameter *Parameter `protobuf:"bytes,1,opt,name=parameter,oneof"` -} -type ParametersItem_JsonReference struct { - JsonReference *JsonReference `protobuf:"bytes,2,opt,name=json_reference,json=jsonReference,oneof"` -} - -func (*ParametersItem_Parameter) isParametersItem_Oneof() {} -func (*ParametersItem_JsonReference) isParametersItem_Oneof() {} - -func (m *ParametersItem) GetOneof() isParametersItem_Oneof { - if m != nil { - return m.Oneof - } - return nil -} - -func (m *ParametersItem) GetParameter() *Parameter { - if x, ok := m.GetOneof().(*ParametersItem_Parameter); ok { - return x.Parameter - } - return nil -} - -func (m *ParametersItem) GetJsonReference() *JsonReference { - if x, ok := m.GetOneof().(*ParametersItem_JsonReference); ok { - return x.JsonReference - } - return nil -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*ParametersItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _ParametersItem_OneofMarshaler, _ParametersItem_OneofUnmarshaler, _ParametersItem_OneofSizer, []interface{}{ - (*ParametersItem_Parameter)(nil), - (*ParametersItem_JsonReference)(nil), - } -} - -func _ParametersItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*ParametersItem) - // oneof - switch x := m.Oneof.(type) { - case *ParametersItem_Parameter: - b.EncodeVarint(1<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.Parameter); err != nil { - return err - } - case *ParametersItem_JsonReference: - b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.JsonReference); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("ParametersItem.Oneof has unexpected type %T", x) - } - return nil -} - -func _ParametersItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*ParametersItem) - switch tag { - case 1: // oneof.parameter - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Parameter) - err := b.DecodeMessage(msg) - m.Oneof = &ParametersItem_Parameter{msg} - return true, err - case 2: // oneof.json_reference - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(JsonReference) - err := b.DecodeMessage(msg) - m.Oneof = &ParametersItem_JsonReference{msg} - return true, err - default: - return false, nil - } -} - -func _ParametersItem_OneofSizer(msg proto.Message) (n int) { - m := msg.(*ParametersItem) - // oneof - switch x := m.Oneof.(type) { - case *ParametersItem_Parameter: - s := proto.Size(x.Parameter) - n += proto.SizeVarint(1<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *ParametersItem_JsonReference: - s := proto.Size(x.JsonReference) - n += proto.SizeVarint(2<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - -type PathItem struct { - XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref" json:"_ref,omitempty"` - Get *Operation `protobuf:"bytes,2,opt,name=get" json:"get,omitempty"` - Put *Operation `protobuf:"bytes,3,opt,name=put" json:"put,omitempty"` - Post *Operation `protobuf:"bytes,4,opt,name=post" json:"post,omitempty"` - Delete *Operation `protobuf:"bytes,5,opt,name=delete" json:"delete,omitempty"` - Options *Operation `protobuf:"bytes,6,opt,name=options" json:"options,omitempty"` - Head *Operation `protobuf:"bytes,7,opt,name=head" json:"head,omitempty"` - Patch *Operation `protobuf:"bytes,8,opt,name=patch" json:"patch,omitempty"` - // The parameters needed to send a valid API call. - Parameters []*ParametersItem `protobuf:"bytes,9,rep,name=parameters" json:"parameters,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,10,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *PathItem) Reset() { *m = PathItem{} } -func (m *PathItem) String() string { return proto.CompactTextString(m) } -func (*PathItem) ProtoMessage() {} -func (*PathItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} } - -func (m *PathItem) GetXRef() string { - if m != nil { - return m.XRef - } - return "" -} - -func (m *PathItem) GetGet() *Operation { - if m != nil { - return m.Get - } - return nil -} - -func (m *PathItem) GetPut() *Operation { - if m != nil { - return m.Put - } - return nil -} - -func (m *PathItem) GetPost() *Operation { - if m != nil { - return m.Post - } - return nil -} - -func (m *PathItem) GetDelete() *Operation { - if m != nil { - return m.Delete - } - return nil -} - -func (m *PathItem) GetOptions() *Operation { - if m != nil { - return m.Options - } - return nil -} - -func (m *PathItem) GetHead() *Operation { - if m != nil { - return m.Head - } - return nil -} - -func (m *PathItem) GetPatch() *Operation { - if m != nil { - return m.Patch - } - return nil -} - -func (m *PathItem) GetParameters() []*ParametersItem { - if m != nil { - return m.Parameters - } - return nil -} - -func (m *PathItem) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type PathParameterSubSchema struct { - // Determines whether or not this parameter is required or optional. - Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"` - // Determines the location of the parameter. - In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"` - // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. - Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` - // The name of the parameter. - Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` - Type string `protobuf:"bytes,5,opt,name=type" json:"type,omitempty"` - Format string `protobuf:"bytes,6,opt,name=format" json:"format,omitempty"` - Items *PrimitivesItems `protobuf:"bytes,7,opt,name=items" json:"items,omitempty"` - CollectionFormat string `protobuf:"bytes,8,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` - Default *Any `protobuf:"bytes,9,opt,name=default" json:"default,omitempty"` - Maximum float64 `protobuf:"fixed64,10,opt,name=maximum" json:"maximum,omitempty"` - ExclusiveMaximum bool `protobuf:"varint,11,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` - Minimum float64 `protobuf:"fixed64,12,opt,name=minimum" json:"minimum,omitempty"` - ExclusiveMinimum bool `protobuf:"varint,13,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` - MaxLength int64 `protobuf:"varint,14,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` - MinLength int64 `protobuf:"varint,15,opt,name=min_length,json=minLength" json:"min_length,omitempty"` - Pattern string `protobuf:"bytes,16,opt,name=pattern" json:"pattern,omitempty"` - MaxItems int64 `protobuf:"varint,17,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` - MinItems int64 `protobuf:"varint,18,opt,name=min_items,json=minItems" json:"min_items,omitempty"` - UniqueItems bool `protobuf:"varint,19,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` - Enum []*Any `protobuf:"bytes,20,rep,name=enum" json:"enum,omitempty"` - MultipleOf float64 `protobuf:"fixed64,21,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,22,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *PathParameterSubSchema) Reset() { *m = PathParameterSubSchema{} } -func (m *PathParameterSubSchema) String() string { return proto.CompactTextString(m) } -func (*PathParameterSubSchema) ProtoMessage() {} -func (*PathParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} } - -func (m *PathParameterSubSchema) GetRequired() bool { - if m != nil { - return m.Required - } - return false -} - -func (m *PathParameterSubSchema) GetIn() string { - if m != nil { - return m.In - } - return "" -} - -func (m *PathParameterSubSchema) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *PathParameterSubSchema) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *PathParameterSubSchema) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *PathParameterSubSchema) GetFormat() string { - if m != nil { - return m.Format - } - return "" -} - -func (m *PathParameterSubSchema) GetItems() *PrimitivesItems { - if m != nil { - return m.Items - } - return nil -} - -func (m *PathParameterSubSchema) GetCollectionFormat() string { - if m != nil { - return m.CollectionFormat - } - return "" -} - -func (m *PathParameterSubSchema) GetDefault() *Any { - if m != nil { - return m.Default - } - return nil -} - -func (m *PathParameterSubSchema) GetMaximum() float64 { - if m != nil { - return m.Maximum - } - return 0 -} - -func (m *PathParameterSubSchema) GetExclusiveMaximum() bool { - if m != nil { - return m.ExclusiveMaximum - } - return false -} - -func (m *PathParameterSubSchema) GetMinimum() float64 { - if m != nil { - return m.Minimum - } - return 0 -} - -func (m *PathParameterSubSchema) GetExclusiveMinimum() bool { - if m != nil { - return m.ExclusiveMinimum - } - return false -} - -func (m *PathParameterSubSchema) GetMaxLength() int64 { - if m != nil { - return m.MaxLength - } - return 0 -} - -func (m *PathParameterSubSchema) GetMinLength() int64 { - if m != nil { - return m.MinLength - } - return 0 -} - -func (m *PathParameterSubSchema) GetPattern() string { - if m != nil { - return m.Pattern - } - return "" -} - -func (m *PathParameterSubSchema) GetMaxItems() int64 { - if m != nil { - return m.MaxItems - } - return 0 -} - -func (m *PathParameterSubSchema) GetMinItems() int64 { - if m != nil { - return m.MinItems - } - return 0 -} - -func (m *PathParameterSubSchema) GetUniqueItems() bool { - if m != nil { - return m.UniqueItems - } - return false -} - -func (m *PathParameterSubSchema) GetEnum() []*Any { - if m != nil { - return m.Enum - } - return nil -} - -func (m *PathParameterSubSchema) GetMultipleOf() float64 { - if m != nil { - return m.MultipleOf - } - return 0 -} - -func (m *PathParameterSubSchema) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -// Relative paths to the individual endpoints. They must be relative to the 'basePath'. -type Paths struct { - VendorExtension []*NamedAny `protobuf:"bytes,1,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` - Path []*NamedPathItem `protobuf:"bytes,2,rep,name=path" json:"path,omitempty"` -} - -func (m *Paths) Reset() { *m = Paths{} } -func (m *Paths) String() string { return proto.CompactTextString(m) } -func (*Paths) ProtoMessage() {} -func (*Paths) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} } - -func (m *Paths) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -func (m *Paths) GetPath() []*NamedPathItem { - if m != nil { - return m.Path - } - return nil -} - -type PrimitivesItems struct { - Type string `protobuf:"bytes,1,opt,name=type" json:"type,omitempty"` - Format string `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"` - Items *PrimitivesItems `protobuf:"bytes,3,opt,name=items" json:"items,omitempty"` - CollectionFormat string `protobuf:"bytes,4,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` - Default *Any `protobuf:"bytes,5,opt,name=default" json:"default,omitempty"` - Maximum float64 `protobuf:"fixed64,6,opt,name=maximum" json:"maximum,omitempty"` - ExclusiveMaximum bool `protobuf:"varint,7,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` - Minimum float64 `protobuf:"fixed64,8,opt,name=minimum" json:"minimum,omitempty"` - ExclusiveMinimum bool `protobuf:"varint,9,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` - MaxLength int64 `protobuf:"varint,10,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` - MinLength int64 `protobuf:"varint,11,opt,name=min_length,json=minLength" json:"min_length,omitempty"` - Pattern string `protobuf:"bytes,12,opt,name=pattern" json:"pattern,omitempty"` - MaxItems int64 `protobuf:"varint,13,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` - MinItems int64 `protobuf:"varint,14,opt,name=min_items,json=minItems" json:"min_items,omitempty"` - UniqueItems bool `protobuf:"varint,15,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` - Enum []*Any `protobuf:"bytes,16,rep,name=enum" json:"enum,omitempty"` - MultipleOf float64 `protobuf:"fixed64,17,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,18,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *PrimitivesItems) Reset() { *m = PrimitivesItems{} } -func (m *PrimitivesItems) String() string { return proto.CompactTextString(m) } -func (*PrimitivesItems) ProtoMessage() {} -func (*PrimitivesItems) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} } - -func (m *PrimitivesItems) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *PrimitivesItems) GetFormat() string { - if m != nil { - return m.Format - } - return "" -} - -func (m *PrimitivesItems) GetItems() *PrimitivesItems { - if m != nil { - return m.Items - } - return nil -} - -func (m *PrimitivesItems) GetCollectionFormat() string { - if m != nil { - return m.CollectionFormat - } - return "" -} - -func (m *PrimitivesItems) GetDefault() *Any { - if m != nil { - return m.Default - } - return nil -} - -func (m *PrimitivesItems) GetMaximum() float64 { - if m != nil { - return m.Maximum - } - return 0 -} - -func (m *PrimitivesItems) GetExclusiveMaximum() bool { - if m != nil { - return m.ExclusiveMaximum - } - return false -} - -func (m *PrimitivesItems) GetMinimum() float64 { - if m != nil { - return m.Minimum - } - return 0 -} - -func (m *PrimitivesItems) GetExclusiveMinimum() bool { - if m != nil { - return m.ExclusiveMinimum - } - return false -} - -func (m *PrimitivesItems) GetMaxLength() int64 { - if m != nil { - return m.MaxLength - } - return 0 -} - -func (m *PrimitivesItems) GetMinLength() int64 { - if m != nil { - return m.MinLength - } - return 0 -} - -func (m *PrimitivesItems) GetPattern() string { - if m != nil { - return m.Pattern - } - return "" -} - -func (m *PrimitivesItems) GetMaxItems() int64 { - if m != nil { - return m.MaxItems - } - return 0 -} - -func (m *PrimitivesItems) GetMinItems() int64 { - if m != nil { - return m.MinItems - } - return 0 -} - -func (m *PrimitivesItems) GetUniqueItems() bool { - if m != nil { - return m.UniqueItems - } - return false -} - -func (m *PrimitivesItems) GetEnum() []*Any { - if m != nil { - return m.Enum - } - return nil -} - -func (m *PrimitivesItems) GetMultipleOf() float64 { - if m != nil { - return m.MultipleOf - } - return 0 -} - -func (m *PrimitivesItems) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type Properties struct { - AdditionalProperties []*NamedSchema `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` -} - -func (m *Properties) Reset() { *m = Properties{} } -func (m *Properties) String() string { return proto.CompactTextString(m) } -func (*Properties) ProtoMessage() {} -func (*Properties) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} } - -func (m *Properties) GetAdditionalProperties() []*NamedSchema { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -type QueryParameterSubSchema struct { - // Determines whether or not this parameter is required or optional. - Required bool `protobuf:"varint,1,opt,name=required" json:"required,omitempty"` - // Determines the location of the parameter. - In string `protobuf:"bytes,2,opt,name=in" json:"in,omitempty"` - // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. - Description string `protobuf:"bytes,3,opt,name=description" json:"description,omitempty"` - // The name of the parameter. - Name string `protobuf:"bytes,4,opt,name=name" json:"name,omitempty"` - // allows sending a parameter by name only or with an empty value. - AllowEmptyValue bool `protobuf:"varint,5,opt,name=allow_empty_value,json=allowEmptyValue" json:"allow_empty_value,omitempty"` - Type string `protobuf:"bytes,6,opt,name=type" json:"type,omitempty"` - Format string `protobuf:"bytes,7,opt,name=format" json:"format,omitempty"` - Items *PrimitivesItems `protobuf:"bytes,8,opt,name=items" json:"items,omitempty"` - CollectionFormat string `protobuf:"bytes,9,opt,name=collection_format,json=collectionFormat" json:"collection_format,omitempty"` - Default *Any `protobuf:"bytes,10,opt,name=default" json:"default,omitempty"` - Maximum float64 `protobuf:"fixed64,11,opt,name=maximum" json:"maximum,omitempty"` - ExclusiveMaximum bool `protobuf:"varint,12,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` - Minimum float64 `protobuf:"fixed64,13,opt,name=minimum" json:"minimum,omitempty"` - ExclusiveMinimum bool `protobuf:"varint,14,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` - MaxLength int64 `protobuf:"varint,15,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` - MinLength int64 `protobuf:"varint,16,opt,name=min_length,json=minLength" json:"min_length,omitempty"` - Pattern string `protobuf:"bytes,17,opt,name=pattern" json:"pattern,omitempty"` - MaxItems int64 `protobuf:"varint,18,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` - MinItems int64 `protobuf:"varint,19,opt,name=min_items,json=minItems" json:"min_items,omitempty"` - UniqueItems bool `protobuf:"varint,20,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` - Enum []*Any `protobuf:"bytes,21,rep,name=enum" json:"enum,omitempty"` - MultipleOf float64 `protobuf:"fixed64,22,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,23,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *QueryParameterSubSchema) Reset() { *m = QueryParameterSubSchema{} } -func (m *QueryParameterSubSchema) String() string { return proto.CompactTextString(m) } -func (*QueryParameterSubSchema) ProtoMessage() {} -func (*QueryParameterSubSchema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} } - -func (m *QueryParameterSubSchema) GetRequired() bool { - if m != nil { - return m.Required - } - return false -} - -func (m *QueryParameterSubSchema) GetIn() string { - if m != nil { - return m.In - } - return "" -} - -func (m *QueryParameterSubSchema) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *QueryParameterSubSchema) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *QueryParameterSubSchema) GetAllowEmptyValue() bool { - if m != nil { - return m.AllowEmptyValue - } - return false -} - -func (m *QueryParameterSubSchema) GetType() string { - if m != nil { - return m.Type - } - return "" -} - -func (m *QueryParameterSubSchema) GetFormat() string { - if m != nil { - return m.Format - } - return "" -} - -func (m *QueryParameterSubSchema) GetItems() *PrimitivesItems { - if m != nil { - return m.Items - } - return nil -} - -func (m *QueryParameterSubSchema) GetCollectionFormat() string { - if m != nil { - return m.CollectionFormat - } - return "" -} - -func (m *QueryParameterSubSchema) GetDefault() *Any { - if m != nil { - return m.Default - } - return nil -} - -func (m *QueryParameterSubSchema) GetMaximum() float64 { - if m != nil { - return m.Maximum - } - return 0 -} - -func (m *QueryParameterSubSchema) GetExclusiveMaximum() bool { - if m != nil { - return m.ExclusiveMaximum - } - return false -} - -func (m *QueryParameterSubSchema) GetMinimum() float64 { - if m != nil { - return m.Minimum - } - return 0 -} - -func (m *QueryParameterSubSchema) GetExclusiveMinimum() bool { - if m != nil { - return m.ExclusiveMinimum - } - return false -} - -func (m *QueryParameterSubSchema) GetMaxLength() int64 { - if m != nil { - return m.MaxLength - } - return 0 -} - -func (m *QueryParameterSubSchema) GetMinLength() int64 { - if m != nil { - return m.MinLength - } - return 0 -} - -func (m *QueryParameterSubSchema) GetPattern() string { - if m != nil { - return m.Pattern - } - return "" -} - -func (m *QueryParameterSubSchema) GetMaxItems() int64 { - if m != nil { - return m.MaxItems - } - return 0 -} - -func (m *QueryParameterSubSchema) GetMinItems() int64 { - if m != nil { - return m.MinItems - } - return 0 -} - -func (m *QueryParameterSubSchema) GetUniqueItems() bool { - if m != nil { - return m.UniqueItems - } - return false -} - -func (m *QueryParameterSubSchema) GetEnum() []*Any { - if m != nil { - return m.Enum - } - return nil -} - -func (m *QueryParameterSubSchema) GetMultipleOf() float64 { - if m != nil { - return m.MultipleOf - } - return 0 -} - -func (m *QueryParameterSubSchema) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type Response struct { - Description string `protobuf:"bytes,1,opt,name=description" json:"description,omitempty"` - Schema *SchemaItem `protobuf:"bytes,2,opt,name=schema" json:"schema,omitempty"` - Headers *Headers `protobuf:"bytes,3,opt,name=headers" json:"headers,omitempty"` - Examples *Examples `protobuf:"bytes,4,opt,name=examples" json:"examples,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,5,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Response) Reset() { *m = Response{} } -func (m *Response) String() string { return proto.CompactTextString(m) } -func (*Response) ProtoMessage() {} -func (*Response) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} } - -func (m *Response) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *Response) GetSchema() *SchemaItem { - if m != nil { - return m.Schema - } - return nil -} - -func (m *Response) GetHeaders() *Headers { - if m != nil { - return m.Headers - } - return nil -} - -func (m *Response) GetExamples() *Examples { - if m != nil { - return m.Examples - } - return nil -} - -func (m *Response) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -// One or more JSON representations for parameters -type ResponseDefinitions struct { - AdditionalProperties []*NamedResponse `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` -} - -func (m *ResponseDefinitions) Reset() { *m = ResponseDefinitions{} } -func (m *ResponseDefinitions) String() string { return proto.CompactTextString(m) } -func (*ResponseDefinitions) ProtoMessage() {} -func (*ResponseDefinitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} } - -func (m *ResponseDefinitions) GetAdditionalProperties() []*NamedResponse { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -type ResponseValue struct { - // Types that are valid to be assigned to Oneof: - // *ResponseValue_Response - // *ResponseValue_JsonReference - Oneof isResponseValue_Oneof `protobuf_oneof:"oneof"` -} - -func (m *ResponseValue) Reset() { *m = ResponseValue{} } -func (m *ResponseValue) String() string { return proto.CompactTextString(m) } -func (*ResponseValue) ProtoMessage() {} -func (*ResponseValue) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} } - -type isResponseValue_Oneof interface { - isResponseValue_Oneof() -} - -type ResponseValue_Response struct { - Response *Response `protobuf:"bytes,1,opt,name=response,oneof"` -} -type ResponseValue_JsonReference struct { - JsonReference *JsonReference `protobuf:"bytes,2,opt,name=json_reference,json=jsonReference,oneof"` -} - -func (*ResponseValue_Response) isResponseValue_Oneof() {} -func (*ResponseValue_JsonReference) isResponseValue_Oneof() {} - -func (m *ResponseValue) GetOneof() isResponseValue_Oneof { - if m != nil { - return m.Oneof - } - return nil -} - -func (m *ResponseValue) GetResponse() *Response { - if x, ok := m.GetOneof().(*ResponseValue_Response); ok { - return x.Response - } - return nil -} - -func (m *ResponseValue) GetJsonReference() *JsonReference { - if x, ok := m.GetOneof().(*ResponseValue_JsonReference); ok { - return x.JsonReference - } - return nil -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*ResponseValue) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _ResponseValue_OneofMarshaler, _ResponseValue_OneofUnmarshaler, _ResponseValue_OneofSizer, []interface{}{ - (*ResponseValue_Response)(nil), - (*ResponseValue_JsonReference)(nil), - } -} - -func _ResponseValue_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*ResponseValue) - // oneof - switch x := m.Oneof.(type) { - case *ResponseValue_Response: - b.EncodeVarint(1<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.Response); err != nil { - return err - } - case *ResponseValue_JsonReference: - b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.JsonReference); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("ResponseValue.Oneof has unexpected type %T", x) - } - return nil -} - -func _ResponseValue_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*ResponseValue) - switch tag { - case 1: // oneof.response - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Response) - err := b.DecodeMessage(msg) - m.Oneof = &ResponseValue_Response{msg} - return true, err - case 2: // oneof.json_reference - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(JsonReference) - err := b.DecodeMessage(msg) - m.Oneof = &ResponseValue_JsonReference{msg} - return true, err - default: - return false, nil - } -} - -func _ResponseValue_OneofSizer(msg proto.Message) (n int) { - m := msg.(*ResponseValue) - // oneof - switch x := m.Oneof.(type) { - case *ResponseValue_Response: - s := proto.Size(x.Response) - n += proto.SizeVarint(1<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *ResponseValue_JsonReference: - s := proto.Size(x.JsonReference) - n += proto.SizeVarint(2<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - -// Response objects names can either be any valid HTTP status code or 'default'. -type Responses struct { - ResponseCode []*NamedResponseValue `protobuf:"bytes,1,rep,name=response_code,json=responseCode" json:"response_code,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,2,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Responses) Reset() { *m = Responses{} } -func (m *Responses) String() string { return proto.CompactTextString(m) } -func (*Responses) ProtoMessage() {} -func (*Responses) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} } - -func (m *Responses) GetResponseCode() []*NamedResponseValue { - if m != nil { - return m.ResponseCode - } - return nil -} - -func (m *Responses) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -// A deterministic version of a JSON Schema object. -type Schema struct { - XRef string `protobuf:"bytes,1,opt,name=_ref,json=Ref" json:"_ref,omitempty"` - Format string `protobuf:"bytes,2,opt,name=format" json:"format,omitempty"` - Title string `protobuf:"bytes,3,opt,name=title" json:"title,omitempty"` - Description string `protobuf:"bytes,4,opt,name=description" json:"description,omitempty"` - Default *Any `protobuf:"bytes,5,opt,name=default" json:"default,omitempty"` - MultipleOf float64 `protobuf:"fixed64,6,opt,name=multiple_of,json=multipleOf" json:"multiple_of,omitempty"` - Maximum float64 `protobuf:"fixed64,7,opt,name=maximum" json:"maximum,omitempty"` - ExclusiveMaximum bool `protobuf:"varint,8,opt,name=exclusive_maximum,json=exclusiveMaximum" json:"exclusive_maximum,omitempty"` - Minimum float64 `protobuf:"fixed64,9,opt,name=minimum" json:"minimum,omitempty"` - ExclusiveMinimum bool `protobuf:"varint,10,opt,name=exclusive_minimum,json=exclusiveMinimum" json:"exclusive_minimum,omitempty"` - MaxLength int64 `protobuf:"varint,11,opt,name=max_length,json=maxLength" json:"max_length,omitempty"` - MinLength int64 `protobuf:"varint,12,opt,name=min_length,json=minLength" json:"min_length,omitempty"` - Pattern string `protobuf:"bytes,13,opt,name=pattern" json:"pattern,omitempty"` - MaxItems int64 `protobuf:"varint,14,opt,name=max_items,json=maxItems" json:"max_items,omitempty"` - MinItems int64 `protobuf:"varint,15,opt,name=min_items,json=minItems" json:"min_items,omitempty"` - UniqueItems bool `protobuf:"varint,16,opt,name=unique_items,json=uniqueItems" json:"unique_items,omitempty"` - MaxProperties int64 `protobuf:"varint,17,opt,name=max_properties,json=maxProperties" json:"max_properties,omitempty"` - MinProperties int64 `protobuf:"varint,18,opt,name=min_properties,json=minProperties" json:"min_properties,omitempty"` - Required []string `protobuf:"bytes,19,rep,name=required" json:"required,omitempty"` - Enum []*Any `protobuf:"bytes,20,rep,name=enum" json:"enum,omitempty"` - AdditionalProperties *AdditionalPropertiesItem `protobuf:"bytes,21,opt,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` - Type *TypeItem `protobuf:"bytes,22,opt,name=type" json:"type,omitempty"` - Items *ItemsItem `protobuf:"bytes,23,opt,name=items" json:"items,omitempty"` - AllOf []*Schema `protobuf:"bytes,24,rep,name=all_of,json=allOf" json:"all_of,omitempty"` - Properties *Properties `protobuf:"bytes,25,opt,name=properties" json:"properties,omitempty"` - Discriminator string `protobuf:"bytes,26,opt,name=discriminator" json:"discriminator,omitempty"` - ReadOnly bool `protobuf:"varint,27,opt,name=read_only,json=readOnly" json:"read_only,omitempty"` - Xml *Xml `protobuf:"bytes,28,opt,name=xml" json:"xml,omitempty"` - ExternalDocs *ExternalDocs `protobuf:"bytes,29,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"` - Example *Any `protobuf:"bytes,30,opt,name=example" json:"example,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,31,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Schema) Reset() { *m = Schema{} } -func (m *Schema) String() string { return proto.CompactTextString(m) } -func (*Schema) ProtoMessage() {} -func (*Schema) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} } - -func (m *Schema) GetXRef() string { - if m != nil { - return m.XRef - } - return "" -} - -func (m *Schema) GetFormat() string { - if m != nil { - return m.Format - } - return "" -} - -func (m *Schema) GetTitle() string { - if m != nil { - return m.Title - } - return "" -} - -func (m *Schema) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *Schema) GetDefault() *Any { - if m != nil { - return m.Default - } - return nil -} - -func (m *Schema) GetMultipleOf() float64 { - if m != nil { - return m.MultipleOf - } - return 0 -} - -func (m *Schema) GetMaximum() float64 { - if m != nil { - return m.Maximum - } - return 0 -} - -func (m *Schema) GetExclusiveMaximum() bool { - if m != nil { - return m.ExclusiveMaximum - } - return false -} - -func (m *Schema) GetMinimum() float64 { - if m != nil { - return m.Minimum - } - return 0 -} - -func (m *Schema) GetExclusiveMinimum() bool { - if m != nil { - return m.ExclusiveMinimum - } - return false -} - -func (m *Schema) GetMaxLength() int64 { - if m != nil { - return m.MaxLength - } - return 0 -} - -func (m *Schema) GetMinLength() int64 { - if m != nil { - return m.MinLength - } - return 0 -} - -func (m *Schema) GetPattern() string { - if m != nil { - return m.Pattern - } - return "" -} - -func (m *Schema) GetMaxItems() int64 { - if m != nil { - return m.MaxItems - } - return 0 -} - -func (m *Schema) GetMinItems() int64 { - if m != nil { - return m.MinItems - } - return 0 -} - -func (m *Schema) GetUniqueItems() bool { - if m != nil { - return m.UniqueItems - } - return false -} - -func (m *Schema) GetMaxProperties() int64 { - if m != nil { - return m.MaxProperties - } - return 0 -} - -func (m *Schema) GetMinProperties() int64 { - if m != nil { - return m.MinProperties - } - return 0 -} - -func (m *Schema) GetRequired() []string { - if m != nil { - return m.Required - } - return nil -} - -func (m *Schema) GetEnum() []*Any { - if m != nil { - return m.Enum - } - return nil -} - -func (m *Schema) GetAdditionalProperties() *AdditionalPropertiesItem { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -func (m *Schema) GetType() *TypeItem { - if m != nil { - return m.Type - } - return nil -} - -func (m *Schema) GetItems() *ItemsItem { - if m != nil { - return m.Items - } - return nil -} - -func (m *Schema) GetAllOf() []*Schema { - if m != nil { - return m.AllOf - } - return nil -} - -func (m *Schema) GetProperties() *Properties { - if m != nil { - return m.Properties - } - return nil -} - -func (m *Schema) GetDiscriminator() string { - if m != nil { - return m.Discriminator - } - return "" -} - -func (m *Schema) GetReadOnly() bool { - if m != nil { - return m.ReadOnly - } - return false -} - -func (m *Schema) GetXml() *Xml { - if m != nil { - return m.Xml - } - return nil -} - -func (m *Schema) GetExternalDocs() *ExternalDocs { - if m != nil { - return m.ExternalDocs - } - return nil -} - -func (m *Schema) GetExample() *Any { - if m != nil { - return m.Example - } - return nil -} - -func (m *Schema) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type SchemaItem struct { - // Types that are valid to be assigned to Oneof: - // *SchemaItem_Schema - // *SchemaItem_FileSchema - Oneof isSchemaItem_Oneof `protobuf_oneof:"oneof"` -} - -func (m *SchemaItem) Reset() { *m = SchemaItem{} } -func (m *SchemaItem) String() string { return proto.CompactTextString(m) } -func (*SchemaItem) ProtoMessage() {} -func (*SchemaItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} } - -type isSchemaItem_Oneof interface { - isSchemaItem_Oneof() -} - -type SchemaItem_Schema struct { - Schema *Schema `protobuf:"bytes,1,opt,name=schema,oneof"` -} -type SchemaItem_FileSchema struct { - FileSchema *FileSchema `protobuf:"bytes,2,opt,name=file_schema,json=fileSchema,oneof"` -} - -func (*SchemaItem_Schema) isSchemaItem_Oneof() {} -func (*SchemaItem_FileSchema) isSchemaItem_Oneof() {} - -func (m *SchemaItem) GetOneof() isSchemaItem_Oneof { - if m != nil { - return m.Oneof - } - return nil -} - -func (m *SchemaItem) GetSchema() *Schema { - if x, ok := m.GetOneof().(*SchemaItem_Schema); ok { - return x.Schema - } - return nil -} - -func (m *SchemaItem) GetFileSchema() *FileSchema { - if x, ok := m.GetOneof().(*SchemaItem_FileSchema); ok { - return x.FileSchema - } - return nil -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*SchemaItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _SchemaItem_OneofMarshaler, _SchemaItem_OneofUnmarshaler, _SchemaItem_OneofSizer, []interface{}{ - (*SchemaItem_Schema)(nil), - (*SchemaItem_FileSchema)(nil), - } -} - -func _SchemaItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*SchemaItem) - // oneof - switch x := m.Oneof.(type) { - case *SchemaItem_Schema: - b.EncodeVarint(1<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.Schema); err != nil { - return err - } - case *SchemaItem_FileSchema: - b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.FileSchema); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("SchemaItem.Oneof has unexpected type %T", x) - } - return nil -} - -func _SchemaItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*SchemaItem) - switch tag { - case 1: // oneof.schema - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Schema) - err := b.DecodeMessage(msg) - m.Oneof = &SchemaItem_Schema{msg} - return true, err - case 2: // oneof.file_schema - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(FileSchema) - err := b.DecodeMessage(msg) - m.Oneof = &SchemaItem_FileSchema{msg} - return true, err - default: - return false, nil - } -} - -func _SchemaItem_OneofSizer(msg proto.Message) (n int) { - m := msg.(*SchemaItem) - // oneof - switch x := m.Oneof.(type) { - case *SchemaItem_Schema: - s := proto.Size(x.Schema) - n += proto.SizeVarint(1<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *SchemaItem_FileSchema: - s := proto.Size(x.FileSchema) - n += proto.SizeVarint(2<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - -type SecurityDefinitions struct { - AdditionalProperties []*NamedSecurityDefinitionsItem `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` -} - -func (m *SecurityDefinitions) Reset() { *m = SecurityDefinitions{} } -func (m *SecurityDefinitions) String() string { return proto.CompactTextString(m) } -func (*SecurityDefinitions) ProtoMessage() {} -func (*SecurityDefinitions) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} } - -func (m *SecurityDefinitions) GetAdditionalProperties() []*NamedSecurityDefinitionsItem { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -type SecurityDefinitionsItem struct { - // Types that are valid to be assigned to Oneof: - // *SecurityDefinitionsItem_BasicAuthenticationSecurity - // *SecurityDefinitionsItem_ApiKeySecurity - // *SecurityDefinitionsItem_Oauth2ImplicitSecurity - // *SecurityDefinitionsItem_Oauth2PasswordSecurity - // *SecurityDefinitionsItem_Oauth2ApplicationSecurity - // *SecurityDefinitionsItem_Oauth2AccessCodeSecurity - Oneof isSecurityDefinitionsItem_Oneof `protobuf_oneof:"oneof"` -} - -func (m *SecurityDefinitionsItem) Reset() { *m = SecurityDefinitionsItem{} } -func (m *SecurityDefinitionsItem) String() string { return proto.CompactTextString(m) } -func (*SecurityDefinitionsItem) ProtoMessage() {} -func (*SecurityDefinitionsItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} } - -type isSecurityDefinitionsItem_Oneof interface { - isSecurityDefinitionsItem_Oneof() -} - -type SecurityDefinitionsItem_BasicAuthenticationSecurity struct { - BasicAuthenticationSecurity *BasicAuthenticationSecurity `protobuf:"bytes,1,opt,name=basic_authentication_security,json=basicAuthenticationSecurity,oneof"` -} -type SecurityDefinitionsItem_ApiKeySecurity struct { - ApiKeySecurity *ApiKeySecurity `protobuf:"bytes,2,opt,name=api_key_security,json=apiKeySecurity,oneof"` -} -type SecurityDefinitionsItem_Oauth2ImplicitSecurity struct { - Oauth2ImplicitSecurity *Oauth2ImplicitSecurity `protobuf:"bytes,3,opt,name=oauth2_implicit_security,json=oauth2ImplicitSecurity,oneof"` -} -type SecurityDefinitionsItem_Oauth2PasswordSecurity struct { - Oauth2PasswordSecurity *Oauth2PasswordSecurity `protobuf:"bytes,4,opt,name=oauth2_password_security,json=oauth2PasswordSecurity,oneof"` -} -type SecurityDefinitionsItem_Oauth2ApplicationSecurity struct { - Oauth2ApplicationSecurity *Oauth2ApplicationSecurity `protobuf:"bytes,5,opt,name=oauth2_application_security,json=oauth2ApplicationSecurity,oneof"` -} -type SecurityDefinitionsItem_Oauth2AccessCodeSecurity struct { - Oauth2AccessCodeSecurity *Oauth2AccessCodeSecurity `protobuf:"bytes,6,opt,name=oauth2_access_code_security,json=oauth2AccessCodeSecurity,oneof"` -} - -func (*SecurityDefinitionsItem_BasicAuthenticationSecurity) isSecurityDefinitionsItem_Oneof() {} -func (*SecurityDefinitionsItem_ApiKeySecurity) isSecurityDefinitionsItem_Oneof() {} -func (*SecurityDefinitionsItem_Oauth2ImplicitSecurity) isSecurityDefinitionsItem_Oneof() {} -func (*SecurityDefinitionsItem_Oauth2PasswordSecurity) isSecurityDefinitionsItem_Oneof() {} -func (*SecurityDefinitionsItem_Oauth2ApplicationSecurity) isSecurityDefinitionsItem_Oneof() {} -func (*SecurityDefinitionsItem_Oauth2AccessCodeSecurity) isSecurityDefinitionsItem_Oneof() {} - -func (m *SecurityDefinitionsItem) GetOneof() isSecurityDefinitionsItem_Oneof { - if m != nil { - return m.Oneof - } - return nil -} - -func (m *SecurityDefinitionsItem) GetBasicAuthenticationSecurity() *BasicAuthenticationSecurity { - if x, ok := m.GetOneof().(*SecurityDefinitionsItem_BasicAuthenticationSecurity); ok { - return x.BasicAuthenticationSecurity - } - return nil -} - -func (m *SecurityDefinitionsItem) GetApiKeySecurity() *ApiKeySecurity { - if x, ok := m.GetOneof().(*SecurityDefinitionsItem_ApiKeySecurity); ok { - return x.ApiKeySecurity - } - return nil -} - -func (m *SecurityDefinitionsItem) GetOauth2ImplicitSecurity() *Oauth2ImplicitSecurity { - if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2ImplicitSecurity); ok { - return x.Oauth2ImplicitSecurity - } - return nil -} - -func (m *SecurityDefinitionsItem) GetOauth2PasswordSecurity() *Oauth2PasswordSecurity { - if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2PasswordSecurity); ok { - return x.Oauth2PasswordSecurity - } - return nil -} - -func (m *SecurityDefinitionsItem) GetOauth2ApplicationSecurity() *Oauth2ApplicationSecurity { - if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2ApplicationSecurity); ok { - return x.Oauth2ApplicationSecurity - } - return nil -} - -func (m *SecurityDefinitionsItem) GetOauth2AccessCodeSecurity() *Oauth2AccessCodeSecurity { - if x, ok := m.GetOneof().(*SecurityDefinitionsItem_Oauth2AccessCodeSecurity); ok { - return x.Oauth2AccessCodeSecurity - } - return nil -} - -// XXX_OneofFuncs is for the internal use of the proto package. -func (*SecurityDefinitionsItem) XXX_OneofFuncs() (func(msg proto.Message, b *proto.Buffer) error, func(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error), func(msg proto.Message) (n int), []interface{}) { - return _SecurityDefinitionsItem_OneofMarshaler, _SecurityDefinitionsItem_OneofUnmarshaler, _SecurityDefinitionsItem_OneofSizer, []interface{}{ - (*SecurityDefinitionsItem_BasicAuthenticationSecurity)(nil), - (*SecurityDefinitionsItem_ApiKeySecurity)(nil), - (*SecurityDefinitionsItem_Oauth2ImplicitSecurity)(nil), - (*SecurityDefinitionsItem_Oauth2PasswordSecurity)(nil), - (*SecurityDefinitionsItem_Oauth2ApplicationSecurity)(nil), - (*SecurityDefinitionsItem_Oauth2AccessCodeSecurity)(nil), - } -} - -func _SecurityDefinitionsItem_OneofMarshaler(msg proto.Message, b *proto.Buffer) error { - m := msg.(*SecurityDefinitionsItem) - // oneof - switch x := m.Oneof.(type) { - case *SecurityDefinitionsItem_BasicAuthenticationSecurity: - b.EncodeVarint(1<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.BasicAuthenticationSecurity); err != nil { - return err - } - case *SecurityDefinitionsItem_ApiKeySecurity: - b.EncodeVarint(2<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.ApiKeySecurity); err != nil { - return err - } - case *SecurityDefinitionsItem_Oauth2ImplicitSecurity: - b.EncodeVarint(3<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.Oauth2ImplicitSecurity); err != nil { - return err - } - case *SecurityDefinitionsItem_Oauth2PasswordSecurity: - b.EncodeVarint(4<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.Oauth2PasswordSecurity); err != nil { - return err - } - case *SecurityDefinitionsItem_Oauth2ApplicationSecurity: - b.EncodeVarint(5<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.Oauth2ApplicationSecurity); err != nil { - return err - } - case *SecurityDefinitionsItem_Oauth2AccessCodeSecurity: - b.EncodeVarint(6<<3 | proto.WireBytes) - if err := b.EncodeMessage(x.Oauth2AccessCodeSecurity); err != nil { - return err - } - case nil: - default: - return fmt.Errorf("SecurityDefinitionsItem.Oneof has unexpected type %T", x) - } - return nil -} - -func _SecurityDefinitionsItem_OneofUnmarshaler(msg proto.Message, tag, wire int, b *proto.Buffer) (bool, error) { - m := msg.(*SecurityDefinitionsItem) - switch tag { - case 1: // oneof.basic_authentication_security - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(BasicAuthenticationSecurity) - err := b.DecodeMessage(msg) - m.Oneof = &SecurityDefinitionsItem_BasicAuthenticationSecurity{msg} - return true, err - case 2: // oneof.api_key_security - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(ApiKeySecurity) - err := b.DecodeMessage(msg) - m.Oneof = &SecurityDefinitionsItem_ApiKeySecurity{msg} - return true, err - case 3: // oneof.oauth2_implicit_security - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Oauth2ImplicitSecurity) - err := b.DecodeMessage(msg) - m.Oneof = &SecurityDefinitionsItem_Oauth2ImplicitSecurity{msg} - return true, err - case 4: // oneof.oauth2_password_security - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Oauth2PasswordSecurity) - err := b.DecodeMessage(msg) - m.Oneof = &SecurityDefinitionsItem_Oauth2PasswordSecurity{msg} - return true, err - case 5: // oneof.oauth2_application_security - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Oauth2ApplicationSecurity) - err := b.DecodeMessage(msg) - m.Oneof = &SecurityDefinitionsItem_Oauth2ApplicationSecurity{msg} - return true, err - case 6: // oneof.oauth2_access_code_security - if wire != proto.WireBytes { - return true, proto.ErrInternalBadWireType - } - msg := new(Oauth2AccessCodeSecurity) - err := b.DecodeMessage(msg) - m.Oneof = &SecurityDefinitionsItem_Oauth2AccessCodeSecurity{msg} - return true, err - default: - return false, nil - } -} - -func _SecurityDefinitionsItem_OneofSizer(msg proto.Message) (n int) { - m := msg.(*SecurityDefinitionsItem) - // oneof - switch x := m.Oneof.(type) { - case *SecurityDefinitionsItem_BasicAuthenticationSecurity: - s := proto.Size(x.BasicAuthenticationSecurity) - n += proto.SizeVarint(1<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *SecurityDefinitionsItem_ApiKeySecurity: - s := proto.Size(x.ApiKeySecurity) - n += proto.SizeVarint(2<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *SecurityDefinitionsItem_Oauth2ImplicitSecurity: - s := proto.Size(x.Oauth2ImplicitSecurity) - n += proto.SizeVarint(3<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *SecurityDefinitionsItem_Oauth2PasswordSecurity: - s := proto.Size(x.Oauth2PasswordSecurity) - n += proto.SizeVarint(4<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *SecurityDefinitionsItem_Oauth2ApplicationSecurity: - s := proto.Size(x.Oauth2ApplicationSecurity) - n += proto.SizeVarint(5<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case *SecurityDefinitionsItem_Oauth2AccessCodeSecurity: - s := proto.Size(x.Oauth2AccessCodeSecurity) - n += proto.SizeVarint(6<<3 | proto.WireBytes) - n += proto.SizeVarint(uint64(s)) - n += s - case nil: - default: - panic(fmt.Sprintf("proto: unexpected type %T in oneof", x)) - } - return n -} - -type SecurityRequirement struct { - AdditionalProperties []*NamedStringArray `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` -} - -func (m *SecurityRequirement) Reset() { *m = SecurityRequirement{} } -func (m *SecurityRequirement) String() string { return proto.CompactTextString(m) } -func (*SecurityRequirement) ProtoMessage() {} -func (*SecurityRequirement) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} } - -func (m *SecurityRequirement) GetAdditionalProperties() []*NamedStringArray { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -type StringArray struct { - Value []string `protobuf:"bytes,1,rep,name=value" json:"value,omitempty"` -} - -func (m *StringArray) Reset() { *m = StringArray{} } -func (m *StringArray) String() string { return proto.CompactTextString(m) } -func (*StringArray) ProtoMessage() {} -func (*StringArray) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} } - -func (m *StringArray) GetValue() []string { - if m != nil { - return m.Value - } - return nil -} - -type Tag struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Description string `protobuf:"bytes,2,opt,name=description" json:"description,omitempty"` - ExternalDocs *ExternalDocs `protobuf:"bytes,3,opt,name=external_docs,json=externalDocs" json:"external_docs,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,4,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Tag) Reset() { *m = Tag{} } -func (m *Tag) String() string { return proto.CompactTextString(m) } -func (*Tag) ProtoMessage() {} -func (*Tag) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} } - -func (m *Tag) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Tag) GetDescription() string { - if m != nil { - return m.Description - } - return "" -} - -func (m *Tag) GetExternalDocs() *ExternalDocs { - if m != nil { - return m.ExternalDocs - } - return nil -} - -func (m *Tag) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -type TypeItem struct { - Value []string `protobuf:"bytes,1,rep,name=value" json:"value,omitempty"` -} - -func (m *TypeItem) Reset() { *m = TypeItem{} } -func (m *TypeItem) String() string { return proto.CompactTextString(m) } -func (*TypeItem) ProtoMessage() {} -func (*TypeItem) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} } - -func (m *TypeItem) GetValue() []string { - if m != nil { - return m.Value - } - return nil -} - -// Any property starting with x- is valid. -type VendorExtension struct { - AdditionalProperties []*NamedAny `protobuf:"bytes,1,rep,name=additional_properties,json=additionalProperties" json:"additional_properties,omitempty"` -} - -func (m *VendorExtension) Reset() { *m = VendorExtension{} } -func (m *VendorExtension) String() string { return proto.CompactTextString(m) } -func (*VendorExtension) ProtoMessage() {} -func (*VendorExtension) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} } - -func (m *VendorExtension) GetAdditionalProperties() []*NamedAny { - if m != nil { - return m.AdditionalProperties - } - return nil -} - -type Xml struct { - Name string `protobuf:"bytes,1,opt,name=name" json:"name,omitempty"` - Namespace string `protobuf:"bytes,2,opt,name=namespace" json:"namespace,omitempty"` - Prefix string `protobuf:"bytes,3,opt,name=prefix" json:"prefix,omitempty"` - Attribute bool `protobuf:"varint,4,opt,name=attribute" json:"attribute,omitempty"` - Wrapped bool `protobuf:"varint,5,opt,name=wrapped" json:"wrapped,omitempty"` - VendorExtension []*NamedAny `protobuf:"bytes,6,rep,name=vendor_extension,json=vendorExtension" json:"vendor_extension,omitempty"` -} - -func (m *Xml) Reset() { *m = Xml{} } -func (m *Xml) String() string { return proto.CompactTextString(m) } -func (*Xml) ProtoMessage() {} -func (*Xml) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} } - -func (m *Xml) GetName() string { - if m != nil { - return m.Name - } - return "" -} - -func (m *Xml) GetNamespace() string { - if m != nil { - return m.Namespace - } - return "" -} - -func (m *Xml) GetPrefix() string { - if m != nil { - return m.Prefix - } - return "" -} - -func (m *Xml) GetAttribute() bool { - if m != nil { - return m.Attribute - } - return false -} - -func (m *Xml) GetWrapped() bool { - if m != nil { - return m.Wrapped - } - return false -} - -func (m *Xml) GetVendorExtension() []*NamedAny { - if m != nil { - return m.VendorExtension - } - return nil -} - -func init() { - proto.RegisterType((*AdditionalPropertiesItem)(nil), "openapi.v2.AdditionalPropertiesItem") - proto.RegisterType((*Any)(nil), "openapi.v2.Any") - proto.RegisterType((*ApiKeySecurity)(nil), "openapi.v2.ApiKeySecurity") - proto.RegisterType((*BasicAuthenticationSecurity)(nil), "openapi.v2.BasicAuthenticationSecurity") - proto.RegisterType((*BodyParameter)(nil), "openapi.v2.BodyParameter") - proto.RegisterType((*Contact)(nil), "openapi.v2.Contact") - proto.RegisterType((*Default)(nil), "openapi.v2.Default") - proto.RegisterType((*Definitions)(nil), "openapi.v2.Definitions") - proto.RegisterType((*Document)(nil), "openapi.v2.Document") - proto.RegisterType((*Examples)(nil), "openapi.v2.Examples") - proto.RegisterType((*ExternalDocs)(nil), "openapi.v2.ExternalDocs") - proto.RegisterType((*FileSchema)(nil), "openapi.v2.FileSchema") - proto.RegisterType((*FormDataParameterSubSchema)(nil), "openapi.v2.FormDataParameterSubSchema") - proto.RegisterType((*Header)(nil), "openapi.v2.Header") - proto.RegisterType((*HeaderParameterSubSchema)(nil), "openapi.v2.HeaderParameterSubSchema") - proto.RegisterType((*Headers)(nil), "openapi.v2.Headers") - proto.RegisterType((*Info)(nil), "openapi.v2.Info") - proto.RegisterType((*ItemsItem)(nil), "openapi.v2.ItemsItem") - proto.RegisterType((*JsonReference)(nil), "openapi.v2.JsonReference") - proto.RegisterType((*License)(nil), "openapi.v2.License") - proto.RegisterType((*NamedAny)(nil), "openapi.v2.NamedAny") - proto.RegisterType((*NamedHeader)(nil), "openapi.v2.NamedHeader") - proto.RegisterType((*NamedParameter)(nil), "openapi.v2.NamedParameter") - proto.RegisterType((*NamedPathItem)(nil), "openapi.v2.NamedPathItem") - proto.RegisterType((*NamedResponse)(nil), "openapi.v2.NamedResponse") - proto.RegisterType((*NamedResponseValue)(nil), "openapi.v2.NamedResponseValue") - proto.RegisterType((*NamedSchema)(nil), "openapi.v2.NamedSchema") - proto.RegisterType((*NamedSecurityDefinitionsItem)(nil), "openapi.v2.NamedSecurityDefinitionsItem") - proto.RegisterType((*NamedString)(nil), "openapi.v2.NamedString") - proto.RegisterType((*NamedStringArray)(nil), "openapi.v2.NamedStringArray") - proto.RegisterType((*NonBodyParameter)(nil), "openapi.v2.NonBodyParameter") - proto.RegisterType((*Oauth2AccessCodeSecurity)(nil), "openapi.v2.Oauth2AccessCodeSecurity") - proto.RegisterType((*Oauth2ApplicationSecurity)(nil), "openapi.v2.Oauth2ApplicationSecurity") - proto.RegisterType((*Oauth2ImplicitSecurity)(nil), "openapi.v2.Oauth2ImplicitSecurity") - proto.RegisterType((*Oauth2PasswordSecurity)(nil), "openapi.v2.Oauth2PasswordSecurity") - proto.RegisterType((*Oauth2Scopes)(nil), "openapi.v2.Oauth2Scopes") - proto.RegisterType((*Operation)(nil), "openapi.v2.Operation") - proto.RegisterType((*Parameter)(nil), "openapi.v2.Parameter") - proto.RegisterType((*ParameterDefinitions)(nil), "openapi.v2.ParameterDefinitions") - proto.RegisterType((*ParametersItem)(nil), "openapi.v2.ParametersItem") - proto.RegisterType((*PathItem)(nil), "openapi.v2.PathItem") - proto.RegisterType((*PathParameterSubSchema)(nil), "openapi.v2.PathParameterSubSchema") - proto.RegisterType((*Paths)(nil), "openapi.v2.Paths") - proto.RegisterType((*PrimitivesItems)(nil), "openapi.v2.PrimitivesItems") - proto.RegisterType((*Properties)(nil), "openapi.v2.Properties") - proto.RegisterType((*QueryParameterSubSchema)(nil), "openapi.v2.QueryParameterSubSchema") - proto.RegisterType((*Response)(nil), "openapi.v2.Response") - proto.RegisterType((*ResponseDefinitions)(nil), "openapi.v2.ResponseDefinitions") - proto.RegisterType((*ResponseValue)(nil), "openapi.v2.ResponseValue") - proto.RegisterType((*Responses)(nil), "openapi.v2.Responses") - proto.RegisterType((*Schema)(nil), "openapi.v2.Schema") - proto.RegisterType((*SchemaItem)(nil), "openapi.v2.SchemaItem") - proto.RegisterType((*SecurityDefinitions)(nil), "openapi.v2.SecurityDefinitions") - proto.RegisterType((*SecurityDefinitionsItem)(nil), "openapi.v2.SecurityDefinitionsItem") - proto.RegisterType((*SecurityRequirement)(nil), "openapi.v2.SecurityRequirement") - proto.RegisterType((*StringArray)(nil), "openapi.v2.StringArray") - proto.RegisterType((*Tag)(nil), "openapi.v2.Tag") - proto.RegisterType((*TypeItem)(nil), "openapi.v2.TypeItem") - proto.RegisterType((*VendorExtension)(nil), "openapi.v2.VendorExtension") - proto.RegisterType((*Xml)(nil), "openapi.v2.Xml") -} - -func init() { proto.RegisterFile("OpenAPIv2/OpenAPIv2.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 3129 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0xec, 0x3b, 0x4b, 0x73, 0x1c, 0x57, - 0xd5, 0xf3, 0x7e, 0x1c, 0x69, 0x46, 0xa3, 0x96, 0x2c, 0xb7, 0x24, 0xc7, 0x71, 0xe4, 0x3c, 0x6c, - 0xe7, 0xb3, 0x9c, 0x4f, 0x29, 0x48, 0x05, 0x2a, 0x05, 0xf2, 0xab, 0xc6, 0xc4, 0x44, 0x4a, 0xcb, - 0x0e, 0x09, 0x04, 0xba, 0xae, 0x66, 0xee, 0x48, 0x9d, 0x74, 0xf7, 0x6d, 0x77, 0xf7, 0xc8, 0x1a, - 0x16, 0x2c, 0xa0, 0x8a, 0x35, 0x50, 0x59, 0x53, 0x15, 0x16, 0x14, 0x55, 0x59, 0xb0, 0x62, 0xc5, - 0x1f, 0x60, 0xc7, 0x3f, 0x60, 0x0d, 0x5b, 0xaa, 0x58, 0x51, 0x3c, 0xea, 0xbe, 0xfa, 0x31, 0x7d, - 0x7b, 0x1e, 0x96, 0x0b, 0x28, 0xd0, 0x6a, 0xe6, 0xde, 0x73, 0xee, 0xb9, 0xa7, 0x4f, 0x9f, 0xd7, - 0x3d, 0xe7, 0x36, 0xac, 0xef, 0x79, 0xd8, 0xdd, 0xdd, 0x7f, 0x70, 0xb2, 0x73, 0x2b, 0xfa, 0xb7, - 0xed, 0xf9, 0x24, 0x24, 0x1a, 0x10, 0x0f, 0xbb, 0xc8, 0xb3, 0xb6, 0x4f, 0x76, 0x36, 0xd6, 0x8f, - 0x08, 0x39, 0xb2, 0xf1, 0x2d, 0x06, 0x39, 0x1c, 0x0e, 0x6e, 0x21, 0x77, 0xc4, 0xd1, 0xb6, 0x1c, - 0xd0, 0x77, 0xfb, 0x7d, 0x2b, 0xb4, 0x88, 0x8b, 0xec, 0x7d, 0x9f, 0x78, 0xd8, 0x0f, 0x2d, 0x1c, - 0x3c, 0x08, 0xb1, 0xa3, 0xfd, 0x1f, 0xd4, 0x82, 0xde, 0x31, 0x76, 0x90, 0x5e, 0xbc, 0x52, 0xbc, - 0xb6, 0xb0, 0xa3, 0x6d, 0xc7, 0x34, 0xb7, 0x0f, 0x18, 0xa4, 0x5b, 0x30, 0x04, 0x8e, 0xb6, 0x01, - 0xf5, 0x43, 0x42, 0x6c, 0x8c, 0x5c, 0xbd, 0x74, 0xa5, 0x78, 0xad, 0xd1, 0x2d, 0x18, 0x72, 0xe2, - 0x76, 0x1d, 0xaa, 0xc4, 0xc5, 0x64, 0xb0, 0x75, 0x0f, 0xca, 0xbb, 0xee, 0x48, 0xbb, 0x01, 0xd5, - 0x13, 0x64, 0x0f, 0xb1, 0x20, 0xbc, 0xba, 0xcd, 0x19, 0xdc, 0x96, 0x0c, 0x6e, 0xef, 0xba, 0x23, - 0x83, 0xa3, 0x68, 0x1a, 0x54, 0x46, 0xc8, 0xb1, 0x19, 0xd1, 0xa6, 0xc1, 0xfe, 0x6f, 0x7d, 0x51, - 0x84, 0xf6, 0xae, 0x67, 0xbd, 0x8b, 0x47, 0x07, 0xb8, 0x37, 0xf4, 0xad, 0x70, 0x44, 0xd1, 0xc2, - 0x91, 0xc7, 0x29, 0x36, 0x0d, 0xf6, 0x9f, 0xce, 0xb9, 0xc8, 0xc1, 0x72, 0x29, 0xfd, 0xaf, 0xb5, - 0xa1, 0x64, 0xb9, 0x7a, 0x99, 0xcd, 0x94, 0x2c, 0x57, 0xbb, 0x02, 0x0b, 0x7d, 0x1c, 0xf4, 0x7c, - 0xcb, 0xa3, 0x32, 0xd0, 0x2b, 0x0c, 0x90, 0x9c, 0xd2, 0xbe, 0x06, 0x9d, 0x13, 0xec, 0xf6, 0x89, - 0x6f, 0xe2, 0xd3, 0x10, 0xbb, 0x01, 0x45, 0xab, 0x5e, 0x29, 0x33, 0xbe, 0x13, 0x02, 0x79, 0x0f, - 0x39, 0xb8, 0x4f, 0xf9, 0x5e, 0xe2, 0xd8, 0xf7, 0x24, 0xf2, 0xd6, 0x67, 0x45, 0xd8, 0xbc, 0x8d, - 0x02, 0xab, 0xb7, 0x3b, 0x0c, 0x8f, 0xb1, 0x1b, 0x5a, 0x3d, 0x44, 0x09, 0x4f, 0x64, 0x7d, 0x8c, - 0xad, 0xd2, 0x6c, 0x6c, 0x95, 0xe7, 0x61, 0xeb, 0x0f, 0x45, 0x68, 0xdd, 0x26, 0xfd, 0xd1, 0x3e, - 0xf2, 0x91, 0x83, 0x43, 0xec, 0x8f, 0x6f, 0x5a, 0xcc, 0x6e, 0x3a, 0x8b, 0x44, 0x37, 0xa0, 0xe1, - 0xe3, 0x27, 0x43, 0xcb, 0xc7, 0x7d, 0x26, 0xce, 0x86, 0x11, 0x8d, 0xb5, 0x1b, 0x91, 0x4a, 0x55, - 0xf3, 0x54, 0x2a, 0x52, 0x28, 0xd5, 0x03, 0xd6, 0xe6, 0x79, 0xc0, 0x1f, 0x17, 0xa1, 0x7e, 0x87, - 0xb8, 0x21, 0xea, 0x85, 0x11, 0xe3, 0xc5, 0x04, 0xe3, 0x1d, 0x28, 0x0f, 0x7d, 0xa9, 0x58, 0xf4, - 0xaf, 0xb6, 0x0a, 0x55, 0xec, 0x20, 0xcb, 0x16, 0x4f, 0xc3, 0x07, 0x4a, 0x46, 0x2a, 0xf3, 0x30, - 0xf2, 0x08, 0xea, 0x77, 0xf1, 0x00, 0x0d, 0xed, 0x50, 0x7b, 0x00, 0x17, 0x50, 0x64, 0x6f, 0xa6, - 0x17, 0x19, 0x9c, 0x5e, 0x9c, 0x40, 0x70, 0x15, 0x29, 0x4c, 0x74, 0xeb, 0x3b, 0xb0, 0x70, 0x17, - 0x0f, 0x2c, 0x97, 0x41, 0x02, 0xed, 0xe1, 0x64, 0xca, 0x17, 0x33, 0x94, 0x85, 0xb8, 0xd5, 0xc4, - 0xff, 0x58, 0x85, 0xc6, 0x5d, 0xd2, 0x1b, 0x3a, 0xd8, 0x0d, 0x35, 0x1d, 0xea, 0xc1, 0x53, 0x74, - 0x74, 0x84, 0x7d, 0x21, 0x3f, 0x39, 0xd4, 0x5e, 0x86, 0x8a, 0xe5, 0x0e, 0x08, 0x93, 0xe1, 0xc2, - 0x4e, 0x27, 0xb9, 0xc7, 0x03, 0x77, 0x40, 0x0c, 0x06, 0xa5, 0xc2, 0x3f, 0x26, 0x41, 0x28, 0xa4, - 0xca, 0xfe, 0x6b, 0x9b, 0xd0, 0x3c, 0x44, 0x01, 0x36, 0x3d, 0x14, 0x1e, 0x0b, 0xab, 0x6b, 0xd0, - 0x89, 0x7d, 0x14, 0x1e, 0xb3, 0x0d, 0x29, 0x77, 0x38, 0x60, 0x96, 0x46, 0x37, 0xe4, 0x43, 0xaa, - 0x5c, 0x3d, 0xe2, 0x06, 0x43, 0x0a, 0xaa, 0x31, 0x50, 0x34, 0xa6, 0x30, 0xcf, 0x27, 0xfd, 0x61, - 0x0f, 0x07, 0x7a, 0x9d, 0xc3, 0xe4, 0x58, 0x7b, 0x0d, 0xaa, 0x74, 0xa7, 0x40, 0x6f, 0x30, 0x4e, - 0x97, 0x93, 0x9c, 0xd2, 0x2d, 0x03, 0x83, 0xc3, 0xb5, 0xb7, 0xa9, 0x0d, 0x44, 0x52, 0xd5, 0x9b, - 0x0c, 0x3d, 0x25, 0xbc, 0x84, 0xd0, 0x8d, 0x24, 0xae, 0xf6, 0x75, 0x00, 0x4f, 0xda, 0x52, 0xa0, - 0x03, 0x5b, 0x79, 0x25, 0xbd, 0x91, 0x80, 0x26, 0x49, 0x24, 0xd6, 0x68, 0xef, 0x40, 0xd3, 0xc7, - 0x81, 0x47, 0xdc, 0x00, 0x07, 0xfa, 0x02, 0x23, 0xf0, 0x62, 0x92, 0x80, 0x21, 0x80, 0xc9, 0xf5, - 0xf1, 0x0a, 0xed, 0xab, 0xd0, 0x08, 0x84, 0x53, 0xd1, 0x17, 0xd9, 0x5b, 0x4f, 0xad, 0x96, 0x0e, - 0xc7, 0xe0, 0xd6, 0x48, 0x5f, 0xad, 0x11, 0x2d, 0xd0, 0x0c, 0x58, 0x95, 0xff, 0xcd, 0xa4, 0x04, - 0x5a, 0x59, 0x36, 0x24, 0xa1, 0x24, 0x1b, 0x2b, 0x41, 0x76, 0x52, 0xbb, 0x0a, 0x95, 0x10, 0x1d, - 0x05, 0x7a, 0x9b, 0x31, 0xb3, 0x94, 0xa4, 0xf1, 0x08, 0x1d, 0x19, 0x0c, 0xa8, 0xbd, 0x03, 0x2d, - 0x6a, 0x57, 0x3e, 0x55, 0xdb, 0x3e, 0xe9, 0x05, 0xfa, 0x12, 0xdb, 0x51, 0x4f, 0x62, 0xdf, 0x13, - 0x08, 0x77, 0x49, 0x2f, 0x30, 0x16, 0x71, 0x62, 0xa4, 0xb4, 0xce, 0xce, 0x3c, 0xd6, 0xf9, 0x18, - 0x1a, 0xf7, 0x4e, 0x91, 0xe3, 0xd9, 0x38, 0x78, 0x9e, 0xe6, 0xf9, 0xa3, 0x22, 0x2c, 0x26, 0xd9, - 0x9e, 0xc1, 0xbb, 0x66, 0x1d, 0xd2, 0x99, 0x9d, 0xfc, 0x3f, 0x4a, 0x00, 0xf7, 0x2d, 0x1b, 0x73, - 0x63, 0xd7, 0xd6, 0xa0, 0x36, 0x20, 0xbe, 0x83, 0x42, 0xb1, 0xbd, 0x18, 0x51, 0xc7, 0x17, 0x5a, - 0xa1, 0x2d, 0x1d, 0x3b, 0x1f, 0x8c, 0x73, 0x5c, 0xce, 0x72, 0x7c, 0x1d, 0xea, 0x7d, 0xee, 0xd9, - 0x98, 0x0d, 0x8f, 0xbd, 0x63, 0xca, 0x91, 0x84, 0xa7, 0xc2, 0x02, 0x37, 0xea, 0x38, 0x2c, 0xc8, - 0x08, 0x58, 0x4b, 0x44, 0xc0, 0x4d, 0x6a, 0x0b, 0xa8, 0x6f, 0x12, 0xd7, 0x1e, 0xe9, 0x75, 0x19, - 0x47, 0x50, 0x7f, 0xcf, 0xb5, 0x47, 0x59, 0x9d, 0x69, 0xcc, 0xa5, 0x33, 0xd7, 0xa1, 0x8e, 0xf9, - 0x2b, 0x17, 0x06, 0x9e, 0x65, 0x5b, 0xc0, 0x95, 0x6f, 0x00, 0xe6, 0x79, 0x03, 0x5f, 0xd4, 0x60, - 0xe3, 0x3e, 0xf1, 0x9d, 0xbb, 0x28, 0x44, 0x91, 0x03, 0x38, 0x18, 0x1e, 0x1e, 0xc8, 0xb4, 0x29, - 0x16, 0x4b, 0x71, 0x2c, 0x5a, 0xf2, 0xc8, 0x5a, 0xca, 0xcb, 0x55, 0xca, 0xf9, 0xf1, 0xb9, 0x92, - 0x08, 0x73, 0x37, 0x60, 0x19, 0xd9, 0x36, 0x79, 0x6a, 0x62, 0xc7, 0x0b, 0x47, 0x26, 0x4f, 0xbc, - 0xaa, 0x6c, 0xab, 0x25, 0x06, 0xb8, 0x47, 0xe7, 0x3f, 0x90, 0xc9, 0x56, 0xe6, 0x45, 0xc4, 0x3a, - 0x53, 0x4f, 0xe9, 0xcc, 0xff, 0x43, 0xd5, 0x0a, 0xb1, 0x23, 0x65, 0xbf, 0x99, 0xf2, 0x74, 0xbe, - 0xe5, 0x58, 0xa1, 0x75, 0xc2, 0x33, 0xc9, 0xc0, 0xe0, 0x98, 0xda, 0xeb, 0xb0, 0xdc, 0x23, 0xb6, - 0x8d, 0x7b, 0x94, 0x59, 0x53, 0x50, 0x6d, 0x32, 0xaa, 0x9d, 0x18, 0x70, 0x9f, 0xd3, 0x4f, 0xe8, - 0x16, 0x4c, 0xd1, 0x2d, 0x1d, 0xea, 0x0e, 0x3a, 0xb5, 0x9c, 0xa1, 0xc3, 0xbc, 0x66, 0xd1, 0x90, - 0x43, 0xba, 0x23, 0x3e, 0xed, 0xd9, 0xc3, 0xc0, 0x3a, 0xc1, 0xa6, 0xc4, 0x59, 0x64, 0x0f, 0xdf, - 0x89, 0x00, 0xdf, 0x14, 0xc8, 0x94, 0x8c, 0xe5, 0x32, 0x94, 0x96, 0x20, 0xc3, 0x87, 0x63, 0x64, - 0x04, 0x4e, 0x7b, 0x9c, 0x8c, 0x40, 0x7e, 0x01, 0xc0, 0x41, 0xa7, 0xa6, 0x8d, 0xdd, 0xa3, 0xf0, - 0x98, 0x79, 0xb3, 0xb2, 0xd1, 0x74, 0xd0, 0xe9, 0x43, 0x36, 0xc1, 0xc0, 0x96, 0x2b, 0xc1, 0x1d, - 0x01, 0xb6, 0x5c, 0x01, 0xd6, 0xa1, 0xee, 0xa1, 0x90, 0x2a, 0xab, 0xbe, 0xcc, 0x83, 0xad, 0x18, - 0x52, 0x8b, 0xa0, 0x74, 0xb9, 0xd0, 0x35, 0xb6, 0xae, 0xe1, 0xa0, 0x53, 0x26, 0x61, 0x06, 0xb4, - 0x5c, 0x01, 0x5c, 0x11, 0x40, 0xcb, 0xe5, 0xc0, 0x97, 0x60, 0x71, 0xe8, 0x5a, 0x4f, 0x86, 0x58, - 0xc0, 0x57, 0x19, 0xe7, 0x0b, 0x7c, 0x8e, 0xa3, 0x5c, 0x85, 0x0a, 0x76, 0x87, 0x8e, 0x7e, 0x21, - 0xeb, 0xaa, 0xa9, 0xa8, 0x19, 0x50, 0x7b, 0x11, 0x16, 0x9c, 0xa1, 0x1d, 0x5a, 0x9e, 0x8d, 0x4d, - 0x32, 0xd0, 0xd7, 0x98, 0x90, 0x40, 0x4e, 0xed, 0x0d, 0x94, 0xd6, 0x72, 0x71, 0x2e, 0x6b, 0xa9, - 0x42, 0xad, 0x8b, 0x51, 0x1f, 0xfb, 0xca, 0xb4, 0x38, 0xd6, 0xc5, 0x92, 0x5a, 0x17, 0xcb, 0x67, - 0xd3, 0xc5, 0xca, 0x74, 0x5d, 0xac, 0xce, 0xae, 0x8b, 0xb5, 0x19, 0x74, 0xb1, 0x3e, 0x5d, 0x17, - 0x1b, 0x33, 0xe8, 0x62, 0x73, 0x26, 0x5d, 0x84, 0xc9, 0xba, 0xb8, 0x30, 0x41, 0x17, 0x17, 0x27, - 0xe8, 0x62, 0x6b, 0x92, 0x2e, 0xb6, 0xa7, 0xe8, 0xe2, 0x52, 0xbe, 0x2e, 0x76, 0xe6, 0xd0, 0xc5, - 0xe5, 0x8c, 0x2e, 0x8e, 0x79, 0x4b, 0x6d, 0xb6, 0x23, 0xd4, 0xca, 0x3c, 0xda, 0xfa, 0xb7, 0x2a, - 0xe8, 0x5c, 0x5b, 0xff, 0x2d, 0x9e, 0x5d, 0x5a, 0x48, 0x55, 0x69, 0x21, 0x35, 0xb5, 0x85, 0xd4, - 0xcf, 0x66, 0x21, 0x8d, 0xe9, 0x16, 0xd2, 0x9c, 0xdd, 0x42, 0x60, 0x06, 0x0b, 0x59, 0x98, 0x6e, - 0x21, 0x8b, 0x33, 0x58, 0x48, 0x6b, 0x26, 0x0b, 0x69, 0x4f, 0xb6, 0x90, 0xa5, 0x09, 0x16, 0xd2, - 0x99, 0x60, 0x21, 0xcb, 0x93, 0x2c, 0x44, 0x9b, 0x62, 0x21, 0x2b, 0xf9, 0x16, 0xb2, 0x3a, 0x87, - 0x85, 0x5c, 0x98, 0xc9, 0x5b, 0xaf, 0xcd, 0xa3, 0xff, 0xdf, 0x82, 0x3a, 0x57, 0xff, 0x67, 0x38, - 0x7e, 0xf2, 0x85, 0x39, 0xc9, 0xf3, 0xe7, 0x25, 0xa8, 0xd0, 0x03, 0x64, 0x9c, 0x98, 0x16, 0x93, - 0x89, 0xa9, 0x0e, 0xf5, 0x13, 0xec, 0x07, 0x71, 0x65, 0x44, 0x0e, 0x67, 0x30, 0xa4, 0x6b, 0xd0, - 0x09, 0xb1, 0xef, 0x04, 0x26, 0x19, 0x98, 0x01, 0xf6, 0x4f, 0xac, 0x9e, 0x34, 0xaa, 0x36, 0x9b, - 0xdf, 0x1b, 0x1c, 0xf0, 0x59, 0xed, 0x26, 0xd4, 0x7b, 0xbc, 0x7c, 0x20, 0x9c, 0xfe, 0x4a, 0xf2, - 0x21, 0x44, 0x65, 0xc1, 0x90, 0x38, 0x14, 0xdd, 0xb6, 0x7a, 0xd8, 0x0d, 0x78, 0xfa, 0x34, 0x86, - 0xfe, 0x90, 0x83, 0x0c, 0x89, 0xa3, 0x14, 0x7e, 0x7d, 0x1e, 0xe1, 0xbf, 0x05, 0x4d, 0xa6, 0x0c, - 0xac, 0x56, 0x77, 0x23, 0x51, 0xab, 0x2b, 0x4f, 0x2e, 0xac, 0x6c, 0xdd, 0x85, 0xd6, 0x37, 0x02, - 0xe2, 0x1a, 0x78, 0x80, 0x7d, 0xec, 0xf6, 0xb0, 0xb6, 0x0c, 0x15, 0xd3, 0xc7, 0x03, 0x21, 0xe3, - 0xb2, 0x81, 0x07, 0xd3, 0xeb, 0x4f, 0x5b, 0x1e, 0xd4, 0xc5, 0x33, 0xcd, 0x58, 0x5c, 0x39, 0xf3, - 0x59, 0xe6, 0x1e, 0x34, 0x24, 0x50, 0xb9, 0xe5, 0x2b, 0xb2, 0xaa, 0x58, 0x52, 0x3b, 0x20, 0x0e, - 0xdd, 0x7a, 0x17, 0x16, 0x12, 0x0a, 0xa8, 0xa4, 0x74, 0x2d, 0x4d, 0x29, 0x25, 0x4c, 0xa1, 0xb7, - 0x82, 0xd8, 0xfb, 0xd0, 0x66, 0xc4, 0xe2, 0x22, 0x9a, 0x8a, 0xde, 0xeb, 0x69, 0x7a, 0x17, 0x94, - 0x45, 0x01, 0x49, 0x72, 0x0f, 0x5a, 0x82, 0x64, 0x78, 0xcc, 0xde, 0xad, 0x8a, 0xe2, 0x8d, 0x34, - 0xc5, 0xd5, 0xf1, 0x7a, 0x06, 0x5d, 0x38, 0x4e, 0x50, 0x56, 0x0f, 0xe6, 0x26, 0x28, 0x17, 0x4a, - 0x82, 0x1f, 0x81, 0x96, 0x22, 0x18, 0x9d, 0x1d, 0x32, 0x54, 0x6f, 0xa5, 0xa9, 0xae, 0xab, 0xa8, - 0xb2, 0xd5, 0xe3, 0x2f, 0x47, 0xc4, 0xd0, 0x79, 0x5f, 0x8e, 0xd0, 0x74, 0x41, 0xcc, 0x81, 0x4b, - 0x9c, 0x58, 0xb6, 0x34, 0x91, 0x2b, 0xd8, 0xb7, 0xd3, 0xd4, 0xaf, 0x4e, 0xa9, 0x7b, 0x24, 0xe5, - 0xfc, 0x96, 0xe4, 0x3d, 0xf4, 0x2d, 0xf7, 0x48, 0x49, 0x7d, 0x35, 0x49, 0xbd, 0x29, 0x17, 0x3e, - 0x86, 0x4e, 0x62, 0xe1, 0xae, 0xef, 0x23, 0xb5, 0x82, 0xdf, 0x4c, 0xf3, 0x96, 0xf2, 0xa9, 0x89, - 0xb5, 0x92, 0xec, 0x6f, 0xca, 0xd0, 0x79, 0x8f, 0xb8, 0xe9, 0x1a, 0x2f, 0x86, 0xcd, 0x63, 0xa6, - 0xc1, 0x66, 0x54, 0x77, 0x32, 0x83, 0xe1, 0xa1, 0x99, 0xaa, 0xf4, 0xbf, 0x9c, 0x55, 0xf8, 0x6c, - 0x82, 0xd3, 0x2d, 0x18, 0xfa, 0x71, 0x5e, 0xf2, 0x63, 0xc3, 0x65, 0x9a, 0x30, 0x98, 0x7d, 0x14, - 0x22, 0xf5, 0x4e, 0xfc, 0x19, 0x5e, 0x4d, 0xee, 0x94, 0x7f, 0x4c, 0xee, 0x16, 0x8c, 0x8d, 0x41, - 0xfe, 0x21, 0xfa, 0x10, 0x36, 0x9e, 0x0c, 0xb1, 0x3f, 0x52, 0xef, 0x54, 0xce, 0xbe, 0xc9, 0xf7, - 0x29, 0xb6, 0x72, 0x9b, 0x8b, 0x4f, 0xd4, 0x20, 0xcd, 0x84, 0x75, 0x0f, 0x85, 0xc7, 0xea, 0x2d, - 0x78, 0xf1, 0x63, 0x6b, 0xdc, 0x0a, 0x95, 0x3b, 0xac, 0x79, 0x4a, 0x48, 0xdc, 0x24, 0xf9, 0xbc, - 0x04, 0xfa, 0x1e, 0x1a, 0x86, 0xc7, 0x3b, 0xbb, 0xbd, 0x1e, 0x0e, 0x82, 0x3b, 0xa4, 0x8f, 0xa7, - 0xf5, 0x39, 0x06, 0x36, 0x79, 0x2a, 0xab, 0xf2, 0xf4, 0xbf, 0xf6, 0x06, 0x0d, 0x08, 0xc4, 0xc3, - 0xf2, 0x48, 0x94, 0x2a, 0x8d, 0x70, 0xea, 0x07, 0x0c, 0x6e, 0x08, 0x3c, 0x9a, 0x35, 0xd1, 0x69, - 0xe2, 0x5b, 0xdf, 0x67, 0xfd, 0x09, 0x93, 0xfa, 0x6f, 0x71, 0x20, 0x4a, 0x01, 0x1e, 0xfb, 0x36, - 0x4d, 0x60, 0x42, 0xf2, 0x29, 0xe6, 0x48, 0x3c, 0xff, 0x6c, 0xb0, 0x09, 0x0a, 0x1c, 0x0b, 0x1e, - 0xb5, 0xd9, 0x32, 0xef, 0xb9, 0x82, 0xdf, 0x5f, 0x8a, 0xb0, 0x2e, 0x64, 0xe4, 0x79, 0xf6, 0x2c, - 0x1d, 0x95, 0xe7, 0x23, 0xa4, 0xd4, 0x73, 0x57, 0x26, 0x3f, 0x77, 0x75, 0xb6, 0xe7, 0x9e, 0xab, - 0xa7, 0xf1, 0xc3, 0x12, 0xac, 0x71, 0xc6, 0x1e, 0x38, 0xf4, 0xb9, 0xad, 0xf0, 0x3f, 0x4d, 0x33, - 0xfe, 0x05, 0x42, 0xf8, 0x73, 0x51, 0x0a, 0x61, 0x1f, 0x05, 0xc1, 0x53, 0xe2, 0xf7, 0xff, 0x07, - 0xde, 0xfc, 0xc7, 0xb0, 0x98, 0xe4, 0xeb, 0x19, 0xfa, 0x3d, 0x2c, 0x42, 0xe4, 0x24, 0xdc, 0x3f, - 0xaf, 0x40, 0x73, 0xcf, 0xc3, 0x3e, 0x92, 0x87, 0x4d, 0x56, 0xb7, 0x2f, 0xb2, 0x3a, 0x2d, 0x2f, - 0xd3, 0xeb, 0x50, 0x0f, 0x86, 0x8e, 0x83, 0xfc, 0x91, 0xcc, 0xb9, 0xc5, 0x70, 0x86, 0x9c, 0x3b, - 0x53, 0xae, 0xad, 0xcc, 0x55, 0xae, 0x7d, 0x09, 0x16, 0x89, 0xe4, 0xcd, 0xb4, 0xfa, 0x52, 0xbc, - 0xd1, 0xdc, 0x83, 0x7e, 0xaa, 0xf7, 0x53, 0x1b, 0xeb, 0xfd, 0x24, 0x7b, 0x46, 0xf5, 0xb1, 0x9e, - 0xd1, 0x57, 0x52, 0x3d, 0x9b, 0x06, 0x13, 0xdd, 0x86, 0x32, 0x3d, 0xe3, 0xa1, 0x3e, 0xd9, 0xad, - 0x79, 0x33, 0xd9, 0xad, 0x69, 0x66, 0x33, 0x3b, 0x99, 0xe0, 0xa4, 0x7a, 0x34, 0x89, 0xd6, 0x16, - 0xa4, 0x5b, 0x5b, 0x97, 0x01, 0xfa, 0xd8, 0xf3, 0x71, 0x0f, 0x85, 0xb8, 0x2f, 0x4e, 0xbd, 0x89, - 0x99, 0xb3, 0x75, 0x77, 0x54, 0xea, 0xd7, 0x9a, 0x47, 0xfd, 0x7e, 0x59, 0x84, 0x66, 0x9c, 0x45, - 0xdc, 0x86, 0xf6, 0x21, 0xe9, 0x27, 0xe2, 0xad, 0x48, 0x1c, 0x52, 0x09, 0x5e, 0x2a, 0xf1, 0xe8, - 0x16, 0x8c, 0xd6, 0x61, 0x2a, 0x13, 0x79, 0x08, 0x9a, 0x4b, 0x5c, 0x73, 0x8c, 0x0e, 0x4f, 0x0b, - 0x2e, 0xa5, 0x98, 0x1a, 0xcb, 0x61, 0xba, 0x05, 0xa3, 0xe3, 0x8e, 0xcd, 0xc5, 0xd1, 0xf3, 0x08, - 0x56, 0x55, 0x7d, 0x36, 0x6d, 0x6f, 0xb2, 0xbd, 0x6c, 0x64, 0xc4, 0x10, 0x27, 0xe6, 0x6a, 0x93, - 0xf9, 0xac, 0x08, 0xed, 0xb4, 0x76, 0x68, 0x5f, 0x82, 0xe6, 0xb8, 0x44, 0xd4, 0xb9, 0x7e, 0xb7, - 0x60, 0xc4, 0x98, 0x54, 0x9a, 0x9f, 0x04, 0xc4, 0xa5, 0x67, 0x30, 0x7e, 0x22, 0x53, 0xa5, 0xcb, - 0xa9, 0x23, 0x1b, 0x95, 0xe6, 0x27, 0xc9, 0x89, 0xf8, 0xf9, 0x7f, 0x5f, 0x86, 0x46, 0x74, 0x74, - 0x50, 0x9c, 0xec, 0x5e, 0x83, 0xf2, 0x11, 0x0e, 0x55, 0x27, 0x91, 0xc8, 0xfe, 0x0d, 0x8a, 0x41, - 0x11, 0xbd, 0x61, 0x28, 0xfc, 0x63, 0x1e, 0xa2, 0x37, 0x0c, 0xb5, 0xeb, 0x50, 0xf1, 0x48, 0x20, - 0x3b, 0x40, 0x39, 0x98, 0x0c, 0x45, 0xbb, 0x09, 0xb5, 0x3e, 0xb6, 0x71, 0x88, 0xc5, 0x89, 0x3a, - 0x07, 0x59, 0x20, 0x69, 0xb7, 0xa0, 0x4e, 0x3c, 0xde, 0x86, 0xac, 0x4d, 0xc2, 0x97, 0x58, 0x94, - 0x15, 0x9a, 0x92, 0x8a, 0x22, 0x57, 0x1e, 0x2b, 0x14, 0x85, 0x9e, 0xc9, 0x3c, 0x14, 0xf6, 0x8e, - 0x45, 0xfb, 0x22, 0x07, 0x97, 0xe3, 0x8c, 0xb9, 0x89, 0xe6, 0x5c, 0x6e, 0xe2, 0xcc, 0x1d, 0xa4, - 0xbf, 0x56, 0x61, 0x4d, 0x9d, 0x4d, 0x9e, 0xd7, 0x18, 0xcf, 0x6b, 0x8c, 0xff, 0xed, 0x35, 0xc6, - 0xa7, 0x50, 0x65, 0x17, 0x34, 0x94, 0x94, 0x8a, 0x73, 0x50, 0xd2, 0x6e, 0x42, 0x85, 0xdd, 0x36, - 0x29, 0xb1, 0x45, 0xeb, 0x0a, 0x87, 0x2f, 0xea, 0x26, 0x0c, 0x6d, 0xeb, 0x67, 0x55, 0x58, 0x1a, - 0xd3, 0xda, 0xf3, 0x9e, 0xd4, 0x79, 0x4f, 0xea, 0x4c, 0x3d, 0x29, 0x95, 0x0e, 0x6b, 0xf3, 0x58, - 0xc3, 0xb7, 0x01, 0xe2, 0x14, 0xe4, 0x39, 0xdf, 0xf9, 0xfa, 0x55, 0x0d, 0x2e, 0xe6, 0x14, 0x46, - 0xce, 0xaf, 0x29, 0x9c, 0x5f, 0x53, 0x38, 0xbf, 0xa6, 0x10, 0x9b, 0xe1, 0xdf, 0x8b, 0xd0, 0x88, - 0xca, 0xe9, 0xd3, 0x2f, 0x76, 0x6d, 0x47, 0xdd, 0x19, 0x9e, 0x76, 0xaf, 0x65, 0x6b, 0xd6, 0x2c, - 0xf0, 0xc8, 0xab, 0xaf, 0x37, 0xa1, 0xce, 0x2b, 0xab, 0x32, 0x78, 0xac, 0x64, 0x0b, 0xb2, 0x81, - 0x21, 0x71, 0xb4, 0x37, 0xa0, 0x21, 0xae, 0x2b, 0xc9, 0x93, 0xf5, 0x6a, 0xfa, 0x64, 0xcd, 0x61, - 0x46, 0x84, 0x75, 0xf6, 0x3b, 0xcd, 0x18, 0x56, 0x14, 0x97, 0x11, 0xb5, 0xf7, 0x26, 0x3b, 0xa4, - 0x6c, 0xcc, 0x8d, 0x5a, 0x0b, 0x6a, 0x97, 0xf4, 0x93, 0x22, 0xb4, 0xd2, 0x5d, 0x86, 0x1d, 0xea, - 0x88, 0xf8, 0x44, 0x74, 0x7b, 0x5c, 0x71, 0xe6, 0xee, 0x16, 0x8c, 0x08, 0xef, 0xf9, 0x9e, 0xaf, - 0x7e, 0x5a, 0x84, 0x66, 0x74, 0xb2, 0xd7, 0xee, 0x40, 0x4b, 0x6e, 0x63, 0xf6, 0x48, 0x1f, 0x8b, - 0x07, 0xbd, 0x9c, 0xfb, 0xa0, 0xbc, 0xdb, 0xb1, 0x28, 0x17, 0xdd, 0x21, 0x7d, 0x75, 0x2b, 0xb0, - 0x34, 0xcf, 0xdb, 0xf8, 0x75, 0x13, 0x6a, 0xc2, 0x51, 0x2b, 0x4e, 0x7c, 0x79, 0x09, 0x4a, 0xd4, - 0x5b, 0x2d, 0x4f, 0xb8, 0xf4, 0x57, 0x99, 0x78, 0xe9, 0x6f, 0x5a, 0xe2, 0x31, 0x66, 0x89, 0xb5, - 0x8c, 0x25, 0x26, 0x5c, 0x62, 0x7d, 0x06, 0x97, 0xd8, 0x98, 0xee, 0x12, 0x9b, 0x33, 0xb8, 0x44, - 0x98, 0xc9, 0x25, 0x2e, 0x4c, 0x76, 0x89, 0x8b, 0x13, 0x5c, 0x62, 0x6b, 0x82, 0x4b, 0x6c, 0x4f, - 0x72, 0x89, 0x4b, 0x53, 0x5c, 0x62, 0x27, 0xeb, 0x12, 0x5f, 0x81, 0x36, 0x25, 0x9e, 0x30, 0x36, - 0x7e, 0x12, 0x68, 0x39, 0xe8, 0x34, 0x91, 0x2b, 0x50, 0x34, 0xcb, 0x4d, 0xa2, 0x69, 0x02, 0xcd, - 0x72, 0x13, 0x68, 0xc9, 0x40, 0xbf, 0x32, 0x76, 0x4d, 0x73, 0xa6, 0x13, 0xc1, 0x47, 0x79, 0x2e, - 0xe0, 0x42, 0xb6, 0xb5, 0x94, 0xf7, 0xe9, 0x89, 0xda, 0x1b, 0x68, 0xd7, 0x44, 0xd8, 0x5f, 0xcb, - 0xda, 0xfd, 0xa3, 0x91, 0x87, 0x79, 0xee, 0xce, 0x92, 0x81, 0xd7, 0x65, 0xd0, 0xbf, 0x98, 0x3d, - 0xdc, 0x47, 0x4d, 0x73, 0x19, 0xee, 0xaf, 0x43, 0x0d, 0xd9, 0x36, 0xd5, 0x4f, 0x3d, 0xb7, 0x77, - 0x5e, 0x45, 0xb6, 0xbd, 0x37, 0xd0, 0xbe, 0x0c, 0x90, 0x78, 0xa2, 0xf5, 0xac, 0x33, 0x8f, 0xb9, - 0x35, 0x12, 0x98, 0xda, 0xcb, 0xd0, 0xea, 0x5b, 0xd4, 0x82, 0x1c, 0xcb, 0x45, 0x21, 0xf1, 0xf5, - 0x0d, 0xa6, 0x20, 0xe9, 0xc9, 0xf4, 0x95, 0xd7, 0xcd, 0xb1, 0x2b, 0xaf, 0x2f, 0x41, 0xf9, 0xd4, - 0xb1, 0xf5, 0x4b, 0x59, 0x8b, 0xfb, 0xd0, 0xb1, 0x0d, 0x0a, 0xcb, 0x96, 0x59, 0x5f, 0x78, 0xd6, - 0x5b, 0xb1, 0x97, 0x9f, 0xe1, 0x56, 0xec, 0x8b, 0xf3, 0x78, 0xac, 0x1f, 0x00, 0xc4, 0x71, 0x6f, - 0xce, 0x2f, 0x8d, 0xde, 0x86, 0x85, 0x81, 0x65, 0x63, 0x33, 0x3f, 0xa4, 0xc6, 0x37, 0x9e, 0xbb, - 0x05, 0x03, 0x06, 0xd1, 0x28, 0xf6, 0xe2, 0x21, 0xac, 0x28, 0xba, 0xb9, 0xda, 0x77, 0x27, 0xc7, - 0xaf, 0x6b, 0xd9, 0x84, 0x3a, 0xa7, 0x25, 0xac, 0x0e, 0x67, 0x7f, 0xaa, 0xc0, 0xc5, 0xbc, 0x66, - 0xb4, 0x03, 0x2f, 0x1c, 0xa2, 0xc0, 0xea, 0x99, 0x28, 0xf5, 0x95, 0x90, 0x19, 0xd5, 0x7c, 0xb9, - 0x68, 0x5e, 0x4b, 0x55, 0x58, 0xf3, 0xbf, 0x2a, 0xea, 0x16, 0x8c, 0xcd, 0xc3, 0x09, 0x1f, 0x1d, - 0xdd, 0x87, 0x0e, 0xf2, 0x2c, 0xf3, 0x53, 0x3c, 0x8a, 0x77, 0xe0, 0x92, 0x4c, 0xd5, 0xb5, 0xd2, - 0x5f, 0x59, 0x75, 0x0b, 0x46, 0x1b, 0xa5, 0xbf, 0xbb, 0xfa, 0x1e, 0xe8, 0x84, 0xb5, 0x25, 0x4c, - 0x4b, 0x34, 0xa4, 0x62, 0x7a, 0xe5, 0x6c, 0x57, 0x54, 0xdd, 0xbb, 0xea, 0x16, 0x8c, 0x35, 0xa2, - 0xee, 0x6a, 0xc5, 0xf4, 0x3d, 0xd1, 0xeb, 0x89, 0xe9, 0x57, 0xf2, 0xe8, 0x8f, 0xb7, 0x85, 0x62, - 0xfa, 0x99, 0x86, 0xd1, 0x11, 0x6c, 0x0a, 0xfa, 0x28, 0x6e, 0x24, 0xc6, 0x5b, 0xf0, 0x00, 0xf7, - 0x4a, 0x76, 0x0b, 0x45, 0xdb, 0xb1, 0x5b, 0x30, 0xd6, 0x49, 0x6e, 0x4f, 0x12, 0xc7, 0x1b, 0xb1, - 0xae, 0x2e, 0x4b, 0x17, 0xe2, 0x8d, 0x6a, 0x59, 0xef, 0x98, 0xd7, 0x03, 0xee, 0x16, 0x0c, 0x21, - 0x93, 0x2c, 0x2c, 0xd6, 0xf0, 0xe3, 0x58, 0xc3, 0x13, 0x2d, 0x01, 0xed, 0xfd, 0xc9, 0x1a, 0x7e, - 0x29, 0xa7, 0x6d, 0xc4, 0x2f, 0x16, 0xa8, 0xb5, 0xfa, 0x2a, 0x2c, 0x24, 0x6f, 0x2e, 0xac, 0xc6, - 0x1f, 0xf7, 0x95, 0xe3, 0x3b, 0x0e, 0xbf, 0x2d, 0x42, 0xf9, 0x11, 0x52, 0xdf, 0x8a, 0x98, 0xfe, - 0xb1, 0x5b, 0xc6, 0xb3, 0x95, 0xcf, 0xfc, 0x8d, 0xc8, 0x5c, 0x5f, 0x70, 0x5d, 0x81, 0x86, 0x8c, - 0x30, 0x39, 0xcf, 0xf7, 0x31, 0x2c, 0x7d, 0x30, 0x56, 0x6f, 0x7a, 0x8e, 0x1f, 0x93, 0xfc, 0xae, - 0x08, 0xe5, 0x0f, 0x1d, 0x5b, 0x29, 0xbd, 0x4b, 0xd0, 0xa4, 0xbf, 0x81, 0x87, 0x7a, 0xf2, 0x5e, - 0x49, 0x3c, 0x41, 0x93, 0x3f, 0xcf, 0xc7, 0x03, 0xeb, 0x54, 0x64, 0x79, 0x62, 0x44, 0x57, 0xa1, - 0x30, 0xf4, 0xad, 0xc3, 0x61, 0x88, 0xc5, 0x67, 0x7a, 0xf1, 0x04, 0x4d, 0x65, 0x9e, 0xfa, 0xc8, - 0xf3, 0x70, 0x5f, 0x1c, 0xc1, 0xe5, 0xf0, 0xcc, 0x7d, 0xcc, 0xdb, 0xaf, 0x42, 0x9b, 0xf8, 0x47, - 0x12, 0xd7, 0x3c, 0xd9, 0xb9, 0xbd, 0x28, 0xbe, 0x5d, 0xdd, 0xf7, 0x49, 0x48, 0xf6, 0x8b, 0xbf, - 0x28, 0x95, 0xf7, 0x76, 0x0f, 0x0e, 0x6b, 0xec, 0x63, 0xd0, 0x37, 0xff, 0x19, 0x00, 0x00, 0xff, - 0xff, 0xd4, 0x0a, 0xef, 0xca, 0xe4, 0x3a, 0x00, 0x00, -} diff --git a/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.proto b/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.proto deleted file mode 100644 index 557c880..0000000 --- a/vendor/github.com/googleapis/gnostic/OpenAPIv2/OpenAPIv2.proto +++ /dev/null @@ -1,663 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// THIS FILE IS AUTOMATICALLY GENERATED. - -syntax = "proto3"; - -package openapi.v2; - -import "google/protobuf/any.proto"; - -// This option lets the proto compiler generate Java code inside the package -// name (see below) instead of inside an outer class. It creates a simpler -// developer experience by reducing one-level of name nesting and be -// consistent with most programming languages that don't support outer classes. -option java_multiple_files = true; - -// The Java outer classname should be the filename in UpperCamelCase. This -// class is only used to hold proto descriptor, so developers don't need to -// work with it directly. -option java_outer_classname = "OpenAPIProto"; - -// The Java package name must be proto package name with proper prefix. -option java_package = "org.openapi_v2"; - -// A reasonable prefix for the Objective-C symbols generated from the package. -// It should at a minimum be 3 characters long, all uppercase, and convention -// is to use an abbreviation of the package name. Something short, but -// hopefully unique enough to not conflict with things that may come along in -// the future. 'GPB' is reserved for the protocol buffer implementation itself. -option objc_class_prefix = "OAS"; - -message AdditionalPropertiesItem { - oneof oneof { - Schema schema = 1; - bool boolean = 2; - } -} - -message Any { - google.protobuf.Any value = 1; - string yaml = 2; -} - -message ApiKeySecurity { - string type = 1; - string name = 2; - string in = 3; - string description = 4; - repeated NamedAny vendor_extension = 5; -} - -message BasicAuthenticationSecurity { - string type = 1; - string description = 2; - repeated NamedAny vendor_extension = 3; -} - -message BodyParameter { - // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. - string description = 1; - // The name of the parameter. - string name = 2; - // Determines the location of the parameter. - string in = 3; - // Determines whether or not this parameter is required or optional. - bool required = 4; - Schema schema = 5; - repeated NamedAny vendor_extension = 6; -} - -// Contact information for the owners of the API. -message Contact { - // The identifying name of the contact person/organization. - string name = 1; - // The URL pointing to the contact information. - string url = 2; - // The email address of the contact person/organization. - string email = 3; - repeated NamedAny vendor_extension = 4; -} - -message Default { - repeated NamedAny additional_properties = 1; -} - -// One or more JSON objects describing the schemas being consumed and produced by the API. -message Definitions { - repeated NamedSchema additional_properties = 1; -} - -message Document { - // The Swagger version of this document. - string swagger = 1; - Info info = 2; - // The host (name or ip) of the API. Example: 'swagger.io' - string host = 3; - // The base path to the API. Example: '/api'. - string base_path = 4; - // The transfer protocol of the API. - repeated string schemes = 5; - // A list of MIME types accepted by the API. - repeated string consumes = 6; - // A list of MIME types the API can produce. - repeated string produces = 7; - Paths paths = 8; - Definitions definitions = 9; - ParameterDefinitions parameters = 10; - ResponseDefinitions responses = 11; - repeated SecurityRequirement security = 12; - SecurityDefinitions security_definitions = 13; - repeated Tag tags = 14; - ExternalDocs external_docs = 15; - repeated NamedAny vendor_extension = 16; -} - -message Examples { - repeated NamedAny additional_properties = 1; -} - -// information about external documentation -message ExternalDocs { - string description = 1; - string url = 2; - repeated NamedAny vendor_extension = 3; -} - -// A deterministic version of a JSON Schema object. -message FileSchema { - string format = 1; - string title = 2; - string description = 3; - Any default = 4; - repeated string required = 5; - string type = 6; - bool read_only = 7; - ExternalDocs external_docs = 8; - Any example = 9; - repeated NamedAny vendor_extension = 10; -} - -message FormDataParameterSubSchema { - // Determines whether or not this parameter is required or optional. - bool required = 1; - // Determines the location of the parameter. - string in = 2; - // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. - string description = 3; - // The name of the parameter. - string name = 4; - // allows sending a parameter by name only or with an empty value. - bool allow_empty_value = 5; - string type = 6; - string format = 7; - PrimitivesItems items = 8; - string collection_format = 9; - Any default = 10; - double maximum = 11; - bool exclusive_maximum = 12; - double minimum = 13; - bool exclusive_minimum = 14; - int64 max_length = 15; - int64 min_length = 16; - string pattern = 17; - int64 max_items = 18; - int64 min_items = 19; - bool unique_items = 20; - repeated Any enum = 21; - double multiple_of = 22; - repeated NamedAny vendor_extension = 23; -} - -message Header { - string type = 1; - string format = 2; - PrimitivesItems items = 3; - string collection_format = 4; - Any default = 5; - double maximum = 6; - bool exclusive_maximum = 7; - double minimum = 8; - bool exclusive_minimum = 9; - int64 max_length = 10; - int64 min_length = 11; - string pattern = 12; - int64 max_items = 13; - int64 min_items = 14; - bool unique_items = 15; - repeated Any enum = 16; - double multiple_of = 17; - string description = 18; - repeated NamedAny vendor_extension = 19; -} - -message HeaderParameterSubSchema { - // Determines whether or not this parameter is required or optional. - bool required = 1; - // Determines the location of the parameter. - string in = 2; - // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. - string description = 3; - // The name of the parameter. - string name = 4; - string type = 5; - string format = 6; - PrimitivesItems items = 7; - string collection_format = 8; - Any default = 9; - double maximum = 10; - bool exclusive_maximum = 11; - double minimum = 12; - bool exclusive_minimum = 13; - int64 max_length = 14; - int64 min_length = 15; - string pattern = 16; - int64 max_items = 17; - int64 min_items = 18; - bool unique_items = 19; - repeated Any enum = 20; - double multiple_of = 21; - repeated NamedAny vendor_extension = 22; -} - -message Headers { - repeated NamedHeader additional_properties = 1; -} - -// General information about the API. -message Info { - // A unique and precise title of the API. - string title = 1; - // A semantic version number of the API. - string version = 2; - // A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed. - string description = 3; - // The terms of service for the API. - string terms_of_service = 4; - Contact contact = 5; - License license = 6; - repeated NamedAny vendor_extension = 7; -} - -message ItemsItem { - repeated Schema schema = 1; -} - -message JsonReference { - string _ref = 1; - string description = 2; -} - -message License { - // The name of the license type. It's encouraged to use an OSI compatible license. - string name = 1; - // The URL pointing to the license. - string url = 2; - repeated NamedAny vendor_extension = 3; -} - -// Automatically-generated message used to represent maps of Any as ordered (name,value) pairs. -message NamedAny { - // Map key - string name = 1; - // Mapped value - Any value = 2; -} - -// Automatically-generated message used to represent maps of Header as ordered (name,value) pairs. -message NamedHeader { - // Map key - string name = 1; - // Mapped value - Header value = 2; -} - -// Automatically-generated message used to represent maps of Parameter as ordered (name,value) pairs. -message NamedParameter { - // Map key - string name = 1; - // Mapped value - Parameter value = 2; -} - -// Automatically-generated message used to represent maps of PathItem as ordered (name,value) pairs. -message NamedPathItem { - // Map key - string name = 1; - // Mapped value - PathItem value = 2; -} - -// Automatically-generated message used to represent maps of Response as ordered (name,value) pairs. -message NamedResponse { - // Map key - string name = 1; - // Mapped value - Response value = 2; -} - -// Automatically-generated message used to represent maps of ResponseValue as ordered (name,value) pairs. -message NamedResponseValue { - // Map key - string name = 1; - // Mapped value - ResponseValue value = 2; -} - -// Automatically-generated message used to represent maps of Schema as ordered (name,value) pairs. -message NamedSchema { - // Map key - string name = 1; - // Mapped value - Schema value = 2; -} - -// Automatically-generated message used to represent maps of SecurityDefinitionsItem as ordered (name,value) pairs. -message NamedSecurityDefinitionsItem { - // Map key - string name = 1; - // Mapped value - SecurityDefinitionsItem value = 2; -} - -// Automatically-generated message used to represent maps of string as ordered (name,value) pairs. -message NamedString { - // Map key - string name = 1; - // Mapped value - string value = 2; -} - -// Automatically-generated message used to represent maps of StringArray as ordered (name,value) pairs. -message NamedStringArray { - // Map key - string name = 1; - // Mapped value - StringArray value = 2; -} - -message NonBodyParameter { - oneof oneof { - HeaderParameterSubSchema header_parameter_sub_schema = 1; - FormDataParameterSubSchema form_data_parameter_sub_schema = 2; - QueryParameterSubSchema query_parameter_sub_schema = 3; - PathParameterSubSchema path_parameter_sub_schema = 4; - } -} - -message Oauth2AccessCodeSecurity { - string type = 1; - string flow = 2; - Oauth2Scopes scopes = 3; - string authorization_url = 4; - string token_url = 5; - string description = 6; - repeated NamedAny vendor_extension = 7; -} - -message Oauth2ApplicationSecurity { - string type = 1; - string flow = 2; - Oauth2Scopes scopes = 3; - string token_url = 4; - string description = 5; - repeated NamedAny vendor_extension = 6; -} - -message Oauth2ImplicitSecurity { - string type = 1; - string flow = 2; - Oauth2Scopes scopes = 3; - string authorization_url = 4; - string description = 5; - repeated NamedAny vendor_extension = 6; -} - -message Oauth2PasswordSecurity { - string type = 1; - string flow = 2; - Oauth2Scopes scopes = 3; - string token_url = 4; - string description = 5; - repeated NamedAny vendor_extension = 6; -} - -message Oauth2Scopes { - repeated NamedString additional_properties = 1; -} - -message Operation { - repeated string tags = 1; - // A brief summary of the operation. - string summary = 2; - // A longer description of the operation, GitHub Flavored Markdown is allowed. - string description = 3; - ExternalDocs external_docs = 4; - // A unique identifier of the operation. - string operation_id = 5; - // A list of MIME types the API can produce. - repeated string produces = 6; - // A list of MIME types the API can consume. - repeated string consumes = 7; - // The parameters needed to send a valid API call. - repeated ParametersItem parameters = 8; - Responses responses = 9; - // The transfer protocol of the API. - repeated string schemes = 10; - bool deprecated = 11; - repeated SecurityRequirement security = 12; - repeated NamedAny vendor_extension = 13; -} - -message Parameter { - oneof oneof { - BodyParameter body_parameter = 1; - NonBodyParameter non_body_parameter = 2; - } -} - -// One or more JSON representations for parameters -message ParameterDefinitions { - repeated NamedParameter additional_properties = 1; -} - -message ParametersItem { - oneof oneof { - Parameter parameter = 1; - JsonReference json_reference = 2; - } -} - -message PathItem { - string _ref = 1; - Operation get = 2; - Operation put = 3; - Operation post = 4; - Operation delete = 5; - Operation options = 6; - Operation head = 7; - Operation patch = 8; - // The parameters needed to send a valid API call. - repeated ParametersItem parameters = 9; - repeated NamedAny vendor_extension = 10; -} - -message PathParameterSubSchema { - // Determines whether or not this parameter is required or optional. - bool required = 1; - // Determines the location of the parameter. - string in = 2; - // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. - string description = 3; - // The name of the parameter. - string name = 4; - string type = 5; - string format = 6; - PrimitivesItems items = 7; - string collection_format = 8; - Any default = 9; - double maximum = 10; - bool exclusive_maximum = 11; - double minimum = 12; - bool exclusive_minimum = 13; - int64 max_length = 14; - int64 min_length = 15; - string pattern = 16; - int64 max_items = 17; - int64 min_items = 18; - bool unique_items = 19; - repeated Any enum = 20; - double multiple_of = 21; - repeated NamedAny vendor_extension = 22; -} - -// Relative paths to the individual endpoints. They must be relative to the 'basePath'. -message Paths { - repeated NamedAny vendor_extension = 1; - repeated NamedPathItem path = 2; -} - -message PrimitivesItems { - string type = 1; - string format = 2; - PrimitivesItems items = 3; - string collection_format = 4; - Any default = 5; - double maximum = 6; - bool exclusive_maximum = 7; - double minimum = 8; - bool exclusive_minimum = 9; - int64 max_length = 10; - int64 min_length = 11; - string pattern = 12; - int64 max_items = 13; - int64 min_items = 14; - bool unique_items = 15; - repeated Any enum = 16; - double multiple_of = 17; - repeated NamedAny vendor_extension = 18; -} - -message Properties { - repeated NamedSchema additional_properties = 1; -} - -message QueryParameterSubSchema { - // Determines whether or not this parameter is required or optional. - bool required = 1; - // Determines the location of the parameter. - string in = 2; - // A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed. - string description = 3; - // The name of the parameter. - string name = 4; - // allows sending a parameter by name only or with an empty value. - bool allow_empty_value = 5; - string type = 6; - string format = 7; - PrimitivesItems items = 8; - string collection_format = 9; - Any default = 10; - double maximum = 11; - bool exclusive_maximum = 12; - double minimum = 13; - bool exclusive_minimum = 14; - int64 max_length = 15; - int64 min_length = 16; - string pattern = 17; - int64 max_items = 18; - int64 min_items = 19; - bool unique_items = 20; - repeated Any enum = 21; - double multiple_of = 22; - repeated NamedAny vendor_extension = 23; -} - -message Response { - string description = 1; - SchemaItem schema = 2; - Headers headers = 3; - Examples examples = 4; - repeated NamedAny vendor_extension = 5; -} - -// One or more JSON representations for parameters -message ResponseDefinitions { - repeated NamedResponse additional_properties = 1; -} - -message ResponseValue { - oneof oneof { - Response response = 1; - JsonReference json_reference = 2; - } -} - -// Response objects names can either be any valid HTTP status code or 'default'. -message Responses { - repeated NamedResponseValue response_code = 1; - repeated NamedAny vendor_extension = 2; -} - -// A deterministic version of a JSON Schema object. -message Schema { - string _ref = 1; - string format = 2; - string title = 3; - string description = 4; - Any default = 5; - double multiple_of = 6; - double maximum = 7; - bool exclusive_maximum = 8; - double minimum = 9; - bool exclusive_minimum = 10; - int64 max_length = 11; - int64 min_length = 12; - string pattern = 13; - int64 max_items = 14; - int64 min_items = 15; - bool unique_items = 16; - int64 max_properties = 17; - int64 min_properties = 18; - repeated string required = 19; - repeated Any enum = 20; - AdditionalPropertiesItem additional_properties = 21; - TypeItem type = 22; - ItemsItem items = 23; - repeated Schema all_of = 24; - Properties properties = 25; - string discriminator = 26; - bool read_only = 27; - Xml xml = 28; - ExternalDocs external_docs = 29; - Any example = 30; - repeated NamedAny vendor_extension = 31; -} - -message SchemaItem { - oneof oneof { - Schema schema = 1; - FileSchema file_schema = 2; - } -} - -message SecurityDefinitions { - repeated NamedSecurityDefinitionsItem additional_properties = 1; -} - -message SecurityDefinitionsItem { - oneof oneof { - BasicAuthenticationSecurity basic_authentication_security = 1; - ApiKeySecurity api_key_security = 2; - Oauth2ImplicitSecurity oauth2_implicit_security = 3; - Oauth2PasswordSecurity oauth2_password_security = 4; - Oauth2ApplicationSecurity oauth2_application_security = 5; - Oauth2AccessCodeSecurity oauth2_access_code_security = 6; - } -} - -message SecurityRequirement { - repeated NamedStringArray additional_properties = 1; -} - -message StringArray { - repeated string value = 1; -} - -message Tag { - string name = 1; - string description = 2; - ExternalDocs external_docs = 3; - repeated NamedAny vendor_extension = 4; -} - -message TypeItem { - repeated string value = 1; -} - -// Any property starting with x- is valid. -message VendorExtension { - repeated NamedAny additional_properties = 1; -} - -message Xml { - string name = 1; - string namespace = 2; - string prefix = 3; - bool attribute = 4; - bool wrapped = 5; - repeated NamedAny vendor_extension = 6; -} - diff --git a/vendor/github.com/googleapis/gnostic/OpenAPIv2/README.md b/vendor/github.com/googleapis/gnostic/OpenAPIv2/README.md deleted file mode 100644 index 836fb32..0000000 --- a/vendor/github.com/googleapis/gnostic/OpenAPIv2/README.md +++ /dev/null @@ -1,16 +0,0 @@ -# OpenAPI v2 Protocol Buffer Models - -This directory contains a Protocol Buffer-language model -and related code for supporting OpenAPI v2. - -Gnostic applications and plugins can use OpenAPIv2.proto -to generate Protocol Buffer support code for their preferred languages. - -OpenAPIv2.go is used by Gnostic to read JSON and YAML OpenAPI -descriptions into the Protocol Buffer-based datastructures -generated from OpenAPIv2.proto. - -OpenAPIv2.proto and OpenAPIv2.go are generated by the Gnostic -compiler generator, and OpenAPIv2.pb.go is generated by -protoc, the Protocol Buffer compiler, and protoc-gen-go, the -Protocol Buffer Go code generation plugin. diff --git a/vendor/github.com/googleapis/gnostic/OpenAPIv2/openapi-2.0.json b/vendor/github.com/googleapis/gnostic/OpenAPIv2/openapi-2.0.json deleted file mode 100644 index 2815a26..0000000 --- a/vendor/github.com/googleapis/gnostic/OpenAPIv2/openapi-2.0.json +++ /dev/null @@ -1,1610 +0,0 @@ -{ - "title": "A JSON Schema for Swagger 2.0 API.", - "id": "http://swagger.io/v2/schema.json#", - "$schema": "http://json-schema.org/draft-04/schema#", - "type": "object", - "required": [ - "swagger", - "info", - "paths" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "swagger": { - "type": "string", - "enum": [ - "2.0" - ], - "description": "The Swagger version of this document." - }, - "info": { - "$ref": "#/definitions/info" - }, - "host": { - "type": "string", - "pattern": "^[^{}/ :\\\\]+(?::\\d+)?$", - "description": "The host (name or ip) of the API. Example: 'swagger.io'" - }, - "basePath": { - "type": "string", - "pattern": "^/", - "description": "The base path to the API. Example: '/api'." - }, - "schemes": { - "$ref": "#/definitions/schemesList" - }, - "consumes": { - "description": "A list of MIME types accepted by the API.", - "allOf": [ - { - "$ref": "#/definitions/mediaTypeList" - } - ] - }, - "produces": { - "description": "A list of MIME types the API can produce.", - "allOf": [ - { - "$ref": "#/definitions/mediaTypeList" - } - ] - }, - "paths": { - "$ref": "#/definitions/paths" - }, - "definitions": { - "$ref": "#/definitions/definitions" - }, - "parameters": { - "$ref": "#/definitions/parameterDefinitions" - }, - "responses": { - "$ref": "#/definitions/responseDefinitions" - }, - "security": { - "$ref": "#/definitions/security" - }, - "securityDefinitions": { - "$ref": "#/definitions/securityDefinitions" - }, - "tags": { - "type": "array", - "items": { - "$ref": "#/definitions/tag" - }, - "uniqueItems": true - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - } - }, - "definitions": { - "info": { - "type": "object", - "description": "General information about the API.", - "required": [ - "version", - "title" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "title": { - "type": "string", - "description": "A unique and precise title of the API." - }, - "version": { - "type": "string", - "description": "A semantic version number of the API." - }, - "description": { - "type": "string", - "description": "A longer description of the API. Should be different from the title. GitHub Flavored Markdown is allowed." - }, - "termsOfService": { - "type": "string", - "description": "The terms of service for the API." - }, - "contact": { - "$ref": "#/definitions/contact" - }, - "license": { - "$ref": "#/definitions/license" - } - } - }, - "contact": { - "type": "object", - "description": "Contact information for the owners of the API.", - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - "description": "The identifying name of the contact person/organization." - }, - "url": { - "type": "string", - "description": "The URL pointing to the contact information.", - "format": "uri" - }, - "email": { - "type": "string", - "description": "The email address of the contact person/organization.", - "format": "email" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "license": { - "type": "object", - "required": [ - "name" - ], - "additionalProperties": false, - "properties": { - "name": { - "type": "string", - "description": "The name of the license type. It's encouraged to use an OSI compatible license." - }, - "url": { - "type": "string", - "description": "The URL pointing to the license.", - "format": "uri" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "paths": { - "type": "object", - "description": "Relative paths to the individual endpoints. They must be relative to the 'basePath'.", - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - }, - "^/": { - "$ref": "#/definitions/pathItem" - } - }, - "additionalProperties": false - }, - "definitions": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schema" - }, - "description": "One or more JSON objects describing the schemas being consumed and produced by the API." - }, - "parameterDefinitions": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/parameter" - }, - "description": "One or more JSON representations for parameters" - }, - "responseDefinitions": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/response" - }, - "description": "One or more JSON representations for parameters" - }, - "externalDocs": { - "type": "object", - "additionalProperties": false, - "description": "information about external documentation", - "required": [ - "url" - ], - "properties": { - "description": { - "type": "string" - }, - "url": { - "type": "string", - "format": "uri" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "examples": { - "type": "object", - "additionalProperties": true - }, - "mimeType": { - "type": "string", - "description": "The MIME type of the HTTP message." - }, - "operation": { - "type": "object", - "required": [ - "responses" - ], - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "tags": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - }, - "summary": { - "type": "string", - "description": "A brief summary of the operation." - }, - "description": { - "type": "string", - "description": "A longer description of the operation, GitHub Flavored Markdown is allowed." - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - }, - "operationId": { - "type": "string", - "description": "A unique identifier of the operation." - }, - "produces": { - "description": "A list of MIME types the API can produce.", - "allOf": [ - { - "$ref": "#/definitions/mediaTypeList" - } - ] - }, - "consumes": { - "description": "A list of MIME types the API can consume.", - "allOf": [ - { - "$ref": "#/definitions/mediaTypeList" - } - ] - }, - "parameters": { - "$ref": "#/definitions/parametersList" - }, - "responses": { - "$ref": "#/definitions/responses" - }, - "schemes": { - "$ref": "#/definitions/schemesList" - }, - "deprecated": { - "type": "boolean", - "default": false - }, - "security": { - "$ref": "#/definitions/security" - } - } - }, - "pathItem": { - "type": "object", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "$ref": { - "type": "string" - }, - "get": { - "$ref": "#/definitions/operation" - }, - "put": { - "$ref": "#/definitions/operation" - }, - "post": { - "$ref": "#/definitions/operation" - }, - "delete": { - "$ref": "#/definitions/operation" - }, - "options": { - "$ref": "#/definitions/operation" - }, - "head": { - "$ref": "#/definitions/operation" - }, - "patch": { - "$ref": "#/definitions/operation" - }, - "parameters": { - "$ref": "#/definitions/parametersList" - } - } - }, - "responses": { - "type": "object", - "description": "Response objects names can either be any valid HTTP status code or 'default'.", - "minProperties": 1, - "additionalProperties": false, - "patternProperties": { - "^([0-9]{3})$|^(default)$": { - "$ref": "#/definitions/responseValue" - }, - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "not": { - "type": "object", - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - } - }, - "responseValue": { - "oneOf": [ - { - "$ref": "#/definitions/response" - }, - { - "$ref": "#/definitions/jsonReference" - } - ] - }, - "response": { - "type": "object", - "required": [ - "description" - ], - "properties": { - "description": { - "type": "string" - }, - "schema": { - "oneOf": [ - { - "$ref": "#/definitions/schema" - }, - { - "$ref": "#/definitions/fileSchema" - } - ] - }, - "headers": { - "$ref": "#/definitions/headers" - }, - "examples": { - "$ref": "#/definitions/examples" - } - }, - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "headers": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/header" - } - }, - "header": { - "type": "object", - "additionalProperties": false, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "string", - "number", - "integer", - "boolean", - "array" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormat" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "vendorExtension": { - "description": "Any property starting with x- is valid.", - "additionalProperties": true, - "additionalItems": true - }, - "bodyParameter": { - "type": "object", - "required": [ - "name", - "in", - "schema" - ], - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "description": { - "type": "string", - "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." - }, - "name": { - "type": "string", - "description": "The name of the parameter." - }, - "in": { - "type": "string", - "description": "Determines the location of the parameter.", - "enum": [ - "body" - ] - }, - "required": { - "type": "boolean", - "description": "Determines whether or not this parameter is required or optional.", - "default": false - }, - "schema": { - "$ref": "#/definitions/schema" - } - }, - "additionalProperties": false - }, - "headerParameterSubSchema": { - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "required": { - "type": "boolean", - "description": "Determines whether or not this parameter is required or optional.", - "default": false - }, - "in": { - "type": "string", - "description": "Determines the location of the parameter.", - "enum": [ - "header" - ] - }, - "description": { - "type": "string", - "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." - }, - "name": { - "type": "string", - "description": "The name of the parameter." - }, - "type": { - "type": "string", - "enum": [ - "string", - "number", - "boolean", - "integer", - "array" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormat" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - } - } - }, - "queryParameterSubSchema": { - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "required": { - "type": "boolean", - "description": "Determines whether or not this parameter is required or optional.", - "default": false - }, - "in": { - "type": "string", - "description": "Determines the location of the parameter.", - "enum": [ - "query" - ] - }, - "description": { - "type": "string", - "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." - }, - "name": { - "type": "string", - "description": "The name of the parameter." - }, - "allowEmptyValue": { - "type": "boolean", - "default": false, - "description": "allows sending a parameter by name only or with an empty value." - }, - "type": { - "type": "string", - "enum": [ - "string", - "number", - "boolean", - "integer", - "array" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormatWithMulti" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - } - } - }, - "formDataParameterSubSchema": { - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "required": { - "type": "boolean", - "description": "Determines whether or not this parameter is required or optional.", - "default": false - }, - "in": { - "type": "string", - "description": "Determines the location of the parameter.", - "enum": [ - "formData" - ] - }, - "description": { - "type": "string", - "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." - }, - "name": { - "type": "string", - "description": "The name of the parameter." - }, - "allowEmptyValue": { - "type": "boolean", - "default": false, - "description": "allows sending a parameter by name only or with an empty value." - }, - "type": { - "type": "string", - "enum": [ - "string", - "number", - "boolean", - "integer", - "array", - "file" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormatWithMulti" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - } - } - }, - "pathParameterSubSchema": { - "additionalProperties": false, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "required": [ - "required" - ], - "properties": { - "required": { - "type": "boolean", - "enum": [ - true - ], - "description": "Determines whether or not this parameter is required or optional." - }, - "in": { - "type": "string", - "description": "Determines the location of the parameter.", - "enum": [ - "path" - ] - }, - "description": { - "type": "string", - "description": "A brief description of the parameter. This could contain examples of use. GitHub Flavored Markdown is allowed." - }, - "name": { - "type": "string", - "description": "The name of the parameter." - }, - "type": { - "type": "string", - "enum": [ - "string", - "number", - "boolean", - "integer", - "array" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormat" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - } - } - }, - "nonBodyParameter": { - "type": "object", - "required": [ - "name", - "in", - "type" - ], - "oneOf": [ - { - "$ref": "#/definitions/headerParameterSubSchema" - }, - { - "$ref": "#/definitions/formDataParameterSubSchema" - }, - { - "$ref": "#/definitions/queryParameterSubSchema" - }, - { - "$ref": "#/definitions/pathParameterSubSchema" - } - ] - }, - "parameter": { - "oneOf": [ - { - "$ref": "#/definitions/bodyParameter" - }, - { - "$ref": "#/definitions/nonBodyParameter" - } - ] - }, - "schema": { - "type": "object", - "description": "A deterministic version of a JSON Schema object.", - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "properties": { - "$ref": { - "type": "string" - }, - "format": { - "type": "string" - }, - "title": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/title" - }, - "description": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/description" - }, - "default": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/default" - }, - "multipleOf": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" - }, - "maximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" - }, - "exclusiveMaximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" - }, - "minimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" - }, - "exclusiveMinimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" - }, - "maxLength": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" - }, - "minLength": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" - }, - "pattern": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" - }, - "maxItems": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" - }, - "minItems": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" - }, - "uniqueItems": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" - }, - "maxProperties": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" - }, - "minProperties": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" - }, - "required": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" - }, - "enum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" - }, - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/schema" - }, - { - "type": "boolean" - } - ], - "default": {} - }, - "type": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/type" - }, - "items": { - "anyOf": [ - { - "$ref": "#/definitions/schema" - }, - { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/schema" - } - } - ], - "default": {} - }, - "allOf": { - "type": "array", - "minItems": 1, - "items": { - "$ref": "#/definitions/schema" - } - }, - "properties": { - "type": "object", - "additionalProperties": { - "$ref": "#/definitions/schema" - }, - "default": {} - }, - "discriminator": { - "type": "string" - }, - "readOnly": { - "type": "boolean", - "default": false - }, - "xml": { - "$ref": "#/definitions/xml" - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - }, - "example": {} - }, - "additionalProperties": false - }, - "fileSchema": { - "type": "object", - "description": "A deterministic version of a JSON Schema object.", - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - }, - "required": [ - "type" - ], - "properties": { - "format": { - "type": "string" - }, - "title": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/title" - }, - "description": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/description" - }, - "default": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/default" - }, - "required": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/stringArray" - }, - "type": { - "type": "string", - "enum": [ - "file" - ] - }, - "readOnly": { - "type": "boolean", - "default": false - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - }, - "example": {} - }, - "additionalProperties": false - }, - "primitivesItems": { - "type": "object", - "additionalProperties": false, - "properties": { - "type": { - "type": "string", - "enum": [ - "string", - "number", - "integer", - "boolean", - "array" - ] - }, - "format": { - "type": "string" - }, - "items": { - "$ref": "#/definitions/primitivesItems" - }, - "collectionFormat": { - "$ref": "#/definitions/collectionFormat" - }, - "default": { - "$ref": "#/definitions/default" - }, - "maximum": { - "$ref": "#/definitions/maximum" - }, - "exclusiveMaximum": { - "$ref": "#/definitions/exclusiveMaximum" - }, - "minimum": { - "$ref": "#/definitions/minimum" - }, - "exclusiveMinimum": { - "$ref": "#/definitions/exclusiveMinimum" - }, - "maxLength": { - "$ref": "#/definitions/maxLength" - }, - "minLength": { - "$ref": "#/definitions/minLength" - }, - "pattern": { - "$ref": "#/definitions/pattern" - }, - "maxItems": { - "$ref": "#/definitions/maxItems" - }, - "minItems": { - "$ref": "#/definitions/minItems" - }, - "uniqueItems": { - "$ref": "#/definitions/uniqueItems" - }, - "enum": { - "$ref": "#/definitions/enum" - }, - "multipleOf": { - "$ref": "#/definitions/multipleOf" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "security": { - "type": "array", - "items": { - "$ref": "#/definitions/securityRequirement" - }, - "uniqueItems": true - }, - "securityRequirement": { - "type": "object", - "additionalProperties": { - "type": "array", - "items": { - "type": "string" - }, - "uniqueItems": true - } - }, - "xml": { - "type": "object", - "additionalProperties": false, - "properties": { - "name": { - "type": "string" - }, - "namespace": { - "type": "string" - }, - "prefix": { - "type": "string" - }, - "attribute": { - "type": "boolean", - "default": false - }, - "wrapped": { - "type": "boolean", - "default": false - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "tag": { - "type": "object", - "additionalProperties": false, - "required": [ - "name" - ], - "properties": { - "name": { - "type": "string" - }, - "description": { - "type": "string" - }, - "externalDocs": { - "$ref": "#/definitions/externalDocs" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "securityDefinitions": { - "type": "object", - "additionalProperties": { - "oneOf": [ - { - "$ref": "#/definitions/basicAuthenticationSecurity" - }, - { - "$ref": "#/definitions/apiKeySecurity" - }, - { - "$ref": "#/definitions/oauth2ImplicitSecurity" - }, - { - "$ref": "#/definitions/oauth2PasswordSecurity" - }, - { - "$ref": "#/definitions/oauth2ApplicationSecurity" - }, - { - "$ref": "#/definitions/oauth2AccessCodeSecurity" - } - ] - } - }, - "basicAuthenticationSecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "basic" - ] - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "apiKeySecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type", - "name", - "in" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "apiKey" - ] - }, - "name": { - "type": "string" - }, - "in": { - "type": "string", - "enum": [ - "header", - "query" - ] - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "oauth2ImplicitSecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type", - "flow", - "authorizationUrl" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "oauth2" - ] - }, - "flow": { - "type": "string", - "enum": [ - "implicit" - ] - }, - "scopes": { - "$ref": "#/definitions/oauth2Scopes" - }, - "authorizationUrl": { - "type": "string", - "format": "uri" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "oauth2PasswordSecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type", - "flow", - "tokenUrl" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "oauth2" - ] - }, - "flow": { - "type": "string", - "enum": [ - "password" - ] - }, - "scopes": { - "$ref": "#/definitions/oauth2Scopes" - }, - "tokenUrl": { - "type": "string", - "format": "uri" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "oauth2ApplicationSecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type", - "flow", - "tokenUrl" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "oauth2" - ] - }, - "flow": { - "type": "string", - "enum": [ - "application" - ] - }, - "scopes": { - "$ref": "#/definitions/oauth2Scopes" - }, - "tokenUrl": { - "type": "string", - "format": "uri" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "oauth2AccessCodeSecurity": { - "type": "object", - "additionalProperties": false, - "required": [ - "type", - "flow", - "authorizationUrl", - "tokenUrl" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "oauth2" - ] - }, - "flow": { - "type": "string", - "enum": [ - "accessCode" - ] - }, - "scopes": { - "$ref": "#/definitions/oauth2Scopes" - }, - "authorizationUrl": { - "type": "string", - "format": "uri" - }, - "tokenUrl": { - "type": "string", - "format": "uri" - }, - "description": { - "type": "string" - } - }, - "patternProperties": { - "^x-": { - "$ref": "#/definitions/vendorExtension" - } - } - }, - "oauth2Scopes": { - "type": "object", - "additionalProperties": { - "type": "string" - } - }, - "mediaTypeList": { - "type": "array", - "items": { - "$ref": "#/definitions/mimeType" - }, - "uniqueItems": true - }, - "parametersList": { - "type": "array", - "description": "The parameters needed to send a valid API call.", - "additionalItems": false, - "items": { - "oneOf": [ - { - "$ref": "#/definitions/parameter" - }, - { - "$ref": "#/definitions/jsonReference" - } - ] - }, - "uniqueItems": true - }, - "schemesList": { - "type": "array", - "description": "The transfer protocol of the API.", - "items": { - "type": "string", - "enum": [ - "http", - "https", - "ws", - "wss" - ] - }, - "uniqueItems": true - }, - "collectionFormat": { - "type": "string", - "enum": [ - "csv", - "ssv", - "tsv", - "pipes" - ], - "default": "csv" - }, - "collectionFormatWithMulti": { - "type": "string", - "enum": [ - "csv", - "ssv", - "tsv", - "pipes", - "multi" - ], - "default": "csv" - }, - "title": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/title" - }, - "description": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/description" - }, - "default": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/default" - }, - "multipleOf": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/multipleOf" - }, - "maximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/maximum" - }, - "exclusiveMaximum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMaximum" - }, - "minimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/minimum" - }, - "exclusiveMinimum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/exclusiveMinimum" - }, - "maxLength": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" - }, - "minLength": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" - }, - "pattern": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/pattern" - }, - "maxItems": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveInteger" - }, - "minItems": { - "$ref": "http://json-schema.org/draft-04/schema#/definitions/positiveIntegerDefault0" - }, - "uniqueItems": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/uniqueItems" - }, - "enum": { - "$ref": "http://json-schema.org/draft-04/schema#/properties/enum" - }, - "jsonReference": { - "type": "object", - "required": [ - "$ref" - ], - "additionalProperties": false, - "properties": { - "$ref": { - "type": "string" - }, - "description": { - "type": "string" - } - } - } - } -} diff --git a/vendor/github.com/googleapis/gnostic/compiler/README.md b/vendor/github.com/googleapis/gnostic/compiler/README.md deleted file mode 100644 index 848b16c..0000000 --- a/vendor/github.com/googleapis/gnostic/compiler/README.md +++ /dev/null @@ -1,3 +0,0 @@ -# Compiler support code - -This directory contains compiler support code used by Gnostic and Gnostic extensions. \ No newline at end of file diff --git a/vendor/github.com/googleapis/gnostic/compiler/context.go b/vendor/github.com/googleapis/gnostic/compiler/context.go deleted file mode 100644 index a64c1b7..0000000 --- a/vendor/github.com/googleapis/gnostic/compiler/context.go +++ /dev/null @@ -1,43 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package compiler - -// Context contains state of the compiler as it traverses a document. -type Context struct { - Parent *Context - Name string - ExtensionHandlers *[]ExtensionHandler -} - -// NewContextWithExtensions returns a new object representing the compiler state -func NewContextWithExtensions(name string, parent *Context, extensionHandlers *[]ExtensionHandler) *Context { - return &Context{Name: name, Parent: parent, ExtensionHandlers: extensionHandlers} -} - -// NewContext returns a new object representing the compiler state -func NewContext(name string, parent *Context) *Context { - if parent != nil { - return &Context{Name: name, Parent: parent, ExtensionHandlers: parent.ExtensionHandlers} - } - return &Context{Name: name, Parent: parent, ExtensionHandlers: nil} -} - -// Description returns a text description of the compiler state -func (context *Context) Description() string { - if context.Parent != nil { - return context.Parent.Description() + "." + context.Name - } - return context.Name -} diff --git a/vendor/github.com/googleapis/gnostic/compiler/error.go b/vendor/github.com/googleapis/gnostic/compiler/error.go deleted file mode 100644 index d8672c1..0000000 --- a/vendor/github.com/googleapis/gnostic/compiler/error.go +++ /dev/null @@ -1,61 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package compiler - -// Error represents compiler errors and their location in the document. -type Error struct { - Context *Context - Message string -} - -// NewError creates an Error. -func NewError(context *Context, message string) *Error { - return &Error{Context: context, Message: message} -} - -// Error returns the string value of an Error. -func (err *Error) Error() string { - if err.Context == nil { - return "ERROR " + err.Message - } - return "ERROR " + err.Context.Description() + " " + err.Message -} - -// ErrorGroup is a container for groups of Error values. -type ErrorGroup struct { - Errors []error -} - -// NewErrorGroupOrNil returns a new ErrorGroup for a slice of errors or nil if the slice is empty. -func NewErrorGroupOrNil(errors []error) error { - if len(errors) == 0 { - return nil - } else if len(errors) == 1 { - return errors[0] - } else { - return &ErrorGroup{Errors: errors} - } -} - -func (group *ErrorGroup) Error() string { - result := "" - for i, err := range group.Errors { - if i > 0 { - result += "\n" - } - result += err.Error() - } - return result -} diff --git a/vendor/github.com/googleapis/gnostic/compiler/extension-handler.go b/vendor/github.com/googleapis/gnostic/compiler/extension-handler.go deleted file mode 100644 index 1f85b65..0000000 --- a/vendor/github.com/googleapis/gnostic/compiler/extension-handler.go +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package compiler - -import ( - "bytes" - "fmt" - "os/exec" - - "strings" - - "errors" - - "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes/any" - ext_plugin "github.com/googleapis/gnostic/extensions" - yaml "gopkg.in/yaml.v2" -) - -// ExtensionHandler describes a binary that is called by the compiler to handle specification extensions. -type ExtensionHandler struct { - Name string -} - -// HandleExtension calls a binary extension handler. -func HandleExtension(context *Context, in interface{}, extensionName string) (bool, *any.Any, error) { - handled := false - var errFromPlugin error - var outFromPlugin *any.Any - - if context != nil && context.ExtensionHandlers != nil && len(*(context.ExtensionHandlers)) != 0 { - for _, customAnyProtoGenerator := range *(context.ExtensionHandlers) { - outFromPlugin, errFromPlugin = customAnyProtoGenerator.handle(in, extensionName) - if outFromPlugin == nil { - continue - } else { - handled = true - break - } - } - } - return handled, outFromPlugin, errFromPlugin -} - -func (extensionHandlers *ExtensionHandler) handle(in interface{}, extensionName string) (*any.Any, error) { - if extensionHandlers.Name != "" { - binary, _ := yaml.Marshal(in) - - request := &ext_plugin.ExtensionHandlerRequest{} - - version := &ext_plugin.Version{} - version.Major = 0 - version.Minor = 1 - version.Patch = 0 - request.CompilerVersion = version - - request.Wrapper = &ext_plugin.Wrapper{} - - request.Wrapper.Version = "v2" - request.Wrapper.Yaml = string(binary) - request.Wrapper.ExtensionName = extensionName - - requestBytes, _ := proto.Marshal(request) - cmd := exec.Command(extensionHandlers.Name) - cmd.Stdin = bytes.NewReader(requestBytes) - output, err := cmd.Output() - - if err != nil { - fmt.Printf("Error: %+v\n", err) - return nil, err - } - response := &ext_plugin.ExtensionHandlerResponse{} - err = proto.Unmarshal(output, response) - if err != nil { - fmt.Printf("Error: %+v\n", err) - fmt.Printf("%s\n", string(output)) - return nil, err - } - if !response.Handled { - return nil, nil - } - if len(response.Error) != 0 { - message := fmt.Sprintf("Errors when parsing: %+v for field %s by vendor extension handler %s. Details %+v", in, extensionName, extensionHandlers.Name, strings.Join(response.Error, ",")) - return nil, errors.New(message) - } - return response.Value, nil - } - return nil, nil -} diff --git a/vendor/github.com/googleapis/gnostic/compiler/helpers.go b/vendor/github.com/googleapis/gnostic/compiler/helpers.go deleted file mode 100644 index 76df635..0000000 --- a/vendor/github.com/googleapis/gnostic/compiler/helpers.go +++ /dev/null @@ -1,197 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package compiler - -import ( - "fmt" - "gopkg.in/yaml.v2" - "regexp" - "sort" - "strconv" -) - -// compiler helper functions, usually called from generated code - -// UnpackMap gets a yaml.MapSlice if possible. -func UnpackMap(in interface{}) (yaml.MapSlice, bool) { - m, ok := in.(yaml.MapSlice) - if ok { - return m, true - } - // do we have an empty array? - a, ok := in.([]interface{}) - if ok && len(a) == 0 { - // if so, return an empty map - return yaml.MapSlice{}, true - } - return nil, false -} - -// SortedKeysForMap returns the sorted keys of a yaml.MapSlice. -func SortedKeysForMap(m yaml.MapSlice) []string { - keys := make([]string, 0) - for _, item := range m { - keys = append(keys, item.Key.(string)) - } - sort.Strings(keys) - return keys -} - -// MapHasKey returns true if a yaml.MapSlice contains a specified key. -func MapHasKey(m yaml.MapSlice, key string) bool { - for _, item := range m { - itemKey, ok := item.Key.(string) - if ok && key == itemKey { - return true - } - } - return false -} - -// MapValueForKey gets the value of a map value for a specified key. -func MapValueForKey(m yaml.MapSlice, key string) interface{} { - for _, item := range m { - itemKey, ok := item.Key.(string) - if ok && key == itemKey { - return item.Value - } - } - return nil -} - -// ConvertInterfaceArrayToStringArray converts an array of interfaces to an array of strings, if possible. -func ConvertInterfaceArrayToStringArray(interfaceArray []interface{}) []string { - stringArray := make([]string, 0) - for _, item := range interfaceArray { - v, ok := item.(string) - if ok { - stringArray = append(stringArray, v) - } - } - return stringArray -} - -// MissingKeysInMap identifies which keys from a list of required keys are not in a map. -func MissingKeysInMap(m yaml.MapSlice, requiredKeys []string) []string { - missingKeys := make([]string, 0) - for _, k := range requiredKeys { - if !MapHasKey(m, k) { - missingKeys = append(missingKeys, k) - } - } - return missingKeys -} - -// InvalidKeysInMap returns keys in a map that don't match a list of allowed keys and patterns. -func InvalidKeysInMap(m yaml.MapSlice, allowedKeys []string, allowedPatterns []*regexp.Regexp) []string { - invalidKeys := make([]string, 0) - for _, item := range m { - itemKey, ok := item.Key.(string) - if ok { - key := itemKey - found := false - // does the key match an allowed key? - for _, allowedKey := range allowedKeys { - if key == allowedKey { - found = true - break - } - } - if !found { - // does the key match an allowed pattern? - for _, allowedPattern := range allowedPatterns { - if allowedPattern.MatchString(key) { - found = true - break - } - } - if !found { - invalidKeys = append(invalidKeys, key) - } - } - } - } - return invalidKeys -} - -// DescribeMap describes a map (for debugging purposes). -func DescribeMap(in interface{}, indent string) string { - description := "" - m, ok := in.(map[string]interface{}) - if ok { - keys := make([]string, 0) - for k := range m { - keys = append(keys, k) - } - sort.Strings(keys) - for _, k := range keys { - v := m[k] - description += fmt.Sprintf("%s%s:\n", indent, k) - description += DescribeMap(v, indent+" ") - } - return description - } - a, ok := in.([]interface{}) - if ok { - for i, v := range a { - description += fmt.Sprintf("%s%d:\n", indent, i) - description += DescribeMap(v, indent+" ") - } - return description - } - description += fmt.Sprintf("%s%+v\n", indent, in) - return description -} - -// PluralProperties returns the string "properties" pluralized. -func PluralProperties(count int) string { - if count == 1 { - return "property" - } - return "properties" -} - -// StringArrayContainsValue returns true if a string array contains a specified value. -func StringArrayContainsValue(array []string, value string) bool { - for _, item := range array { - if item == value { - return true - } - } - return false -} - -// StringArrayContainsValues returns true if a string array contains all of a list of specified values. -func StringArrayContainsValues(array []string, values []string) bool { - for _, value := range values { - if !StringArrayContainsValue(array, value) { - return false - } - } - return true -} - -// StringValue returns the string value of an item. -func StringValue(item interface{}) (value string, ok bool) { - value, ok = item.(string) - if ok { - return value, ok - } - intValue, ok := item.(int) - if ok { - return strconv.Itoa(intValue), true - } - return "", false -} diff --git a/vendor/github.com/googleapis/gnostic/compiler/main.go b/vendor/github.com/googleapis/gnostic/compiler/main.go deleted file mode 100644 index 9713a21..0000000 --- a/vendor/github.com/googleapis/gnostic/compiler/main.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package compiler provides support functions to generated compiler code. -package compiler diff --git a/vendor/github.com/googleapis/gnostic/compiler/reader.go b/vendor/github.com/googleapis/gnostic/compiler/reader.go deleted file mode 100644 index 604a46a..0000000 --- a/vendor/github.com/googleapis/gnostic/compiler/reader.go +++ /dev/null @@ -1,167 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package compiler - -import ( - "fmt" - "gopkg.in/yaml.v2" - "io/ioutil" - "log" - "net/http" - "net/url" - "path/filepath" - "strings" -) - -var fileCache map[string][]byte -var infoCache map[string]interface{} -var count int64 - -var verboseReader = false - -func initializeFileCache() { - if fileCache == nil { - fileCache = make(map[string][]byte, 0) - } -} - -func initializeInfoCache() { - if infoCache == nil { - infoCache = make(map[string]interface{}, 0) - } -} - -// FetchFile gets a specified file from the local filesystem or a remote location. -func FetchFile(fileurl string) ([]byte, error) { - initializeFileCache() - bytes, ok := fileCache[fileurl] - if ok { - if verboseReader { - log.Printf("Cache hit %s", fileurl) - } - return bytes, nil - } - log.Printf("Fetching %s", fileurl) - response, err := http.Get(fileurl) - if err != nil { - return nil, err - } - defer response.Body.Close() - bytes, err = ioutil.ReadAll(response.Body) - if err == nil { - fileCache[fileurl] = bytes - } - return bytes, err -} - -// ReadBytesForFile reads the bytes of a file. -func ReadBytesForFile(filename string) ([]byte, error) { - // is the filename a url? - fileurl, _ := url.Parse(filename) - if fileurl.Scheme != "" { - // yes, fetch it - bytes, err := FetchFile(filename) - if err != nil { - return nil, err - } - return bytes, nil - } - // no, it's a local filename - bytes, err := ioutil.ReadFile(filename) - if err != nil { - return nil, err - } - return bytes, nil -} - -// ReadInfoFromBytes unmarshals a file as a yaml.MapSlice. -func ReadInfoFromBytes(filename string, bytes []byte) (interface{}, error) { - initializeInfoCache() - cachedInfo, ok := infoCache[filename] - if ok { - if verboseReader { - log.Printf("Cache hit info for file %s", filename) - } - return cachedInfo, nil - } - if verboseReader { - log.Printf("Reading info for file %s", filename) - } - var info yaml.MapSlice - err := yaml.Unmarshal(bytes, &info) - if err != nil { - return nil, err - } - infoCache[filename] = info - return info, nil -} - -// ReadInfoForRef reads a file and return the fragment needed to resolve a $ref. -func ReadInfoForRef(basefile string, ref string) (interface{}, error) { - initializeInfoCache() - { - info, ok := infoCache[ref] - if ok { - if verboseReader { - log.Printf("Cache hit for ref %s#%s", basefile, ref) - } - return info, nil - } - } - if verboseReader { - log.Printf("Reading info for ref %s#%s", basefile, ref) - } - count = count + 1 - basedir, _ := filepath.Split(basefile) - parts := strings.Split(ref, "#") - var filename string - if parts[0] != "" { - filename = basedir + parts[0] - } else { - filename = basefile - } - bytes, err := ReadBytesForFile(filename) - if err != nil { - return nil, err - } - info, err := ReadInfoFromBytes(filename, bytes) - if err != nil { - log.Printf("File error: %v\n", err) - } else { - if len(parts) > 1 { - path := strings.Split(parts[1], "/") - for i, key := range path { - if i > 0 { - m, ok := info.(yaml.MapSlice) - if ok { - found := false - for _, section := range m { - if section.Key == key { - info = section.Value - found = true - } - } - if !found { - infoCache[ref] = nil - return nil, NewError(nil, fmt.Sprintf("could not resolve %s", ref)) - } - } - } - } - } - } - infoCache[ref] = info - return info, nil -} diff --git a/vendor/github.com/googleapis/gnostic/extensions/COMPILE-EXTENSION.sh b/vendor/github.com/googleapis/gnostic/extensions/COMPILE-EXTENSION.sh deleted file mode 100755 index 68d02a0..0000000 --- a/vendor/github.com/googleapis/gnostic/extensions/COMPILE-EXTENSION.sh +++ /dev/null @@ -1,5 +0,0 @@ -go get github.com/golang/protobuf/protoc-gen-go - -protoc \ ---go_out=Mgoogle/protobuf/any.proto=github.com/golang/protobuf/ptypes/any:. *.proto - diff --git a/vendor/github.com/googleapis/gnostic/extensions/README.md b/vendor/github.com/googleapis/gnostic/extensions/README.md deleted file mode 100644 index ff1c2eb..0000000 --- a/vendor/github.com/googleapis/gnostic/extensions/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Extensions - -This directory contains support code for building Gnostic extensions and associated examples. - -Extensions are used to compile vendor or specification extensions into protocol buffer structures. diff --git a/vendor/github.com/googleapis/gnostic/extensions/extension.pb.go b/vendor/github.com/googleapis/gnostic/extensions/extension.pb.go deleted file mode 100644 index b14f1f9..0000000 --- a/vendor/github.com/googleapis/gnostic/extensions/extension.pb.go +++ /dev/null @@ -1,219 +0,0 @@ -// Code generated by protoc-gen-go. -// source: extension.proto -// DO NOT EDIT! - -/* -Package openapiextension_v1 is a generated protocol buffer package. - -It is generated from these files: - extension.proto - -It has these top-level messages: - Version - ExtensionHandlerRequest - ExtensionHandlerResponse - Wrapper -*/ -package openapiextension_v1 - -import proto "github.com/golang/protobuf/proto" -import fmt "fmt" -import math "math" -import google_protobuf "github.com/golang/protobuf/ptypes/any" - -// Reference imports to suppress errors if they are not otherwise used. -var _ = proto.Marshal -var _ = fmt.Errorf -var _ = math.Inf - -// This is a compile-time assertion to ensure that this generated file -// is compatible with the proto package it is being compiled against. -// A compilation error at this line likely means your copy of the -// proto package needs to be updated. -const _ = proto.ProtoPackageIsVersion2 // please upgrade the proto package - -// The version number of OpenAPI compiler. -type Version struct { - Major int32 `protobuf:"varint,1,opt,name=major" json:"major,omitempty"` - Minor int32 `protobuf:"varint,2,opt,name=minor" json:"minor,omitempty"` - Patch int32 `protobuf:"varint,3,opt,name=patch" json:"patch,omitempty"` - // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should - // be empty for mainline stable releases. - Suffix string `protobuf:"bytes,4,opt,name=suffix" json:"suffix,omitempty"` -} - -func (m *Version) Reset() { *m = Version{} } -func (m *Version) String() string { return proto.CompactTextString(m) } -func (*Version) ProtoMessage() {} -func (*Version) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{0} } - -func (m *Version) GetMajor() int32 { - if m != nil { - return m.Major - } - return 0 -} - -func (m *Version) GetMinor() int32 { - if m != nil { - return m.Minor - } - return 0 -} - -func (m *Version) GetPatch() int32 { - if m != nil { - return m.Patch - } - return 0 -} - -func (m *Version) GetSuffix() string { - if m != nil { - return m.Suffix - } - return "" -} - -// An encoded Request is written to the ExtensionHandler's stdin. -type ExtensionHandlerRequest struct { - // The OpenAPI descriptions that were explicitly listed on the command line. - // The specifications will appear in the order they are specified to openapic. - Wrapper *Wrapper `protobuf:"bytes,1,opt,name=wrapper" json:"wrapper,omitempty"` - // The version number of openapi compiler. - CompilerVersion *Version `protobuf:"bytes,3,opt,name=compiler_version,json=compilerVersion" json:"compiler_version,omitempty"` -} - -func (m *ExtensionHandlerRequest) Reset() { *m = ExtensionHandlerRequest{} } -func (m *ExtensionHandlerRequest) String() string { return proto.CompactTextString(m) } -func (*ExtensionHandlerRequest) ProtoMessage() {} -func (*ExtensionHandlerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{1} } - -func (m *ExtensionHandlerRequest) GetWrapper() *Wrapper { - if m != nil { - return m.Wrapper - } - return nil -} - -func (m *ExtensionHandlerRequest) GetCompilerVersion() *Version { - if m != nil { - return m.CompilerVersion - } - return nil -} - -// The extensions writes an encoded ExtensionHandlerResponse to stdout. -type ExtensionHandlerResponse struct { - // true if the extension is handled by the extension handler; false otherwise - Handled bool `protobuf:"varint,1,opt,name=handled" json:"handled,omitempty"` - // Error message. If non-empty, the extension handling failed. - // The extension handler process should exit with status code zero - // even if it reports an error in this way. - // - // This should be used to indicate errors which prevent the extension from - // operating as intended. Errors which indicate a problem in gnostic - // itself -- such as the input Document being unparseable -- should be - // reported by writing a message to stderr and exiting with a non-zero - // status code. - Error []string `protobuf:"bytes,2,rep,name=error" json:"error,omitempty"` - // text output - Value *google_protobuf.Any `protobuf:"bytes,3,opt,name=value" json:"value,omitempty"` -} - -func (m *ExtensionHandlerResponse) Reset() { *m = ExtensionHandlerResponse{} } -func (m *ExtensionHandlerResponse) String() string { return proto.CompactTextString(m) } -func (*ExtensionHandlerResponse) ProtoMessage() {} -func (*ExtensionHandlerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{2} } - -func (m *ExtensionHandlerResponse) GetHandled() bool { - if m != nil { - return m.Handled - } - return false -} - -func (m *ExtensionHandlerResponse) GetError() []string { - if m != nil { - return m.Error - } - return nil -} - -func (m *ExtensionHandlerResponse) GetValue() *google_protobuf.Any { - if m != nil { - return m.Value - } - return nil -} - -type Wrapper struct { - // version of the OpenAPI specification in which this extension was written. - Version string `protobuf:"bytes,1,opt,name=version" json:"version,omitempty"` - // Name of the extension - ExtensionName string `protobuf:"bytes,2,opt,name=extension_name,json=extensionName" json:"extension_name,omitempty"` - // Must be a valid yaml for the proto - Yaml string `protobuf:"bytes,3,opt,name=yaml" json:"yaml,omitempty"` -} - -func (m *Wrapper) Reset() { *m = Wrapper{} } -func (m *Wrapper) String() string { return proto.CompactTextString(m) } -func (*Wrapper) ProtoMessage() {} -func (*Wrapper) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{3} } - -func (m *Wrapper) GetVersion() string { - if m != nil { - return m.Version - } - return "" -} - -func (m *Wrapper) GetExtensionName() string { - if m != nil { - return m.ExtensionName - } - return "" -} - -func (m *Wrapper) GetYaml() string { - if m != nil { - return m.Yaml - } - return "" -} - -func init() { - proto.RegisterType((*Version)(nil), "openapiextension.v1.Version") - proto.RegisterType((*ExtensionHandlerRequest)(nil), "openapiextension.v1.ExtensionHandlerRequest") - proto.RegisterType((*ExtensionHandlerResponse)(nil), "openapiextension.v1.ExtensionHandlerResponse") - proto.RegisterType((*Wrapper)(nil), "openapiextension.v1.Wrapper") -} - -func init() { proto.RegisterFile("extension.proto", fileDescriptor0) } - -var fileDescriptor0 = []byte{ - // 355 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x09, 0x6e, 0x88, 0x02, 0xff, 0x74, 0x91, 0x4d, 0x4b, 0xf3, 0x40, - 0x1c, 0xc4, 0x49, 0xdf, 0xf2, 0x64, 0x1f, 0xb4, 0xb2, 0x16, 0x8d, 0xe2, 0xa1, 0x04, 0x84, 0x22, - 0xb8, 0xa5, 0x0a, 0xde, 0x5b, 0x28, 0xea, 0xc5, 0x96, 0x3d, 0xd4, 0x9b, 0x65, 0x9b, 0xfe, 0xdb, - 0x46, 0x92, 0xdd, 0x75, 0xf3, 0x62, 0xfb, 0x55, 0x3c, 0xfa, 0x49, 0x25, 0xbb, 0xd9, 0x7a, 0x50, - 0x6f, 0x99, 0x1f, 0x93, 0xfc, 0x67, 0x26, 0xa8, 0x0d, 0xdb, 0x0c, 0x78, 0x1a, 0x09, 0x4e, 0xa4, - 0x12, 0x99, 0xc0, 0xc7, 0x42, 0x02, 0x67, 0x32, 0xfa, 0xe6, 0xc5, 0xe0, 0xfc, 0x6c, 0x2d, 0xc4, - 0x3a, 0x86, 0xbe, 0xb6, 0x2c, 0xf2, 0x55, 0x9f, 0xf1, 0x9d, 0xf1, 0x07, 0x21, 0x72, 0x67, 0xa0, - 0x4a, 0x23, 0xee, 0xa0, 0x66, 0xc2, 0x5e, 0x85, 0xf2, 0x9d, 0xae, 0xd3, 0x6b, 0x52, 0x23, 0x34, - 0x8d, 0xb8, 0x50, 0x7e, 0xad, 0xa2, 0xa5, 0x28, 0xa9, 0x64, 0x59, 0xb8, 0xf1, 0xeb, 0x86, 0x6a, - 0x81, 0x4f, 0x50, 0x2b, 0xcd, 0x57, 0xab, 0x68, 0xeb, 0x37, 0xba, 0x4e, 0xcf, 0xa3, 0x95, 0x0a, - 0x3e, 0x1c, 0x74, 0x3a, 0xb6, 0x81, 0x1e, 0x18, 0x5f, 0xc6, 0xa0, 0x28, 0xbc, 0xe5, 0x90, 0x66, - 0xf8, 0x0e, 0xb9, 0xef, 0x8a, 0x49, 0x09, 0xe6, 0xee, 0xff, 0x9b, 0x0b, 0xf2, 0x4b, 0x05, 0xf2, - 0x6c, 0x3c, 0xd4, 0x9a, 0xf1, 0x3d, 0x3a, 0x0a, 0x45, 0x22, 0xa3, 0x18, 0xd4, 0xbc, 0x30, 0x0d, - 0x74, 0x98, 0xbf, 0x3e, 0x50, 0xb5, 0xa4, 0x6d, 0xfb, 0x56, 0x05, 0x82, 0x02, 0xf9, 0x3f, 0xb3, - 0xa5, 0x52, 0xf0, 0x14, 0xb0, 0x8f, 0xdc, 0x8d, 0x46, 0x4b, 0x1d, 0xee, 0x1f, 0xb5, 0xb2, 0x1c, - 0x00, 0x94, 0xd2, 0xb3, 0xd4, 0x7b, 0x1e, 0x35, 0x02, 0x5f, 0xa1, 0x66, 0xc1, 0xe2, 0x1c, 0xaa, - 0x24, 0x1d, 0x62, 0x86, 0x27, 0x76, 0x78, 0x32, 0xe4, 0x3b, 0x6a, 0x2c, 0xc1, 0x0b, 0x72, 0xab, - 0x52, 0xe5, 0x19, 0x5b, 0xc1, 0xd1, 0xc3, 0x59, 0x89, 0x2f, 0xd1, 0xe1, 0xbe, 0xc5, 0x9c, 0xb3, - 0x04, 0xf4, 0x6f, 0xf0, 0xe8, 0xc1, 0x9e, 0x3e, 0xb1, 0x04, 0x30, 0x46, 0x8d, 0x1d, 0x4b, 0x62, - 0x7d, 0xd6, 0xa3, 0xfa, 0x79, 0x74, 0x8d, 0xda, 0x42, 0xad, 0xed, 0x16, 0x21, 0x29, 0x06, 0x23, - 0x3c, 0x91, 0xc0, 0x87, 0xd3, 0xc7, 0x7d, 0xdf, 0xd9, 0x60, 0xea, 0x7c, 0xd6, 0xea, 0x93, 0xe1, - 0x78, 0xd1, 0xd2, 0x19, 0x6f, 0xbf, 0x02, 0x00, 0x00, 0xff, 0xff, 0xfc, 0x56, 0x40, 0x4d, 0x52, - 0x02, 0x00, 0x00, -} diff --git a/vendor/github.com/googleapis/gnostic/extensions/extension.proto b/vendor/github.com/googleapis/gnostic/extensions/extension.proto deleted file mode 100644 index 806760a..0000000 --- a/vendor/github.com/googleapis/gnostic/extensions/extension.proto +++ /dev/null @@ -1,93 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -syntax = "proto3"; - -import "google/protobuf/any.proto"; -package openapiextension.v1; - -// This option lets the proto compiler generate Java code inside the package -// name (see below) instead of inside an outer class. It creates a simpler -// developer experience by reducing one-level of name nesting and be -// consistent with most programming languages that don't support outer classes. -option java_multiple_files = true; - -// The Java outer classname should be the filename in UpperCamelCase. This -// class is only used to hold proto descriptor, so developers don't need to -// work with it directly. -option java_outer_classname = "OpenAPIExtensionV1"; - -// The Java package name must be proto package name with proper prefix. -option java_package = "org.openapic.v1"; - -// A reasonable prefix for the Objective-C symbols generated from the package. -// It should at a minimum be 3 characters long, all uppercase, and convention -// is to use an abbreviation of the package name. Something short, but -// hopefully unique enough to not conflict with things that may come along in -// the future. 'GPB' is reserved for the protocol buffer implementation itself. -// -option objc_class_prefix = "OAE"; // "OpenAPI Extension" - -// The version number of OpenAPI compiler. -message Version { - int32 major = 1; - int32 minor = 2; - int32 patch = 3; - // A suffix for alpha, beta or rc release, e.g., "alpha-1", "rc2". It should - // be empty for mainline stable releases. - string suffix = 4; -} - -// An encoded Request is written to the ExtensionHandler's stdin. -message ExtensionHandlerRequest { - - // The OpenAPI descriptions that were explicitly listed on the command line. - // The specifications will appear in the order they are specified to openapic. - Wrapper wrapper = 1; - - // The version number of openapi compiler. - Version compiler_version = 3; -} - -// The extensions writes an encoded ExtensionHandlerResponse to stdout. -message ExtensionHandlerResponse { - - // true if the extension is handled by the extension handler; false otherwise - bool handled = 1; - - // Error message. If non-empty, the extension handling failed. - // The extension handler process should exit with status code zero - // even if it reports an error in this way. - // - // This should be used to indicate errors which prevent the extension from - // operating as intended. Errors which indicate a problem in gnostic - // itself -- such as the input Document being unparseable -- should be - // reported by writing a message to stderr and exiting with a non-zero - // status code. - repeated string error = 2; - - // text output - google.protobuf.Any value = 3; -} - -message Wrapper { - // version of the OpenAPI specification in which this extension was written. - string version = 1; - - // Name of the extension - string extension_name = 2; - - // Must be a valid yaml for the proto - string yaml = 3; -} diff --git a/vendor/github.com/googleapis/gnostic/extensions/extensions.go b/vendor/github.com/googleapis/gnostic/extensions/extensions.go deleted file mode 100644 index 94a8e62..0000000 --- a/vendor/github.com/googleapis/gnostic/extensions/extensions.go +++ /dev/null @@ -1,82 +0,0 @@ -// Copyright 2017 Google Inc. All Rights Reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package openapiextension_v1 - -import ( - "fmt" - "io/ioutil" - "os" - - "github.com/golang/protobuf/proto" - "github.com/golang/protobuf/ptypes" -) - -type documentHandler func(version string, extensionName string, document string) -type extensionHandler func(name string, yamlInput string) (bool, proto.Message, error) - -func forInputYamlFromOpenapic(handler documentHandler) { - data, err := ioutil.ReadAll(os.Stdin) - if err != nil { - fmt.Println("File error:", err.Error()) - os.Exit(1) - } - if len(data) == 0 { - fmt.Println("No input data.") - os.Exit(1) - } - request := &ExtensionHandlerRequest{} - err = proto.Unmarshal(data, request) - if err != nil { - fmt.Println("Input error:", err.Error()) - os.Exit(1) - } - handler(request.Wrapper.Version, request.Wrapper.ExtensionName, request.Wrapper.Yaml) -} - -// ProcessExtension calles the handler for a specified extension. -func ProcessExtension(handleExtension extensionHandler) { - response := &ExtensionHandlerResponse{} - forInputYamlFromOpenapic( - func(version string, extensionName string, yamlInput string) { - var newObject proto.Message - var err error - - handled, newObject, err := handleExtension(extensionName, yamlInput) - if !handled { - responseBytes, _ := proto.Marshal(response) - os.Stdout.Write(responseBytes) - os.Exit(0) - } - - // If we reach here, then the extension is handled - response.Handled = true - if err != nil { - response.Error = append(response.Error, err.Error()) - responseBytes, _ := proto.Marshal(response) - os.Stdout.Write(responseBytes) - os.Exit(0) - } - response.Value, err = ptypes.MarshalAny(newObject) - if err != nil { - response.Error = append(response.Error, err.Error()) - responseBytes, _ := proto.Marshal(response) - os.Stdout.Write(responseBytes) - os.Exit(0) - } - }) - - responseBytes, _ := proto.Marshal(response) - os.Stdout.Write(responseBytes) -} diff --git a/vendor/github.com/gorilla/websocket/.gitignore b/vendor/github.com/gorilla/websocket/.gitignore deleted file mode 100644 index cd3fcd1..0000000 --- a/vendor/github.com/gorilla/websocket/.gitignore +++ /dev/null @@ -1,25 +0,0 @@ -# Compiled Object files, Static and Dynamic libs (Shared Objects) -*.o -*.a -*.so - -# Folders -_obj -_test - -# Architecture specific extensions/prefixes -*.[568vq] -[568vq].out - -*.cgo1.go -*.cgo2.c -_cgo_defun.c -_cgo_gotypes.go -_cgo_export.* - -_testmain.go - -*.exe - -.idea/ -*.iml diff --git a/vendor/github.com/gorilla/websocket/.travis.yml b/vendor/github.com/gorilla/websocket/.travis.yml deleted file mode 100644 index a49db51..0000000 --- a/vendor/github.com/gorilla/websocket/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -language: go -sudo: false - -matrix: - include: - - go: 1.7.x - - go: 1.8.x - - go: 1.9.x - - go: 1.10.x - - go: 1.11.x - - go: tip - allow_failures: - - go: tip - -script: - - go get -t -v ./... - - diff -u <(echo -n) <(gofmt -d .) - - go vet $(go list ./... | grep -v /vendor/) - - go test -v -race ./... diff --git a/vendor/github.com/gorilla/websocket/AUTHORS b/vendor/github.com/gorilla/websocket/AUTHORS deleted file mode 100644 index 1931f40..0000000 --- a/vendor/github.com/gorilla/websocket/AUTHORS +++ /dev/null @@ -1,9 +0,0 @@ -# This is the official list of Gorilla WebSocket authors for copyright -# purposes. -# -# Please keep the list sorted. - -Gary Burd -Google LLC (https://opensource.google.com/) -Joachim Bauch - diff --git a/vendor/github.com/gorilla/websocket/LICENSE b/vendor/github.com/gorilla/websocket/LICENSE deleted file mode 100644 index 9171c97..0000000 --- a/vendor/github.com/gorilla/websocket/LICENSE +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2013 The Gorilla WebSocket Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - - Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - - Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND -ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/gorilla/websocket/README.md b/vendor/github.com/gorilla/websocket/README.md deleted file mode 100644 index 20e391f..0000000 --- a/vendor/github.com/gorilla/websocket/README.md +++ /dev/null @@ -1,64 +0,0 @@ -# Gorilla WebSocket - -Gorilla WebSocket is a [Go](http://golang.org/) implementation of the -[WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. - -[![Build Status](https://travis-ci.org/gorilla/websocket.svg?branch=master)](https://travis-ci.org/gorilla/websocket) -[![GoDoc](https://godoc.org/github.com/gorilla/websocket?status.svg)](https://godoc.org/github.com/gorilla/websocket) - -### Documentation - -* [API Reference](http://godoc.org/github.com/gorilla/websocket) -* [Chat example](https://github.com/gorilla/websocket/tree/master/examples/chat) -* [Command example](https://github.com/gorilla/websocket/tree/master/examples/command) -* [Client and server example](https://github.com/gorilla/websocket/tree/master/examples/echo) -* [File watch example](https://github.com/gorilla/websocket/tree/master/examples/filewatch) - -### Status - -The Gorilla WebSocket package provides a complete and tested implementation of -the [WebSocket](http://www.rfc-editor.org/rfc/rfc6455.txt) protocol. The -package API is stable. - -### Installation - - go get github.com/gorilla/websocket - -### Protocol Compliance - -The Gorilla WebSocket package passes the server tests in the [Autobahn Test -Suite](http://autobahn.ws/testsuite) using the application in the [examples/autobahn -subdirectory](https://github.com/gorilla/websocket/tree/master/examples/autobahn). - -### Gorilla WebSocket compared with other packages - - - - - - - - - - - - - - - - - - -
github.com/gorillagolang.org/x/net
RFC 6455 Features
Passes Autobahn Test SuiteYesNo
Receive fragmented messageYesNo, see note 1
Send close messageYesNo
Send pings and receive pongsYesNo
Get the type of a received data messageYesYes, see note 2
Other Features
Compression ExtensionsExperimentalNo
Read message using io.ReaderYesNo, see note 3
Write message using io.WriteCloserYesNo, see note 3
- -Notes: - -1. Large messages are fragmented in [Chrome's new WebSocket implementation](http://www.ietf.org/mail-archive/web/hybi/current/msg10503.html). -2. The application can get the type of a received data message by implementing - a [Codec marshal](http://godoc.org/golang.org/x/net/websocket#Codec.Marshal) - function. -3. The go.net io.Reader and io.Writer operate across WebSocket frame boundaries. - Read returns when the input buffer is full or a frame boundary is - encountered. Each call to Write sends a single frame message. The Gorilla - io.Reader and io.WriteCloser operate on a single WebSocket message. - diff --git a/vendor/github.com/gorilla/websocket/client.go b/vendor/github.com/gorilla/websocket/client.go deleted file mode 100644 index 2e32fd5..0000000 --- a/vendor/github.com/gorilla/websocket/client.go +++ /dev/null @@ -1,395 +0,0 @@ -// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bytes" - "context" - "crypto/tls" - "errors" - "io" - "io/ioutil" - "net" - "net/http" - "net/http/httptrace" - "net/url" - "strings" - "time" -) - -// ErrBadHandshake is returned when the server response to opening handshake is -// invalid. -var ErrBadHandshake = errors.New("websocket: bad handshake") - -var errInvalidCompression = errors.New("websocket: invalid compression negotiation") - -// NewClient creates a new client connection using the given net connection. -// The URL u specifies the host and request URI. Use requestHeader to specify -// the origin (Origin), subprotocols (Sec-WebSocket-Protocol) and cookies -// (Cookie). Use the response.Header to get the selected subprotocol -// (Sec-WebSocket-Protocol) and cookies (Set-Cookie). -// -// If the WebSocket handshake fails, ErrBadHandshake is returned along with a -// non-nil *http.Response so that callers can handle redirects, authentication, -// etc. -// -// Deprecated: Use Dialer instead. -func NewClient(netConn net.Conn, u *url.URL, requestHeader http.Header, readBufSize, writeBufSize int) (c *Conn, response *http.Response, err error) { - d := Dialer{ - ReadBufferSize: readBufSize, - WriteBufferSize: writeBufSize, - NetDial: func(net, addr string) (net.Conn, error) { - return netConn, nil - }, - } - return d.Dial(u.String(), requestHeader) -} - -// A Dialer contains options for connecting to WebSocket server. -type Dialer struct { - // NetDial specifies the dial function for creating TCP connections. If - // NetDial is nil, net.Dial is used. - NetDial func(network, addr string) (net.Conn, error) - - // NetDialContext specifies the dial function for creating TCP connections. If - // NetDialContext is nil, net.DialContext is used. - NetDialContext func(ctx context.Context, network, addr string) (net.Conn, error) - - // Proxy specifies a function to return a proxy for a given - // Request. If the function returns a non-nil error, the - // request is aborted with the provided error. - // If Proxy is nil or returns a nil *URL, no proxy is used. - Proxy func(*http.Request) (*url.URL, error) - - // TLSClientConfig specifies the TLS configuration to use with tls.Client. - // If nil, the default configuration is used. - TLSClientConfig *tls.Config - - // HandshakeTimeout specifies the duration for the handshake to complete. - HandshakeTimeout time.Duration - - // ReadBufferSize and WriteBufferSize specify I/O buffer sizes. If a buffer - // size is zero, then a useful default size is used. The I/O buffer sizes - // do not limit the size of the messages that can be sent or received. - ReadBufferSize, WriteBufferSize int - - // WriteBufferPool is a pool of buffers for write operations. If the value - // is not set, then write buffers are allocated to the connection for the - // lifetime of the connection. - // - // A pool is most useful when the application has a modest volume of writes - // across a large number of connections. - // - // Applications should use a single pool for each unique value of - // WriteBufferSize. - WriteBufferPool BufferPool - - // Subprotocols specifies the client's requested subprotocols. - Subprotocols []string - - // EnableCompression specifies if the client should attempt to negotiate - // per message compression (RFC 7692). Setting this value to true does not - // guarantee that compression will be supported. Currently only "no context - // takeover" modes are supported. - EnableCompression bool - - // Jar specifies the cookie jar. - // If Jar is nil, cookies are not sent in requests and ignored - // in responses. - Jar http.CookieJar -} - -// Dial creates a new client connection by calling DialContext with a background context. -func (d *Dialer) Dial(urlStr string, requestHeader http.Header) (*Conn, *http.Response, error) { - return d.DialContext(context.Background(), urlStr, requestHeader) -} - -var errMalformedURL = errors.New("malformed ws or wss URL") - -func hostPortNoPort(u *url.URL) (hostPort, hostNoPort string) { - hostPort = u.Host - hostNoPort = u.Host - if i := strings.LastIndex(u.Host, ":"); i > strings.LastIndex(u.Host, "]") { - hostNoPort = hostNoPort[:i] - } else { - switch u.Scheme { - case "wss": - hostPort += ":443" - case "https": - hostPort += ":443" - default: - hostPort += ":80" - } - } - return hostPort, hostNoPort -} - -// DefaultDialer is a dialer with all fields set to the default values. -var DefaultDialer = &Dialer{ - Proxy: http.ProxyFromEnvironment, - HandshakeTimeout: 45 * time.Second, -} - -// nilDialer is dialer to use when receiver is nil. -var nilDialer = *DefaultDialer - -// DialContext creates a new client connection. Use requestHeader to specify the -// origin (Origin), subprotocols (Sec-WebSocket-Protocol) and cookies (Cookie). -// Use the response.Header to get the selected subprotocol -// (Sec-WebSocket-Protocol) and cookies (Set-Cookie). -// -// The context will be used in the request and in the Dialer -// -// If the WebSocket handshake fails, ErrBadHandshake is returned along with a -// non-nil *http.Response so that callers can handle redirects, authentication, -// etcetera. The response body may not contain the entire response and does not -// need to be closed by the application. -func (d *Dialer) DialContext(ctx context.Context, urlStr string, requestHeader http.Header) (*Conn, *http.Response, error) { - if d == nil { - d = &nilDialer - } - - challengeKey, err := generateChallengeKey() - if err != nil { - return nil, nil, err - } - - u, err := url.Parse(urlStr) - if err != nil { - return nil, nil, err - } - - switch u.Scheme { - case "ws": - u.Scheme = "http" - case "wss": - u.Scheme = "https" - default: - return nil, nil, errMalformedURL - } - - if u.User != nil { - // User name and password are not allowed in websocket URIs. - return nil, nil, errMalformedURL - } - - req := &http.Request{ - Method: "GET", - URL: u, - Proto: "HTTP/1.1", - ProtoMajor: 1, - ProtoMinor: 1, - Header: make(http.Header), - Host: u.Host, - } - req = req.WithContext(ctx) - - // Set the cookies present in the cookie jar of the dialer - if d.Jar != nil { - for _, cookie := range d.Jar.Cookies(u) { - req.AddCookie(cookie) - } - } - - // Set the request headers using the capitalization for names and values in - // RFC examples. Although the capitalization shouldn't matter, there are - // servers that depend on it. The Header.Set method is not used because the - // method canonicalizes the header names. - req.Header["Upgrade"] = []string{"websocket"} - req.Header["Connection"] = []string{"Upgrade"} - req.Header["Sec-WebSocket-Key"] = []string{challengeKey} - req.Header["Sec-WebSocket-Version"] = []string{"13"} - if len(d.Subprotocols) > 0 { - req.Header["Sec-WebSocket-Protocol"] = []string{strings.Join(d.Subprotocols, ", ")} - } - for k, vs := range requestHeader { - switch { - case k == "Host": - if len(vs) > 0 { - req.Host = vs[0] - } - case k == "Upgrade" || - k == "Connection" || - k == "Sec-Websocket-Key" || - k == "Sec-Websocket-Version" || - k == "Sec-Websocket-Extensions" || - (k == "Sec-Websocket-Protocol" && len(d.Subprotocols) > 0): - return nil, nil, errors.New("websocket: duplicate header not allowed: " + k) - case k == "Sec-Websocket-Protocol": - req.Header["Sec-WebSocket-Protocol"] = vs - default: - req.Header[k] = vs - } - } - - if d.EnableCompression { - req.Header["Sec-WebSocket-Extensions"] = []string{"permessage-deflate; server_no_context_takeover; client_no_context_takeover"} - } - - if d.HandshakeTimeout != 0 { - var cancel func() - ctx, cancel = context.WithTimeout(ctx, d.HandshakeTimeout) - defer cancel() - } - - // Get network dial function. - var netDial func(network, add string) (net.Conn, error) - - if d.NetDialContext != nil { - netDial = func(network, addr string) (net.Conn, error) { - return d.NetDialContext(ctx, network, addr) - } - } else if d.NetDial != nil { - netDial = d.NetDial - } else { - netDialer := &net.Dialer{} - netDial = func(network, addr string) (net.Conn, error) { - return netDialer.DialContext(ctx, network, addr) - } - } - - // If needed, wrap the dial function to set the connection deadline. - if deadline, ok := ctx.Deadline(); ok { - forwardDial := netDial - netDial = func(network, addr string) (net.Conn, error) { - c, err := forwardDial(network, addr) - if err != nil { - return nil, err - } - err = c.SetDeadline(deadline) - if err != nil { - c.Close() - return nil, err - } - return c, nil - } - } - - // If needed, wrap the dial function to connect through a proxy. - if d.Proxy != nil { - proxyURL, err := d.Proxy(req) - if err != nil { - return nil, nil, err - } - if proxyURL != nil { - dialer, err := proxy_FromURL(proxyURL, netDialerFunc(netDial)) - if err != nil { - return nil, nil, err - } - netDial = dialer.Dial - } - } - - hostPort, hostNoPort := hostPortNoPort(u) - trace := httptrace.ContextClientTrace(ctx) - if trace != nil && trace.GetConn != nil { - trace.GetConn(hostPort) - } - - netConn, err := netDial("tcp", hostPort) - if trace != nil && trace.GotConn != nil { - trace.GotConn(httptrace.GotConnInfo{ - Conn: netConn, - }) - } - if err != nil { - return nil, nil, err - } - - defer func() { - if netConn != nil { - netConn.Close() - } - }() - - if u.Scheme == "https" { - cfg := cloneTLSConfig(d.TLSClientConfig) - if cfg.ServerName == "" { - cfg.ServerName = hostNoPort - } - tlsConn := tls.Client(netConn, cfg) - netConn = tlsConn - - var err error - if trace != nil { - err = doHandshakeWithTrace(trace, tlsConn, cfg) - } else { - err = doHandshake(tlsConn, cfg) - } - - if err != nil { - return nil, nil, err - } - } - - conn := newConn(netConn, false, d.ReadBufferSize, d.WriteBufferSize, d.WriteBufferPool, nil, nil) - - if err := req.Write(netConn); err != nil { - return nil, nil, err - } - - if trace != nil && trace.GotFirstResponseByte != nil { - if peek, err := conn.br.Peek(1); err == nil && len(peek) == 1 { - trace.GotFirstResponseByte() - } - } - - resp, err := http.ReadResponse(conn.br, req) - if err != nil { - return nil, nil, err - } - - if d.Jar != nil { - if rc := resp.Cookies(); len(rc) > 0 { - d.Jar.SetCookies(u, rc) - } - } - - if resp.StatusCode != 101 || - !strings.EqualFold(resp.Header.Get("Upgrade"), "websocket") || - !strings.EqualFold(resp.Header.Get("Connection"), "upgrade") || - resp.Header.Get("Sec-Websocket-Accept") != computeAcceptKey(challengeKey) { - // Before closing the network connection on return from this - // function, slurp up some of the response to aid application - // debugging. - buf := make([]byte, 1024) - n, _ := io.ReadFull(resp.Body, buf) - resp.Body = ioutil.NopCloser(bytes.NewReader(buf[:n])) - return nil, resp, ErrBadHandshake - } - - for _, ext := range parseExtensions(resp.Header) { - if ext[""] != "permessage-deflate" { - continue - } - _, snct := ext["server_no_context_takeover"] - _, cnct := ext["client_no_context_takeover"] - if !snct || !cnct { - return nil, resp, errInvalidCompression - } - conn.newCompressionWriter = compressNoContextTakeover - conn.newDecompressionReader = decompressNoContextTakeover - break - } - - resp.Body = ioutil.NopCloser(bytes.NewReader([]byte{})) - conn.subprotocol = resp.Header.Get("Sec-Websocket-Protocol") - - netConn.SetDeadline(time.Time{}) - netConn = nil // to avoid close in defer. - return conn, resp, nil -} - -func doHandshake(tlsConn *tls.Conn, cfg *tls.Config) error { - if err := tlsConn.Handshake(); err != nil { - return err - } - if !cfg.InsecureSkipVerify { - if err := tlsConn.VerifyHostname(cfg.ServerName); err != nil { - return err - } - } - return nil -} diff --git a/vendor/github.com/gorilla/websocket/client_clone.go b/vendor/github.com/gorilla/websocket/client_clone.go deleted file mode 100644 index 4f0d943..0000000 --- a/vendor/github.com/gorilla/websocket/client_clone.go +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.8 - -package websocket - -import "crypto/tls" - -func cloneTLSConfig(cfg *tls.Config) *tls.Config { - if cfg == nil { - return &tls.Config{} - } - return cfg.Clone() -} diff --git a/vendor/github.com/gorilla/websocket/client_clone_legacy.go b/vendor/github.com/gorilla/websocket/client_clone_legacy.go deleted file mode 100644 index babb007..0000000 --- a/vendor/github.com/gorilla/websocket/client_clone_legacy.go +++ /dev/null @@ -1,38 +0,0 @@ -// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.8 - -package websocket - -import "crypto/tls" - -// cloneTLSConfig clones all public fields except the fields -// SessionTicketsDisabled and SessionTicketKey. This avoids copying the -// sync.Mutex in the sync.Once and makes it safe to call cloneTLSConfig on a -// config in active use. -func cloneTLSConfig(cfg *tls.Config) *tls.Config { - if cfg == nil { - return &tls.Config{} - } - return &tls.Config{ - Rand: cfg.Rand, - Time: cfg.Time, - Certificates: cfg.Certificates, - NameToCertificate: cfg.NameToCertificate, - GetCertificate: cfg.GetCertificate, - RootCAs: cfg.RootCAs, - NextProtos: cfg.NextProtos, - ServerName: cfg.ServerName, - ClientAuth: cfg.ClientAuth, - ClientCAs: cfg.ClientCAs, - InsecureSkipVerify: cfg.InsecureSkipVerify, - CipherSuites: cfg.CipherSuites, - PreferServerCipherSuites: cfg.PreferServerCipherSuites, - ClientSessionCache: cfg.ClientSessionCache, - MinVersion: cfg.MinVersion, - MaxVersion: cfg.MaxVersion, - CurvePreferences: cfg.CurvePreferences, - } -} diff --git a/vendor/github.com/gorilla/websocket/compression.go b/vendor/github.com/gorilla/websocket/compression.go deleted file mode 100644 index 813ffb1..0000000 --- a/vendor/github.com/gorilla/websocket/compression.go +++ /dev/null @@ -1,148 +0,0 @@ -// Copyright 2017 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "compress/flate" - "errors" - "io" - "strings" - "sync" -) - -const ( - minCompressionLevel = -2 // flate.HuffmanOnly not defined in Go < 1.6 - maxCompressionLevel = flate.BestCompression - defaultCompressionLevel = 1 -) - -var ( - flateWriterPools [maxCompressionLevel - minCompressionLevel + 1]sync.Pool - flateReaderPool = sync.Pool{New: func() interface{} { - return flate.NewReader(nil) - }} -) - -func decompressNoContextTakeover(r io.Reader) io.ReadCloser { - const tail = - // Add four bytes as specified in RFC - "\x00\x00\xff\xff" + - // Add final block to squelch unexpected EOF error from flate reader. - "\x01\x00\x00\xff\xff" - - fr, _ := flateReaderPool.Get().(io.ReadCloser) - fr.(flate.Resetter).Reset(io.MultiReader(r, strings.NewReader(tail)), nil) - return &flateReadWrapper{fr} -} - -func isValidCompressionLevel(level int) bool { - return minCompressionLevel <= level && level <= maxCompressionLevel -} - -func compressNoContextTakeover(w io.WriteCloser, level int) io.WriteCloser { - p := &flateWriterPools[level-minCompressionLevel] - tw := &truncWriter{w: w} - fw, _ := p.Get().(*flate.Writer) - if fw == nil { - fw, _ = flate.NewWriter(tw, level) - } else { - fw.Reset(tw) - } - return &flateWriteWrapper{fw: fw, tw: tw, p: p} -} - -// truncWriter is an io.Writer that writes all but the last four bytes of the -// stream to another io.Writer. -type truncWriter struct { - w io.WriteCloser - n int - p [4]byte -} - -func (w *truncWriter) Write(p []byte) (int, error) { - n := 0 - - // fill buffer first for simplicity. - if w.n < len(w.p) { - n = copy(w.p[w.n:], p) - p = p[n:] - w.n += n - if len(p) == 0 { - return n, nil - } - } - - m := len(p) - if m > len(w.p) { - m = len(w.p) - } - - if nn, err := w.w.Write(w.p[:m]); err != nil { - return n + nn, err - } - - copy(w.p[:], w.p[m:]) - copy(w.p[len(w.p)-m:], p[len(p)-m:]) - nn, err := w.w.Write(p[:len(p)-m]) - return n + nn, err -} - -type flateWriteWrapper struct { - fw *flate.Writer - tw *truncWriter - p *sync.Pool -} - -func (w *flateWriteWrapper) Write(p []byte) (int, error) { - if w.fw == nil { - return 0, errWriteClosed - } - return w.fw.Write(p) -} - -func (w *flateWriteWrapper) Close() error { - if w.fw == nil { - return errWriteClosed - } - err1 := w.fw.Flush() - w.p.Put(w.fw) - w.fw = nil - if w.tw.p != [4]byte{0, 0, 0xff, 0xff} { - return errors.New("websocket: internal error, unexpected bytes at end of flate stream") - } - err2 := w.tw.w.Close() - if err1 != nil { - return err1 - } - return err2 -} - -type flateReadWrapper struct { - fr io.ReadCloser -} - -func (r *flateReadWrapper) Read(p []byte) (int, error) { - if r.fr == nil { - return 0, io.ErrClosedPipe - } - n, err := r.fr.Read(p) - if err == io.EOF { - // Preemptively place the reader back in the pool. This helps with - // scenarios where the application does not call NextReader() soon after - // this final read. - r.Close() - } - return n, err -} - -func (r *flateReadWrapper) Close() error { - if r.fr == nil { - return io.ErrClosedPipe - } - err := r.fr.Close() - flateReaderPool.Put(r.fr) - r.fr = nil - return err -} diff --git a/vendor/github.com/gorilla/websocket/conn.go b/vendor/github.com/gorilla/websocket/conn.go deleted file mode 100644 index d2a21c1..0000000 --- a/vendor/github.com/gorilla/websocket/conn.go +++ /dev/null @@ -1,1165 +0,0 @@ -// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bufio" - "encoding/binary" - "errors" - "io" - "io/ioutil" - "math/rand" - "net" - "strconv" - "sync" - "time" - "unicode/utf8" -) - -const ( - // Frame header byte 0 bits from Section 5.2 of RFC 6455 - finalBit = 1 << 7 - rsv1Bit = 1 << 6 - rsv2Bit = 1 << 5 - rsv3Bit = 1 << 4 - - // Frame header byte 1 bits from Section 5.2 of RFC 6455 - maskBit = 1 << 7 - - maxFrameHeaderSize = 2 + 8 + 4 // Fixed header + length + mask - maxControlFramePayloadSize = 125 - - writeWait = time.Second - - defaultReadBufferSize = 4096 - defaultWriteBufferSize = 4096 - - continuationFrame = 0 - noFrame = -1 -) - -// Close codes defined in RFC 6455, section 11.7. -const ( - CloseNormalClosure = 1000 - CloseGoingAway = 1001 - CloseProtocolError = 1002 - CloseUnsupportedData = 1003 - CloseNoStatusReceived = 1005 - CloseAbnormalClosure = 1006 - CloseInvalidFramePayloadData = 1007 - ClosePolicyViolation = 1008 - CloseMessageTooBig = 1009 - CloseMandatoryExtension = 1010 - CloseInternalServerErr = 1011 - CloseServiceRestart = 1012 - CloseTryAgainLater = 1013 - CloseTLSHandshake = 1015 -) - -// The message types are defined in RFC 6455, section 11.8. -const ( - // TextMessage denotes a text data message. The text message payload is - // interpreted as UTF-8 encoded text data. - TextMessage = 1 - - // BinaryMessage denotes a binary data message. - BinaryMessage = 2 - - // CloseMessage denotes a close control message. The optional message - // payload contains a numeric code and text. Use the FormatCloseMessage - // function to format a close message payload. - CloseMessage = 8 - - // PingMessage denotes a ping control message. The optional message payload - // is UTF-8 encoded text. - PingMessage = 9 - - // PongMessage denotes a pong control message. The optional message payload - // is UTF-8 encoded text. - PongMessage = 10 -) - -// ErrCloseSent is returned when the application writes a message to the -// connection after sending a close message. -var ErrCloseSent = errors.New("websocket: close sent") - -// ErrReadLimit is returned when reading a message that is larger than the -// read limit set for the connection. -var ErrReadLimit = errors.New("websocket: read limit exceeded") - -// netError satisfies the net Error interface. -type netError struct { - msg string - temporary bool - timeout bool -} - -func (e *netError) Error() string { return e.msg } -func (e *netError) Temporary() bool { return e.temporary } -func (e *netError) Timeout() bool { return e.timeout } - -// CloseError represents a close message. -type CloseError struct { - // Code is defined in RFC 6455, section 11.7. - Code int - - // Text is the optional text payload. - Text string -} - -func (e *CloseError) Error() string { - s := []byte("websocket: close ") - s = strconv.AppendInt(s, int64(e.Code), 10) - switch e.Code { - case CloseNormalClosure: - s = append(s, " (normal)"...) - case CloseGoingAway: - s = append(s, " (going away)"...) - case CloseProtocolError: - s = append(s, " (protocol error)"...) - case CloseUnsupportedData: - s = append(s, " (unsupported data)"...) - case CloseNoStatusReceived: - s = append(s, " (no status)"...) - case CloseAbnormalClosure: - s = append(s, " (abnormal closure)"...) - case CloseInvalidFramePayloadData: - s = append(s, " (invalid payload data)"...) - case ClosePolicyViolation: - s = append(s, " (policy violation)"...) - case CloseMessageTooBig: - s = append(s, " (message too big)"...) - case CloseMandatoryExtension: - s = append(s, " (mandatory extension missing)"...) - case CloseInternalServerErr: - s = append(s, " (internal server error)"...) - case CloseTLSHandshake: - s = append(s, " (TLS handshake error)"...) - } - if e.Text != "" { - s = append(s, ": "...) - s = append(s, e.Text...) - } - return string(s) -} - -// IsCloseError returns boolean indicating whether the error is a *CloseError -// with one of the specified codes. -func IsCloseError(err error, codes ...int) bool { - if e, ok := err.(*CloseError); ok { - for _, code := range codes { - if e.Code == code { - return true - } - } - } - return false -} - -// IsUnexpectedCloseError returns boolean indicating whether the error is a -// *CloseError with a code not in the list of expected codes. -func IsUnexpectedCloseError(err error, expectedCodes ...int) bool { - if e, ok := err.(*CloseError); ok { - for _, code := range expectedCodes { - if e.Code == code { - return false - } - } - return true - } - return false -} - -var ( - errWriteTimeout = &netError{msg: "websocket: write timeout", timeout: true, temporary: true} - errUnexpectedEOF = &CloseError{Code: CloseAbnormalClosure, Text: io.ErrUnexpectedEOF.Error()} - errBadWriteOpCode = errors.New("websocket: bad write message type") - errWriteClosed = errors.New("websocket: write closed") - errInvalidControlFrame = errors.New("websocket: invalid control frame") -) - -func newMaskKey() [4]byte { - n := rand.Uint32() - return [4]byte{byte(n), byte(n >> 8), byte(n >> 16), byte(n >> 24)} -} - -func hideTempErr(err error) error { - if e, ok := err.(net.Error); ok && e.Temporary() { - err = &netError{msg: e.Error(), timeout: e.Timeout()} - } - return err -} - -func isControl(frameType int) bool { - return frameType == CloseMessage || frameType == PingMessage || frameType == PongMessage -} - -func isData(frameType int) bool { - return frameType == TextMessage || frameType == BinaryMessage -} - -var validReceivedCloseCodes = map[int]bool{ - // see http://www.iana.org/assignments/websocket/websocket.xhtml#close-code-number - - CloseNormalClosure: true, - CloseGoingAway: true, - CloseProtocolError: true, - CloseUnsupportedData: true, - CloseNoStatusReceived: false, - CloseAbnormalClosure: false, - CloseInvalidFramePayloadData: true, - ClosePolicyViolation: true, - CloseMessageTooBig: true, - CloseMandatoryExtension: true, - CloseInternalServerErr: true, - CloseServiceRestart: true, - CloseTryAgainLater: true, - CloseTLSHandshake: false, -} - -func isValidReceivedCloseCode(code int) bool { - return validReceivedCloseCodes[code] || (code >= 3000 && code <= 4999) -} - -// BufferPool represents a pool of buffers. The *sync.Pool type satisfies this -// interface. The type of the value stored in a pool is not specified. -type BufferPool interface { - // Get gets a value from the pool or returns nil if the pool is empty. - Get() interface{} - // Put adds a value to the pool. - Put(interface{}) -} - -// writePoolData is the type added to the write buffer pool. This wrapper is -// used to prevent applications from peeking at and depending on the values -// added to the pool. -type writePoolData struct{ buf []byte } - -// The Conn type represents a WebSocket connection. -type Conn struct { - conn net.Conn - isServer bool - subprotocol string - - // Write fields - mu chan bool // used as mutex to protect write to conn - writeBuf []byte // frame is constructed in this buffer. - writePool BufferPool - writeBufSize int - writeDeadline time.Time - writer io.WriteCloser // the current writer returned to the application - isWriting bool // for best-effort concurrent write detection - - writeErrMu sync.Mutex - writeErr error - - enableWriteCompression bool - compressionLevel int - newCompressionWriter func(io.WriteCloser, int) io.WriteCloser - - // Read fields - reader io.ReadCloser // the current reader returned to the application - readErr error - br *bufio.Reader - readRemaining int64 // bytes remaining in current frame. - readFinal bool // true the current message has more frames. - readLength int64 // Message size. - readLimit int64 // Maximum message size. - readMaskPos int - readMaskKey [4]byte - handlePong func(string) error - handlePing func(string) error - handleClose func(int, string) error - readErrCount int - messageReader *messageReader // the current low-level reader - - readDecompress bool // whether last read frame had RSV1 set - newDecompressionReader func(io.Reader) io.ReadCloser -} - -func newConn(conn net.Conn, isServer bool, readBufferSize, writeBufferSize int, writeBufferPool BufferPool, br *bufio.Reader, writeBuf []byte) *Conn { - - if br == nil { - if readBufferSize == 0 { - readBufferSize = defaultReadBufferSize - } else if readBufferSize < maxControlFramePayloadSize { - // must be large enough for control frame - readBufferSize = maxControlFramePayloadSize - } - br = bufio.NewReaderSize(conn, readBufferSize) - } - - if writeBufferSize <= 0 { - writeBufferSize = defaultWriteBufferSize - } - writeBufferSize += maxFrameHeaderSize - - if writeBuf == nil && writeBufferPool == nil { - writeBuf = make([]byte, writeBufferSize) - } - - mu := make(chan bool, 1) - mu <- true - c := &Conn{ - isServer: isServer, - br: br, - conn: conn, - mu: mu, - readFinal: true, - writeBuf: writeBuf, - writePool: writeBufferPool, - writeBufSize: writeBufferSize, - enableWriteCompression: true, - compressionLevel: defaultCompressionLevel, - } - c.SetCloseHandler(nil) - c.SetPingHandler(nil) - c.SetPongHandler(nil) - return c -} - -// Subprotocol returns the negotiated protocol for the connection. -func (c *Conn) Subprotocol() string { - return c.subprotocol -} - -// Close closes the underlying network connection without sending or waiting -// for a close message. -func (c *Conn) Close() error { - return c.conn.Close() -} - -// LocalAddr returns the local network address. -func (c *Conn) LocalAddr() net.Addr { - return c.conn.LocalAddr() -} - -// RemoteAddr returns the remote network address. -func (c *Conn) RemoteAddr() net.Addr { - return c.conn.RemoteAddr() -} - -// Write methods - -func (c *Conn) writeFatal(err error) error { - err = hideTempErr(err) - c.writeErrMu.Lock() - if c.writeErr == nil { - c.writeErr = err - } - c.writeErrMu.Unlock() - return err -} - -func (c *Conn) read(n int) ([]byte, error) { - p, err := c.br.Peek(n) - if err == io.EOF { - err = errUnexpectedEOF - } - c.br.Discard(len(p)) - return p, err -} - -func (c *Conn) write(frameType int, deadline time.Time, buf0, buf1 []byte) error { - <-c.mu - defer func() { c.mu <- true }() - - c.writeErrMu.Lock() - err := c.writeErr - c.writeErrMu.Unlock() - if err != nil { - return err - } - - c.conn.SetWriteDeadline(deadline) - if len(buf1) == 0 { - _, err = c.conn.Write(buf0) - } else { - err = c.writeBufs(buf0, buf1) - } - if err != nil { - return c.writeFatal(err) - } - if frameType == CloseMessage { - c.writeFatal(ErrCloseSent) - } - return nil -} - -// WriteControl writes a control message with the given deadline. The allowed -// message types are CloseMessage, PingMessage and PongMessage. -func (c *Conn) WriteControl(messageType int, data []byte, deadline time.Time) error { - if !isControl(messageType) { - return errBadWriteOpCode - } - if len(data) > maxControlFramePayloadSize { - return errInvalidControlFrame - } - - b0 := byte(messageType) | finalBit - b1 := byte(len(data)) - if !c.isServer { - b1 |= maskBit - } - - buf := make([]byte, 0, maxFrameHeaderSize+maxControlFramePayloadSize) - buf = append(buf, b0, b1) - - if c.isServer { - buf = append(buf, data...) - } else { - key := newMaskKey() - buf = append(buf, key[:]...) - buf = append(buf, data...) - maskBytes(key, 0, buf[6:]) - } - - d := time.Hour * 1000 - if !deadline.IsZero() { - d = deadline.Sub(time.Now()) - if d < 0 { - return errWriteTimeout - } - } - - timer := time.NewTimer(d) - select { - case <-c.mu: - timer.Stop() - case <-timer.C: - return errWriteTimeout - } - defer func() { c.mu <- true }() - - c.writeErrMu.Lock() - err := c.writeErr - c.writeErrMu.Unlock() - if err != nil { - return err - } - - c.conn.SetWriteDeadline(deadline) - _, err = c.conn.Write(buf) - if err != nil { - return c.writeFatal(err) - } - if messageType == CloseMessage { - c.writeFatal(ErrCloseSent) - } - return err -} - -func (c *Conn) prepWrite(messageType int) error { - // Close previous writer if not already closed by the application. It's - // probably better to return an error in this situation, but we cannot - // change this without breaking existing applications. - if c.writer != nil { - c.writer.Close() - c.writer = nil - } - - if !isControl(messageType) && !isData(messageType) { - return errBadWriteOpCode - } - - c.writeErrMu.Lock() - err := c.writeErr - c.writeErrMu.Unlock() - if err != nil { - return err - } - - if c.writeBuf == nil { - wpd, ok := c.writePool.Get().(writePoolData) - if ok { - c.writeBuf = wpd.buf - } else { - c.writeBuf = make([]byte, c.writeBufSize) - } - } - return nil -} - -// NextWriter returns a writer for the next message to send. The writer's Close -// method flushes the complete message to the network. -// -// There can be at most one open writer on a connection. NextWriter closes the -// previous writer if the application has not already done so. -// -// All message types (TextMessage, BinaryMessage, CloseMessage, PingMessage and -// PongMessage) are supported. -func (c *Conn) NextWriter(messageType int) (io.WriteCloser, error) { - if err := c.prepWrite(messageType); err != nil { - return nil, err - } - - mw := &messageWriter{ - c: c, - frameType: messageType, - pos: maxFrameHeaderSize, - } - c.writer = mw - if c.newCompressionWriter != nil && c.enableWriteCompression && isData(messageType) { - w := c.newCompressionWriter(c.writer, c.compressionLevel) - mw.compress = true - c.writer = w - } - return c.writer, nil -} - -type messageWriter struct { - c *Conn - compress bool // whether next call to flushFrame should set RSV1 - pos int // end of data in writeBuf. - frameType int // type of the current frame. - err error -} - -func (w *messageWriter) fatal(err error) error { - if w.err != nil { - w.err = err - w.c.writer = nil - } - return err -} - -// flushFrame writes buffered data and extra as a frame to the network. The -// final argument indicates that this is the last frame in the message. -func (w *messageWriter) flushFrame(final bool, extra []byte) error { - c := w.c - length := w.pos - maxFrameHeaderSize + len(extra) - - // Check for invalid control frames. - if isControl(w.frameType) && - (!final || length > maxControlFramePayloadSize) { - return w.fatal(errInvalidControlFrame) - } - - b0 := byte(w.frameType) - if final { - b0 |= finalBit - } - if w.compress { - b0 |= rsv1Bit - } - w.compress = false - - b1 := byte(0) - if !c.isServer { - b1 |= maskBit - } - - // Assume that the frame starts at beginning of c.writeBuf. - framePos := 0 - if c.isServer { - // Adjust up if mask not included in the header. - framePos = 4 - } - - switch { - case length >= 65536: - c.writeBuf[framePos] = b0 - c.writeBuf[framePos+1] = b1 | 127 - binary.BigEndian.PutUint64(c.writeBuf[framePos+2:], uint64(length)) - case length > 125: - framePos += 6 - c.writeBuf[framePos] = b0 - c.writeBuf[framePos+1] = b1 | 126 - binary.BigEndian.PutUint16(c.writeBuf[framePos+2:], uint16(length)) - default: - framePos += 8 - c.writeBuf[framePos] = b0 - c.writeBuf[framePos+1] = b1 | byte(length) - } - - if !c.isServer { - key := newMaskKey() - copy(c.writeBuf[maxFrameHeaderSize-4:], key[:]) - maskBytes(key, 0, c.writeBuf[maxFrameHeaderSize:w.pos]) - if len(extra) > 0 { - return c.writeFatal(errors.New("websocket: internal error, extra used in client mode")) - } - } - - // Write the buffers to the connection with best-effort detection of - // concurrent writes. See the concurrency section in the package - // documentation for more info. - - if c.isWriting { - panic("concurrent write to websocket connection") - } - c.isWriting = true - - err := c.write(w.frameType, c.writeDeadline, c.writeBuf[framePos:w.pos], extra) - - if !c.isWriting { - panic("concurrent write to websocket connection") - } - c.isWriting = false - - if err != nil { - return w.fatal(err) - } - - if final { - c.writer = nil - if c.writePool != nil { - c.writePool.Put(writePoolData{buf: c.writeBuf}) - c.writeBuf = nil - } - return nil - } - - // Setup for next frame. - w.pos = maxFrameHeaderSize - w.frameType = continuationFrame - return nil -} - -func (w *messageWriter) ncopy(max int) (int, error) { - n := len(w.c.writeBuf) - w.pos - if n <= 0 { - if err := w.flushFrame(false, nil); err != nil { - return 0, err - } - n = len(w.c.writeBuf) - w.pos - } - if n > max { - n = max - } - return n, nil -} - -func (w *messageWriter) Write(p []byte) (int, error) { - if w.err != nil { - return 0, w.err - } - - if len(p) > 2*len(w.c.writeBuf) && w.c.isServer { - // Don't buffer large messages. - err := w.flushFrame(false, p) - if err != nil { - return 0, err - } - return len(p), nil - } - - nn := len(p) - for len(p) > 0 { - n, err := w.ncopy(len(p)) - if err != nil { - return 0, err - } - copy(w.c.writeBuf[w.pos:], p[:n]) - w.pos += n - p = p[n:] - } - return nn, nil -} - -func (w *messageWriter) WriteString(p string) (int, error) { - if w.err != nil { - return 0, w.err - } - - nn := len(p) - for len(p) > 0 { - n, err := w.ncopy(len(p)) - if err != nil { - return 0, err - } - copy(w.c.writeBuf[w.pos:], p[:n]) - w.pos += n - p = p[n:] - } - return nn, nil -} - -func (w *messageWriter) ReadFrom(r io.Reader) (nn int64, err error) { - if w.err != nil { - return 0, w.err - } - for { - if w.pos == len(w.c.writeBuf) { - err = w.flushFrame(false, nil) - if err != nil { - break - } - } - var n int - n, err = r.Read(w.c.writeBuf[w.pos:]) - w.pos += n - nn += int64(n) - if err != nil { - if err == io.EOF { - err = nil - } - break - } - } - return nn, err -} - -func (w *messageWriter) Close() error { - if w.err != nil { - return w.err - } - if err := w.flushFrame(true, nil); err != nil { - return err - } - w.err = errWriteClosed - return nil -} - -// WritePreparedMessage writes prepared message into connection. -func (c *Conn) WritePreparedMessage(pm *PreparedMessage) error { - frameType, frameData, err := pm.frame(prepareKey{ - isServer: c.isServer, - compress: c.newCompressionWriter != nil && c.enableWriteCompression && isData(pm.messageType), - compressionLevel: c.compressionLevel, - }) - if err != nil { - return err - } - if c.isWriting { - panic("concurrent write to websocket connection") - } - c.isWriting = true - err = c.write(frameType, c.writeDeadline, frameData, nil) - if !c.isWriting { - panic("concurrent write to websocket connection") - } - c.isWriting = false - return err -} - -// WriteMessage is a helper method for getting a writer using NextWriter, -// writing the message and closing the writer. -func (c *Conn) WriteMessage(messageType int, data []byte) error { - - if c.isServer && (c.newCompressionWriter == nil || !c.enableWriteCompression) { - // Fast path with no allocations and single frame. - - if err := c.prepWrite(messageType); err != nil { - return err - } - mw := messageWriter{c: c, frameType: messageType, pos: maxFrameHeaderSize} - n := copy(c.writeBuf[mw.pos:], data) - mw.pos += n - data = data[n:] - return mw.flushFrame(true, data) - } - - w, err := c.NextWriter(messageType) - if err != nil { - return err - } - if _, err = w.Write(data); err != nil { - return err - } - return w.Close() -} - -// SetWriteDeadline sets the write deadline on the underlying network -// connection. After a write has timed out, the websocket state is corrupt and -// all future writes will return an error. A zero value for t means writes will -// not time out. -func (c *Conn) SetWriteDeadline(t time.Time) error { - c.writeDeadline = t - return nil -} - -// Read methods - -func (c *Conn) advanceFrame() (int, error) { - // 1. Skip remainder of previous frame. - - if c.readRemaining > 0 { - if _, err := io.CopyN(ioutil.Discard, c.br, c.readRemaining); err != nil { - return noFrame, err - } - } - - // 2. Read and parse first two bytes of frame header. - - p, err := c.read(2) - if err != nil { - return noFrame, err - } - - final := p[0]&finalBit != 0 - frameType := int(p[0] & 0xf) - mask := p[1]&maskBit != 0 - c.readRemaining = int64(p[1] & 0x7f) - - c.readDecompress = false - if c.newDecompressionReader != nil && (p[0]&rsv1Bit) != 0 { - c.readDecompress = true - p[0] &^= rsv1Bit - } - - if rsv := p[0] & (rsv1Bit | rsv2Bit | rsv3Bit); rsv != 0 { - return noFrame, c.handleProtocolError("unexpected reserved bits 0x" + strconv.FormatInt(int64(rsv), 16)) - } - - switch frameType { - case CloseMessage, PingMessage, PongMessage: - if c.readRemaining > maxControlFramePayloadSize { - return noFrame, c.handleProtocolError("control frame length > 125") - } - if !final { - return noFrame, c.handleProtocolError("control frame not final") - } - case TextMessage, BinaryMessage: - if !c.readFinal { - return noFrame, c.handleProtocolError("message start before final message frame") - } - c.readFinal = final - case continuationFrame: - if c.readFinal { - return noFrame, c.handleProtocolError("continuation after final message frame") - } - c.readFinal = final - default: - return noFrame, c.handleProtocolError("unknown opcode " + strconv.Itoa(frameType)) - } - - // 3. Read and parse frame length. - - switch c.readRemaining { - case 126: - p, err := c.read(2) - if err != nil { - return noFrame, err - } - c.readRemaining = int64(binary.BigEndian.Uint16(p)) - case 127: - p, err := c.read(8) - if err != nil { - return noFrame, err - } - c.readRemaining = int64(binary.BigEndian.Uint64(p)) - } - - // 4. Handle frame masking. - - if mask != c.isServer { - return noFrame, c.handleProtocolError("incorrect mask flag") - } - - if mask { - c.readMaskPos = 0 - p, err := c.read(len(c.readMaskKey)) - if err != nil { - return noFrame, err - } - copy(c.readMaskKey[:], p) - } - - // 5. For text and binary messages, enforce read limit and return. - - if frameType == continuationFrame || frameType == TextMessage || frameType == BinaryMessage { - - c.readLength += c.readRemaining - if c.readLimit > 0 && c.readLength > c.readLimit { - c.WriteControl(CloseMessage, FormatCloseMessage(CloseMessageTooBig, ""), time.Now().Add(writeWait)) - return noFrame, ErrReadLimit - } - - return frameType, nil - } - - // 6. Read control frame payload. - - var payload []byte - if c.readRemaining > 0 { - payload, err = c.read(int(c.readRemaining)) - c.readRemaining = 0 - if err != nil { - return noFrame, err - } - if c.isServer { - maskBytes(c.readMaskKey, 0, payload) - } - } - - // 7. Process control frame payload. - - switch frameType { - case PongMessage: - if err := c.handlePong(string(payload)); err != nil { - return noFrame, err - } - case PingMessage: - if err := c.handlePing(string(payload)); err != nil { - return noFrame, err - } - case CloseMessage: - closeCode := CloseNoStatusReceived - closeText := "" - if len(payload) >= 2 { - closeCode = int(binary.BigEndian.Uint16(payload)) - if !isValidReceivedCloseCode(closeCode) { - return noFrame, c.handleProtocolError("invalid close code") - } - closeText = string(payload[2:]) - if !utf8.ValidString(closeText) { - return noFrame, c.handleProtocolError("invalid utf8 payload in close frame") - } - } - if err := c.handleClose(closeCode, closeText); err != nil { - return noFrame, err - } - return noFrame, &CloseError{Code: closeCode, Text: closeText} - } - - return frameType, nil -} - -func (c *Conn) handleProtocolError(message string) error { - c.WriteControl(CloseMessage, FormatCloseMessage(CloseProtocolError, message), time.Now().Add(writeWait)) - return errors.New("websocket: " + message) -} - -// NextReader returns the next data message received from the peer. The -// returned messageType is either TextMessage or BinaryMessage. -// -// There can be at most one open reader on a connection. NextReader discards -// the previous message if the application has not already consumed it. -// -// Applications must break out of the application's read loop when this method -// returns a non-nil error value. Errors returned from this method are -// permanent. Once this method returns a non-nil error, all subsequent calls to -// this method return the same error. -func (c *Conn) NextReader() (messageType int, r io.Reader, err error) { - // Close previous reader, only relevant for decompression. - if c.reader != nil { - c.reader.Close() - c.reader = nil - } - - c.messageReader = nil - c.readLength = 0 - - for c.readErr == nil { - frameType, err := c.advanceFrame() - if err != nil { - c.readErr = hideTempErr(err) - break - } - if frameType == TextMessage || frameType == BinaryMessage { - c.messageReader = &messageReader{c} - c.reader = c.messageReader - if c.readDecompress { - c.reader = c.newDecompressionReader(c.reader) - } - return frameType, c.reader, nil - } - } - - // Applications that do handle the error returned from this method spin in - // tight loop on connection failure. To help application developers detect - // this error, panic on repeated reads to the failed connection. - c.readErrCount++ - if c.readErrCount >= 1000 { - panic("repeated read on failed websocket connection") - } - - return noFrame, nil, c.readErr -} - -type messageReader struct{ c *Conn } - -func (r *messageReader) Read(b []byte) (int, error) { - c := r.c - if c.messageReader != r { - return 0, io.EOF - } - - for c.readErr == nil { - - if c.readRemaining > 0 { - if int64(len(b)) > c.readRemaining { - b = b[:c.readRemaining] - } - n, err := c.br.Read(b) - c.readErr = hideTempErr(err) - if c.isServer { - c.readMaskPos = maskBytes(c.readMaskKey, c.readMaskPos, b[:n]) - } - c.readRemaining -= int64(n) - if c.readRemaining > 0 && c.readErr == io.EOF { - c.readErr = errUnexpectedEOF - } - return n, c.readErr - } - - if c.readFinal { - c.messageReader = nil - return 0, io.EOF - } - - frameType, err := c.advanceFrame() - switch { - case err != nil: - c.readErr = hideTempErr(err) - case frameType == TextMessage || frameType == BinaryMessage: - c.readErr = errors.New("websocket: internal error, unexpected text or binary in Reader") - } - } - - err := c.readErr - if err == io.EOF && c.messageReader == r { - err = errUnexpectedEOF - } - return 0, err -} - -func (r *messageReader) Close() error { - return nil -} - -// ReadMessage is a helper method for getting a reader using NextReader and -// reading from that reader to a buffer. -func (c *Conn) ReadMessage() (messageType int, p []byte, err error) { - var r io.Reader - messageType, r, err = c.NextReader() - if err != nil { - return messageType, nil, err - } - p, err = ioutil.ReadAll(r) - return messageType, p, err -} - -// SetReadDeadline sets the read deadline on the underlying network connection. -// After a read has timed out, the websocket connection state is corrupt and -// all future reads will return an error. A zero value for t means reads will -// not time out. -func (c *Conn) SetReadDeadline(t time.Time) error { - return c.conn.SetReadDeadline(t) -} - -// SetReadLimit sets the maximum size for a message read from the peer. If a -// message exceeds the limit, the connection sends a close message to the peer -// and returns ErrReadLimit to the application. -func (c *Conn) SetReadLimit(limit int64) { - c.readLimit = limit -} - -// CloseHandler returns the current close handler -func (c *Conn) CloseHandler() func(code int, text string) error { - return c.handleClose -} - -// SetCloseHandler sets the handler for close messages received from the peer. -// The code argument to h is the received close code or CloseNoStatusReceived -// if the close message is empty. The default close handler sends a close -// message back to the peer. -// -// The handler function is called from the NextReader, ReadMessage and message -// reader Read methods. The application must read the connection to process -// close messages as described in the section on Control Messages above. -// -// The connection read methods return a CloseError when a close message is -// received. Most applications should handle close messages as part of their -// normal error handling. Applications should only set a close handler when the -// application must perform some action before sending a close message back to -// the peer. -func (c *Conn) SetCloseHandler(h func(code int, text string) error) { - if h == nil { - h = func(code int, text string) error { - message := FormatCloseMessage(code, "") - c.WriteControl(CloseMessage, message, time.Now().Add(writeWait)) - return nil - } - } - c.handleClose = h -} - -// PingHandler returns the current ping handler -func (c *Conn) PingHandler() func(appData string) error { - return c.handlePing -} - -// SetPingHandler sets the handler for ping messages received from the peer. -// The appData argument to h is the PING message application data. The default -// ping handler sends a pong to the peer. -// -// The handler function is called from the NextReader, ReadMessage and message -// reader Read methods. The application must read the connection to process -// ping messages as described in the section on Control Messages above. -func (c *Conn) SetPingHandler(h func(appData string) error) { - if h == nil { - h = func(message string) error { - err := c.WriteControl(PongMessage, []byte(message), time.Now().Add(writeWait)) - if err == ErrCloseSent { - return nil - } else if e, ok := err.(net.Error); ok && e.Temporary() { - return nil - } - return err - } - } - c.handlePing = h -} - -// PongHandler returns the current pong handler -func (c *Conn) PongHandler() func(appData string) error { - return c.handlePong -} - -// SetPongHandler sets the handler for pong messages received from the peer. -// The appData argument to h is the PONG message application data. The default -// pong handler does nothing. -// -// The handler function is called from the NextReader, ReadMessage and message -// reader Read methods. The application must read the connection to process -// pong messages as described in the section on Control Messages above. -func (c *Conn) SetPongHandler(h func(appData string) error) { - if h == nil { - h = func(string) error { return nil } - } - c.handlePong = h -} - -// UnderlyingConn returns the internal net.Conn. This can be used to further -// modifications to connection specific flags. -func (c *Conn) UnderlyingConn() net.Conn { - return c.conn -} - -// EnableWriteCompression enables and disables write compression of -// subsequent text and binary messages. This function is a noop if -// compression was not negotiated with the peer. -func (c *Conn) EnableWriteCompression(enable bool) { - c.enableWriteCompression = enable -} - -// SetCompressionLevel sets the flate compression level for subsequent text and -// binary messages. This function is a noop if compression was not negotiated -// with the peer. See the compress/flate package for a description of -// compression levels. -func (c *Conn) SetCompressionLevel(level int) error { - if !isValidCompressionLevel(level) { - return errors.New("websocket: invalid compression level") - } - c.compressionLevel = level - return nil -} - -// FormatCloseMessage formats closeCode and text as a WebSocket close message. -// An empty message is returned for code CloseNoStatusReceived. -func FormatCloseMessage(closeCode int, text string) []byte { - if closeCode == CloseNoStatusReceived { - // Return empty message because it's illegal to send - // CloseNoStatusReceived. Return non-nil value in case application - // checks for nil. - return []byte{} - } - buf := make([]byte, 2+len(text)) - binary.BigEndian.PutUint16(buf, uint16(closeCode)) - copy(buf[2:], text) - return buf -} diff --git a/vendor/github.com/gorilla/websocket/conn_write.go b/vendor/github.com/gorilla/websocket/conn_write.go deleted file mode 100644 index a509a21..0000000 --- a/vendor/github.com/gorilla/websocket/conn_write.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build go1.8 - -package websocket - -import "net" - -func (c *Conn) writeBufs(bufs ...[]byte) error { - b := net.Buffers(bufs) - _, err := b.WriteTo(c.conn) - return err -} diff --git a/vendor/github.com/gorilla/websocket/conn_write_legacy.go b/vendor/github.com/gorilla/websocket/conn_write_legacy.go deleted file mode 100644 index 37edaff..0000000 --- a/vendor/github.com/gorilla/websocket/conn_write_legacy.go +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// +build !go1.8 - -package websocket - -func (c *Conn) writeBufs(bufs ...[]byte) error { - for _, buf := range bufs { - if len(buf) > 0 { - if _, err := c.conn.Write(buf); err != nil { - return err - } - } - } - return nil -} diff --git a/vendor/github.com/gorilla/websocket/doc.go b/vendor/github.com/gorilla/websocket/doc.go deleted file mode 100644 index dcce1a6..0000000 --- a/vendor/github.com/gorilla/websocket/doc.go +++ /dev/null @@ -1,180 +0,0 @@ -// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Package websocket implements the WebSocket protocol defined in RFC 6455. -// -// Overview -// -// The Conn type represents a WebSocket connection. A server application calls -// the Upgrader.Upgrade method from an HTTP request handler to get a *Conn: -// -// var upgrader = websocket.Upgrader{ -// ReadBufferSize: 1024, -// WriteBufferSize: 1024, -// } -// -// func handler(w http.ResponseWriter, r *http.Request) { -// conn, err := upgrader.Upgrade(w, r, nil) -// if err != nil { -// log.Println(err) -// return -// } -// ... Use conn to send and receive messages. -// } -// -// Call the connection's WriteMessage and ReadMessage methods to send and -// receive messages as a slice of bytes. This snippet of code shows how to echo -// messages using these methods: -// -// for { -// messageType, p, err := conn.ReadMessage() -// if err != nil { -// log.Println(err) -// return -// } -// if err := conn.WriteMessage(messageType, p); err != nil { -// log.Println(err) -// return -// } -// } -// -// In above snippet of code, p is a []byte and messageType is an int with value -// websocket.BinaryMessage or websocket.TextMessage. -// -// An application can also send and receive messages using the io.WriteCloser -// and io.Reader interfaces. To send a message, call the connection NextWriter -// method to get an io.WriteCloser, write the message to the writer and close -// the writer when done. To receive a message, call the connection NextReader -// method to get an io.Reader and read until io.EOF is returned. This snippet -// shows how to echo messages using the NextWriter and NextReader methods: -// -// for { -// messageType, r, err := conn.NextReader() -// if err != nil { -// return -// } -// w, err := conn.NextWriter(messageType) -// if err != nil { -// return err -// } -// if _, err := io.Copy(w, r); err != nil { -// return err -// } -// if err := w.Close(); err != nil { -// return err -// } -// } -// -// Data Messages -// -// The WebSocket protocol distinguishes between text and binary data messages. -// Text messages are interpreted as UTF-8 encoded text. The interpretation of -// binary messages is left to the application. -// -// This package uses the TextMessage and BinaryMessage integer constants to -// identify the two data message types. The ReadMessage and NextReader methods -// return the type of the received message. The messageType argument to the -// WriteMessage and NextWriter methods specifies the type of a sent message. -// -// It is the application's responsibility to ensure that text messages are -// valid UTF-8 encoded text. -// -// Control Messages -// -// The WebSocket protocol defines three types of control messages: close, ping -// and pong. Call the connection WriteControl, WriteMessage or NextWriter -// methods to send a control message to the peer. -// -// Connections handle received close messages by calling the handler function -// set with the SetCloseHandler method and by returning a *CloseError from the -// NextReader, ReadMessage or the message Read method. The default close -// handler sends a close message to the peer. -// -// Connections handle received ping messages by calling the handler function -// set with the SetPingHandler method. The default ping handler sends a pong -// message to the peer. -// -// Connections handle received pong messages by calling the handler function -// set with the SetPongHandler method. The default pong handler does nothing. -// If an application sends ping messages, then the application should set a -// pong handler to receive the corresponding pong. -// -// The control message handler functions are called from the NextReader, -// ReadMessage and message reader Read methods. The default close and ping -// handlers can block these methods for a short time when the handler writes to -// the connection. -// -// The application must read the connection to process close, ping and pong -// messages sent from the peer. If the application is not otherwise interested -// in messages from the peer, then the application should start a goroutine to -// read and discard messages from the peer. A simple example is: -// -// func readLoop(c *websocket.Conn) { -// for { -// if _, _, err := c.NextReader(); err != nil { -// c.Close() -// break -// } -// } -// } -// -// Concurrency -// -// Connections support one concurrent reader and one concurrent writer. -// -// Applications are responsible for ensuring that no more than one goroutine -// calls the write methods (NextWriter, SetWriteDeadline, WriteMessage, -// WriteJSON, EnableWriteCompression, SetCompressionLevel) concurrently and -// that no more than one goroutine calls the read methods (NextReader, -// SetReadDeadline, ReadMessage, ReadJSON, SetPongHandler, SetPingHandler) -// concurrently. -// -// The Close and WriteControl methods can be called concurrently with all other -// methods. -// -// Origin Considerations -// -// Web browsers allow Javascript applications to open a WebSocket connection to -// any host. It's up to the server to enforce an origin policy using the Origin -// request header sent by the browser. -// -// The Upgrader calls the function specified in the CheckOrigin field to check -// the origin. If the CheckOrigin function returns false, then the Upgrade -// method fails the WebSocket handshake with HTTP status 403. -// -// If the CheckOrigin field is nil, then the Upgrader uses a safe default: fail -// the handshake if the Origin request header is present and the Origin host is -// not equal to the Host request header. -// -// The deprecated package-level Upgrade function does not perform origin -// checking. The application is responsible for checking the Origin header -// before calling the Upgrade function. -// -// Compression EXPERIMENTAL -// -// Per message compression extensions (RFC 7692) are experimentally supported -// by this package in a limited capacity. Setting the EnableCompression option -// to true in Dialer or Upgrader will attempt to negotiate per message deflate -// support. -// -// var upgrader = websocket.Upgrader{ -// EnableCompression: true, -// } -// -// If compression was successfully negotiated with the connection's peer, any -// message received in compressed form will be automatically decompressed. -// All Read methods will return uncompressed bytes. -// -// Per message compression of messages written to a connection can be enabled -// or disabled by calling the corresponding Conn method: -// -// conn.EnableWriteCompression(false) -// -// Currently this package does not support compression with "context takeover". -// This means that messages must be compressed and decompressed in isolation, -// without retaining sliding window or dictionary state across messages. For -// more details refer to RFC 7692. -// -// Use of compression is experimental and may result in decreased performance. -package websocket diff --git a/vendor/github.com/gorilla/websocket/json.go b/vendor/github.com/gorilla/websocket/json.go deleted file mode 100644 index dc2c1f6..0000000 --- a/vendor/github.com/gorilla/websocket/json.go +++ /dev/null @@ -1,60 +0,0 @@ -// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "encoding/json" - "io" -) - -// WriteJSON writes the JSON encoding of v as a message. -// -// Deprecated: Use c.WriteJSON instead. -func WriteJSON(c *Conn, v interface{}) error { - return c.WriteJSON(v) -} - -// WriteJSON writes the JSON encoding of v as a message. -// -// See the documentation for encoding/json Marshal for details about the -// conversion of Go values to JSON. -func (c *Conn) WriteJSON(v interface{}) error { - w, err := c.NextWriter(TextMessage) - if err != nil { - return err - } - err1 := json.NewEncoder(w).Encode(v) - err2 := w.Close() - if err1 != nil { - return err1 - } - return err2 -} - -// ReadJSON reads the next JSON-encoded message from the connection and stores -// it in the value pointed to by v. -// -// Deprecated: Use c.ReadJSON instead. -func ReadJSON(c *Conn, v interface{}) error { - return c.ReadJSON(v) -} - -// ReadJSON reads the next JSON-encoded message from the connection and stores -// it in the value pointed to by v. -// -// See the documentation for the encoding/json Unmarshal function for details -// about the conversion of JSON to a Go value. -func (c *Conn) ReadJSON(v interface{}) error { - _, r, err := c.NextReader() - if err != nil { - return err - } - err = json.NewDecoder(r).Decode(v) - if err == io.EOF { - // One value is expected in the message. - err = io.ErrUnexpectedEOF - } - return err -} diff --git a/vendor/github.com/gorilla/websocket/mask.go b/vendor/github.com/gorilla/websocket/mask.go deleted file mode 100644 index 577fce9..0000000 --- a/vendor/github.com/gorilla/websocket/mask.go +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. Use of -// this source code is governed by a BSD-style license that can be found in the -// LICENSE file. - -// +build !appengine - -package websocket - -import "unsafe" - -const wordSize = int(unsafe.Sizeof(uintptr(0))) - -func maskBytes(key [4]byte, pos int, b []byte) int { - // Mask one byte at a time for small buffers. - if len(b) < 2*wordSize { - for i := range b { - b[i] ^= key[pos&3] - pos++ - } - return pos & 3 - } - - // Mask one byte at a time to word boundary. - if n := int(uintptr(unsafe.Pointer(&b[0]))) % wordSize; n != 0 { - n = wordSize - n - for i := range b[:n] { - b[i] ^= key[pos&3] - pos++ - } - b = b[n:] - } - - // Create aligned word size key. - var k [wordSize]byte - for i := range k { - k[i] = key[(pos+i)&3] - } - kw := *(*uintptr)(unsafe.Pointer(&k)) - - // Mask one word at a time. - n := (len(b) / wordSize) * wordSize - for i := 0; i < n; i += wordSize { - *(*uintptr)(unsafe.Pointer(uintptr(unsafe.Pointer(&b[0])) + uintptr(i))) ^= kw - } - - // Mask one byte at a time for remaining bytes. - b = b[n:] - for i := range b { - b[i] ^= key[pos&3] - pos++ - } - - return pos & 3 -} diff --git a/vendor/github.com/gorilla/websocket/mask_safe.go b/vendor/github.com/gorilla/websocket/mask_safe.go deleted file mode 100644 index 2aac060..0000000 --- a/vendor/github.com/gorilla/websocket/mask_safe.go +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2016 The Gorilla WebSocket Authors. All rights reserved. Use of -// this source code is governed by a BSD-style license that can be found in the -// LICENSE file. - -// +build appengine - -package websocket - -func maskBytes(key [4]byte, pos int, b []byte) int { - for i := range b { - b[i] ^= key[pos&3] - pos++ - } - return pos & 3 -} diff --git a/vendor/github.com/gorilla/websocket/prepared.go b/vendor/github.com/gorilla/websocket/prepared.go deleted file mode 100644 index 74ec565..0000000 --- a/vendor/github.com/gorilla/websocket/prepared.go +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright 2017 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bytes" - "net" - "sync" - "time" -) - -// PreparedMessage caches on the wire representations of a message payload. -// Use PreparedMessage to efficiently send a message payload to multiple -// connections. PreparedMessage is especially useful when compression is used -// because the CPU and memory expensive compression operation can be executed -// once for a given set of compression options. -type PreparedMessage struct { - messageType int - data []byte - mu sync.Mutex - frames map[prepareKey]*preparedFrame -} - -// prepareKey defines a unique set of options to cache prepared frames in PreparedMessage. -type prepareKey struct { - isServer bool - compress bool - compressionLevel int -} - -// preparedFrame contains data in wire representation. -type preparedFrame struct { - once sync.Once - data []byte -} - -// NewPreparedMessage returns an initialized PreparedMessage. You can then send -// it to connection using WritePreparedMessage method. Valid wire -// representation will be calculated lazily only once for a set of current -// connection options. -func NewPreparedMessage(messageType int, data []byte) (*PreparedMessage, error) { - pm := &PreparedMessage{ - messageType: messageType, - frames: make(map[prepareKey]*preparedFrame), - data: data, - } - - // Prepare a plain server frame. - _, frameData, err := pm.frame(prepareKey{isServer: true, compress: false}) - if err != nil { - return nil, err - } - - // To protect against caller modifying the data argument, remember the data - // copied to the plain server frame. - pm.data = frameData[len(frameData)-len(data):] - return pm, nil -} - -func (pm *PreparedMessage) frame(key prepareKey) (int, []byte, error) { - pm.mu.Lock() - frame, ok := pm.frames[key] - if !ok { - frame = &preparedFrame{} - pm.frames[key] = frame - } - pm.mu.Unlock() - - var err error - frame.once.Do(func() { - // Prepare a frame using a 'fake' connection. - // TODO: Refactor code in conn.go to allow more direct construction of - // the frame. - mu := make(chan bool, 1) - mu <- true - var nc prepareConn - c := &Conn{ - conn: &nc, - mu: mu, - isServer: key.isServer, - compressionLevel: key.compressionLevel, - enableWriteCompression: true, - writeBuf: make([]byte, defaultWriteBufferSize+maxFrameHeaderSize), - } - if key.compress { - c.newCompressionWriter = compressNoContextTakeover - } - err = c.WriteMessage(pm.messageType, pm.data) - frame.data = nc.buf.Bytes() - }) - return pm.messageType, frame.data, err -} - -type prepareConn struct { - buf bytes.Buffer - net.Conn -} - -func (pc *prepareConn) Write(p []byte) (int, error) { return pc.buf.Write(p) } -func (pc *prepareConn) SetWriteDeadline(t time.Time) error { return nil } diff --git a/vendor/github.com/gorilla/websocket/proxy.go b/vendor/github.com/gorilla/websocket/proxy.go deleted file mode 100644 index bf2478e..0000000 --- a/vendor/github.com/gorilla/websocket/proxy.go +++ /dev/null @@ -1,77 +0,0 @@ -// Copyright 2017 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bufio" - "encoding/base64" - "errors" - "net" - "net/http" - "net/url" - "strings" -) - -type netDialerFunc func(network, addr string) (net.Conn, error) - -func (fn netDialerFunc) Dial(network, addr string) (net.Conn, error) { - return fn(network, addr) -} - -func init() { - proxy_RegisterDialerType("http", func(proxyURL *url.URL, forwardDialer proxy_Dialer) (proxy_Dialer, error) { - return &httpProxyDialer{proxyURL: proxyURL, fowardDial: forwardDialer.Dial}, nil - }) -} - -type httpProxyDialer struct { - proxyURL *url.URL - fowardDial func(network, addr string) (net.Conn, error) -} - -func (hpd *httpProxyDialer) Dial(network string, addr string) (net.Conn, error) { - hostPort, _ := hostPortNoPort(hpd.proxyURL) - conn, err := hpd.fowardDial(network, hostPort) - if err != nil { - return nil, err - } - - connectHeader := make(http.Header) - if user := hpd.proxyURL.User; user != nil { - proxyUser := user.Username() - if proxyPassword, passwordSet := user.Password(); passwordSet { - credential := base64.StdEncoding.EncodeToString([]byte(proxyUser + ":" + proxyPassword)) - connectHeader.Set("Proxy-Authorization", "Basic "+credential) - } - } - - connectReq := &http.Request{ - Method: "CONNECT", - URL: &url.URL{Opaque: addr}, - Host: addr, - Header: connectHeader, - } - - if err := connectReq.Write(conn); err != nil { - conn.Close() - return nil, err - } - - // Read response. It's OK to use and discard buffered reader here becaue - // the remote server does not speak until spoken to. - br := bufio.NewReader(conn) - resp, err := http.ReadResponse(br, connectReq) - if err != nil { - conn.Close() - return nil, err - } - - if resp.StatusCode != 200 { - conn.Close() - f := strings.SplitN(resp.Status, " ", 2) - return nil, errors.New(f[1]) - } - return conn, nil -} diff --git a/vendor/github.com/gorilla/websocket/server.go b/vendor/github.com/gorilla/websocket/server.go deleted file mode 100644 index a761824..0000000 --- a/vendor/github.com/gorilla/websocket/server.go +++ /dev/null @@ -1,363 +0,0 @@ -// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "bufio" - "errors" - "io" - "net/http" - "net/url" - "strings" - "time" -) - -// HandshakeError describes an error with the handshake from the peer. -type HandshakeError struct { - message string -} - -func (e HandshakeError) Error() string { return e.message } - -// Upgrader specifies parameters for upgrading an HTTP connection to a -// WebSocket connection. -type Upgrader struct { - // HandshakeTimeout specifies the duration for the handshake to complete. - HandshakeTimeout time.Duration - - // ReadBufferSize and WriteBufferSize specify I/O buffer sizes. If a buffer - // size is zero, then buffers allocated by the HTTP server are used. The - // I/O buffer sizes do not limit the size of the messages that can be sent - // or received. - ReadBufferSize, WriteBufferSize int - - // WriteBufferPool is a pool of buffers for write operations. If the value - // is not set, then write buffers are allocated to the connection for the - // lifetime of the connection. - // - // A pool is most useful when the application has a modest volume of writes - // across a large number of connections. - // - // Applications should use a single pool for each unique value of - // WriteBufferSize. - WriteBufferPool BufferPool - - // Subprotocols specifies the server's supported protocols in order of - // preference. If this field is not nil, then the Upgrade method negotiates a - // subprotocol by selecting the first match in this list with a protocol - // requested by the client. If there's no match, then no protocol is - // negotiated (the Sec-Websocket-Protocol header is not included in the - // handshake response). - Subprotocols []string - - // Error specifies the function for generating HTTP error responses. If Error - // is nil, then http.Error is used to generate the HTTP response. - Error func(w http.ResponseWriter, r *http.Request, status int, reason error) - - // CheckOrigin returns true if the request Origin header is acceptable. If - // CheckOrigin is nil, then a safe default is used: return false if the - // Origin request header is present and the origin host is not equal to - // request Host header. - // - // A CheckOrigin function should carefully validate the request origin to - // prevent cross-site request forgery. - CheckOrigin func(r *http.Request) bool - - // EnableCompression specify if the server should attempt to negotiate per - // message compression (RFC 7692). Setting this value to true does not - // guarantee that compression will be supported. Currently only "no context - // takeover" modes are supported. - EnableCompression bool -} - -func (u *Upgrader) returnError(w http.ResponseWriter, r *http.Request, status int, reason string) (*Conn, error) { - err := HandshakeError{reason} - if u.Error != nil { - u.Error(w, r, status, err) - } else { - w.Header().Set("Sec-Websocket-Version", "13") - http.Error(w, http.StatusText(status), status) - } - return nil, err -} - -// checkSameOrigin returns true if the origin is not set or is equal to the request host. -func checkSameOrigin(r *http.Request) bool { - origin := r.Header["Origin"] - if len(origin) == 0 { - return true - } - u, err := url.Parse(origin[0]) - if err != nil { - return false - } - return equalASCIIFold(u.Host, r.Host) -} - -func (u *Upgrader) selectSubprotocol(r *http.Request, responseHeader http.Header) string { - if u.Subprotocols != nil { - clientProtocols := Subprotocols(r) - for _, serverProtocol := range u.Subprotocols { - for _, clientProtocol := range clientProtocols { - if clientProtocol == serverProtocol { - return clientProtocol - } - } - } - } else if responseHeader != nil { - return responseHeader.Get("Sec-Websocket-Protocol") - } - return "" -} - -// Upgrade upgrades the HTTP server connection to the WebSocket protocol. -// -// The responseHeader is included in the response to the client's upgrade -// request. Use the responseHeader to specify cookies (Set-Cookie) and the -// application negotiated subprotocol (Sec-WebSocket-Protocol). -// -// If the upgrade fails, then Upgrade replies to the client with an HTTP error -// response. -func (u *Upgrader) Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header) (*Conn, error) { - const badHandshake = "websocket: the client is not using the websocket protocol: " - - if !tokenListContainsValue(r.Header, "Connection", "upgrade") { - return u.returnError(w, r, http.StatusBadRequest, badHandshake+"'upgrade' token not found in 'Connection' header") - } - - if !tokenListContainsValue(r.Header, "Upgrade", "websocket") { - return u.returnError(w, r, http.StatusBadRequest, badHandshake+"'websocket' token not found in 'Upgrade' header") - } - - if r.Method != "GET" { - return u.returnError(w, r, http.StatusMethodNotAllowed, badHandshake+"request method is not GET") - } - - if !tokenListContainsValue(r.Header, "Sec-Websocket-Version", "13") { - return u.returnError(w, r, http.StatusBadRequest, "websocket: unsupported version: 13 not found in 'Sec-Websocket-Version' header") - } - - if _, ok := responseHeader["Sec-Websocket-Extensions"]; ok { - return u.returnError(w, r, http.StatusInternalServerError, "websocket: application specific 'Sec-WebSocket-Extensions' headers are unsupported") - } - - checkOrigin := u.CheckOrigin - if checkOrigin == nil { - checkOrigin = checkSameOrigin - } - if !checkOrigin(r) { - return u.returnError(w, r, http.StatusForbidden, "websocket: request origin not allowed by Upgrader.CheckOrigin") - } - - challengeKey := r.Header.Get("Sec-Websocket-Key") - if challengeKey == "" { - return u.returnError(w, r, http.StatusBadRequest, "websocket: not a websocket handshake: `Sec-WebSocket-Key' header is missing or blank") - } - - subprotocol := u.selectSubprotocol(r, responseHeader) - - // Negotiate PMCE - var compress bool - if u.EnableCompression { - for _, ext := range parseExtensions(r.Header) { - if ext[""] != "permessage-deflate" { - continue - } - compress = true - break - } - } - - h, ok := w.(http.Hijacker) - if !ok { - return u.returnError(w, r, http.StatusInternalServerError, "websocket: response does not implement http.Hijacker") - } - var brw *bufio.ReadWriter - netConn, brw, err := h.Hijack() - if err != nil { - return u.returnError(w, r, http.StatusInternalServerError, err.Error()) - } - - if brw.Reader.Buffered() > 0 { - netConn.Close() - return nil, errors.New("websocket: client sent data before handshake is complete") - } - - var br *bufio.Reader - if u.ReadBufferSize == 0 && bufioReaderSize(netConn, brw.Reader) > 256 { - // Reuse hijacked buffered reader as connection reader. - br = brw.Reader - } - - buf := bufioWriterBuffer(netConn, brw.Writer) - - var writeBuf []byte - if u.WriteBufferPool == nil && u.WriteBufferSize == 0 && len(buf) >= maxFrameHeaderSize+256 { - // Reuse hijacked write buffer as connection buffer. - writeBuf = buf - } - - c := newConn(netConn, true, u.ReadBufferSize, u.WriteBufferSize, u.WriteBufferPool, br, writeBuf) - c.subprotocol = subprotocol - - if compress { - c.newCompressionWriter = compressNoContextTakeover - c.newDecompressionReader = decompressNoContextTakeover - } - - // Use larger of hijacked buffer and connection write buffer for header. - p := buf - if len(c.writeBuf) > len(p) { - p = c.writeBuf - } - p = p[:0] - - p = append(p, "HTTP/1.1 101 Switching Protocols\r\nUpgrade: websocket\r\nConnection: Upgrade\r\nSec-WebSocket-Accept: "...) - p = append(p, computeAcceptKey(challengeKey)...) - p = append(p, "\r\n"...) - if c.subprotocol != "" { - p = append(p, "Sec-WebSocket-Protocol: "...) - p = append(p, c.subprotocol...) - p = append(p, "\r\n"...) - } - if compress { - p = append(p, "Sec-WebSocket-Extensions: permessage-deflate; server_no_context_takeover; client_no_context_takeover\r\n"...) - } - for k, vs := range responseHeader { - if k == "Sec-Websocket-Protocol" { - continue - } - for _, v := range vs { - p = append(p, k...) - p = append(p, ": "...) - for i := 0; i < len(v); i++ { - b := v[i] - if b <= 31 { - // prevent response splitting. - b = ' ' - } - p = append(p, b) - } - p = append(p, "\r\n"...) - } - } - p = append(p, "\r\n"...) - - // Clear deadlines set by HTTP server. - netConn.SetDeadline(time.Time{}) - - if u.HandshakeTimeout > 0 { - netConn.SetWriteDeadline(time.Now().Add(u.HandshakeTimeout)) - } - if _, err = netConn.Write(p); err != nil { - netConn.Close() - return nil, err - } - if u.HandshakeTimeout > 0 { - netConn.SetWriteDeadline(time.Time{}) - } - - return c, nil -} - -// Upgrade upgrades the HTTP server connection to the WebSocket protocol. -// -// Deprecated: Use websocket.Upgrader instead. -// -// Upgrade does not perform origin checking. The application is responsible for -// checking the Origin header before calling Upgrade. An example implementation -// of the same origin policy check is: -// -// if req.Header.Get("Origin") != "http://"+req.Host { -// http.Error(w, "Origin not allowed", http.StatusForbidden) -// return -// } -// -// If the endpoint supports subprotocols, then the application is responsible -// for negotiating the protocol used on the connection. Use the Subprotocols() -// function to get the subprotocols requested by the client. Use the -// Sec-Websocket-Protocol response header to specify the subprotocol selected -// by the application. -// -// The responseHeader is included in the response to the client's upgrade -// request. Use the responseHeader to specify cookies (Set-Cookie) and the -// negotiated subprotocol (Sec-Websocket-Protocol). -// -// The connection buffers IO to the underlying network connection. The -// readBufSize and writeBufSize parameters specify the size of the buffers to -// use. Messages can be larger than the buffers. -// -// If the request is not a valid WebSocket handshake, then Upgrade returns an -// error of type HandshakeError. Applications should handle this error by -// replying to the client with an HTTP error response. -func Upgrade(w http.ResponseWriter, r *http.Request, responseHeader http.Header, readBufSize, writeBufSize int) (*Conn, error) { - u := Upgrader{ReadBufferSize: readBufSize, WriteBufferSize: writeBufSize} - u.Error = func(w http.ResponseWriter, r *http.Request, status int, reason error) { - // don't return errors to maintain backwards compatibility - } - u.CheckOrigin = func(r *http.Request) bool { - // allow all connections by default - return true - } - return u.Upgrade(w, r, responseHeader) -} - -// Subprotocols returns the subprotocols requested by the client in the -// Sec-Websocket-Protocol header. -func Subprotocols(r *http.Request) []string { - h := strings.TrimSpace(r.Header.Get("Sec-Websocket-Protocol")) - if h == "" { - return nil - } - protocols := strings.Split(h, ",") - for i := range protocols { - protocols[i] = strings.TrimSpace(protocols[i]) - } - return protocols -} - -// IsWebSocketUpgrade returns true if the client requested upgrade to the -// WebSocket protocol. -func IsWebSocketUpgrade(r *http.Request) bool { - return tokenListContainsValue(r.Header, "Connection", "upgrade") && - tokenListContainsValue(r.Header, "Upgrade", "websocket") -} - -// bufioReaderSize size returns the size of a bufio.Reader. -func bufioReaderSize(originalReader io.Reader, br *bufio.Reader) int { - // This code assumes that peek on a reset reader returns - // bufio.Reader.buf[:0]. - // TODO: Use bufio.Reader.Size() after Go 1.10 - br.Reset(originalReader) - if p, err := br.Peek(0); err == nil { - return cap(p) - } - return 0 -} - -// writeHook is an io.Writer that records the last slice passed to it vio -// io.Writer.Write. -type writeHook struct { - p []byte -} - -func (wh *writeHook) Write(p []byte) (int, error) { - wh.p = p - return len(p), nil -} - -// bufioWriterBuffer grabs the buffer from a bufio.Writer. -func bufioWriterBuffer(originalWriter io.Writer, bw *bufio.Writer) []byte { - // This code assumes that bufio.Writer.buf[:1] is passed to the - // bufio.Writer's underlying writer. - var wh writeHook - bw.Reset(&wh) - bw.WriteByte(0) - bw.Flush() - - bw.Reset(originalWriter) - - return wh.p[:cap(wh.p)] -} diff --git a/vendor/github.com/gorilla/websocket/trace.go b/vendor/github.com/gorilla/websocket/trace.go deleted file mode 100644 index 834f122..0000000 --- a/vendor/github.com/gorilla/websocket/trace.go +++ /dev/null @@ -1,19 +0,0 @@ -// +build go1.8 - -package websocket - -import ( - "crypto/tls" - "net/http/httptrace" -) - -func doHandshakeWithTrace(trace *httptrace.ClientTrace, tlsConn *tls.Conn, cfg *tls.Config) error { - if trace.TLSHandshakeStart != nil { - trace.TLSHandshakeStart() - } - err := doHandshake(tlsConn, cfg) - if trace.TLSHandshakeDone != nil { - trace.TLSHandshakeDone(tlsConn.ConnectionState(), err) - } - return err -} diff --git a/vendor/github.com/gorilla/websocket/trace_17.go b/vendor/github.com/gorilla/websocket/trace_17.go deleted file mode 100644 index 77d05a0..0000000 --- a/vendor/github.com/gorilla/websocket/trace_17.go +++ /dev/null @@ -1,12 +0,0 @@ -// +build !go1.8 - -package websocket - -import ( - "crypto/tls" - "net/http/httptrace" -) - -func doHandshakeWithTrace(trace *httptrace.ClientTrace, tlsConn *tls.Conn, cfg *tls.Config) error { - return doHandshake(tlsConn, cfg) -} diff --git a/vendor/github.com/gorilla/websocket/util.go b/vendor/github.com/gorilla/websocket/util.go deleted file mode 100644 index 354001e..0000000 --- a/vendor/github.com/gorilla/websocket/util.go +++ /dev/null @@ -1,237 +0,0 @@ -// Copyright 2013 The Gorilla WebSocket Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -package websocket - -import ( - "crypto/rand" - "crypto/sha1" - "encoding/base64" - "io" - "net/http" - "strings" - "unicode/utf8" -) - -var keyGUID = []byte("258EAFA5-E914-47DA-95CA-C5AB0DC85B11") - -func computeAcceptKey(challengeKey string) string { - h := sha1.New() - h.Write([]byte(challengeKey)) - h.Write(keyGUID) - return base64.StdEncoding.EncodeToString(h.Sum(nil)) -} - -func generateChallengeKey() (string, error) { - p := make([]byte, 16) - if _, err := io.ReadFull(rand.Reader, p); err != nil { - return "", err - } - return base64.StdEncoding.EncodeToString(p), nil -} - -// Octet types from RFC 2616. -var octetTypes [256]byte - -const ( - isTokenOctet = 1 << iota - isSpaceOctet -) - -func init() { - // From RFC 2616 - // - // OCTET = - // CHAR = - // CTL = - // CR = - // LF = - // SP = - // HT = - // <"> = - // CRLF = CR LF - // LWS = [CRLF] 1*( SP | HT ) - // TEXT = - // separators = "(" | ")" | "<" | ">" | "@" | "," | ";" | ":" | "\" | <"> - // | "/" | "[" | "]" | "?" | "=" | "{" | "}" | SP | HT - // token = 1* - // qdtext = > - - for c := 0; c < 256; c++ { - var t byte - isCtl := c <= 31 || c == 127 - isChar := 0 <= c && c <= 127 - isSeparator := strings.IndexRune(" \t\"(),/:;<=>?@[]\\{}", rune(c)) >= 0 - if strings.IndexRune(" \t\r\n", rune(c)) >= 0 { - t |= isSpaceOctet - } - if isChar && !isCtl && !isSeparator { - t |= isTokenOctet - } - octetTypes[c] = t - } -} - -func skipSpace(s string) (rest string) { - i := 0 - for ; i < len(s); i++ { - if octetTypes[s[i]]&isSpaceOctet == 0 { - break - } - } - return s[i:] -} - -func nextToken(s string) (token, rest string) { - i := 0 - for ; i < len(s); i++ { - if octetTypes[s[i]]&isTokenOctet == 0 { - break - } - } - return s[:i], s[i:] -} - -func nextTokenOrQuoted(s string) (value string, rest string) { - if !strings.HasPrefix(s, "\"") { - return nextToken(s) - } - s = s[1:] - for i := 0; i < len(s); i++ { - switch s[i] { - case '"': - return s[:i], s[i+1:] - case '\\': - p := make([]byte, len(s)-1) - j := copy(p, s[:i]) - escape := true - for i = i + 1; i < len(s); i++ { - b := s[i] - switch { - case escape: - escape = false - p[j] = b - j++ - case b == '\\': - escape = true - case b == '"': - return string(p[:j]), s[i+1:] - default: - p[j] = b - j++ - } - } - return "", "" - } - } - return "", "" -} - -// equalASCIIFold returns true if s is equal to t with ASCII case folding. -func equalASCIIFold(s, t string) bool { - for s != "" && t != "" { - sr, size := utf8.DecodeRuneInString(s) - s = s[size:] - tr, size := utf8.DecodeRuneInString(t) - t = t[size:] - if sr == tr { - continue - } - if 'A' <= sr && sr <= 'Z' { - sr = sr + 'a' - 'A' - } - if 'A' <= tr && tr <= 'Z' { - tr = tr + 'a' - 'A' - } - if sr != tr { - return false - } - } - return s == t -} - -// tokenListContainsValue returns true if the 1#token header with the given -// name contains a token equal to value with ASCII case folding. -func tokenListContainsValue(header http.Header, name string, value string) bool { -headers: - for _, s := range header[name] { - for { - var t string - t, s = nextToken(skipSpace(s)) - if t == "" { - continue headers - } - s = skipSpace(s) - if s != "" && s[0] != ',' { - continue headers - } - if equalASCIIFold(t, value) { - return true - } - if s == "" { - continue headers - } - s = s[1:] - } - } - return false -} - -// parseExtensions parses WebSocket extensions from a header. -func parseExtensions(header http.Header) []map[string]string { - // From RFC 6455: - // - // Sec-WebSocket-Extensions = extension-list - // extension-list = 1#extension - // extension = extension-token *( ";" extension-param ) - // extension-token = registered-token - // registered-token = token - // extension-param = token [ "=" (token | quoted-string) ] - // ;When using the quoted-string syntax variant, the value - // ;after quoted-string unescaping MUST conform to the - // ;'token' ABNF. - - var result []map[string]string -headers: - for _, s := range header["Sec-Websocket-Extensions"] { - for { - var t string - t, s = nextToken(skipSpace(s)) - if t == "" { - continue headers - } - ext := map[string]string{"": t} - for { - s = skipSpace(s) - if !strings.HasPrefix(s, ";") { - break - } - var k string - k, s = nextToken(skipSpace(s[1:])) - if k == "" { - continue headers - } - s = skipSpace(s) - var v string - if strings.HasPrefix(s, "=") { - v, s = nextTokenOrQuoted(skipSpace(s[1:])) - s = skipSpace(s) - } - if s != "" && s[0] != ',' && s[0] != ';' { - continue headers - } - ext[k] = v - } - if s != "" && s[0] != ',' { - continue headers - } - result = append(result, ext) - if s == "" { - continue headers - } - s = s[1:] - } - } - return result -} diff --git a/vendor/github.com/gorilla/websocket/x_net_proxy.go b/vendor/github.com/gorilla/websocket/x_net_proxy.go deleted file mode 100644 index 2e668f6..0000000 --- a/vendor/github.com/gorilla/websocket/x_net_proxy.go +++ /dev/null @@ -1,473 +0,0 @@ -// Code generated by golang.org/x/tools/cmd/bundle. DO NOT EDIT. -//go:generate bundle -o x_net_proxy.go golang.org/x/net/proxy - -// Package proxy provides support for a variety of protocols to proxy network -// data. -// - -package websocket - -import ( - "errors" - "io" - "net" - "net/url" - "os" - "strconv" - "strings" - "sync" -) - -type proxy_direct struct{} - -// Direct is a direct proxy: one that makes network connections directly. -var proxy_Direct = proxy_direct{} - -func (proxy_direct) Dial(network, addr string) (net.Conn, error) { - return net.Dial(network, addr) -} - -// A PerHost directs connections to a default Dialer unless the host name -// requested matches one of a number of exceptions. -type proxy_PerHost struct { - def, bypass proxy_Dialer - - bypassNetworks []*net.IPNet - bypassIPs []net.IP - bypassZones []string - bypassHosts []string -} - -// NewPerHost returns a PerHost Dialer that directs connections to either -// defaultDialer or bypass, depending on whether the connection matches one of -// the configured rules. -func proxy_NewPerHost(defaultDialer, bypass proxy_Dialer) *proxy_PerHost { - return &proxy_PerHost{ - def: defaultDialer, - bypass: bypass, - } -} - -// Dial connects to the address addr on the given network through either -// defaultDialer or bypass. -func (p *proxy_PerHost) Dial(network, addr string) (c net.Conn, err error) { - host, _, err := net.SplitHostPort(addr) - if err != nil { - return nil, err - } - - return p.dialerForRequest(host).Dial(network, addr) -} - -func (p *proxy_PerHost) dialerForRequest(host string) proxy_Dialer { - if ip := net.ParseIP(host); ip != nil { - for _, net := range p.bypassNetworks { - if net.Contains(ip) { - return p.bypass - } - } - for _, bypassIP := range p.bypassIPs { - if bypassIP.Equal(ip) { - return p.bypass - } - } - return p.def - } - - for _, zone := range p.bypassZones { - if strings.HasSuffix(host, zone) { - return p.bypass - } - if host == zone[1:] { - // For a zone ".example.com", we match "example.com" - // too. - return p.bypass - } - } - for _, bypassHost := range p.bypassHosts { - if bypassHost == host { - return p.bypass - } - } - return p.def -} - -// AddFromString parses a string that contains comma-separated values -// specifying hosts that should use the bypass proxy. Each value is either an -// IP address, a CIDR range, a zone (*.example.com) or a host name -// (localhost). A best effort is made to parse the string and errors are -// ignored. -func (p *proxy_PerHost) AddFromString(s string) { - hosts := strings.Split(s, ",") - for _, host := range hosts { - host = strings.TrimSpace(host) - if len(host) == 0 { - continue - } - if strings.Contains(host, "/") { - // We assume that it's a CIDR address like 127.0.0.0/8 - if _, net, err := net.ParseCIDR(host); err == nil { - p.AddNetwork(net) - } - continue - } - if ip := net.ParseIP(host); ip != nil { - p.AddIP(ip) - continue - } - if strings.HasPrefix(host, "*.") { - p.AddZone(host[1:]) - continue - } - p.AddHost(host) - } -} - -// AddIP specifies an IP address that will use the bypass proxy. Note that -// this will only take effect if a literal IP address is dialed. A connection -// to a named host will never match an IP. -func (p *proxy_PerHost) AddIP(ip net.IP) { - p.bypassIPs = append(p.bypassIPs, ip) -} - -// AddNetwork specifies an IP range that will use the bypass proxy. Note that -// this will only take effect if a literal IP address is dialed. A connection -// to a named host will never match. -func (p *proxy_PerHost) AddNetwork(net *net.IPNet) { - p.bypassNetworks = append(p.bypassNetworks, net) -} - -// AddZone specifies a DNS suffix that will use the bypass proxy. A zone of -// "example.com" matches "example.com" and all of its subdomains. -func (p *proxy_PerHost) AddZone(zone string) { - if strings.HasSuffix(zone, ".") { - zone = zone[:len(zone)-1] - } - if !strings.HasPrefix(zone, ".") { - zone = "." + zone - } - p.bypassZones = append(p.bypassZones, zone) -} - -// AddHost specifies a host name that will use the bypass proxy. -func (p *proxy_PerHost) AddHost(host string) { - if strings.HasSuffix(host, ".") { - host = host[:len(host)-1] - } - p.bypassHosts = append(p.bypassHosts, host) -} - -// A Dialer is a means to establish a connection. -type proxy_Dialer interface { - // Dial connects to the given address via the proxy. - Dial(network, addr string) (c net.Conn, err error) -} - -// Auth contains authentication parameters that specific Dialers may require. -type proxy_Auth struct { - User, Password string -} - -// FromEnvironment returns the dialer specified by the proxy related variables in -// the environment. -func proxy_FromEnvironment() proxy_Dialer { - allProxy := proxy_allProxyEnv.Get() - if len(allProxy) == 0 { - return proxy_Direct - } - - proxyURL, err := url.Parse(allProxy) - if err != nil { - return proxy_Direct - } - proxy, err := proxy_FromURL(proxyURL, proxy_Direct) - if err != nil { - return proxy_Direct - } - - noProxy := proxy_noProxyEnv.Get() - if len(noProxy) == 0 { - return proxy - } - - perHost := proxy_NewPerHost(proxy, proxy_Direct) - perHost.AddFromString(noProxy) - return perHost -} - -// proxySchemes is a map from URL schemes to a function that creates a Dialer -// from a URL with such a scheme. -var proxy_proxySchemes map[string]func(*url.URL, proxy_Dialer) (proxy_Dialer, error) - -// RegisterDialerType takes a URL scheme and a function to generate Dialers from -// a URL with that scheme and a forwarding Dialer. Registered schemes are used -// by FromURL. -func proxy_RegisterDialerType(scheme string, f func(*url.URL, proxy_Dialer) (proxy_Dialer, error)) { - if proxy_proxySchemes == nil { - proxy_proxySchemes = make(map[string]func(*url.URL, proxy_Dialer) (proxy_Dialer, error)) - } - proxy_proxySchemes[scheme] = f -} - -// FromURL returns a Dialer given a URL specification and an underlying -// Dialer for it to make network requests. -func proxy_FromURL(u *url.URL, forward proxy_Dialer) (proxy_Dialer, error) { - var auth *proxy_Auth - if u.User != nil { - auth = new(proxy_Auth) - auth.User = u.User.Username() - if p, ok := u.User.Password(); ok { - auth.Password = p - } - } - - switch u.Scheme { - case "socks5": - return proxy_SOCKS5("tcp", u.Host, auth, forward) - } - - // If the scheme doesn't match any of the built-in schemes, see if it - // was registered by another package. - if proxy_proxySchemes != nil { - if f, ok := proxy_proxySchemes[u.Scheme]; ok { - return f(u, forward) - } - } - - return nil, errors.New("proxy: unknown scheme: " + u.Scheme) -} - -var ( - proxy_allProxyEnv = &proxy_envOnce{ - names: []string{"ALL_PROXY", "all_proxy"}, - } - proxy_noProxyEnv = &proxy_envOnce{ - names: []string{"NO_PROXY", "no_proxy"}, - } -) - -// envOnce looks up an environment variable (optionally by multiple -// names) once. It mitigates expensive lookups on some platforms -// (e.g. Windows). -// (Borrowed from net/http/transport.go) -type proxy_envOnce struct { - names []string - once sync.Once - val string -} - -func (e *proxy_envOnce) Get() string { - e.once.Do(e.init) - return e.val -} - -func (e *proxy_envOnce) init() { - for _, n := range e.names { - e.val = os.Getenv(n) - if e.val != "" { - return - } - } -} - -// SOCKS5 returns a Dialer that makes SOCKSv5 connections to the given address -// with an optional username and password. See RFC 1928 and RFC 1929. -func proxy_SOCKS5(network, addr string, auth *proxy_Auth, forward proxy_Dialer) (proxy_Dialer, error) { - s := &proxy_socks5{ - network: network, - addr: addr, - forward: forward, - } - if auth != nil { - s.user = auth.User - s.password = auth.Password - } - - return s, nil -} - -type proxy_socks5 struct { - user, password string - network, addr string - forward proxy_Dialer -} - -const proxy_socks5Version = 5 - -const ( - proxy_socks5AuthNone = 0 - proxy_socks5AuthPassword = 2 -) - -const proxy_socks5Connect = 1 - -const ( - proxy_socks5IP4 = 1 - proxy_socks5Domain = 3 - proxy_socks5IP6 = 4 -) - -var proxy_socks5Errors = []string{ - "", - "general failure", - "connection forbidden", - "network unreachable", - "host unreachable", - "connection refused", - "TTL expired", - "command not supported", - "address type not supported", -} - -// Dial connects to the address addr on the given network via the SOCKS5 proxy. -func (s *proxy_socks5) Dial(network, addr string) (net.Conn, error) { - switch network { - case "tcp", "tcp6", "tcp4": - default: - return nil, errors.New("proxy: no support for SOCKS5 proxy connections of type " + network) - } - - conn, err := s.forward.Dial(s.network, s.addr) - if err != nil { - return nil, err - } - if err := s.connect(conn, addr); err != nil { - conn.Close() - return nil, err - } - return conn, nil -} - -// connect takes an existing connection to a socks5 proxy server, -// and commands the server to extend that connection to target, -// which must be a canonical address with a host and port. -func (s *proxy_socks5) connect(conn net.Conn, target string) error { - host, portStr, err := net.SplitHostPort(target) - if err != nil { - return err - } - - port, err := strconv.Atoi(portStr) - if err != nil { - return errors.New("proxy: failed to parse port number: " + portStr) - } - if port < 1 || port > 0xffff { - return errors.New("proxy: port number out of range: " + portStr) - } - - // the size here is just an estimate - buf := make([]byte, 0, 6+len(host)) - - buf = append(buf, proxy_socks5Version) - if len(s.user) > 0 && len(s.user) < 256 && len(s.password) < 256 { - buf = append(buf, 2 /* num auth methods */, proxy_socks5AuthNone, proxy_socks5AuthPassword) - } else { - buf = append(buf, 1 /* num auth methods */, proxy_socks5AuthNone) - } - - if _, err := conn.Write(buf); err != nil { - return errors.New("proxy: failed to write greeting to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return errors.New("proxy: failed to read greeting from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - if buf[0] != 5 { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " has unexpected version " + strconv.Itoa(int(buf[0]))) - } - if buf[1] == 0xff { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " requires authentication") - } - - // See RFC 1929 - if buf[1] == proxy_socks5AuthPassword { - buf = buf[:0] - buf = append(buf, 1 /* password protocol version */) - buf = append(buf, uint8(len(s.user))) - buf = append(buf, s.user...) - buf = append(buf, uint8(len(s.password))) - buf = append(buf, s.password...) - - if _, err := conn.Write(buf); err != nil { - return errors.New("proxy: failed to write authentication request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return errors.New("proxy: failed to read authentication reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if buf[1] != 0 { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " rejected username/password") - } - } - - buf = buf[:0] - buf = append(buf, proxy_socks5Version, proxy_socks5Connect, 0 /* reserved */) - - if ip := net.ParseIP(host); ip != nil { - if ip4 := ip.To4(); ip4 != nil { - buf = append(buf, proxy_socks5IP4) - ip = ip4 - } else { - buf = append(buf, proxy_socks5IP6) - } - buf = append(buf, ip...) - } else { - if len(host) > 255 { - return errors.New("proxy: destination host name too long: " + host) - } - buf = append(buf, proxy_socks5Domain) - buf = append(buf, byte(len(host))) - buf = append(buf, host...) - } - buf = append(buf, byte(port>>8), byte(port)) - - if _, err := conn.Write(buf); err != nil { - return errors.New("proxy: failed to write connect request to SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - if _, err := io.ReadFull(conn, buf[:4]); err != nil { - return errors.New("proxy: failed to read connect reply from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - failure := "unknown error" - if int(buf[1]) < len(proxy_socks5Errors) { - failure = proxy_socks5Errors[buf[1]] - } - - if len(failure) > 0 { - return errors.New("proxy: SOCKS5 proxy at " + s.addr + " failed to connect: " + failure) - } - - bytesToDiscard := 0 - switch buf[3] { - case proxy_socks5IP4: - bytesToDiscard = net.IPv4len - case proxy_socks5IP6: - bytesToDiscard = net.IPv6len - case proxy_socks5Domain: - _, err := io.ReadFull(conn, buf[:1]) - if err != nil { - return errors.New("proxy: failed to read domain length from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - bytesToDiscard = int(buf[0]) - default: - return errors.New("proxy: got unknown address type " + strconv.Itoa(int(buf[3])) + " from SOCKS5 proxy at " + s.addr) - } - - if cap(buf) < bytesToDiscard { - buf = make([]byte, bytesToDiscard) - } else { - buf = buf[:bytesToDiscard] - } - if _, err := io.ReadFull(conn, buf); err != nil { - return errors.New("proxy: failed to read address from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - // Also need to discard the port number - if _, err := io.ReadFull(conn, buf[:2]); err != nil { - return errors.New("proxy: failed to read port from SOCKS5 proxy at " + s.addr + ": " + err.Error()) - } - - return nil -} diff --git a/vendor/github.com/gregjones/httpcache/.travis.yml b/vendor/github.com/gregjones/httpcache/.travis.yml deleted file mode 100644 index 2bca4c5..0000000 --- a/vendor/github.com/gregjones/httpcache/.travis.yml +++ /dev/null @@ -1,18 +0,0 @@ -sudo: false -language: go -go: - - 1.6.x - - 1.7.x - - 1.8.x - - master -matrix: - allow_failures: - - go: master - fast_finish: true -install: - - # Do nothing. This is needed to prevent default install action "go get -t -v ./..." from happening here (we want it to happen inside script step). -script: - - go get -t -v ./... - - diff -u <(echo -n) <(gofmt -d .) - - go tool vet . - - go test -v -race ./... diff --git a/vendor/github.com/gregjones/httpcache/LICENSE.txt b/vendor/github.com/gregjones/httpcache/LICENSE.txt deleted file mode 100644 index 81316be..0000000 --- a/vendor/github.com/gregjones/httpcache/LICENSE.txt +++ /dev/null @@ -1,7 +0,0 @@ -Copyright © 2012 Greg Jones (greg.jones@gmail.com) - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/gregjones/httpcache/README.md b/vendor/github.com/gregjones/httpcache/README.md deleted file mode 100644 index 61bd830..0000000 --- a/vendor/github.com/gregjones/httpcache/README.md +++ /dev/null @@ -1,24 +0,0 @@ -httpcache -========= - -[![Build Status](https://travis-ci.org/gregjones/httpcache.svg?branch=master)](https://travis-ci.org/gregjones/httpcache) [![GoDoc](https://godoc.org/github.com/gregjones/httpcache?status.svg)](https://godoc.org/github.com/gregjones/httpcache) - -Package httpcache provides a http.RoundTripper implementation that works as a mostly RFC-compliant cache for http responses. - -It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client and not for a shared proxy). - -Cache Backends --------------- - -- The built-in 'memory' cache stores responses in an in-memory map. -- [`github.com/gregjones/httpcache/diskcache`](https://github.com/gregjones/httpcache/tree/master/diskcache) provides a filesystem-backed cache using the [diskv](https://github.com/peterbourgon/diskv) library. -- [`github.com/gregjones/httpcache/memcache`](https://github.com/gregjones/httpcache/tree/master/memcache) provides memcache implementations, for both App Engine and 'normal' memcache servers. -- [`sourcegraph.com/sourcegraph/s3cache`](https://sourcegraph.com/github.com/sourcegraph/s3cache) uses Amazon S3 for storage. -- [`github.com/gregjones/httpcache/leveldbcache`](https://github.com/gregjones/httpcache/tree/master/leveldbcache) provides a filesystem-backed cache using [leveldb](https://github.com/syndtr/goleveldb/leveldb). -- [`github.com/die-net/lrucache`](https://github.com/die-net/lrucache) provides an in-memory cache that will evict least-recently used entries. -- [`github.com/die-net/lrucache/twotier`](https://github.com/die-net/lrucache/tree/master/twotier) allows caches to be combined, for example to use lrucache above with a persistent disk-cache. - -License -------- - -- [MIT License](LICENSE.txt) diff --git a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go b/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go deleted file mode 100644 index 42e3129..0000000 --- a/vendor/github.com/gregjones/httpcache/diskcache/diskcache.go +++ /dev/null @@ -1,61 +0,0 @@ -// Package diskcache provides an implementation of httpcache.Cache that uses the diskv package -// to supplement an in-memory map with persistent storage -// -package diskcache - -import ( - "bytes" - "crypto/md5" - "encoding/hex" - "github.com/peterbourgon/diskv" - "io" -) - -// Cache is an implementation of httpcache.Cache that supplements the in-memory map with persistent storage -type Cache struct { - d *diskv.Diskv -} - -// Get returns the response corresponding to key if present -func (c *Cache) Get(key string) (resp []byte, ok bool) { - key = keyToFilename(key) - resp, err := c.d.Read(key) - if err != nil { - return []byte{}, false - } - return resp, true -} - -// Set saves a response to the cache as key -func (c *Cache) Set(key string, resp []byte) { - key = keyToFilename(key) - c.d.WriteStream(key, bytes.NewReader(resp), true) -} - -// Delete removes the response with key from the cache -func (c *Cache) Delete(key string) { - key = keyToFilename(key) - c.d.Erase(key) -} - -func keyToFilename(key string) string { - h := md5.New() - io.WriteString(h, key) - return hex.EncodeToString(h.Sum(nil)) -} - -// New returns a new Cache that will store files in basePath -func New(basePath string) *Cache { - return &Cache{ - d: diskv.New(diskv.Options{ - BasePath: basePath, - CacheSizeMax: 100 * 1024 * 1024, // 100MB - }), - } -} - -// NewWithDiskv returns a new Cache using the provided Diskv as underlying -// storage. -func NewWithDiskv(d *diskv.Diskv) *Cache { - return &Cache{d} -} diff --git a/vendor/github.com/gregjones/httpcache/httpcache.go b/vendor/github.com/gregjones/httpcache/httpcache.go deleted file mode 100644 index 8239edc..0000000 --- a/vendor/github.com/gregjones/httpcache/httpcache.go +++ /dev/null @@ -1,553 +0,0 @@ -// Package httpcache provides a http.RoundTripper implementation that works as a -// mostly RFC-compliant cache for http responses. -// -// It is only suitable for use as a 'private' cache (i.e. for a web-browser or an API-client -// and not for a shared proxy). -// -package httpcache - -import ( - "bufio" - "bytes" - "errors" - "fmt" - "io" - "io/ioutil" - "net/http" - "net/http/httputil" - "strings" - "sync" - "time" -) - -const ( - stale = iota - fresh - transparent - // XFromCache is the header added to responses that are returned from the cache - XFromCache = "X-From-Cache" -) - -// A Cache interface is used by the Transport to store and retrieve responses. -type Cache interface { - // Get returns the []byte representation of a cached response and a bool - // set to true if the value isn't empty - Get(key string) (responseBytes []byte, ok bool) - // Set stores the []byte representation of a response against a key - Set(key string, responseBytes []byte) - // Delete removes the value associated with the key - Delete(key string) -} - -// cacheKey returns the cache key for req. -func cacheKey(req *http.Request) string { - return req.URL.String() -} - -// CachedResponse returns the cached http.Response for req if present, and nil -// otherwise. -func CachedResponse(c Cache, req *http.Request) (resp *http.Response, err error) { - cachedVal, ok := c.Get(cacheKey(req)) - if !ok { - return - } - - b := bytes.NewBuffer(cachedVal) - return http.ReadResponse(bufio.NewReader(b), req) -} - -// MemoryCache is an implemtation of Cache that stores responses in an in-memory map. -type MemoryCache struct { - mu sync.RWMutex - items map[string][]byte -} - -// Get returns the []byte representation of the response and true if present, false if not -func (c *MemoryCache) Get(key string) (resp []byte, ok bool) { - c.mu.RLock() - resp, ok = c.items[key] - c.mu.RUnlock() - return resp, ok -} - -// Set saves response resp to the cache with key -func (c *MemoryCache) Set(key string, resp []byte) { - c.mu.Lock() - c.items[key] = resp - c.mu.Unlock() -} - -// Delete removes key from the cache -func (c *MemoryCache) Delete(key string) { - c.mu.Lock() - delete(c.items, key) - c.mu.Unlock() -} - -// NewMemoryCache returns a new Cache that will store items in an in-memory map -func NewMemoryCache() *MemoryCache { - c := &MemoryCache{items: map[string][]byte{}} - return c -} - -// Transport is an implementation of http.RoundTripper that will return values from a cache -// where possible (avoiding a network request) and will additionally add validators (etag/if-modified-since) -// to repeated requests allowing servers to return 304 / Not Modified -type Transport struct { - // The RoundTripper interface actually used to make requests - // If nil, http.DefaultTransport is used - Transport http.RoundTripper - Cache Cache - // If true, responses returned from the cache will be given an extra header, X-From-Cache - MarkCachedResponses bool -} - -// NewTransport returns a new Transport with the -// provided Cache implementation and MarkCachedResponses set to true -func NewTransport(c Cache) *Transport { - return &Transport{Cache: c, MarkCachedResponses: true} -} - -// Client returns an *http.Client that caches responses. -func (t *Transport) Client() *http.Client { - return &http.Client{Transport: t} -} - -// varyMatches will return false unless all of the cached values for the headers listed in Vary -// match the new request -func varyMatches(cachedResp *http.Response, req *http.Request) bool { - for _, header := range headerAllCommaSepValues(cachedResp.Header, "vary") { - header = http.CanonicalHeaderKey(header) - if header != "" && req.Header.Get(header) != cachedResp.Header.Get("X-Varied-"+header) { - return false - } - } - return true -} - -// RoundTrip takes a Request and returns a Response -// -// If there is a fresh Response already in cache, then it will be returned without connecting to -// the server. -// -// If there is a stale Response, then any validators it contains will be set on the new request -// to give the server a chance to respond with NotModified. If this happens, then the cached Response -// will be returned. -func (t *Transport) RoundTrip(req *http.Request) (resp *http.Response, err error) { - cacheKey := cacheKey(req) - cacheable := (req.Method == "GET" || req.Method == "HEAD") && req.Header.Get("range") == "" - var cachedResp *http.Response - if cacheable { - cachedResp, err = CachedResponse(t.Cache, req) - } else { - // Need to invalidate an existing value - t.Cache.Delete(cacheKey) - } - - transport := t.Transport - if transport == nil { - transport = http.DefaultTransport - } - - if cacheable && cachedResp != nil && err == nil { - if t.MarkCachedResponses { - cachedResp.Header.Set(XFromCache, "1") - } - - if varyMatches(cachedResp, req) { - // Can only use cached value if the new request doesn't Vary significantly - freshness := getFreshness(cachedResp.Header, req.Header) - if freshness == fresh { - return cachedResp, nil - } - - if freshness == stale { - var req2 *http.Request - // Add validators if caller hasn't already done so - etag := cachedResp.Header.Get("etag") - if etag != "" && req.Header.Get("etag") == "" { - req2 = cloneRequest(req) - req2.Header.Set("if-none-match", etag) - } - lastModified := cachedResp.Header.Get("last-modified") - if lastModified != "" && req.Header.Get("last-modified") == "" { - if req2 == nil { - req2 = cloneRequest(req) - } - req2.Header.Set("if-modified-since", lastModified) - } - if req2 != nil { - req = req2 - } - } - } - - resp, err = transport.RoundTrip(req) - if err == nil && req.Method == "GET" && resp.StatusCode == http.StatusNotModified { - // Replace the 304 response with the one from cache, but update with some new headers - endToEndHeaders := getEndToEndHeaders(resp.Header) - for _, header := range endToEndHeaders { - cachedResp.Header[header] = resp.Header[header] - } - cachedResp.Status = fmt.Sprintf("%d %s", http.StatusOK, http.StatusText(http.StatusOK)) - cachedResp.StatusCode = http.StatusOK - - resp = cachedResp - } else if (err != nil || (cachedResp != nil && resp.StatusCode >= 500)) && - req.Method == "GET" && canStaleOnError(cachedResp.Header, req.Header) { - // In case of transport failure and stale-if-error activated, returns cached content - // when available - cachedResp.Status = fmt.Sprintf("%d %s", http.StatusOK, http.StatusText(http.StatusOK)) - cachedResp.StatusCode = http.StatusOK - return cachedResp, nil - } else { - if err != nil || resp.StatusCode != http.StatusOK { - t.Cache.Delete(cacheKey) - } - if err != nil { - return nil, err - } - } - } else { - reqCacheControl := parseCacheControl(req.Header) - if _, ok := reqCacheControl["only-if-cached"]; ok { - resp = newGatewayTimeoutResponse(req) - } else { - resp, err = transport.RoundTrip(req) - if err != nil { - return nil, err - } - } - } - - if cacheable && canStore(parseCacheControl(req.Header), parseCacheControl(resp.Header)) { - for _, varyKey := range headerAllCommaSepValues(resp.Header, "vary") { - varyKey = http.CanonicalHeaderKey(varyKey) - fakeHeader := "X-Varied-" + varyKey - reqValue := req.Header.Get(varyKey) - if reqValue != "" { - resp.Header.Set(fakeHeader, reqValue) - } - } - switch req.Method { - case "GET": - // Delay caching until EOF is reached. - resp.Body = &cachingReadCloser{ - R: resp.Body, - OnEOF: func(r io.Reader) { - resp := *resp - resp.Body = ioutil.NopCloser(r) - respBytes, err := httputil.DumpResponse(&resp, true) - if err == nil { - t.Cache.Set(cacheKey, respBytes) - } - }, - } - default: - respBytes, err := httputil.DumpResponse(resp, true) - if err == nil { - t.Cache.Set(cacheKey, respBytes) - } - } - } else { - t.Cache.Delete(cacheKey) - } - return resp, nil -} - -// ErrNoDateHeader indicates that the HTTP headers contained no Date header. -var ErrNoDateHeader = errors.New("no Date header") - -// Date parses and returns the value of the Date header. -func Date(respHeaders http.Header) (date time.Time, err error) { - dateHeader := respHeaders.Get("date") - if dateHeader == "" { - err = ErrNoDateHeader - return - } - - return time.Parse(time.RFC1123, dateHeader) -} - -type realClock struct{} - -func (c *realClock) since(d time.Time) time.Duration { - return time.Since(d) -} - -type timer interface { - since(d time.Time) time.Duration -} - -var clock timer = &realClock{} - -// getFreshness will return one of fresh/stale/transparent based on the cache-control -// values of the request and the response -// -// fresh indicates the response can be returned -// stale indicates that the response needs validating before it is returned -// transparent indicates the response should not be used to fulfil the request -// -// Because this is only a private cache, 'public' and 'private' in cache-control aren't -// signficant. Similarly, smax-age isn't used. -func getFreshness(respHeaders, reqHeaders http.Header) (freshness int) { - respCacheControl := parseCacheControl(respHeaders) - reqCacheControl := parseCacheControl(reqHeaders) - if _, ok := reqCacheControl["no-cache"]; ok { - return transparent - } - if _, ok := respCacheControl["no-cache"]; ok { - return stale - } - if _, ok := reqCacheControl["only-if-cached"]; ok { - return fresh - } - - date, err := Date(respHeaders) - if err != nil { - return stale - } - currentAge := clock.since(date) - - var lifetime time.Duration - var zeroDuration time.Duration - - // If a response includes both an Expires header and a max-age directive, - // the max-age directive overrides the Expires header, even if the Expires header is more restrictive. - if maxAge, ok := respCacheControl["max-age"]; ok { - lifetime, err = time.ParseDuration(maxAge + "s") - if err != nil { - lifetime = zeroDuration - } - } else { - expiresHeader := respHeaders.Get("Expires") - if expiresHeader != "" { - expires, err := time.Parse(time.RFC1123, expiresHeader) - if err != nil { - lifetime = zeroDuration - } else { - lifetime = expires.Sub(date) - } - } - } - - if maxAge, ok := reqCacheControl["max-age"]; ok { - // the client is willing to accept a response whose age is no greater than the specified time in seconds - lifetime, err = time.ParseDuration(maxAge + "s") - if err != nil { - lifetime = zeroDuration - } - } - if minfresh, ok := reqCacheControl["min-fresh"]; ok { - // the client wants a response that will still be fresh for at least the specified number of seconds. - minfreshDuration, err := time.ParseDuration(minfresh + "s") - if err == nil { - currentAge = time.Duration(currentAge + minfreshDuration) - } - } - - if maxstale, ok := reqCacheControl["max-stale"]; ok { - // Indicates that the client is willing to accept a response that has exceeded its expiration time. - // If max-stale is assigned a value, then the client is willing to accept a response that has exceeded - // its expiration time by no more than the specified number of seconds. - // If no value is assigned to max-stale, then the client is willing to accept a stale response of any age. - // - // Responses served only because of a max-stale value are supposed to have a Warning header added to them, - // but that seems like a hassle, and is it actually useful? If so, then there needs to be a different - // return-value available here. - if maxstale == "" { - return fresh - } - maxstaleDuration, err := time.ParseDuration(maxstale + "s") - if err == nil { - currentAge = time.Duration(currentAge - maxstaleDuration) - } - } - - if lifetime > currentAge { - return fresh - } - - return stale -} - -// Returns true if either the request or the response includes the stale-if-error -// cache control extension: https://tools.ietf.org/html/rfc5861 -func canStaleOnError(respHeaders, reqHeaders http.Header) bool { - respCacheControl := parseCacheControl(respHeaders) - reqCacheControl := parseCacheControl(reqHeaders) - - var err error - lifetime := time.Duration(-1) - - if staleMaxAge, ok := respCacheControl["stale-if-error"]; ok { - if staleMaxAge != "" { - lifetime, err = time.ParseDuration(staleMaxAge + "s") - if err != nil { - return false - } - } else { - return true - } - } - if staleMaxAge, ok := reqCacheControl["stale-if-error"]; ok { - if staleMaxAge != "" { - lifetime, err = time.ParseDuration(staleMaxAge + "s") - if err != nil { - return false - } - } else { - return true - } - } - - if lifetime >= 0 { - date, err := Date(respHeaders) - if err != nil { - return false - } - currentAge := clock.since(date) - if lifetime > currentAge { - return true - } - } - - return false -} - -func getEndToEndHeaders(respHeaders http.Header) []string { - // These headers are always hop-by-hop - hopByHopHeaders := map[string]struct{}{ - "Connection": struct{}{}, - "Keep-Alive": struct{}{}, - "Proxy-Authenticate": struct{}{}, - "Proxy-Authorization": struct{}{}, - "Te": struct{}{}, - "Trailers": struct{}{}, - "Transfer-Encoding": struct{}{}, - "Upgrade": struct{}{}, - } - - for _, extra := range strings.Split(respHeaders.Get("connection"), ",") { - // any header listed in connection, if present, is also considered hop-by-hop - if strings.Trim(extra, " ") != "" { - hopByHopHeaders[http.CanonicalHeaderKey(extra)] = struct{}{} - } - } - endToEndHeaders := []string{} - for respHeader, _ := range respHeaders { - if _, ok := hopByHopHeaders[respHeader]; !ok { - endToEndHeaders = append(endToEndHeaders, respHeader) - } - } - return endToEndHeaders -} - -func canStore(reqCacheControl, respCacheControl cacheControl) (canStore bool) { - if _, ok := respCacheControl["no-store"]; ok { - return false - } - if _, ok := reqCacheControl["no-store"]; ok { - return false - } - return true -} - -func newGatewayTimeoutResponse(req *http.Request) *http.Response { - var braw bytes.Buffer - braw.WriteString("HTTP/1.1 504 Gateway Timeout\r\n\r\n") - resp, err := http.ReadResponse(bufio.NewReader(&braw), req) - if err != nil { - panic(err) - } - return resp -} - -// cloneRequest returns a clone of the provided *http.Request. -// The clone is a shallow copy of the struct and its Header map. -// (This function copyright goauth2 authors: https://code.google.com/p/goauth2) -func cloneRequest(r *http.Request) *http.Request { - // shallow copy of the struct - r2 := new(http.Request) - *r2 = *r - // deep copy of the Header - r2.Header = make(http.Header) - for k, s := range r.Header { - r2.Header[k] = s - } - return r2 -} - -type cacheControl map[string]string - -func parseCacheControl(headers http.Header) cacheControl { - cc := cacheControl{} - ccHeader := headers.Get("Cache-Control") - for _, part := range strings.Split(ccHeader, ",") { - part = strings.Trim(part, " ") - if part == "" { - continue - } - if strings.ContainsRune(part, '=') { - keyval := strings.Split(part, "=") - cc[strings.Trim(keyval[0], " ")] = strings.Trim(keyval[1], ",") - } else { - cc[part] = "" - } - } - return cc -} - -// headerAllCommaSepValues returns all comma-separated values (each -// with whitespace trimmed) for header name in headers. According to -// Section 4.2 of the HTTP/1.1 spec -// (http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html#sec4.2), -// values from multiple occurrences of a header should be concatenated, if -// the header's value is a comma-separated list. -func headerAllCommaSepValues(headers http.Header, name string) []string { - var vals []string - for _, val := range headers[http.CanonicalHeaderKey(name)] { - fields := strings.Split(val, ",") - for i, f := range fields { - fields[i] = strings.TrimSpace(f) - } - vals = append(vals, fields...) - } - return vals -} - -// cachingReadCloser is a wrapper around ReadCloser R that calls OnEOF -// handler with a full copy of the content read from R when EOF is -// reached. -type cachingReadCloser struct { - // Underlying ReadCloser. - R io.ReadCloser - // OnEOF is called with a copy of the content of R when EOF is reached. - OnEOF func(io.Reader) - - buf bytes.Buffer // buf stores a copy of the content of R. -} - -// Read reads the next len(p) bytes from R or until R is drained. The -// return value n is the number of bytes read. If R has no data to -// return, err is io.EOF and OnEOF is called with a full copy of what -// has been read so far. -func (r *cachingReadCloser) Read(p []byte) (n int, err error) { - n, err = r.R.Read(p) - r.buf.Write(p[:n]) - if err == io.EOF { - r.OnEOF(bytes.NewReader(r.buf.Bytes())) - } - return n, err -} - -func (r *cachingReadCloser) Close() error { - return r.R.Close() -} - -// NewMemoryCacheTransport returns a new Transport using the in-memory cache implementation -func NewMemoryCacheTransport() *Transport { - c := NewMemoryCache() - t := NewTransport(c) - return t -} diff --git a/vendor/github.com/hashicorp/hcl/.gitignore b/vendor/github.com/hashicorp/hcl/.gitignore deleted file mode 100644 index 15586a2..0000000 --- a/vendor/github.com/hashicorp/hcl/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -y.output - -# ignore intellij files -.idea -*.iml -*.ipr -*.iws - -*.test diff --git a/vendor/github.com/hashicorp/hcl/.travis.yml b/vendor/github.com/hashicorp/hcl/.travis.yml deleted file mode 100644 index cb63a32..0000000 --- a/vendor/github.com/hashicorp/hcl/.travis.yml +++ /dev/null @@ -1,13 +0,0 @@ -sudo: false - -language: go - -go: - - 1.x - - tip - -branches: - only: - - master - -script: make test diff --git a/vendor/github.com/hashicorp/hcl/LICENSE b/vendor/github.com/hashicorp/hcl/LICENSE deleted file mode 100644 index c33dcc7..0000000 --- a/vendor/github.com/hashicorp/hcl/LICENSE +++ /dev/null @@ -1,354 +0,0 @@ -Mozilla Public License, version 2.0 - -1. Definitions - -1.1. “Contributor” - - means each individual or legal entity that creates, contributes to the - creation of, or owns Covered Software. - -1.2. “Contributor Version” - - means the combination of the Contributions of others (if any) used by a - Contributor and that particular Contributor’s Contribution. - -1.3. “Contribution” - - means Covered Software of a particular Contributor. - -1.4. “Covered Software” - - means Source Code Form to which the initial Contributor has attached the - notice in Exhibit A, the Executable Form of such Source Code Form, and - Modifications of such Source Code Form, in each case including portions - thereof. - -1.5. “Incompatible With Secondary Licenses” - means - - a. that the initial Contributor has attached the notice described in - Exhibit B to the Covered Software; or - - b. that the Covered Software was made available under the terms of version - 1.1 or earlier of the License, but not also under the terms of a - Secondary License. - -1.6. “Executable Form” - - means any form of the work other than Source Code Form. - -1.7. “Larger Work” - - means a work that combines Covered Software with other material, in a separate - file or files, that is not Covered Software. - -1.8. “License” - - means this document. - -1.9. “Licensable” - - means having the right to grant, to the maximum extent possible, whether at the - time of the initial grant or subsequently, any and all of the rights conveyed by - this License. - -1.10. “Modifications” - - means any of the following: - - a. any file in Source Code Form that results from an addition to, deletion - from, or modification of the contents of Covered Software; or - - b. any new file in Source Code Form that contains any Covered Software. - -1.11. “Patent Claims” of a Contributor - - means any patent claim(s), including without limitation, method, process, - and apparatus claims, in any patent Licensable by such Contributor that - would be infringed, but for the grant of the License, by the making, - using, selling, offering for sale, having made, import, or transfer of - either its Contributions or its Contributor Version. - -1.12. “Secondary License” - - means either the GNU General Public License, Version 2.0, the GNU Lesser - General Public License, Version 2.1, the GNU Affero General Public - License, Version 3.0, or any later versions of those licenses. - -1.13. “Source Code Form” - - means the form of the work preferred for making modifications. - -1.14. “You” (or “Your”) - - means an individual or a legal entity exercising rights under this - License. For legal entities, “You” includes any entity that controls, is - controlled by, or is under common control with You. For purposes of this - definition, “control” means (a) the power, direct or indirect, to cause - the direction or management of such entity, whether by contract or - otherwise, or (b) ownership of more than fifty percent (50%) of the - outstanding shares or beneficial ownership of such entity. - - -2. License Grants and Conditions - -2.1. Grants - - Each Contributor hereby grants You a world-wide, royalty-free, - non-exclusive license: - - a. under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or as - part of a Larger Work; and - - b. under Patent Claims of such Contributor to make, use, sell, offer for - sale, have made, import, and otherwise transfer either its Contributions - or its Contributor Version. - -2.2. Effective Date - - The licenses granted in Section 2.1 with respect to any Contribution become - effective for each Contribution on the date the Contributor first distributes - such Contribution. - -2.3. Limitations on Grant Scope - - The licenses granted in this Section 2 are the only rights granted under this - License. No additional rights or licenses will be implied from the distribution - or licensing of Covered Software under this License. Notwithstanding Section - 2.1(b) above, no patent license is granted by a Contributor: - - a. for any code that a Contributor has removed from Covered Software; or - - b. for infringements caused by: (i) Your and any other third party’s - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - - c. under Patent Claims infringed by Covered Software in the absence of its - Contributions. - - This License does not grant any rights in the trademarks, service marks, or - logos of any Contributor (except as may be necessary to comply with the - notice requirements in Section 3.4). - -2.4. Subsequent Licenses - - No Contributor makes additional grants as a result of Your choice to - distribute the Covered Software under a subsequent version of this License - (see Section 10.2) or under the terms of a Secondary License (if permitted - under the terms of Section 3.3). - -2.5. Representation - - Each Contributor represents that the Contributor believes its Contributions - are its original creation(s) or it has sufficient rights to grant the - rights to its Contributions conveyed by this License. - -2.6. Fair Use - - This License is not intended to limit any rights You have under applicable - copyright doctrines of fair use, fair dealing, or other equivalents. - -2.7. Conditions - - Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in - Section 2.1. - - -3. Responsibilities - -3.1. Distribution of Source Form - - All distribution of Covered Software in Source Code Form, including any - Modifications that You create or to which You contribute, must be under the - terms of this License. You must inform recipients that the Source Code Form - of the Covered Software is governed by the terms of this License, and how - they can obtain a copy of this License. You may not attempt to alter or - restrict the recipients’ rights in the Source Code Form. - -3.2. Distribution of Executable Form - - If You distribute Covered Software in Executable Form then: - - a. such Covered Software must also be made available in Source Code Form, - as described in Section 3.1, and You must inform recipients of the - Executable Form how they can obtain a copy of such Source Code Form by - reasonable means in a timely manner, at a charge no more than the cost - of distribution to the recipient; and - - b. You may distribute such Executable Form under the terms of this License, - or sublicense it under different terms, provided that the license for - the Executable Form does not attempt to limit or alter the recipients’ - rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - - You may create and distribute a Larger Work under terms of Your choice, - provided that You also comply with the requirements of this License for the - Covered Software. If the Larger Work is a combination of Covered Software - with a work governed by one or more Secondary Licenses, and the Covered - Software is not Incompatible With Secondary Licenses, this License permits - You to additionally distribute such Covered Software under the terms of - such Secondary License(s), so that the recipient of the Larger Work may, at - their option, further distribute the Covered Software under the terms of - either this License or such Secondary License(s). - -3.4. Notices - - You may not remove or alter the substance of any license notices (including - copyright notices, patent notices, disclaimers of warranty, or limitations - of liability) contained within the Source Code Form of the Covered - Software, except that You may alter any license notices to the extent - required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - - You may choose to offer, and to charge a fee for, warranty, support, - indemnity or liability obligations to one or more recipients of Covered - Software. However, You may do so only on Your own behalf, and not on behalf - of any Contributor. You must make it absolutely clear that any such - warranty, support, indemnity, or liability obligation is offered by You - alone, and You hereby agree to indemnify every Contributor for any - liability incurred by such Contributor as a result of warranty, support, - indemnity or liability terms You offer. You may include additional - disclaimers of warranty and limitations of liability specific to any - jurisdiction. - -4. Inability to Comply Due to Statute or Regulation - - If it is impossible for You to comply with any of the terms of this License - with respect to some or all of the Covered Software due to statute, judicial - order, or regulation then You must: (a) comply with the terms of this License - to the maximum extent possible; and (b) describe the limitations and the code - they affect. Such description must be placed in a text file included with all - distributions of the Covered Software under this License. Except to the - extent prohibited by statute or regulation, such description must be - sufficiently detailed for a recipient of ordinary skill to be able to - understand it. - -5. Termination - -5.1. The rights granted under this License will terminate automatically if You - fail to comply with any of its terms. However, if You become compliant, - then the rights granted under this License from a particular Contributor - are reinstated (a) provisionally, unless and until such Contributor - explicitly and finally terminates Your grants, and (b) on an ongoing basis, - if such Contributor fails to notify You of the non-compliance by some - reasonable means prior to 60 days after You have come back into compliance. - Moreover, Your grants from a particular Contributor are reinstated on an - ongoing basis if such Contributor notifies You of the non-compliance by - some reasonable means, this is the first time You have received notice of - non-compliance with this License from such Contributor, and You become - compliant prior to 30 days after Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent - infringement claim (excluding declaratory judgment actions, counter-claims, - and cross-claims) alleging that a Contributor Version directly or - indirectly infringes any patent, then the rights granted to You by any and - all Contributors for the Covered Software under Section 2.1 of this License - shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user - license agreements (excluding distributors and resellers) which have been - validly granted by You or Your distributors under this License prior to - termination shall survive termination. - -6. Disclaimer of Warranty - - Covered Software is provided under this License on an “as is” basis, without - warranty of any kind, either expressed, implied, or statutory, including, - without limitation, warranties that the Covered Software is free of defects, - merchantable, fit for a particular purpose or non-infringing. The entire - risk as to the quality and performance of the Covered Software is with You. - Should any Covered Software prove defective in any respect, You (not any - Contributor) assume the cost of any necessary servicing, repair, or - correction. This disclaimer of warranty constitutes an essential part of this - License. No use of any Covered Software is authorized under this License - except under this disclaimer. - -7. Limitation of Liability - - Under no circumstances and under no legal theory, whether tort (including - negligence), contract, or otherwise, shall any Contributor, or anyone who - distributes Covered Software as permitted above, be liable to You for any - direct, indirect, special, incidental, or consequential damages of any - character including, without limitation, damages for lost profits, loss of - goodwill, work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses, even if such party shall have been - informed of the possibility of such damages. This limitation of liability - shall not apply to liability for death or personal injury resulting from such - party’s negligence to the extent applicable law prohibits such limitation. - Some jurisdictions do not allow the exclusion or limitation of incidental or - consequential damages, so this exclusion and limitation may not apply to You. - -8. Litigation - - Any litigation relating to this License may be brought only in the courts of - a jurisdiction where the defendant maintains its principal place of business - and such litigation shall be governed by laws of that jurisdiction, without - reference to its conflict-of-law provisions. Nothing in this Section shall - prevent a party’s ability to bring cross-claims or counter-claims. - -9. Miscellaneous - - This License represents the complete agreement concerning the subject matter - hereof. If any provision of this License is held to be unenforceable, such - provision shall be reformed only to the extent necessary to make it - enforceable. Any law or regulation which provides that the language of a - contract shall be construed against the drafter shall not be used to construe - this License against a Contributor. - - -10. Versions of the License - -10.1. New Versions - - Mozilla Foundation is the license steward. Except as provided in Section - 10.3, no one other than the license steward has the right to modify or - publish new versions of this License. Each version will be given a - distinguishing version number. - -10.2. Effect of New Versions - - You may distribute the Covered Software under the terms of the version of - the License under which You originally received the Covered Software, or - under the terms of any subsequent version published by the license - steward. - -10.3. Modified Versions - - If you create software not governed by this License, and you want to - create a new license for such software, you may create and use a modified - version of this License if you rename the license and remove any - references to the name of the license steward (except to note that such - modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary Licenses - If You choose to distribute Source Code Form that is Incompatible With - Secondary Licenses under the terms of this version of the License, the - notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice - - This Source Code Form is subject to the - terms of the Mozilla Public License, v. - 2.0. If a copy of the MPL was not - distributed with this file, You can - obtain one at - http://mozilla.org/MPL/2.0/. - -If it is not possible or desirable to put the notice in a particular file, then -You may include the notice in a location (such as a LICENSE file in a relevant -directory) where a recipient would be likely to look for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - “Incompatible With Secondary Licenses” Notice - - This Source Code Form is “Incompatible - With Secondary Licenses”, as defined by - the Mozilla Public License, v. 2.0. - diff --git a/vendor/github.com/hashicorp/hcl/Makefile b/vendor/github.com/hashicorp/hcl/Makefile deleted file mode 100644 index 84fd743..0000000 --- a/vendor/github.com/hashicorp/hcl/Makefile +++ /dev/null @@ -1,18 +0,0 @@ -TEST?=./... - -default: test - -fmt: generate - go fmt ./... - -test: generate - go get -t ./... - go test $(TEST) $(TESTARGS) - -generate: - go generate ./... - -updatedeps: - go get -u golang.org/x/tools/cmd/stringer - -.PHONY: default generate test updatedeps diff --git a/vendor/github.com/hashicorp/hcl/README.md b/vendor/github.com/hashicorp/hcl/README.md deleted file mode 100644 index c822332..0000000 --- a/vendor/github.com/hashicorp/hcl/README.md +++ /dev/null @@ -1,125 +0,0 @@ -# HCL - -[![GoDoc](https://godoc.org/github.com/hashicorp/hcl?status.png)](https://godoc.org/github.com/hashicorp/hcl) [![Build Status](https://travis-ci.org/hashicorp/hcl.svg?branch=master)](https://travis-ci.org/hashicorp/hcl) - -HCL (HashiCorp Configuration Language) is a configuration language built -by HashiCorp. The goal of HCL is to build a structured configuration language -that is both human and machine friendly for use with command-line tools, but -specifically targeted towards DevOps tools, servers, etc. - -HCL is also fully JSON compatible. That is, JSON can be used as completely -valid input to a system expecting HCL. This helps makes systems -interoperable with other systems. - -HCL is heavily inspired by -[libucl](https://github.com/vstakhov/libucl), -nginx configuration, and others similar. - -## Why? - -A common question when viewing HCL is to ask the question: why not -JSON, YAML, etc.? - -Prior to HCL, the tools we built at [HashiCorp](http://www.hashicorp.com) -used a variety of configuration languages from full programming languages -such as Ruby to complete data structure languages such as JSON. What we -learned is that some people wanted human-friendly configuration languages -and some people wanted machine-friendly languages. - -JSON fits a nice balance in this, but is fairly verbose and most -importantly doesn't support comments. With YAML, we found that beginners -had a really hard time determining what the actual structure was, and -ended up guessing more often than not whether to use a hyphen, colon, etc. -in order to represent some configuration key. - -Full programming languages such as Ruby enable complex behavior -a configuration language shouldn't usually allow, and also forces -people to learn some set of Ruby. - -Because of this, we decided to create our own configuration language -that is JSON-compatible. Our configuration language (HCL) is designed -to be written and modified by humans. The API for HCL allows JSON -as an input so that it is also machine-friendly (machines can generate -JSON instead of trying to generate HCL). - -Our goal with HCL is not to alienate other configuration languages. -It is instead to provide HCL as a specialized language for our tools, -and JSON as the interoperability layer. - -## Syntax - -For a complete grammar, please see the parser itself. A high-level overview -of the syntax and grammar is listed here. - - * Single line comments start with `#` or `//` - - * Multi-line comments are wrapped in `/*` and `*/`. Nested block comments - are not allowed. A multi-line comment (also known as a block comment) - terminates at the first `*/` found. - - * Values are assigned with the syntax `key = value` (whitespace doesn't - matter). The value can be any primitive: a string, number, boolean, - object, or list. - - * Strings are double-quoted and can contain any UTF-8 characters. - Example: `"Hello, World"` - - * Multi-line strings start with `<- - echo %Path% - - go version - - go env - - go get -t ./... - -build_script: -- cmd: go test -v ./... diff --git a/vendor/github.com/hashicorp/hcl/decoder.go b/vendor/github.com/hashicorp/hcl/decoder.go deleted file mode 100644 index bed9ebb..0000000 --- a/vendor/github.com/hashicorp/hcl/decoder.go +++ /dev/null @@ -1,729 +0,0 @@ -package hcl - -import ( - "errors" - "fmt" - "reflect" - "sort" - "strconv" - "strings" - - "github.com/hashicorp/hcl/hcl/ast" - "github.com/hashicorp/hcl/hcl/parser" - "github.com/hashicorp/hcl/hcl/token" -) - -// This is the tag to use with structures to have settings for HCL -const tagName = "hcl" - -var ( - // nodeType holds a reference to the type of ast.Node - nodeType reflect.Type = findNodeType() -) - -// Unmarshal accepts a byte slice as input and writes the -// data to the value pointed to by v. -func Unmarshal(bs []byte, v interface{}) error { - root, err := parse(bs) - if err != nil { - return err - } - - return DecodeObject(v, root) -} - -// Decode reads the given input and decodes it into the structure -// given by `out`. -func Decode(out interface{}, in string) error { - obj, err := Parse(in) - if err != nil { - return err - } - - return DecodeObject(out, obj) -} - -// DecodeObject is a lower-level version of Decode. It decodes a -// raw Object into the given output. -func DecodeObject(out interface{}, n ast.Node) error { - val := reflect.ValueOf(out) - if val.Kind() != reflect.Ptr { - return errors.New("result must be a pointer") - } - - // If we have the file, we really decode the root node - if f, ok := n.(*ast.File); ok { - n = f.Node - } - - var d decoder - return d.decode("root", n, val.Elem()) -} - -type decoder struct { - stack []reflect.Kind -} - -func (d *decoder) decode(name string, node ast.Node, result reflect.Value) error { - k := result - - // If we have an interface with a valid value, we use that - // for the check. - if result.Kind() == reflect.Interface { - elem := result.Elem() - if elem.IsValid() { - k = elem - } - } - - // Push current onto stack unless it is an interface. - if k.Kind() != reflect.Interface { - d.stack = append(d.stack, k.Kind()) - - // Schedule a pop - defer func() { - d.stack = d.stack[:len(d.stack)-1] - }() - } - - switch k.Kind() { - case reflect.Bool: - return d.decodeBool(name, node, result) - case reflect.Float32, reflect.Float64: - return d.decodeFloat(name, node, result) - case reflect.Int, reflect.Int32, reflect.Int64: - return d.decodeInt(name, node, result) - case reflect.Interface: - // When we see an interface, we make our own thing - return d.decodeInterface(name, node, result) - case reflect.Map: - return d.decodeMap(name, node, result) - case reflect.Ptr: - return d.decodePtr(name, node, result) - case reflect.Slice: - return d.decodeSlice(name, node, result) - case reflect.String: - return d.decodeString(name, node, result) - case reflect.Struct: - return d.decodeStruct(name, node, result) - default: - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: unknown kind to decode into: %s", name, k.Kind()), - } - } -} - -func (d *decoder) decodeBool(name string, node ast.Node, result reflect.Value) error { - switch n := node.(type) { - case *ast.LiteralType: - if n.Token.Type == token.BOOL { - v, err := strconv.ParseBool(n.Token.Text) - if err != nil { - return err - } - - result.Set(reflect.ValueOf(v)) - return nil - } - } - - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: unknown type %T", name, node), - } -} - -func (d *decoder) decodeFloat(name string, node ast.Node, result reflect.Value) error { - switch n := node.(type) { - case *ast.LiteralType: - if n.Token.Type == token.FLOAT || n.Token.Type == token.NUMBER { - v, err := strconv.ParseFloat(n.Token.Text, 64) - if err != nil { - return err - } - - result.Set(reflect.ValueOf(v).Convert(result.Type())) - return nil - } - } - - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: unknown type %T", name, node), - } -} - -func (d *decoder) decodeInt(name string, node ast.Node, result reflect.Value) error { - switch n := node.(type) { - case *ast.LiteralType: - switch n.Token.Type { - case token.NUMBER: - v, err := strconv.ParseInt(n.Token.Text, 0, 0) - if err != nil { - return err - } - - if result.Kind() == reflect.Interface { - result.Set(reflect.ValueOf(int(v))) - } else { - result.SetInt(v) - } - return nil - case token.STRING: - v, err := strconv.ParseInt(n.Token.Value().(string), 0, 0) - if err != nil { - return err - } - - if result.Kind() == reflect.Interface { - result.Set(reflect.ValueOf(int(v))) - } else { - result.SetInt(v) - } - return nil - } - } - - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: unknown type %T", name, node), - } -} - -func (d *decoder) decodeInterface(name string, node ast.Node, result reflect.Value) error { - // When we see an ast.Node, we retain the value to enable deferred decoding. - // Very useful in situations where we want to preserve ast.Node information - // like Pos - if result.Type() == nodeType && result.CanSet() { - result.Set(reflect.ValueOf(node)) - return nil - } - - var set reflect.Value - redecode := true - - // For testing types, ObjectType should just be treated as a list. We - // set this to a temporary var because we want to pass in the real node. - testNode := node - if ot, ok := node.(*ast.ObjectType); ok { - testNode = ot.List - } - - switch n := testNode.(type) { - case *ast.ObjectList: - // If we're at the root or we're directly within a slice, then we - // decode objects into map[string]interface{}, otherwise we decode - // them into lists. - if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { - var temp map[string]interface{} - tempVal := reflect.ValueOf(temp) - result := reflect.MakeMap( - reflect.MapOf( - reflect.TypeOf(""), - tempVal.Type().Elem())) - - set = result - } else { - var temp []map[string]interface{} - tempVal := reflect.ValueOf(temp) - result := reflect.MakeSlice( - reflect.SliceOf(tempVal.Type().Elem()), 0, len(n.Items)) - set = result - } - case *ast.ObjectType: - // If we're at the root or we're directly within a slice, then we - // decode objects into map[string]interface{}, otherwise we decode - // them into lists. - if len(d.stack) == 0 || d.stack[len(d.stack)-1] == reflect.Slice { - var temp map[string]interface{} - tempVal := reflect.ValueOf(temp) - result := reflect.MakeMap( - reflect.MapOf( - reflect.TypeOf(""), - tempVal.Type().Elem())) - - set = result - } else { - var temp []map[string]interface{} - tempVal := reflect.ValueOf(temp) - result := reflect.MakeSlice( - reflect.SliceOf(tempVal.Type().Elem()), 0, 1) - set = result - } - case *ast.ListType: - var temp []interface{} - tempVal := reflect.ValueOf(temp) - result := reflect.MakeSlice( - reflect.SliceOf(tempVal.Type().Elem()), 0, 0) - set = result - case *ast.LiteralType: - switch n.Token.Type { - case token.BOOL: - var result bool - set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) - case token.FLOAT: - var result float64 - set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) - case token.NUMBER: - var result int - set = reflect.Indirect(reflect.New(reflect.TypeOf(result))) - case token.STRING, token.HEREDOC: - set = reflect.Indirect(reflect.New(reflect.TypeOf(""))) - default: - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: cannot decode into interface: %T", name, node), - } - } - default: - return fmt.Errorf( - "%s: cannot decode into interface: %T", - name, node) - } - - // Set the result to what its supposed to be, then reset - // result so we don't reflect into this method anymore. - result.Set(set) - - if redecode { - // Revisit the node so that we can use the newly instantiated - // thing and populate it. - if err := d.decode(name, node, result); err != nil { - return err - } - } - - return nil -} - -func (d *decoder) decodeMap(name string, node ast.Node, result reflect.Value) error { - if item, ok := node.(*ast.ObjectItem); ok { - node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} - } - - if ot, ok := node.(*ast.ObjectType); ok { - node = ot.List - } - - n, ok := node.(*ast.ObjectList) - if !ok { - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: not an object type for map (%T)", name, node), - } - } - - // If we have an interface, then we can address the interface, - // but not the slice itself, so get the element but set the interface - set := result - if result.Kind() == reflect.Interface { - result = result.Elem() - } - - resultType := result.Type() - resultElemType := resultType.Elem() - resultKeyType := resultType.Key() - if resultKeyType.Kind() != reflect.String { - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: map must have string keys", name), - } - } - - // Make a map if it is nil - resultMap := result - if result.IsNil() { - resultMap = reflect.MakeMap( - reflect.MapOf(resultKeyType, resultElemType)) - } - - // Go through each element and decode it. - done := make(map[string]struct{}) - for _, item := range n.Items { - if item.Val == nil { - continue - } - - // github.com/hashicorp/terraform/issue/5740 - if len(item.Keys) == 0 { - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: map must have string keys", name), - } - } - - // Get the key we're dealing with, which is the first item - keyStr := item.Keys[0].Token.Value().(string) - - // If we've already processed this key, then ignore it - if _, ok := done[keyStr]; ok { - continue - } - - // Determine the value. If we have more than one key, then we - // get the objectlist of only these keys. - itemVal := item.Val - if len(item.Keys) > 1 { - itemVal = n.Filter(keyStr) - done[keyStr] = struct{}{} - } - - // Make the field name - fieldName := fmt.Sprintf("%s.%s", name, keyStr) - - // Get the key/value as reflection values - key := reflect.ValueOf(keyStr) - val := reflect.Indirect(reflect.New(resultElemType)) - - // If we have a pre-existing value in the map, use that - oldVal := resultMap.MapIndex(key) - if oldVal.IsValid() { - val.Set(oldVal) - } - - // Decode! - if err := d.decode(fieldName, itemVal, val); err != nil { - return err - } - - // Set the value on the map - resultMap.SetMapIndex(key, val) - } - - // Set the final map if we can - set.Set(resultMap) - return nil -} - -func (d *decoder) decodePtr(name string, node ast.Node, result reflect.Value) error { - // Create an element of the concrete (non pointer) type and decode - // into that. Then set the value of the pointer to this type. - resultType := result.Type() - resultElemType := resultType.Elem() - val := reflect.New(resultElemType) - if err := d.decode(name, node, reflect.Indirect(val)); err != nil { - return err - } - - result.Set(val) - return nil -} - -func (d *decoder) decodeSlice(name string, node ast.Node, result reflect.Value) error { - // If we have an interface, then we can address the interface, - // but not the slice itself, so get the element but set the interface - set := result - if result.Kind() == reflect.Interface { - result = result.Elem() - } - // Create the slice if it isn't nil - resultType := result.Type() - resultElemType := resultType.Elem() - if result.IsNil() { - resultSliceType := reflect.SliceOf(resultElemType) - result = reflect.MakeSlice( - resultSliceType, 0, 0) - } - - // Figure out the items we'll be copying into the slice - var items []ast.Node - switch n := node.(type) { - case *ast.ObjectList: - items = make([]ast.Node, len(n.Items)) - for i, item := range n.Items { - items[i] = item - } - case *ast.ObjectType: - items = []ast.Node{n} - case *ast.ListType: - items = n.List - default: - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("unknown slice type: %T", node), - } - } - - for i, item := range items { - fieldName := fmt.Sprintf("%s[%d]", name, i) - - // Decode - val := reflect.Indirect(reflect.New(resultElemType)) - - // if item is an object that was decoded from ambiguous JSON and - // flattened, make sure it's expanded if it needs to decode into a - // defined structure. - item := expandObject(item, val) - - if err := d.decode(fieldName, item, val); err != nil { - return err - } - - // Append it onto the slice - result = reflect.Append(result, val) - } - - set.Set(result) - return nil -} - -// expandObject detects if an ambiguous JSON object was flattened to a List which -// should be decoded into a struct, and expands the ast to properly deocode. -func expandObject(node ast.Node, result reflect.Value) ast.Node { - item, ok := node.(*ast.ObjectItem) - if !ok { - return node - } - - elemType := result.Type() - - // our target type must be a struct - switch elemType.Kind() { - case reflect.Ptr: - switch elemType.Elem().Kind() { - case reflect.Struct: - //OK - default: - return node - } - case reflect.Struct: - //OK - default: - return node - } - - // A list value will have a key and field name. If it had more fields, - // it wouldn't have been flattened. - if len(item.Keys) != 2 { - return node - } - - keyToken := item.Keys[0].Token - item.Keys = item.Keys[1:] - - // we need to un-flatten the ast enough to decode - newNode := &ast.ObjectItem{ - Keys: []*ast.ObjectKey{ - &ast.ObjectKey{ - Token: keyToken, - }, - }, - Val: &ast.ObjectType{ - List: &ast.ObjectList{ - Items: []*ast.ObjectItem{item}, - }, - }, - } - - return newNode -} - -func (d *decoder) decodeString(name string, node ast.Node, result reflect.Value) error { - switch n := node.(type) { - case *ast.LiteralType: - switch n.Token.Type { - case token.NUMBER: - result.Set(reflect.ValueOf(n.Token.Text).Convert(result.Type())) - return nil - case token.STRING, token.HEREDOC: - result.Set(reflect.ValueOf(n.Token.Value()).Convert(result.Type())) - return nil - } - } - - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: unknown type for string %T", name, node), - } -} - -func (d *decoder) decodeStruct(name string, node ast.Node, result reflect.Value) error { - var item *ast.ObjectItem - if it, ok := node.(*ast.ObjectItem); ok { - item = it - node = it.Val - } - - if ot, ok := node.(*ast.ObjectType); ok { - node = ot.List - } - - // Handle the special case where the object itself is a literal. Previously - // the yacc parser would always ensure top-level elements were arrays. The new - // parser does not make the same guarantees, thus we need to convert any - // top-level literal elements into a list. - if _, ok := node.(*ast.LiteralType); ok && item != nil { - node = &ast.ObjectList{Items: []*ast.ObjectItem{item}} - } - - list, ok := node.(*ast.ObjectList) - if !ok { - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: not an object type for struct (%T)", name, node), - } - } - - // This slice will keep track of all the structs we'll be decoding. - // There can be more than one struct if there are embedded structs - // that are squashed. - structs := make([]reflect.Value, 1, 5) - structs[0] = result - - // Compile the list of all the fields that we're going to be decoding - // from all the structs. - type field struct { - field reflect.StructField - val reflect.Value - } - fields := []field{} - for len(structs) > 0 { - structVal := structs[0] - structs = structs[1:] - - structType := structVal.Type() - for i := 0; i < structType.NumField(); i++ { - fieldType := structType.Field(i) - tagParts := strings.Split(fieldType.Tag.Get(tagName), ",") - - // Ignore fields with tag name "-" - if tagParts[0] == "-" { - continue - } - - if fieldType.Anonymous { - fieldKind := fieldType.Type.Kind() - if fieldKind != reflect.Struct { - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: unsupported type to struct: %s", - fieldType.Name, fieldKind), - } - } - - // We have an embedded field. We "squash" the fields down - // if specified in the tag. - squash := false - for _, tag := range tagParts[1:] { - if tag == "squash" { - squash = true - break - } - } - - if squash { - structs = append( - structs, result.FieldByName(fieldType.Name)) - continue - } - } - - // Normal struct field, store it away - fields = append(fields, field{fieldType, structVal.Field(i)}) - } - } - - usedKeys := make(map[string]struct{}) - decodedFields := make([]string, 0, len(fields)) - decodedFieldsVal := make([]reflect.Value, 0) - unusedKeysVal := make([]reflect.Value, 0) - for _, f := range fields { - field, fieldValue := f.field, f.val - if !fieldValue.IsValid() { - // This should never happen - panic("field is not valid") - } - - // If we can't set the field, then it is unexported or something, - // and we just continue onwards. - if !fieldValue.CanSet() { - continue - } - - fieldName := field.Name - - tagValue := field.Tag.Get(tagName) - tagParts := strings.SplitN(tagValue, ",", 2) - if len(tagParts) >= 2 { - switch tagParts[1] { - case "decodedFields": - decodedFieldsVal = append(decodedFieldsVal, fieldValue) - continue - case "key": - if item == nil { - return &parser.PosError{ - Pos: node.Pos(), - Err: fmt.Errorf("%s: %s asked for 'key', impossible", - name, fieldName), - } - } - - fieldValue.SetString(item.Keys[0].Token.Value().(string)) - continue - case "unusedKeys": - unusedKeysVal = append(unusedKeysVal, fieldValue) - continue - } - } - - if tagParts[0] != "" { - fieldName = tagParts[0] - } - - // Determine the element we'll use to decode. If it is a single - // match (only object with the field), then we decode it exactly. - // If it is a prefix match, then we decode the matches. - filter := list.Filter(fieldName) - - prefixMatches := filter.Children() - matches := filter.Elem() - if len(matches.Items) == 0 && len(prefixMatches.Items) == 0 { - continue - } - - // Track the used key - usedKeys[fieldName] = struct{}{} - - // Create the field name and decode. We range over the elements - // because we actually want the value. - fieldName = fmt.Sprintf("%s.%s", name, fieldName) - if len(prefixMatches.Items) > 0 { - if err := d.decode(fieldName, prefixMatches, fieldValue); err != nil { - return err - } - } - for _, match := range matches.Items { - var decodeNode ast.Node = match.Val - if ot, ok := decodeNode.(*ast.ObjectType); ok { - decodeNode = &ast.ObjectList{Items: ot.List.Items} - } - - if err := d.decode(fieldName, decodeNode, fieldValue); err != nil { - return err - } - } - - decodedFields = append(decodedFields, field.Name) - } - - if len(decodedFieldsVal) > 0 { - // Sort it so that it is deterministic - sort.Strings(decodedFields) - - for _, v := range decodedFieldsVal { - v.Set(reflect.ValueOf(decodedFields)) - } - } - - return nil -} - -// findNodeType returns the type of ast.Node -func findNodeType() reflect.Type { - var nodeContainer struct { - Node ast.Node - } - value := reflect.ValueOf(nodeContainer).FieldByName("Node") - return value.Type() -} diff --git a/vendor/github.com/hashicorp/hcl/go.mod b/vendor/github.com/hashicorp/hcl/go.mod deleted file mode 100644 index 4debbbe..0000000 --- a/vendor/github.com/hashicorp/hcl/go.mod +++ /dev/null @@ -1,3 +0,0 @@ -module github.com/hashicorp/hcl - -require github.com/davecgh/go-spew v1.1.1 diff --git a/vendor/github.com/hashicorp/hcl/go.sum b/vendor/github.com/hashicorp/hcl/go.sum deleted file mode 100644 index b5e2922..0000000 --- a/vendor/github.com/hashicorp/hcl/go.sum +++ /dev/null @@ -1,2 +0,0 @@ -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= diff --git a/vendor/github.com/hashicorp/hcl/hcl.go b/vendor/github.com/hashicorp/hcl/hcl.go deleted file mode 100644 index 575a20b..0000000 --- a/vendor/github.com/hashicorp/hcl/hcl.go +++ /dev/null @@ -1,11 +0,0 @@ -// Package hcl decodes HCL into usable Go structures. -// -// hcl input can come in either pure HCL format or JSON format. -// It can be parsed into an AST, and then decoded into a structure, -// or it can be decoded directly from a string into a structure. -// -// If you choose to parse HCL into a raw AST, the benefit is that you -// can write custom visitor implementations to implement custom -// semantic checks. By default, HCL does not perform any semantic -// checks. -package hcl diff --git a/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go b/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go deleted file mode 100644 index 6e5ef65..0000000 --- a/vendor/github.com/hashicorp/hcl/hcl/ast/ast.go +++ /dev/null @@ -1,219 +0,0 @@ -// Package ast declares the types used to represent syntax trees for HCL -// (HashiCorp Configuration Language) -package ast - -import ( - "fmt" - "strings" - - "github.com/hashicorp/hcl/hcl/token" -) - -// Node is an element in the abstract syntax tree. -type Node interface { - node() - Pos() token.Pos -} - -func (File) node() {} -func (ObjectList) node() {} -func (ObjectKey) node() {} -func (ObjectItem) node() {} -func (Comment) node() {} -func (CommentGroup) node() {} -func (ObjectType) node() {} -func (LiteralType) node() {} -func (ListType) node() {} - -// File represents a single HCL file -type File struct { - Node Node // usually a *ObjectList - Comments []*CommentGroup // list of all comments in the source -} - -func (f *File) Pos() token.Pos { - return f.Node.Pos() -} - -// ObjectList represents a list of ObjectItems. An HCL file itself is an -// ObjectList. -type ObjectList struct { - Items []*ObjectItem -} - -func (o *ObjectList) Add(item *ObjectItem) { - o.Items = append(o.Items, item) -} - -// Filter filters out the objects with the given key list as a prefix. -// -// The returned list of objects contain ObjectItems where the keys have -// this prefix already stripped off. This might result in objects with -// zero-length key lists if they have no children. -// -// If no matches are found, an empty ObjectList (non-nil) is returned. -func (o *ObjectList) Filter(keys ...string) *ObjectList { - var result ObjectList - for _, item := range o.Items { - // If there aren't enough keys, then ignore this - if len(item.Keys) < len(keys) { - continue - } - - match := true - for i, key := range item.Keys[:len(keys)] { - key := key.Token.Value().(string) - if key != keys[i] && !strings.EqualFold(key, keys[i]) { - match = false - break - } - } - if !match { - continue - } - - // Strip off the prefix from the children - newItem := *item - newItem.Keys = newItem.Keys[len(keys):] - result.Add(&newItem) - } - - return &result -} - -// Children returns further nested objects (key length > 0) within this -// ObjectList. This should be used with Filter to get at child items. -func (o *ObjectList) Children() *ObjectList { - var result ObjectList - for _, item := range o.Items { - if len(item.Keys) > 0 { - result.Add(item) - } - } - - return &result -} - -// Elem returns items in the list that are direct element assignments -// (key length == 0). This should be used with Filter to get at elements. -func (o *ObjectList) Elem() *ObjectList { - var result ObjectList - for _, item := range o.Items { - if len(item.Keys) == 0 { - result.Add(item) - } - } - - return &result -} - -func (o *ObjectList) Pos() token.Pos { - // always returns the uninitiliazed position - return o.Items[0].Pos() -} - -// ObjectItem represents a HCL Object Item. An item is represented with a key -// (or keys). It can be an assignment or an object (both normal and nested) -type ObjectItem struct { - // keys is only one length long if it's of type assignment. If it's a - // nested object it can be larger than one. In that case "assign" is - // invalid as there is no assignments for a nested object. - Keys []*ObjectKey - - // assign contains the position of "=", if any - Assign token.Pos - - // val is the item itself. It can be an object,list, number, bool or a - // string. If key length is larger than one, val can be only of type - // Object. - Val Node - - LeadComment *CommentGroup // associated lead comment - LineComment *CommentGroup // associated line comment -} - -func (o *ObjectItem) Pos() token.Pos { - // I'm not entirely sure what causes this, but removing this causes - // a test failure. We should investigate at some point. - if len(o.Keys) == 0 { - return token.Pos{} - } - - return o.Keys[0].Pos() -} - -// ObjectKeys are either an identifier or of type string. -type ObjectKey struct { - Token token.Token -} - -func (o *ObjectKey) Pos() token.Pos { - return o.Token.Pos -} - -// LiteralType represents a literal of basic type. Valid types are: -// token.NUMBER, token.FLOAT, token.BOOL and token.STRING -type LiteralType struct { - Token token.Token - - // comment types, only used when in a list - LeadComment *CommentGroup - LineComment *CommentGroup -} - -func (l *LiteralType) Pos() token.Pos { - return l.Token.Pos -} - -// ListStatement represents a HCL List type -type ListType struct { - Lbrack token.Pos // position of "[" - Rbrack token.Pos // position of "]" - List []Node // the elements in lexical order -} - -func (l *ListType) Pos() token.Pos { - return l.Lbrack -} - -func (l *ListType) Add(node Node) { - l.List = append(l.List, node) -} - -// ObjectType represents a HCL Object Type -type ObjectType struct { - Lbrace token.Pos // position of "{" - Rbrace token.Pos // position of "}" - List *ObjectList // the nodes in lexical order -} - -func (o *ObjectType) Pos() token.Pos { - return o.Lbrace -} - -// Comment node represents a single //, # style or /*- style commment -type Comment struct { - Start token.Pos // position of / or # - Text string -} - -func (c *Comment) Pos() token.Pos { - return c.Start -} - -// CommentGroup node represents a sequence of comments with no other tokens and -// no empty lines between. -type CommentGroup struct { - List []*Comment // len(List) > 0 -} - -func (c *CommentGroup) Pos() token.Pos { - return c.List[0].Pos() -} - -//------------------------------------------------------------------- -// GoStringer -//------------------------------------------------------------------- - -func (o *ObjectKey) GoString() string { return fmt.Sprintf("*%#v", *o) } -func (o *ObjectList) GoString() string { return fmt.Sprintf("*%#v", *o) } diff --git a/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go b/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go deleted file mode 100644 index ba07ad4..0000000 --- a/vendor/github.com/hashicorp/hcl/hcl/ast/walk.go +++ /dev/null @@ -1,52 +0,0 @@ -package ast - -import "fmt" - -// WalkFunc describes a function to be called for each node during a Walk. The -// returned node can be used to rewrite the AST. Walking stops the returned -// bool is false. -type WalkFunc func(Node) (Node, bool) - -// Walk traverses an AST in depth-first order: It starts by calling fn(node); -// node must not be nil. If fn returns true, Walk invokes fn recursively for -// each of the non-nil children of node, followed by a call of fn(nil). The -// returned node of fn can be used to rewrite the passed node to fn. -func Walk(node Node, fn WalkFunc) Node { - rewritten, ok := fn(node) - if !ok { - return rewritten - } - - switch n := node.(type) { - case *File: - n.Node = Walk(n.Node, fn) - case *ObjectList: - for i, item := range n.Items { - n.Items[i] = Walk(item, fn).(*ObjectItem) - } - case *ObjectKey: - // nothing to do - case *ObjectItem: - for i, k := range n.Keys { - n.Keys[i] = Walk(k, fn).(*ObjectKey) - } - - if n.Val != nil { - n.Val = Walk(n.Val, fn) - } - case *LiteralType: - // nothing to do - case *ListType: - for i, l := range n.List { - n.List[i] = Walk(l, fn) - } - case *ObjectType: - n.List = Walk(n.List, fn).(*ObjectList) - default: - // should we panic here? - fmt.Printf("unknown type: %T\n", n) - } - - fn(nil) - return rewritten -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/error.go b/vendor/github.com/hashicorp/hcl/hcl/parser/error.go deleted file mode 100644 index 5c99381..0000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/error.go +++ /dev/null @@ -1,17 +0,0 @@ -package parser - -import ( - "fmt" - - "github.com/hashicorp/hcl/hcl/token" -) - -// PosError is a parse error that contains a position. -type PosError struct { - Pos token.Pos - Err error -} - -func (e *PosError) Error() string { - return fmt.Sprintf("At %s: %s", e.Pos, e.Err) -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go b/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go deleted file mode 100644 index 64c83bc..0000000 --- a/vendor/github.com/hashicorp/hcl/hcl/parser/parser.go +++ /dev/null @@ -1,532 +0,0 @@ -// Package parser implements a parser for HCL (HashiCorp Configuration -// Language) -package parser - -import ( - "bytes" - "errors" - "fmt" - "strings" - - "github.com/hashicorp/hcl/hcl/ast" - "github.com/hashicorp/hcl/hcl/scanner" - "github.com/hashicorp/hcl/hcl/token" -) - -type Parser struct { - sc *scanner.Scanner - - // Last read token - tok token.Token - commaPrev token.Token - - comments []*ast.CommentGroup - leadComment *ast.CommentGroup // last lead comment - lineComment *ast.CommentGroup // last line comment - - enableTrace bool - indent int - n int // buffer size (max = 1) -} - -func newParser(src []byte) *Parser { - return &Parser{ - sc: scanner.New(src), - } -} - -// Parse returns the fully parsed source and returns the abstract syntax tree. -func Parse(src []byte) (*ast.File, error) { - // normalize all line endings - // since the scanner and output only work with "\n" line endings, we may - // end up with dangling "\r" characters in the parsed data. - src = bytes.Replace(src, []byte("\r\n"), []byte("\n"), -1) - - p := newParser(src) - return p.Parse() -} - -var errEofToken = errors.New("EOF token found") - -// Parse returns the fully parsed source and returns the abstract syntax tree. -func (p *Parser) Parse() (*ast.File, error) { - f := &ast.File{} - var err, scerr error - p.sc.Error = func(pos token.Pos, msg string) { - scerr = &PosError{Pos: pos, Err: errors.New(msg)} - } - - f.Node, err = p.objectList(false) - if scerr != nil { - return nil, scerr - } - if err != nil { - return nil, err - } - - f.Comments = p.comments - return f, nil -} - -// objectList parses a list of items within an object (generally k/v pairs). -// The parameter" obj" tells this whether to we are within an object (braces: -// '{', '}') or just at the top level. If we're within an object, we end -// at an RBRACE. -func (p *Parser) objectList(obj bool) (*ast.ObjectList, error) { - defer un(trace(p, "ParseObjectList")) - node := &ast.ObjectList{} - - for { - if obj { - tok := p.scan() - p.unscan() - if tok.Type == token.RBRACE { - break - } - } - - n, err := p.objectItem() - if err == errEofToken { - break // we are finished - } - - // we don't return a nil node, because might want to use already - // collected items. - if err != nil { - return node, err - } - - node.Add(n) - - // object lists can be optionally comma-delimited e.g. when a list of maps - // is being expressed, so a comma is allowed here - it's simply consumed - tok := p.scan() - if tok.Type != token.COMMA { - p.unscan() - } - } - return node, nil -} - -func (p *Parser) consumeComment() (comment *ast.Comment, endline int) { - endline = p.tok.Pos.Line - - // count the endline if it's multiline comment, ie starting with /* - if len(p.tok.Text) > 1 && p.tok.Text[1] == '*' { - // don't use range here - no need to decode Unicode code points - for i := 0; i < len(p.tok.Text); i++ { - if p.tok.Text[i] == '\n' { - endline++ - } - } - } - - comment = &ast.Comment{Start: p.tok.Pos, Text: p.tok.Text} - p.tok = p.sc.Scan() - return -} - -func (p *Parser) consumeCommentGroup(n int) (comments *ast.CommentGroup, endline int) { - var list []*ast.Comment - endline = p.tok.Pos.Line - - for p.tok.Type == token.COMMENT && p.tok.Pos.Line <= endline+n { - var comment *ast.Comment - comment, endline = p.consumeComment() - list = append(list, comment) - } - - // add comment group to the comments list - comments = &ast.CommentGroup{List: list} - p.comments = append(p.comments, comments) - - return -} - -// objectItem parses a single object item -func (p *Parser) objectItem() (*ast.ObjectItem, error) { - defer un(trace(p, "ParseObjectItem")) - - keys, err := p.objectKey() - if len(keys) > 0 && err == errEofToken { - // We ignore eof token here since it is an error if we didn't - // receive a value (but we did receive a key) for the item. - err = nil - } - if len(keys) > 0 && err != nil && p.tok.Type == token.RBRACE { - // This is a strange boolean statement, but what it means is: - // We have keys with no value, and we're likely in an object - // (since RBrace ends an object). For this, we set err to nil so - // we continue and get the error below of having the wrong value - // type. - err = nil - - // Reset the token type so we don't think it completed fine. See - // objectType which uses p.tok.Type to check if we're done with - // the object. - p.tok.Type = token.EOF - } - if err != nil { - return nil, err - } - - o := &ast.ObjectItem{ - Keys: keys, - } - - if p.leadComment != nil { - o.LeadComment = p.leadComment - p.leadComment = nil - } - - switch p.tok.Type { - case token.ASSIGN: - o.Assign = p.tok.Pos - o.Val, err = p.object() - if err != nil { - return nil, err - } - case token.LBRACE: - o.Val, err = p.objectType() - if err != nil { - return nil, err - } - default: - keyStr := make([]string, 0, len(keys)) - for _, k := range keys { - keyStr = append(keyStr, k.Token.Text) - } - - return nil, &PosError{ - Pos: p.tok.Pos, - Err: fmt.Errorf( - "key '%s' expected start of object ('{') or assignment ('=')", - strings.Join(keyStr, " ")), - } - } - - // key=#comment - // val - if p.lineComment != nil { - o.LineComment, p.lineComment = p.lineComment, nil - } - - // do a look-ahead for line comment - p.scan() - if len(keys) > 0 && o.Val.Pos().Line == keys[0].Pos().Line && p.lineComment != nil { - o.LineComment = p.lineComment - p.lineComment = nil - } - p.unscan() - return o, nil -} - -// objectKey parses an object key and returns a ObjectKey AST -func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { - keyCount := 0 - keys := make([]*ast.ObjectKey, 0) - - for { - tok := p.scan() - switch tok.Type { - case token.EOF: - // It is very important to also return the keys here as well as - // the error. This is because we need to be able to tell if we - // did parse keys prior to finding the EOF, or if we just found - // a bare EOF. - return keys, errEofToken - case token.ASSIGN: - // assignment or object only, but not nested objects. this is not - // allowed: `foo bar = {}` - if keyCount > 1 { - return nil, &PosError{ - Pos: p.tok.Pos, - Err: fmt.Errorf("nested object expected: LBRACE got: %s", p.tok.Type), - } - } - - if keyCount == 0 { - return nil, &PosError{ - Pos: p.tok.Pos, - Err: errors.New("no object keys found!"), - } - } - - return keys, nil - case token.LBRACE: - var err error - - // If we have no keys, then it is a syntax error. i.e. {{}} is not - // allowed. - if len(keys) == 0 { - err = &PosError{ - Pos: p.tok.Pos, - Err: fmt.Errorf("expected: IDENT | STRING got: %s", p.tok.Type), - } - } - - // object - return keys, err - case token.IDENT, token.STRING: - keyCount++ - keys = append(keys, &ast.ObjectKey{Token: p.tok}) - case token.ILLEGAL: - return keys, &PosError{ - Pos: p.tok.Pos, - Err: fmt.Errorf("illegal character"), - } - default: - return keys, &PosError{ - Pos: p.tok.Pos, - Err: fmt.Errorf("expected: IDENT | STRING | ASSIGN | LBRACE got: %s", p.tok.Type), - } - } - } -} - -// object parses any type of object, such as number, bool, string, object or -// list. -func (p *Parser) object() (ast.Node, error) { - defer un(trace(p, "ParseType")) - tok := p.scan() - - switch tok.Type { - case token.NUMBER, token.FLOAT, token.BOOL, token.STRING, token.HEREDOC: - return p.literalType() - case token.LBRACE: - return p.objectType() - case token.LBRACK: - return p.listType() - case token.COMMENT: - // implement comment - case token.EOF: - return nil, errEofToken - } - - return nil, &PosError{ - Pos: tok.Pos, - Err: fmt.Errorf("Unknown token: %+v", tok), - } -} - -// objectType parses an object type and returns a ObjectType AST -func (p *Parser) objectType() (*ast.ObjectType, error) { - defer un(trace(p, "ParseObjectType")) - - // we assume that the currently scanned token is a LBRACE - o := &ast.ObjectType{ - Lbrace: p.tok.Pos, - } - - l, err := p.objectList(true) - - // if we hit RBRACE, we are good to go (means we parsed all Items), if it's - // not a RBRACE, it's an syntax error and we just return it. - if err != nil && p.tok.Type != token.RBRACE { - return nil, err - } - - // No error, scan and expect the ending to be a brace - if tok := p.scan(); tok.Type != token.RBRACE { - return nil, &PosError{ - Pos: tok.Pos, - Err: fmt.Errorf("object expected closing RBRACE got: %s", tok.Type), - } - } - - o.List = l - o.Rbrace = p.tok.Pos // advanced via parseObjectList - return o, nil -} - -// listType parses a list type and returns a ListType AST -func (p *Parser) listType() (*ast.ListType, error) { - defer un(trace(p, "ParseListType")) - - // we assume that the currently scanned token is a LBRACK - l := &ast.ListType{ - Lbrack: p.tok.Pos, - } - - needComma := false - for { - tok := p.scan() - if needComma { - switch tok.Type { - case token.COMMA, token.RBRACK: - default: - return nil, &PosError{ - Pos: tok.Pos, - Err: fmt.Errorf( - "error parsing list, expected comma or list end, got: %s", - tok.Type), - } - } - } - switch tok.Type { - case token.BOOL, token.NUMBER, token.FLOAT, token.STRING, token.HEREDOC: - node, err := p.literalType() - if err != nil { - return nil, err - } - - // If there is a lead comment, apply it - if p.leadComment != nil { - node.LeadComment = p.leadComment - p.leadComment = nil - } - - l.Add(node) - needComma = true - case token.COMMA: - // get next list item or we are at the end - // do a look-ahead for line comment - p.scan() - if p.lineComment != nil && len(l.List) > 0 { - lit, ok := l.List[len(l.List)-1].(*ast.LiteralType) - if ok { - lit.LineComment = p.lineComment - l.List[len(l.List)-1] = lit - p.lineComment = nil - } - } - p.unscan() - - needComma = false - continue - case token.LBRACE: - // Looks like a nested object, so parse it out - node, err := p.objectType() - if err != nil { - return nil, &PosError{ - Pos: tok.Pos, - Err: fmt.Errorf( - "error while trying to parse object within list: %s", err), - } - } - l.Add(node) - needComma = true - case token.LBRACK: - node, err := p.listType() - if err != nil { - return nil, &PosError{ - Pos: tok.Pos, - Err: fmt.Errorf( - "error while trying to parse list within list: %s", err), - } - } - l.Add(node) - case token.RBRACK: - // finished - l.Rbrack = p.tok.Pos - return l, nil - default: - return nil, &PosError{ - Pos: tok.Pos, - Err: fmt.Errorf("unexpected token while parsing list: %s", tok.Type), - } - } - } -} - -// literalType parses a literal type and returns a LiteralType AST -func (p *Parser) literalType() (*ast.LiteralType, error) { - defer un(trace(p, "ParseLiteral")) - - return &ast.LiteralType{ - Token: p.tok, - }, nil -} - -// scan returns the next token from the underlying scanner. If a token has -// been unscanned then read that instead. In the process, it collects any -// comment groups encountered, and remembers the last lead and line comments. -func (p *Parser) scan() token.Token { - // If we have a token on the buffer, then return it. - if p.n != 0 { - p.n = 0 - return p.tok - } - - // Otherwise read the next token from the scanner and Save it to the buffer - // in case we unscan later. - prev := p.tok - p.tok = p.sc.Scan() - - if p.tok.Type == token.COMMENT { - var comment *ast.CommentGroup - var endline int - - // fmt.Printf("p.tok.Pos.Line = %+v prev: %d endline %d \n", - // p.tok.Pos.Line, prev.Pos.Line, endline) - if p.tok.Pos.Line == prev.Pos.Line { - // The comment is on same line as the previous token; it - // cannot be a lead comment but may be a line comment. - comment, endline = p.consumeCommentGroup(0) - if p.tok.Pos.Line != endline { - // The next token is on a different line, thus - // the last comment group is a line comment. - p.lineComment = comment - } - } - - // consume successor comments, if any - endline = -1 - for p.tok.Type == token.COMMENT { - comment, endline = p.consumeCommentGroup(1) - } - - if endline+1 == p.tok.Pos.Line && p.tok.Type != token.RBRACE { - switch p.tok.Type { - case token.RBRACE, token.RBRACK: - // Do not count for these cases - default: - // The next token is following on the line immediately after the - // comment group, thus the last comment group is a lead comment. - p.leadComment = comment - } - } - - } - - return p.tok -} - -// unscan pushes the previously read token back onto the buffer. -func (p *Parser) unscan() { - p.n = 1 -} - -// ---------------------------------------------------------------------------- -// Parsing support - -func (p *Parser) printTrace(a ...interface{}) { - if !p.enableTrace { - return - } - - const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " - const n = len(dots) - fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) - - i := 2 * p.indent - for i > n { - fmt.Print(dots) - i -= n - } - // i <= n - fmt.Print(dots[0:i]) - fmt.Println(a...) -} - -func trace(p *Parser, msg string) *Parser { - p.printTrace(msg, "(") - p.indent++ - return p -} - -// Usage pattern: defer un(trace(p, "...")) -func un(p *Parser) { - p.indent-- - p.printTrace(")") -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go b/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go deleted file mode 100644 index 7c038d1..0000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/nodes.go +++ /dev/null @@ -1,789 +0,0 @@ -package printer - -import ( - "bytes" - "fmt" - "sort" - - "github.com/hashicorp/hcl/hcl/ast" - "github.com/hashicorp/hcl/hcl/token" -) - -const ( - blank = byte(' ') - newline = byte('\n') - tab = byte('\t') - infinity = 1 << 30 // offset or line -) - -var ( - unindent = []byte("\uE123") // in the private use space -) - -type printer struct { - cfg Config - prev token.Pos - - comments []*ast.CommentGroup // may be nil, contains all comments - standaloneComments []*ast.CommentGroup // contains all standalone comments (not assigned to any node) - - enableTrace bool - indentTrace int -} - -type ByPosition []*ast.CommentGroup - -func (b ByPosition) Len() int { return len(b) } -func (b ByPosition) Swap(i, j int) { b[i], b[j] = b[j], b[i] } -func (b ByPosition) Less(i, j int) bool { return b[i].Pos().Before(b[j].Pos()) } - -// collectComments comments all standalone comments which are not lead or line -// comment -func (p *printer) collectComments(node ast.Node) { - // first collect all comments. This is already stored in - // ast.File.(comments) - ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { - switch t := nn.(type) { - case *ast.File: - p.comments = t.Comments - return nn, false - } - return nn, true - }) - - standaloneComments := make(map[token.Pos]*ast.CommentGroup, 0) - for _, c := range p.comments { - standaloneComments[c.Pos()] = c - } - - // next remove all lead and line comments from the overall comment map. - // This will give us comments which are standalone, comments which are not - // assigned to any kind of node. - ast.Walk(node, func(nn ast.Node) (ast.Node, bool) { - switch t := nn.(type) { - case *ast.LiteralType: - if t.LeadComment != nil { - for _, comment := range t.LeadComment.List { - if _, ok := standaloneComments[comment.Pos()]; ok { - delete(standaloneComments, comment.Pos()) - } - } - } - - if t.LineComment != nil { - for _, comment := range t.LineComment.List { - if _, ok := standaloneComments[comment.Pos()]; ok { - delete(standaloneComments, comment.Pos()) - } - } - } - case *ast.ObjectItem: - if t.LeadComment != nil { - for _, comment := range t.LeadComment.List { - if _, ok := standaloneComments[comment.Pos()]; ok { - delete(standaloneComments, comment.Pos()) - } - } - } - - if t.LineComment != nil { - for _, comment := range t.LineComment.List { - if _, ok := standaloneComments[comment.Pos()]; ok { - delete(standaloneComments, comment.Pos()) - } - } - } - } - - return nn, true - }) - - for _, c := range standaloneComments { - p.standaloneComments = append(p.standaloneComments, c) - } - - sort.Sort(ByPosition(p.standaloneComments)) -} - -// output prints creates b printable HCL output and returns it. -func (p *printer) output(n interface{}) []byte { - var buf bytes.Buffer - - switch t := n.(type) { - case *ast.File: - // File doesn't trace so we add the tracing here - defer un(trace(p, "File")) - return p.output(t.Node) - case *ast.ObjectList: - defer un(trace(p, "ObjectList")) - - var index int - for { - // Determine the location of the next actual non-comment - // item. If we're at the end, the next item is at "infinity" - var nextItem token.Pos - if index != len(t.Items) { - nextItem = t.Items[index].Pos() - } else { - nextItem = token.Pos{Offset: infinity, Line: infinity} - } - - // Go through the standalone comments in the file and print out - // the comments that we should be for this object item. - for _, c := range p.standaloneComments { - // Go through all the comments in the group. The group - // should be printed together, not separated by double newlines. - printed := false - newlinePrinted := false - for _, comment := range c.List { - // We only care about comments after the previous item - // we've printed so that comments are printed in the - // correct locations (between two objects for example). - // And before the next item. - if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { - // if we hit the end add newlines so we can print the comment - // we don't do this if prev is invalid which means the - // beginning of the file since the first comment should - // be at the first line. - if !newlinePrinted && p.prev.IsValid() && index == len(t.Items) { - buf.Write([]byte{newline, newline}) - newlinePrinted = true - } - - // Write the actual comment. - buf.WriteString(comment.Text) - buf.WriteByte(newline) - - // Set printed to true to note that we printed something - printed = true - } - } - - // If we're not at the last item, write a new line so - // that there is a newline separating this comment from - // the next object. - if printed && index != len(t.Items) { - buf.WriteByte(newline) - } - } - - if index == len(t.Items) { - break - } - - buf.Write(p.output(t.Items[index])) - if index != len(t.Items)-1 { - // Always write a newline to separate us from the next item - buf.WriteByte(newline) - - // Need to determine if we're going to separate the next item - // with a blank line. The logic here is simple, though there - // are a few conditions: - // - // 1. The next object is more than one line away anyways, - // so we need an empty line. - // - // 2. The next object is not a "single line" object, so - // we need an empty line. - // - // 3. This current object is not a single line object, - // so we need an empty line. - current := t.Items[index] - next := t.Items[index+1] - if next.Pos().Line != t.Items[index].Pos().Line+1 || - !p.isSingleLineObject(next) || - !p.isSingleLineObject(current) { - buf.WriteByte(newline) - } - } - index++ - } - case *ast.ObjectKey: - buf.WriteString(t.Token.Text) - case *ast.ObjectItem: - p.prev = t.Pos() - buf.Write(p.objectItem(t)) - case *ast.LiteralType: - buf.Write(p.literalType(t)) - case *ast.ListType: - buf.Write(p.list(t)) - case *ast.ObjectType: - buf.Write(p.objectType(t)) - default: - fmt.Printf(" unknown type: %T\n", n) - } - - return buf.Bytes() -} - -func (p *printer) literalType(lit *ast.LiteralType) []byte { - result := []byte(lit.Token.Text) - switch lit.Token.Type { - case token.HEREDOC: - // Clear the trailing newline from heredocs - if result[len(result)-1] == '\n' { - result = result[:len(result)-1] - } - - // Poison lines 2+ so that we don't indent them - result = p.heredocIndent(result) - case token.STRING: - // If this is a multiline string, poison lines 2+ so we don't - // indent them. - if bytes.IndexRune(result, '\n') >= 0 { - result = p.heredocIndent(result) - } - } - - return result -} - -// objectItem returns the printable HCL form of an object item. An object type -// starts with one/multiple keys and has a value. The value might be of any -// type. -func (p *printer) objectItem(o *ast.ObjectItem) []byte { - defer un(trace(p, fmt.Sprintf("ObjectItem: %s", o.Keys[0].Token.Text))) - var buf bytes.Buffer - - if o.LeadComment != nil { - for _, comment := range o.LeadComment.List { - buf.WriteString(comment.Text) - buf.WriteByte(newline) - } - } - - // If key and val are on different lines, treat line comments like lead comments. - if o.LineComment != nil && o.Val.Pos().Line != o.Keys[0].Pos().Line { - for _, comment := range o.LineComment.List { - buf.WriteString(comment.Text) - buf.WriteByte(newline) - } - } - - for i, k := range o.Keys { - buf.WriteString(k.Token.Text) - buf.WriteByte(blank) - - // reach end of key - if o.Assign.IsValid() && i == len(o.Keys)-1 && len(o.Keys) == 1 { - buf.WriteString("=") - buf.WriteByte(blank) - } - } - - buf.Write(p.output(o.Val)) - - if o.LineComment != nil && o.Val.Pos().Line == o.Keys[0].Pos().Line { - buf.WriteByte(blank) - for _, comment := range o.LineComment.List { - buf.WriteString(comment.Text) - } - } - - return buf.Bytes() -} - -// objectType returns the printable HCL form of an object type. An object type -// begins with a brace and ends with a brace. -func (p *printer) objectType(o *ast.ObjectType) []byte { - defer un(trace(p, "ObjectType")) - var buf bytes.Buffer - buf.WriteString("{") - - var index int - var nextItem token.Pos - var commented, newlinePrinted bool - for { - // Determine the location of the next actual non-comment - // item. If we're at the end, the next item is the closing brace - if index != len(o.List.Items) { - nextItem = o.List.Items[index].Pos() - } else { - nextItem = o.Rbrace - } - - // Go through the standalone comments in the file and print out - // the comments that we should be for this object item. - for _, c := range p.standaloneComments { - printed := false - var lastCommentPos token.Pos - for _, comment := range c.List { - // We only care about comments after the previous item - // we've printed so that comments are printed in the - // correct locations (between two objects for example). - // And before the next item. - if comment.Pos().After(p.prev) && comment.Pos().Before(nextItem) { - // If there are standalone comments and the initial newline has not - // been printed yet, do it now. - if !newlinePrinted { - newlinePrinted = true - buf.WriteByte(newline) - } - - // add newline if it's between other printed nodes - if index > 0 { - commented = true - buf.WriteByte(newline) - } - - // Store this position - lastCommentPos = comment.Pos() - - // output the comment itself - buf.Write(p.indent(p.heredocIndent([]byte(comment.Text)))) - - // Set printed to true to note that we printed something - printed = true - - /* - if index != len(o.List.Items) { - buf.WriteByte(newline) // do not print on the end - } - */ - } - } - - // Stuff to do if we had comments - if printed { - // Always write a newline - buf.WriteByte(newline) - - // If there is another item in the object and our comment - // didn't hug it directly, then make sure there is a blank - // line separating them. - if nextItem != o.Rbrace && nextItem.Line != lastCommentPos.Line+1 { - buf.WriteByte(newline) - } - } - } - - if index == len(o.List.Items) { - p.prev = o.Rbrace - break - } - - // At this point we are sure that it's not a totally empty block: print - // the initial newline if it hasn't been printed yet by the previous - // block about standalone comments. - if !newlinePrinted { - buf.WriteByte(newline) - newlinePrinted = true - } - - // check if we have adjacent one liner items. If yes we'll going to align - // the comments. - var aligned []*ast.ObjectItem - for _, item := range o.List.Items[index:] { - // we don't group one line lists - if len(o.List.Items) == 1 { - break - } - - // one means a oneliner with out any lead comment - // two means a oneliner with lead comment - // anything else might be something else - cur := lines(string(p.objectItem(item))) - if cur > 2 { - break - } - - curPos := item.Pos() - - nextPos := token.Pos{} - if index != len(o.List.Items)-1 { - nextPos = o.List.Items[index+1].Pos() - } - - prevPos := token.Pos{} - if index != 0 { - prevPos = o.List.Items[index-1].Pos() - } - - // fmt.Println("DEBUG ----------------") - // fmt.Printf("prev = %+v prevPos: %s\n", prev, prevPos) - // fmt.Printf("cur = %+v curPos: %s\n", cur, curPos) - // fmt.Printf("next = %+v nextPos: %s\n", next, nextPos) - - if curPos.Line+1 == nextPos.Line { - aligned = append(aligned, item) - index++ - continue - } - - if curPos.Line-1 == prevPos.Line { - aligned = append(aligned, item) - index++ - - // finish if we have a new line or comment next. This happens - // if the next item is not adjacent - if curPos.Line+1 != nextPos.Line { - break - } - continue - } - - break - } - - // put newlines if the items are between other non aligned items. - // newlines are also added if there is a standalone comment already, so - // check it too - if !commented && index != len(aligned) { - buf.WriteByte(newline) - } - - if len(aligned) >= 1 { - p.prev = aligned[len(aligned)-1].Pos() - - items := p.alignedItems(aligned) - buf.Write(p.indent(items)) - } else { - p.prev = o.List.Items[index].Pos() - - buf.Write(p.indent(p.objectItem(o.List.Items[index]))) - index++ - } - - buf.WriteByte(newline) - } - - buf.WriteString("}") - return buf.Bytes() -} - -func (p *printer) alignedItems(items []*ast.ObjectItem) []byte { - var buf bytes.Buffer - - // find the longest key and value length, needed for alignment - var longestKeyLen int // longest key length - var longestValLen int // longest value length - for _, item := range items { - key := len(item.Keys[0].Token.Text) - val := len(p.output(item.Val)) - - if key > longestKeyLen { - longestKeyLen = key - } - - if val > longestValLen { - longestValLen = val - } - } - - for i, item := range items { - if item.LeadComment != nil { - for _, comment := range item.LeadComment.List { - buf.WriteString(comment.Text) - buf.WriteByte(newline) - } - } - - for i, k := range item.Keys { - keyLen := len(k.Token.Text) - buf.WriteString(k.Token.Text) - for i := 0; i < longestKeyLen-keyLen+1; i++ { - buf.WriteByte(blank) - } - - // reach end of key - if i == len(item.Keys)-1 && len(item.Keys) == 1 { - buf.WriteString("=") - buf.WriteByte(blank) - } - } - - val := p.output(item.Val) - valLen := len(val) - buf.Write(val) - - if item.Val.Pos().Line == item.Keys[0].Pos().Line && item.LineComment != nil { - for i := 0; i < longestValLen-valLen+1; i++ { - buf.WriteByte(blank) - } - - for _, comment := range item.LineComment.List { - buf.WriteString(comment.Text) - } - } - - // do not print for the last item - if i != len(items)-1 { - buf.WriteByte(newline) - } - } - - return buf.Bytes() -} - -// list returns the printable HCL form of an list type. -func (p *printer) list(l *ast.ListType) []byte { - if p.isSingleLineList(l) { - return p.singleLineList(l) - } - - var buf bytes.Buffer - buf.WriteString("[") - buf.WriteByte(newline) - - var longestLine int - for _, item := range l.List { - // for now we assume that the list only contains literal types - if lit, ok := item.(*ast.LiteralType); ok { - lineLen := len(lit.Token.Text) - if lineLen > longestLine { - longestLine = lineLen - } - } - } - - haveEmptyLine := false - for i, item := range l.List { - // If we have a lead comment, then we want to write that first - leadComment := false - if lit, ok := item.(*ast.LiteralType); ok && lit.LeadComment != nil { - leadComment = true - - // Ensure an empty line before every element with a - // lead comment (except the first item in a list). - if !haveEmptyLine && i != 0 { - buf.WriteByte(newline) - } - - for _, comment := range lit.LeadComment.List { - buf.Write(p.indent([]byte(comment.Text))) - buf.WriteByte(newline) - } - } - - // also indent each line - val := p.output(item) - curLen := len(val) - buf.Write(p.indent(val)) - - // if this item is a heredoc, then we output the comma on - // the next line. This is the only case this happens. - comma := []byte{','} - if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC { - buf.WriteByte(newline) - comma = p.indent(comma) - } - - buf.Write(comma) - - if lit, ok := item.(*ast.LiteralType); ok && lit.LineComment != nil { - // if the next item doesn't have any comments, do not align - buf.WriteByte(blank) // align one space - for i := 0; i < longestLine-curLen; i++ { - buf.WriteByte(blank) - } - - for _, comment := range lit.LineComment.List { - buf.WriteString(comment.Text) - } - } - - buf.WriteByte(newline) - - // Ensure an empty line after every element with a - // lead comment (except the first item in a list). - haveEmptyLine = leadComment && i != len(l.List)-1 - if haveEmptyLine { - buf.WriteByte(newline) - } - } - - buf.WriteString("]") - return buf.Bytes() -} - -// isSingleLineList returns true if: -// * they were previously formatted entirely on one line -// * they consist entirely of literals -// * there are either no heredoc strings or the list has exactly one element -// * there are no line comments -func (printer) isSingleLineList(l *ast.ListType) bool { - for _, item := range l.List { - if item.Pos().Line != l.Lbrack.Line { - return false - } - - lit, ok := item.(*ast.LiteralType) - if !ok { - return false - } - - if lit.Token.Type == token.HEREDOC && len(l.List) != 1 { - return false - } - - if lit.LineComment != nil { - return false - } - } - - return true -} - -// singleLineList prints a simple single line list. -// For a definition of "simple", see isSingleLineList above. -func (p *printer) singleLineList(l *ast.ListType) []byte { - buf := &bytes.Buffer{} - - buf.WriteString("[") - for i, item := range l.List { - if i != 0 { - buf.WriteString(", ") - } - - // Output the item itself - buf.Write(p.output(item)) - - // The heredoc marker needs to be at the end of line. - if lit, ok := item.(*ast.LiteralType); ok && lit.Token.Type == token.HEREDOC { - buf.WriteByte(newline) - } - } - - buf.WriteString("]") - return buf.Bytes() -} - -// indent indents the lines of the given buffer for each non-empty line -func (p *printer) indent(buf []byte) []byte { - var prefix []byte - if p.cfg.SpacesWidth != 0 { - for i := 0; i < p.cfg.SpacesWidth; i++ { - prefix = append(prefix, blank) - } - } else { - prefix = []byte{tab} - } - - var res []byte - bol := true - for _, c := range buf { - if bol && c != '\n' { - res = append(res, prefix...) - } - - res = append(res, c) - bol = c == '\n' - } - return res -} - -// unindent removes all the indentation from the tombstoned lines -func (p *printer) unindent(buf []byte) []byte { - var res []byte - for i := 0; i < len(buf); i++ { - skip := len(buf)-i <= len(unindent) - if !skip { - skip = !bytes.Equal(unindent, buf[i:i+len(unindent)]) - } - if skip { - res = append(res, buf[i]) - continue - } - - // We have a marker. we have to backtrace here and clean out - // any whitespace ahead of our tombstone up to a \n - for j := len(res) - 1; j >= 0; j-- { - if res[j] == '\n' { - break - } - - res = res[:j] - } - - // Skip the entire unindent marker - i += len(unindent) - 1 - } - - return res -} - -// heredocIndent marks all the 2nd and further lines as unindentable -func (p *printer) heredocIndent(buf []byte) []byte { - var res []byte - bol := false - for _, c := range buf { - if bol && c != '\n' { - res = append(res, unindent...) - } - res = append(res, c) - bol = c == '\n' - } - return res -} - -// isSingleLineObject tells whether the given object item is a single -// line object such as "obj {}". -// -// A single line object: -// -// * has no lead comments (hence multi-line) -// * has no assignment -// * has no values in the stanza (within {}) -// -func (p *printer) isSingleLineObject(val *ast.ObjectItem) bool { - // If there is a lead comment, can't be one line - if val.LeadComment != nil { - return false - } - - // If there is assignment, we always break by line - if val.Assign.IsValid() { - return false - } - - // If it isn't an object type, then its not a single line object - ot, ok := val.Val.(*ast.ObjectType) - if !ok { - return false - } - - // If the object has no items, it is single line! - return len(ot.List.Items) == 0 -} - -func lines(txt string) int { - endline := 1 - for i := 0; i < len(txt); i++ { - if txt[i] == '\n' { - endline++ - } - } - return endline -} - -// ---------------------------------------------------------------------------- -// Tracing support - -func (p *printer) printTrace(a ...interface{}) { - if !p.enableTrace { - return - } - - const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " - const n = len(dots) - i := 2 * p.indentTrace - for i > n { - fmt.Print(dots) - i -= n - } - // i <= n - fmt.Print(dots[0:i]) - fmt.Println(a...) -} - -func trace(p *printer, msg string) *printer { - p.printTrace(msg, "(") - p.indentTrace++ - return p -} - -// Usage pattern: defer un(trace(p, "...")) -func un(p *printer) { - p.indentTrace-- - p.printTrace(")") -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go b/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go deleted file mode 100644 index 6617ab8..0000000 --- a/vendor/github.com/hashicorp/hcl/hcl/printer/printer.go +++ /dev/null @@ -1,66 +0,0 @@ -// Package printer implements printing of AST nodes to HCL format. -package printer - -import ( - "bytes" - "io" - "text/tabwriter" - - "github.com/hashicorp/hcl/hcl/ast" - "github.com/hashicorp/hcl/hcl/parser" -) - -var DefaultConfig = Config{ - SpacesWidth: 2, -} - -// A Config node controls the output of Fprint. -type Config struct { - SpacesWidth int // if set, it will use spaces instead of tabs for alignment -} - -func (c *Config) Fprint(output io.Writer, node ast.Node) error { - p := &printer{ - cfg: *c, - comments: make([]*ast.CommentGroup, 0), - standaloneComments: make([]*ast.CommentGroup, 0), - // enableTrace: true, - } - - p.collectComments(node) - - if _, err := output.Write(p.unindent(p.output(node))); err != nil { - return err - } - - // flush tabwriter, if any - var err error - if tw, _ := output.(*tabwriter.Writer); tw != nil { - err = tw.Flush() - } - - return err -} - -// Fprint "pretty-prints" an HCL node to output -// It calls Config.Fprint with default settings. -func Fprint(output io.Writer, node ast.Node) error { - return DefaultConfig.Fprint(output, node) -} - -// Format formats src HCL and returns the result. -func Format(src []byte) ([]byte, error) { - node, err := parser.Parse(src) - if err != nil { - return nil, err - } - - var buf bytes.Buffer - if err := DefaultConfig.Fprint(&buf, node); err != nil { - return nil, err - } - - // Add trailing newline to result - buf.WriteString("\n") - return buf.Bytes(), nil -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go b/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go deleted file mode 100644 index 624a18f..0000000 --- a/vendor/github.com/hashicorp/hcl/hcl/scanner/scanner.go +++ /dev/null @@ -1,652 +0,0 @@ -// Package scanner implements a scanner for HCL (HashiCorp Configuration -// Language) source text. -package scanner - -import ( - "bytes" - "fmt" - "os" - "regexp" - "unicode" - "unicode/utf8" - - "github.com/hashicorp/hcl/hcl/token" -) - -// eof represents a marker rune for the end of the reader. -const eof = rune(0) - -// Scanner defines a lexical scanner -type Scanner struct { - buf *bytes.Buffer // Source buffer for advancing and scanning - src []byte // Source buffer for immutable access - - // Source Position - srcPos token.Pos // current position - prevPos token.Pos // previous position, used for peek() method - - lastCharLen int // length of last character in bytes - lastLineLen int // length of last line in characters (for correct column reporting) - - tokStart int // token text start position - tokEnd int // token text end position - - // Error is called for each error encountered. If no Error - // function is set, the error is reported to os.Stderr. - Error func(pos token.Pos, msg string) - - // ErrorCount is incremented by one for each error encountered. - ErrorCount int - - // tokPos is the start position of most recently scanned token; set by - // Scan. The Filename field is always left untouched by the Scanner. If - // an error is reported (via Error) and Position is invalid, the scanner is - // not inside a token. - tokPos token.Pos -} - -// New creates and initializes a new instance of Scanner using src as -// its source content. -func New(src []byte) *Scanner { - // even though we accept a src, we read from a io.Reader compatible type - // (*bytes.Buffer). So in the future we might easily change it to streaming - // read. - b := bytes.NewBuffer(src) - s := &Scanner{ - buf: b, - src: src, - } - - // srcPosition always starts with 1 - s.srcPos.Line = 1 - return s -} - -// next reads the next rune from the bufferred reader. Returns the rune(0) if -// an error occurs (or io.EOF is returned). -func (s *Scanner) next() rune { - ch, size, err := s.buf.ReadRune() - if err != nil { - // advance for error reporting - s.srcPos.Column++ - s.srcPos.Offset += size - s.lastCharLen = size - return eof - } - - // remember last position - s.prevPos = s.srcPos - - s.srcPos.Column++ - s.lastCharLen = size - s.srcPos.Offset += size - - if ch == utf8.RuneError && size == 1 { - s.err("illegal UTF-8 encoding") - return ch - } - - if ch == '\n' { - s.srcPos.Line++ - s.lastLineLen = s.srcPos.Column - s.srcPos.Column = 0 - } - - if ch == '\x00' { - s.err("unexpected null character (0x00)") - return eof - } - - if ch == '\uE123' { - s.err("unicode code point U+E123 reserved for internal use") - return utf8.RuneError - } - - // debug - // fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column) - return ch -} - -// unread unreads the previous read Rune and updates the source position -func (s *Scanner) unread() { - if err := s.buf.UnreadRune(); err != nil { - panic(err) // this is user fault, we should catch it - } - s.srcPos = s.prevPos // put back last position -} - -// peek returns the next rune without advancing the reader. -func (s *Scanner) peek() rune { - peek, _, err := s.buf.ReadRune() - if err != nil { - return eof - } - - s.buf.UnreadRune() - return peek -} - -// Scan scans the next token and returns the token. -func (s *Scanner) Scan() token.Token { - ch := s.next() - - // skip white space - for isWhitespace(ch) { - ch = s.next() - } - - var tok token.Type - - // token text markings - s.tokStart = s.srcPos.Offset - s.lastCharLen - - // token position, initial next() is moving the offset by one(size of rune - // actually), though we are interested with the starting point - s.tokPos.Offset = s.srcPos.Offset - s.lastCharLen - if s.srcPos.Column > 0 { - // common case: last character was not a '\n' - s.tokPos.Line = s.srcPos.Line - s.tokPos.Column = s.srcPos.Column - } else { - // last character was a '\n' - // (we cannot be at the beginning of the source - // since we have called next() at least once) - s.tokPos.Line = s.srcPos.Line - 1 - s.tokPos.Column = s.lastLineLen - } - - switch { - case isLetter(ch): - tok = token.IDENT - lit := s.scanIdentifier() - if lit == "true" || lit == "false" { - tok = token.BOOL - } - case isDecimal(ch): - tok = s.scanNumber(ch) - default: - switch ch { - case eof: - tok = token.EOF - case '"': - tok = token.STRING - s.scanString() - case '#', '/': - tok = token.COMMENT - s.scanComment(ch) - case '.': - tok = token.PERIOD - ch = s.peek() - if isDecimal(ch) { - tok = token.FLOAT - ch = s.scanMantissa(ch) - ch = s.scanExponent(ch) - } - case '<': - tok = token.HEREDOC - s.scanHeredoc() - case '[': - tok = token.LBRACK - case ']': - tok = token.RBRACK - case '{': - tok = token.LBRACE - case '}': - tok = token.RBRACE - case ',': - tok = token.COMMA - case '=': - tok = token.ASSIGN - case '+': - tok = token.ADD - case '-': - if isDecimal(s.peek()) { - ch := s.next() - tok = s.scanNumber(ch) - } else { - tok = token.SUB - } - default: - s.err("illegal char") - } - } - - // finish token ending - s.tokEnd = s.srcPos.Offset - - // create token literal - var tokenText string - if s.tokStart >= 0 { - tokenText = string(s.src[s.tokStart:s.tokEnd]) - } - s.tokStart = s.tokEnd // ensure idempotency of tokenText() call - - return token.Token{ - Type: tok, - Pos: s.tokPos, - Text: tokenText, - } -} - -func (s *Scanner) scanComment(ch rune) { - // single line comments - if ch == '#' || (ch == '/' && s.peek() != '*') { - if ch == '/' && s.peek() != '/' { - s.err("expected '/' for comment") - return - } - - ch = s.next() - for ch != '\n' && ch >= 0 && ch != eof { - ch = s.next() - } - if ch != eof && ch >= 0 { - s.unread() - } - return - } - - // be sure we get the character after /* This allows us to find comment's - // that are not erminated - if ch == '/' { - s.next() - ch = s.next() // read character after "/*" - } - - // look for /* - style comments - for { - if ch < 0 || ch == eof { - s.err("comment not terminated") - break - } - - ch0 := ch - ch = s.next() - if ch0 == '*' && ch == '/' { - break - } - } -} - -// scanNumber scans a HCL number definition starting with the given rune -func (s *Scanner) scanNumber(ch rune) token.Type { - if ch == '0' { - // check for hexadecimal, octal or float - ch = s.next() - if ch == 'x' || ch == 'X' { - // hexadecimal - ch = s.next() - found := false - for isHexadecimal(ch) { - ch = s.next() - found = true - } - - if !found { - s.err("illegal hexadecimal number") - } - - if ch != eof { - s.unread() - } - - return token.NUMBER - } - - // now it's either something like: 0421(octal) or 0.1231(float) - illegalOctal := false - for isDecimal(ch) { - ch = s.next() - if ch == '8' || ch == '9' { - // this is just a possibility. For example 0159 is illegal, but - // 0159.23 is valid. So we mark a possible illegal octal. If - // the next character is not a period, we'll print the error. - illegalOctal = true - } - } - - if ch == 'e' || ch == 'E' { - ch = s.scanExponent(ch) - return token.FLOAT - } - - if ch == '.' { - ch = s.scanFraction(ch) - - if ch == 'e' || ch == 'E' { - ch = s.next() - ch = s.scanExponent(ch) - } - return token.FLOAT - } - - if illegalOctal { - s.err("illegal octal number") - } - - if ch != eof { - s.unread() - } - return token.NUMBER - } - - s.scanMantissa(ch) - ch = s.next() // seek forward - if ch == 'e' || ch == 'E' { - ch = s.scanExponent(ch) - return token.FLOAT - } - - if ch == '.' { - ch = s.scanFraction(ch) - if ch == 'e' || ch == 'E' { - ch = s.next() - ch = s.scanExponent(ch) - } - return token.FLOAT - } - - if ch != eof { - s.unread() - } - return token.NUMBER -} - -// scanMantissa scans the mantissa beginning from the rune. It returns the next -// non decimal rune. It's used to determine wheter it's a fraction or exponent. -func (s *Scanner) scanMantissa(ch rune) rune { - scanned := false - for isDecimal(ch) { - ch = s.next() - scanned = true - } - - if scanned && ch != eof { - s.unread() - } - return ch -} - -// scanFraction scans the fraction after the '.' rune -func (s *Scanner) scanFraction(ch rune) rune { - if ch == '.' { - ch = s.peek() // we peek just to see if we can move forward - ch = s.scanMantissa(ch) - } - return ch -} - -// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' -// rune. -func (s *Scanner) scanExponent(ch rune) rune { - if ch == 'e' || ch == 'E' { - ch = s.next() - if ch == '-' || ch == '+' { - ch = s.next() - } - ch = s.scanMantissa(ch) - } - return ch -} - -// scanHeredoc scans a heredoc string -func (s *Scanner) scanHeredoc() { - // Scan the second '<' in example: '<= len(identBytes) && identRegexp.Match(s.src[lineStart:s.srcPos.Offset-s.lastCharLen]) { - break - } - - // Not an anchor match, record the start of a new line - lineStart = s.srcPos.Offset - } - - if ch == eof { - s.err("heredoc not terminated") - return - } - } - - return -} - -// scanString scans a quoted string -func (s *Scanner) scanString() { - braces := 0 - for { - // '"' opening already consumed - // read character after quote - ch := s.next() - - if (ch == '\n' && braces == 0) || ch < 0 || ch == eof { - s.err("literal not terminated") - return - } - - if ch == '"' && braces == 0 { - break - } - - // If we're going into a ${} then we can ignore quotes for awhile - if braces == 0 && ch == '$' && s.peek() == '{' { - braces++ - s.next() - } else if braces > 0 && ch == '{' { - braces++ - } - if braces > 0 && ch == '}' { - braces-- - } - - if ch == '\\' { - s.scanEscape() - } - } - - return -} - -// scanEscape scans an escape sequence -func (s *Scanner) scanEscape() rune { - // http://en.cppreference.com/w/cpp/language/escape - ch := s.next() // read character after '/' - switch ch { - case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': - // nothing to do - case '0', '1', '2', '3', '4', '5', '6', '7': - // octal notation - ch = s.scanDigits(ch, 8, 3) - case 'x': - // hexademical notation - ch = s.scanDigits(s.next(), 16, 2) - case 'u': - // universal character name - ch = s.scanDigits(s.next(), 16, 4) - case 'U': - // universal character name - ch = s.scanDigits(s.next(), 16, 8) - default: - s.err("illegal char escape") - } - return ch -} - -// scanDigits scans a rune with the given base for n times. For example an -// octal notation \184 would yield in scanDigits(ch, 8, 3) -func (s *Scanner) scanDigits(ch rune, base, n int) rune { - start := n - for n > 0 && digitVal(ch) < base { - ch = s.next() - if ch == eof { - // If we see an EOF, we halt any more scanning of digits - // immediately. - break - } - - n-- - } - if n > 0 { - s.err("illegal char escape") - } - - if n != start && ch != eof { - // we scanned all digits, put the last non digit char back, - // only if we read anything at all - s.unread() - } - - return ch -} - -// scanIdentifier scans an identifier and returns the literal string -func (s *Scanner) scanIdentifier() string { - offs := s.srcPos.Offset - s.lastCharLen - ch := s.next() - for isLetter(ch) || isDigit(ch) || ch == '-' || ch == '.' { - ch = s.next() - } - - if ch != eof { - s.unread() // we got identifier, put back latest char - } - - return string(s.src[offs:s.srcPos.Offset]) -} - -// recentPosition returns the position of the character immediately after the -// character or token returned by the last call to Scan. -func (s *Scanner) recentPosition() (pos token.Pos) { - pos.Offset = s.srcPos.Offset - s.lastCharLen - switch { - case s.srcPos.Column > 0: - // common case: last character was not a '\n' - pos.Line = s.srcPos.Line - pos.Column = s.srcPos.Column - case s.lastLineLen > 0: - // last character was a '\n' - // (we cannot be at the beginning of the source - // since we have called next() at least once) - pos.Line = s.srcPos.Line - 1 - pos.Column = s.lastLineLen - default: - // at the beginning of the source - pos.Line = 1 - pos.Column = 1 - } - return -} - -// err prints the error of any scanning to s.Error function. If the function is -// not defined, by default it prints them to os.Stderr -func (s *Scanner) err(msg string) { - s.ErrorCount++ - pos := s.recentPosition() - - if s.Error != nil { - s.Error(pos, msg) - return - } - - fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) -} - -// isHexadecimal returns true if the given rune is a letter -func isLetter(ch rune) bool { - return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) -} - -// isDigit returns true if the given rune is a decimal digit -func isDigit(ch rune) bool { - return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) -} - -// isDecimal returns true if the given rune is a decimal number -func isDecimal(ch rune) bool { - return '0' <= ch && ch <= '9' -} - -// isHexadecimal returns true if the given rune is an hexadecimal number -func isHexadecimal(ch rune) bool { - return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' -} - -// isWhitespace returns true if the rune is a space, tab, newline or carriage return -func isWhitespace(ch rune) bool { - return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' -} - -// digitVal returns the integer value of a given octal,decimal or hexadecimal rune -func digitVal(ch rune) int { - switch { - case '0' <= ch && ch <= '9': - return int(ch - '0') - case 'a' <= ch && ch <= 'f': - return int(ch - 'a' + 10) - case 'A' <= ch && ch <= 'F': - return int(ch - 'A' + 10) - } - return 16 // larger than any legal digit val -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go b/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go deleted file mode 100644 index 5f981ea..0000000 --- a/vendor/github.com/hashicorp/hcl/hcl/strconv/quote.go +++ /dev/null @@ -1,241 +0,0 @@ -package strconv - -import ( - "errors" - "unicode/utf8" -) - -// ErrSyntax indicates that a value does not have the right syntax for the target type. -var ErrSyntax = errors.New("invalid syntax") - -// Unquote interprets s as a single-quoted, double-quoted, -// or backquoted Go string literal, returning the string value -// that s quotes. (If s is single-quoted, it would be a Go -// character literal; Unquote returns the corresponding -// one-character string.) -func Unquote(s string) (t string, err error) { - n := len(s) - if n < 2 { - return "", ErrSyntax - } - quote := s[0] - if quote != s[n-1] { - return "", ErrSyntax - } - s = s[1 : n-1] - - if quote != '"' { - return "", ErrSyntax - } - if !contains(s, '$') && !contains(s, '{') && contains(s, '\n') { - return "", ErrSyntax - } - - // Is it trivial? Avoid allocation. - if !contains(s, '\\') && !contains(s, quote) && !contains(s, '$') { - switch quote { - case '"': - return s, nil - case '\'': - r, size := utf8.DecodeRuneInString(s) - if size == len(s) && (r != utf8.RuneError || size != 1) { - return s, nil - } - } - } - - var runeTmp [utf8.UTFMax]byte - buf := make([]byte, 0, 3*len(s)/2) // Try to avoid more allocations. - for len(s) > 0 { - // If we're starting a '${}' then let it through un-unquoted. - // Specifically: we don't unquote any characters within the `${}` - // section. - if s[0] == '$' && len(s) > 1 && s[1] == '{' { - buf = append(buf, '$', '{') - s = s[2:] - - // Continue reading until we find the closing brace, copying as-is - braces := 1 - for len(s) > 0 && braces > 0 { - r, size := utf8.DecodeRuneInString(s) - if r == utf8.RuneError { - return "", ErrSyntax - } - - s = s[size:] - - n := utf8.EncodeRune(runeTmp[:], r) - buf = append(buf, runeTmp[:n]...) - - switch r { - case '{': - braces++ - case '}': - braces-- - } - } - if braces != 0 { - return "", ErrSyntax - } - if len(s) == 0 { - // If there's no string left, we're done! - break - } else { - // If there's more left, we need to pop back up to the top of the loop - // in case there's another interpolation in this string. - continue - } - } - - if s[0] == '\n' { - return "", ErrSyntax - } - - c, multibyte, ss, err := unquoteChar(s, quote) - if err != nil { - return "", err - } - s = ss - if c < utf8.RuneSelf || !multibyte { - buf = append(buf, byte(c)) - } else { - n := utf8.EncodeRune(runeTmp[:], c) - buf = append(buf, runeTmp[:n]...) - } - if quote == '\'' && len(s) != 0 { - // single-quoted must be single character - return "", ErrSyntax - } - } - return string(buf), nil -} - -// contains reports whether the string contains the byte c. -func contains(s string, c byte) bool { - for i := 0; i < len(s); i++ { - if s[i] == c { - return true - } - } - return false -} - -func unhex(b byte) (v rune, ok bool) { - c := rune(b) - switch { - case '0' <= c && c <= '9': - return c - '0', true - case 'a' <= c && c <= 'f': - return c - 'a' + 10, true - case 'A' <= c && c <= 'F': - return c - 'A' + 10, true - } - return -} - -func unquoteChar(s string, quote byte) (value rune, multibyte bool, tail string, err error) { - // easy cases - switch c := s[0]; { - case c == quote && (quote == '\'' || quote == '"'): - err = ErrSyntax - return - case c >= utf8.RuneSelf: - r, size := utf8.DecodeRuneInString(s) - return r, true, s[size:], nil - case c != '\\': - return rune(s[0]), false, s[1:], nil - } - - // hard case: c is backslash - if len(s) <= 1 { - err = ErrSyntax - return - } - c := s[1] - s = s[2:] - - switch c { - case 'a': - value = '\a' - case 'b': - value = '\b' - case 'f': - value = '\f' - case 'n': - value = '\n' - case 'r': - value = '\r' - case 't': - value = '\t' - case 'v': - value = '\v' - case 'x', 'u', 'U': - n := 0 - switch c { - case 'x': - n = 2 - case 'u': - n = 4 - case 'U': - n = 8 - } - var v rune - if len(s) < n { - err = ErrSyntax - return - } - for j := 0; j < n; j++ { - x, ok := unhex(s[j]) - if !ok { - err = ErrSyntax - return - } - v = v<<4 | x - } - s = s[n:] - if c == 'x' { - // single-byte string, possibly not UTF-8 - value = v - break - } - if v > utf8.MaxRune { - err = ErrSyntax - return - } - value = v - multibyte = true - case '0', '1', '2', '3', '4', '5', '6', '7': - v := rune(c) - '0' - if len(s) < 2 { - err = ErrSyntax - return - } - for j := 0; j < 2; j++ { // one digit already; two more - x := rune(s[j]) - '0' - if x < 0 || x > 7 { - err = ErrSyntax - return - } - v = (v << 3) | x - } - s = s[2:] - if v > 255 { - err = ErrSyntax - return - } - value = v - case '\\': - value = '\\' - case '\'', '"': - if c != quote { - err = ErrSyntax - return - } - value = rune(c) - default: - err = ErrSyntax - return - } - tail = s - return -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/token/position.go b/vendor/github.com/hashicorp/hcl/hcl/token/position.go deleted file mode 100644 index 59c1bb7..0000000 --- a/vendor/github.com/hashicorp/hcl/hcl/token/position.go +++ /dev/null @@ -1,46 +0,0 @@ -package token - -import "fmt" - -// Pos describes an arbitrary source position -// including the file, line, and column location. -// A Position is valid if the line number is > 0. -type Pos struct { - Filename string // filename, if any - Offset int // offset, starting at 0 - Line int // line number, starting at 1 - Column int // column number, starting at 1 (character count) -} - -// IsValid returns true if the position is valid. -func (p *Pos) IsValid() bool { return p.Line > 0 } - -// String returns a string in one of several forms: -// -// file:line:column valid position with file name -// line:column valid position without file name -// file invalid position with file name -// - invalid position without file name -func (p Pos) String() string { - s := p.Filename - if p.IsValid() { - if s != "" { - s += ":" - } - s += fmt.Sprintf("%d:%d", p.Line, p.Column) - } - if s == "" { - s = "-" - } - return s -} - -// Before reports whether the position p is before u. -func (p Pos) Before(u Pos) bool { - return u.Offset > p.Offset || u.Line > p.Line -} - -// After reports whether the position p is after u. -func (p Pos) After(u Pos) bool { - return u.Offset < p.Offset || u.Line < p.Line -} diff --git a/vendor/github.com/hashicorp/hcl/hcl/token/token.go b/vendor/github.com/hashicorp/hcl/hcl/token/token.go deleted file mode 100644 index e37c066..0000000 --- a/vendor/github.com/hashicorp/hcl/hcl/token/token.go +++ /dev/null @@ -1,219 +0,0 @@ -// Package token defines constants representing the lexical tokens for HCL -// (HashiCorp Configuration Language) -package token - -import ( - "fmt" - "strconv" - "strings" - - hclstrconv "github.com/hashicorp/hcl/hcl/strconv" -) - -// Token defines a single HCL token which can be obtained via the Scanner -type Token struct { - Type Type - Pos Pos - Text string - JSON bool -} - -// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) -type Type int - -const ( - // Special tokens - ILLEGAL Type = iota - EOF - COMMENT - - identifier_beg - IDENT // literals - literal_beg - NUMBER // 12345 - FLOAT // 123.45 - BOOL // true,false - STRING // "abc" - HEREDOC // < 0 { - // Pop the current item - n := len(frontier) - item := frontier[n-1] - frontier = frontier[:n-1] - - switch v := item.Val.(type) { - case *ast.ObjectType: - items, frontier = flattenObjectType(v, item, items, frontier) - case *ast.ListType: - items, frontier = flattenListType(v, item, items, frontier) - default: - items = append(items, item) - } - } - - // Reverse the list since the frontier model runs things backwards - for i := len(items)/2 - 1; i >= 0; i-- { - opp := len(items) - 1 - i - items[i], items[opp] = items[opp], items[i] - } - - // Done! Set the original items - list.Items = items - return n, true - }) -} - -func flattenListType( - ot *ast.ListType, - item *ast.ObjectItem, - items []*ast.ObjectItem, - frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { - // If the list is empty, keep the original list - if len(ot.List) == 0 { - items = append(items, item) - return items, frontier - } - - // All the elements of this object must also be objects! - for _, subitem := range ot.List { - if _, ok := subitem.(*ast.ObjectType); !ok { - items = append(items, item) - return items, frontier - } - } - - // Great! We have a match go through all the items and flatten - for _, elem := range ot.List { - // Add it to the frontier so that we can recurse - frontier = append(frontier, &ast.ObjectItem{ - Keys: item.Keys, - Assign: item.Assign, - Val: elem, - LeadComment: item.LeadComment, - LineComment: item.LineComment, - }) - } - - return items, frontier -} - -func flattenObjectType( - ot *ast.ObjectType, - item *ast.ObjectItem, - items []*ast.ObjectItem, - frontier []*ast.ObjectItem) ([]*ast.ObjectItem, []*ast.ObjectItem) { - // If the list has no items we do not have to flatten anything - if ot.List.Items == nil { - items = append(items, item) - return items, frontier - } - - // All the elements of this object must also be objects! - for _, subitem := range ot.List.Items { - if _, ok := subitem.Val.(*ast.ObjectType); !ok { - items = append(items, item) - return items, frontier - } - } - - // Great! We have a match go through all the items and flatten - for _, subitem := range ot.List.Items { - // Copy the new key - keys := make([]*ast.ObjectKey, len(item.Keys)+len(subitem.Keys)) - copy(keys, item.Keys) - copy(keys[len(item.Keys):], subitem.Keys) - - // Add it to the frontier so that we can recurse - frontier = append(frontier, &ast.ObjectItem{ - Keys: keys, - Assign: item.Assign, - Val: subitem.Val, - LeadComment: item.LeadComment, - LineComment: item.LineComment, - }) - } - - return items, frontier -} diff --git a/vendor/github.com/hashicorp/hcl/json/parser/parser.go b/vendor/github.com/hashicorp/hcl/json/parser/parser.go deleted file mode 100644 index 125a5f0..0000000 --- a/vendor/github.com/hashicorp/hcl/json/parser/parser.go +++ /dev/null @@ -1,313 +0,0 @@ -package parser - -import ( - "errors" - "fmt" - - "github.com/hashicorp/hcl/hcl/ast" - hcltoken "github.com/hashicorp/hcl/hcl/token" - "github.com/hashicorp/hcl/json/scanner" - "github.com/hashicorp/hcl/json/token" -) - -type Parser struct { - sc *scanner.Scanner - - // Last read token - tok token.Token - commaPrev token.Token - - enableTrace bool - indent int - n int // buffer size (max = 1) -} - -func newParser(src []byte) *Parser { - return &Parser{ - sc: scanner.New(src), - } -} - -// Parse returns the fully parsed source and returns the abstract syntax tree. -func Parse(src []byte) (*ast.File, error) { - p := newParser(src) - return p.Parse() -} - -var errEofToken = errors.New("EOF token found") - -// Parse returns the fully parsed source and returns the abstract syntax tree. -func (p *Parser) Parse() (*ast.File, error) { - f := &ast.File{} - var err, scerr error - p.sc.Error = func(pos token.Pos, msg string) { - scerr = fmt.Errorf("%s: %s", pos, msg) - } - - // The root must be an object in JSON - object, err := p.object() - if scerr != nil { - return nil, scerr - } - if err != nil { - return nil, err - } - - // We make our final node an object list so it is more HCL compatible - f.Node = object.List - - // Flatten it, which finds patterns and turns them into more HCL-like - // AST trees. - flattenObjects(f.Node) - - return f, nil -} - -func (p *Parser) objectList() (*ast.ObjectList, error) { - defer un(trace(p, "ParseObjectList")) - node := &ast.ObjectList{} - - for { - n, err := p.objectItem() - if err == errEofToken { - break // we are finished - } - - // we don't return a nil node, because might want to use already - // collected items. - if err != nil { - return node, err - } - - node.Add(n) - - // Check for a followup comma. If it isn't a comma, then we're done - if tok := p.scan(); tok.Type != token.COMMA { - break - } - } - - return node, nil -} - -// objectItem parses a single object item -func (p *Parser) objectItem() (*ast.ObjectItem, error) { - defer un(trace(p, "ParseObjectItem")) - - keys, err := p.objectKey() - if err != nil { - return nil, err - } - - o := &ast.ObjectItem{ - Keys: keys, - } - - switch p.tok.Type { - case token.COLON: - pos := p.tok.Pos - o.Assign = hcltoken.Pos{ - Filename: pos.Filename, - Offset: pos.Offset, - Line: pos.Line, - Column: pos.Column, - } - - o.Val, err = p.objectValue() - if err != nil { - return nil, err - } - } - - return o, nil -} - -// objectKey parses an object key and returns a ObjectKey AST -func (p *Parser) objectKey() ([]*ast.ObjectKey, error) { - keyCount := 0 - keys := make([]*ast.ObjectKey, 0) - - for { - tok := p.scan() - switch tok.Type { - case token.EOF: - return nil, errEofToken - case token.STRING: - keyCount++ - keys = append(keys, &ast.ObjectKey{ - Token: p.tok.HCLToken(), - }) - case token.COLON: - // If we have a zero keycount it means that we never got - // an object key, i.e. `{ :`. This is a syntax error. - if keyCount == 0 { - return nil, fmt.Errorf("expected: STRING got: %s", p.tok.Type) - } - - // Done - return keys, nil - case token.ILLEGAL: - return nil, errors.New("illegal") - default: - return nil, fmt.Errorf("expected: STRING got: %s", p.tok.Type) - } - } -} - -// object parses any type of object, such as number, bool, string, object or -// list. -func (p *Parser) objectValue() (ast.Node, error) { - defer un(trace(p, "ParseObjectValue")) - tok := p.scan() - - switch tok.Type { - case token.NUMBER, token.FLOAT, token.BOOL, token.NULL, token.STRING: - return p.literalType() - case token.LBRACE: - return p.objectType() - case token.LBRACK: - return p.listType() - case token.EOF: - return nil, errEofToken - } - - return nil, fmt.Errorf("Expected object value, got unknown token: %+v", tok) -} - -// object parses any type of object, such as number, bool, string, object or -// list. -func (p *Parser) object() (*ast.ObjectType, error) { - defer un(trace(p, "ParseType")) - tok := p.scan() - - switch tok.Type { - case token.LBRACE: - return p.objectType() - case token.EOF: - return nil, errEofToken - } - - return nil, fmt.Errorf("Expected object, got unknown token: %+v", tok) -} - -// objectType parses an object type and returns a ObjectType AST -func (p *Parser) objectType() (*ast.ObjectType, error) { - defer un(trace(p, "ParseObjectType")) - - // we assume that the currently scanned token is a LBRACE - o := &ast.ObjectType{} - - l, err := p.objectList() - - // if we hit RBRACE, we are good to go (means we parsed all Items), if it's - // not a RBRACE, it's an syntax error and we just return it. - if err != nil && p.tok.Type != token.RBRACE { - return nil, err - } - - o.List = l - return o, nil -} - -// listType parses a list type and returns a ListType AST -func (p *Parser) listType() (*ast.ListType, error) { - defer un(trace(p, "ParseListType")) - - // we assume that the currently scanned token is a LBRACK - l := &ast.ListType{} - - for { - tok := p.scan() - switch tok.Type { - case token.NUMBER, token.FLOAT, token.STRING: - node, err := p.literalType() - if err != nil { - return nil, err - } - - l.Add(node) - case token.COMMA: - continue - case token.LBRACE: - node, err := p.objectType() - if err != nil { - return nil, err - } - - l.Add(node) - case token.BOOL: - // TODO(arslan) should we support? not supported by HCL yet - case token.LBRACK: - // TODO(arslan) should we support nested lists? Even though it's - // written in README of HCL, it's not a part of the grammar - // (not defined in parse.y) - case token.RBRACK: - // finished - return l, nil - default: - return nil, fmt.Errorf("unexpected token while parsing list: %s", tok.Type) - } - - } -} - -// literalType parses a literal type and returns a LiteralType AST -func (p *Parser) literalType() (*ast.LiteralType, error) { - defer un(trace(p, "ParseLiteral")) - - return &ast.LiteralType{ - Token: p.tok.HCLToken(), - }, nil -} - -// scan returns the next token from the underlying scanner. If a token has -// been unscanned then read that instead. -func (p *Parser) scan() token.Token { - // If we have a token on the buffer, then return it. - if p.n != 0 { - p.n = 0 - return p.tok - } - - p.tok = p.sc.Scan() - return p.tok -} - -// unscan pushes the previously read token back onto the buffer. -func (p *Parser) unscan() { - p.n = 1 -} - -// ---------------------------------------------------------------------------- -// Parsing support - -func (p *Parser) printTrace(a ...interface{}) { - if !p.enableTrace { - return - } - - const dots = ". . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . " - const n = len(dots) - fmt.Printf("%5d:%3d: ", p.tok.Pos.Line, p.tok.Pos.Column) - - i := 2 * p.indent - for i > n { - fmt.Print(dots) - i -= n - } - // i <= n - fmt.Print(dots[0:i]) - fmt.Println(a...) -} - -func trace(p *Parser, msg string) *Parser { - p.printTrace(msg, "(") - p.indent++ - return p -} - -// Usage pattern: defer un(trace(p, "...")) -func un(p *Parser) { - p.indent-- - p.printTrace(")") -} diff --git a/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go b/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go deleted file mode 100644 index fe3f0f0..0000000 --- a/vendor/github.com/hashicorp/hcl/json/scanner/scanner.go +++ /dev/null @@ -1,451 +0,0 @@ -package scanner - -import ( - "bytes" - "fmt" - "os" - "unicode" - "unicode/utf8" - - "github.com/hashicorp/hcl/json/token" -) - -// eof represents a marker rune for the end of the reader. -const eof = rune(0) - -// Scanner defines a lexical scanner -type Scanner struct { - buf *bytes.Buffer // Source buffer for advancing and scanning - src []byte // Source buffer for immutable access - - // Source Position - srcPos token.Pos // current position - prevPos token.Pos // previous position, used for peek() method - - lastCharLen int // length of last character in bytes - lastLineLen int // length of last line in characters (for correct column reporting) - - tokStart int // token text start position - tokEnd int // token text end position - - // Error is called for each error encountered. If no Error - // function is set, the error is reported to os.Stderr. - Error func(pos token.Pos, msg string) - - // ErrorCount is incremented by one for each error encountered. - ErrorCount int - - // tokPos is the start position of most recently scanned token; set by - // Scan. The Filename field is always left untouched by the Scanner. If - // an error is reported (via Error) and Position is invalid, the scanner is - // not inside a token. - tokPos token.Pos -} - -// New creates and initializes a new instance of Scanner using src as -// its source content. -func New(src []byte) *Scanner { - // even though we accept a src, we read from a io.Reader compatible type - // (*bytes.Buffer). So in the future we might easily change it to streaming - // read. - b := bytes.NewBuffer(src) - s := &Scanner{ - buf: b, - src: src, - } - - // srcPosition always starts with 1 - s.srcPos.Line = 1 - return s -} - -// next reads the next rune from the bufferred reader. Returns the rune(0) if -// an error occurs (or io.EOF is returned). -func (s *Scanner) next() rune { - ch, size, err := s.buf.ReadRune() - if err != nil { - // advance for error reporting - s.srcPos.Column++ - s.srcPos.Offset += size - s.lastCharLen = size - return eof - } - - if ch == utf8.RuneError && size == 1 { - s.srcPos.Column++ - s.srcPos.Offset += size - s.lastCharLen = size - s.err("illegal UTF-8 encoding") - return ch - } - - // remember last position - s.prevPos = s.srcPos - - s.srcPos.Column++ - s.lastCharLen = size - s.srcPos.Offset += size - - if ch == '\n' { - s.srcPos.Line++ - s.lastLineLen = s.srcPos.Column - s.srcPos.Column = 0 - } - - // debug - // fmt.Printf("ch: %q, offset:column: %d:%d\n", ch, s.srcPos.Offset, s.srcPos.Column) - return ch -} - -// unread unreads the previous read Rune and updates the source position -func (s *Scanner) unread() { - if err := s.buf.UnreadRune(); err != nil { - panic(err) // this is user fault, we should catch it - } - s.srcPos = s.prevPos // put back last position -} - -// peek returns the next rune without advancing the reader. -func (s *Scanner) peek() rune { - peek, _, err := s.buf.ReadRune() - if err != nil { - return eof - } - - s.buf.UnreadRune() - return peek -} - -// Scan scans the next token and returns the token. -func (s *Scanner) Scan() token.Token { - ch := s.next() - - // skip white space - for isWhitespace(ch) { - ch = s.next() - } - - var tok token.Type - - // token text markings - s.tokStart = s.srcPos.Offset - s.lastCharLen - - // token position, initial next() is moving the offset by one(size of rune - // actually), though we are interested with the starting point - s.tokPos.Offset = s.srcPos.Offset - s.lastCharLen - if s.srcPos.Column > 0 { - // common case: last character was not a '\n' - s.tokPos.Line = s.srcPos.Line - s.tokPos.Column = s.srcPos.Column - } else { - // last character was a '\n' - // (we cannot be at the beginning of the source - // since we have called next() at least once) - s.tokPos.Line = s.srcPos.Line - 1 - s.tokPos.Column = s.lastLineLen - } - - switch { - case isLetter(ch): - lit := s.scanIdentifier() - if lit == "true" || lit == "false" { - tok = token.BOOL - } else if lit == "null" { - tok = token.NULL - } else { - s.err("illegal char") - } - case isDecimal(ch): - tok = s.scanNumber(ch) - default: - switch ch { - case eof: - tok = token.EOF - case '"': - tok = token.STRING - s.scanString() - case '.': - tok = token.PERIOD - ch = s.peek() - if isDecimal(ch) { - tok = token.FLOAT - ch = s.scanMantissa(ch) - ch = s.scanExponent(ch) - } - case '[': - tok = token.LBRACK - case ']': - tok = token.RBRACK - case '{': - tok = token.LBRACE - case '}': - tok = token.RBRACE - case ',': - tok = token.COMMA - case ':': - tok = token.COLON - case '-': - if isDecimal(s.peek()) { - ch := s.next() - tok = s.scanNumber(ch) - } else { - s.err("illegal char") - } - default: - s.err("illegal char: " + string(ch)) - } - } - - // finish token ending - s.tokEnd = s.srcPos.Offset - - // create token literal - var tokenText string - if s.tokStart >= 0 { - tokenText = string(s.src[s.tokStart:s.tokEnd]) - } - s.tokStart = s.tokEnd // ensure idempotency of tokenText() call - - return token.Token{ - Type: tok, - Pos: s.tokPos, - Text: tokenText, - } -} - -// scanNumber scans a HCL number definition starting with the given rune -func (s *Scanner) scanNumber(ch rune) token.Type { - zero := ch == '0' - pos := s.srcPos - - s.scanMantissa(ch) - ch = s.next() // seek forward - if ch == 'e' || ch == 'E' { - ch = s.scanExponent(ch) - return token.FLOAT - } - - if ch == '.' { - ch = s.scanFraction(ch) - if ch == 'e' || ch == 'E' { - ch = s.next() - ch = s.scanExponent(ch) - } - return token.FLOAT - } - - if ch != eof { - s.unread() - } - - // If we have a larger number and this is zero, error - if zero && pos != s.srcPos { - s.err("numbers cannot start with 0") - } - - return token.NUMBER -} - -// scanMantissa scans the mantissa beginning from the rune. It returns the next -// non decimal rune. It's used to determine wheter it's a fraction or exponent. -func (s *Scanner) scanMantissa(ch rune) rune { - scanned := false - for isDecimal(ch) { - ch = s.next() - scanned = true - } - - if scanned && ch != eof { - s.unread() - } - return ch -} - -// scanFraction scans the fraction after the '.' rune -func (s *Scanner) scanFraction(ch rune) rune { - if ch == '.' { - ch = s.peek() // we peek just to see if we can move forward - ch = s.scanMantissa(ch) - } - return ch -} - -// scanExponent scans the remaining parts of an exponent after the 'e' or 'E' -// rune. -func (s *Scanner) scanExponent(ch rune) rune { - if ch == 'e' || ch == 'E' { - ch = s.next() - if ch == '-' || ch == '+' { - ch = s.next() - } - ch = s.scanMantissa(ch) - } - return ch -} - -// scanString scans a quoted string -func (s *Scanner) scanString() { - braces := 0 - for { - // '"' opening already consumed - // read character after quote - ch := s.next() - - if ch == '\n' || ch < 0 || ch == eof { - s.err("literal not terminated") - return - } - - if ch == '"' { - break - } - - // If we're going into a ${} then we can ignore quotes for awhile - if braces == 0 && ch == '$' && s.peek() == '{' { - braces++ - s.next() - } else if braces > 0 && ch == '{' { - braces++ - } - if braces > 0 && ch == '}' { - braces-- - } - - if ch == '\\' { - s.scanEscape() - } - } - - return -} - -// scanEscape scans an escape sequence -func (s *Scanner) scanEscape() rune { - // http://en.cppreference.com/w/cpp/language/escape - ch := s.next() // read character after '/' - switch ch { - case 'a', 'b', 'f', 'n', 'r', 't', 'v', '\\', '"': - // nothing to do - case '0', '1', '2', '3', '4', '5', '6', '7': - // octal notation - ch = s.scanDigits(ch, 8, 3) - case 'x': - // hexademical notation - ch = s.scanDigits(s.next(), 16, 2) - case 'u': - // universal character name - ch = s.scanDigits(s.next(), 16, 4) - case 'U': - // universal character name - ch = s.scanDigits(s.next(), 16, 8) - default: - s.err("illegal char escape") - } - return ch -} - -// scanDigits scans a rune with the given base for n times. For example an -// octal notation \184 would yield in scanDigits(ch, 8, 3) -func (s *Scanner) scanDigits(ch rune, base, n int) rune { - for n > 0 && digitVal(ch) < base { - ch = s.next() - n-- - } - if n > 0 { - s.err("illegal char escape") - } - - // we scanned all digits, put the last non digit char back - s.unread() - return ch -} - -// scanIdentifier scans an identifier and returns the literal string -func (s *Scanner) scanIdentifier() string { - offs := s.srcPos.Offset - s.lastCharLen - ch := s.next() - for isLetter(ch) || isDigit(ch) || ch == '-' { - ch = s.next() - } - - if ch != eof { - s.unread() // we got identifier, put back latest char - } - - return string(s.src[offs:s.srcPos.Offset]) -} - -// recentPosition returns the position of the character immediately after the -// character or token returned by the last call to Scan. -func (s *Scanner) recentPosition() (pos token.Pos) { - pos.Offset = s.srcPos.Offset - s.lastCharLen - switch { - case s.srcPos.Column > 0: - // common case: last character was not a '\n' - pos.Line = s.srcPos.Line - pos.Column = s.srcPos.Column - case s.lastLineLen > 0: - // last character was a '\n' - // (we cannot be at the beginning of the source - // since we have called next() at least once) - pos.Line = s.srcPos.Line - 1 - pos.Column = s.lastLineLen - default: - // at the beginning of the source - pos.Line = 1 - pos.Column = 1 - } - return -} - -// err prints the error of any scanning to s.Error function. If the function is -// not defined, by default it prints them to os.Stderr -func (s *Scanner) err(msg string) { - s.ErrorCount++ - pos := s.recentPosition() - - if s.Error != nil { - s.Error(pos, msg) - return - } - - fmt.Fprintf(os.Stderr, "%s: %s\n", pos, msg) -} - -// isHexadecimal returns true if the given rune is a letter -func isLetter(ch rune) bool { - return 'a' <= ch && ch <= 'z' || 'A' <= ch && ch <= 'Z' || ch == '_' || ch >= 0x80 && unicode.IsLetter(ch) -} - -// isHexadecimal returns true if the given rune is a decimal digit -func isDigit(ch rune) bool { - return '0' <= ch && ch <= '9' || ch >= 0x80 && unicode.IsDigit(ch) -} - -// isHexadecimal returns true if the given rune is a decimal number -func isDecimal(ch rune) bool { - return '0' <= ch && ch <= '9' -} - -// isHexadecimal returns true if the given rune is an hexadecimal number -func isHexadecimal(ch rune) bool { - return '0' <= ch && ch <= '9' || 'a' <= ch && ch <= 'f' || 'A' <= ch && ch <= 'F' -} - -// isWhitespace returns true if the rune is a space, tab, newline or carriage return -func isWhitespace(ch rune) bool { - return ch == ' ' || ch == '\t' || ch == '\n' || ch == '\r' -} - -// digitVal returns the integer value of a given octal,decimal or hexadecimal rune -func digitVal(ch rune) int { - switch { - case '0' <= ch && ch <= '9': - return int(ch - '0') - case 'a' <= ch && ch <= 'f': - return int(ch - 'a' + 10) - case 'A' <= ch && ch <= 'F': - return int(ch - 'A' + 10) - } - return 16 // larger than any legal digit val -} diff --git a/vendor/github.com/hashicorp/hcl/json/token/position.go b/vendor/github.com/hashicorp/hcl/json/token/position.go deleted file mode 100644 index 59c1bb7..0000000 --- a/vendor/github.com/hashicorp/hcl/json/token/position.go +++ /dev/null @@ -1,46 +0,0 @@ -package token - -import "fmt" - -// Pos describes an arbitrary source position -// including the file, line, and column location. -// A Position is valid if the line number is > 0. -type Pos struct { - Filename string // filename, if any - Offset int // offset, starting at 0 - Line int // line number, starting at 1 - Column int // column number, starting at 1 (character count) -} - -// IsValid returns true if the position is valid. -func (p *Pos) IsValid() bool { return p.Line > 0 } - -// String returns a string in one of several forms: -// -// file:line:column valid position with file name -// line:column valid position without file name -// file invalid position with file name -// - invalid position without file name -func (p Pos) String() string { - s := p.Filename - if p.IsValid() { - if s != "" { - s += ":" - } - s += fmt.Sprintf("%d:%d", p.Line, p.Column) - } - if s == "" { - s = "-" - } - return s -} - -// Before reports whether the position p is before u. -func (p Pos) Before(u Pos) bool { - return u.Offset > p.Offset || u.Line > p.Line -} - -// After reports whether the position p is after u. -func (p Pos) After(u Pos) bool { - return u.Offset < p.Offset || u.Line < p.Line -} diff --git a/vendor/github.com/hashicorp/hcl/json/token/token.go b/vendor/github.com/hashicorp/hcl/json/token/token.go deleted file mode 100644 index 95a0c3e..0000000 --- a/vendor/github.com/hashicorp/hcl/json/token/token.go +++ /dev/null @@ -1,118 +0,0 @@ -package token - -import ( - "fmt" - "strconv" - - hcltoken "github.com/hashicorp/hcl/hcl/token" -) - -// Token defines a single HCL token which can be obtained via the Scanner -type Token struct { - Type Type - Pos Pos - Text string -} - -// Type is the set of lexical tokens of the HCL (HashiCorp Configuration Language) -type Type int - -const ( - // Special tokens - ILLEGAL Type = iota - EOF - - identifier_beg - literal_beg - NUMBER // 12345 - FLOAT // 123.45 - BOOL // true,false - STRING // "abc" - NULL // null - literal_end - identifier_end - - operator_beg - LBRACK // [ - LBRACE // { - COMMA // , - PERIOD // . - COLON // : - - RBRACK // ] - RBRACE // } - - operator_end -) - -var tokens = [...]string{ - ILLEGAL: "ILLEGAL", - - EOF: "EOF", - - NUMBER: "NUMBER", - FLOAT: "FLOAT", - BOOL: "BOOL", - STRING: "STRING", - NULL: "NULL", - - LBRACK: "LBRACK", - LBRACE: "LBRACE", - COMMA: "COMMA", - PERIOD: "PERIOD", - COLON: "COLON", - - RBRACK: "RBRACK", - RBRACE: "RBRACE", -} - -// String returns the string corresponding to the token tok. -func (t Type) String() string { - s := "" - if 0 <= t && t < Type(len(tokens)) { - s = tokens[t] - } - if s == "" { - s = "token(" + strconv.Itoa(int(t)) + ")" - } - return s -} - -// IsIdentifier returns true for tokens corresponding to identifiers and basic -// type literals; it returns false otherwise. -func (t Type) IsIdentifier() bool { return identifier_beg < t && t < identifier_end } - -// IsLiteral returns true for tokens corresponding to basic type literals; it -// returns false otherwise. -func (t Type) IsLiteral() bool { return literal_beg < t && t < literal_end } - -// IsOperator returns true for tokens corresponding to operators and -// delimiters; it returns false otherwise. -func (t Type) IsOperator() bool { return operator_beg < t && t < operator_end } - -// String returns the token's literal text. Note that this is only -// applicable for certain token types, such as token.IDENT, -// token.STRING, etc.. -func (t Token) String() string { - return fmt.Sprintf("%s %s %s", t.Pos.String(), t.Type.String(), t.Text) -} - -// HCLToken converts this token to an HCL token. -// -// The token type must be a literal type or this will panic. -func (t Token) HCLToken() hcltoken.Token { - switch t.Type { - case BOOL: - return hcltoken.Token{Type: hcltoken.BOOL, Text: t.Text} - case FLOAT: - return hcltoken.Token{Type: hcltoken.FLOAT, Text: t.Text} - case NULL: - return hcltoken.Token{Type: hcltoken.STRING, Text: ""} - case NUMBER: - return hcltoken.Token{Type: hcltoken.NUMBER, Text: t.Text} - case STRING: - return hcltoken.Token{Type: hcltoken.STRING, Text: t.Text, JSON: true} - default: - panic(fmt.Sprintf("unimplemented HCLToken for type: %s", t.Type)) - } -} diff --git a/vendor/github.com/hashicorp/hcl/lex.go b/vendor/github.com/hashicorp/hcl/lex.go deleted file mode 100644 index d9993c2..0000000 --- a/vendor/github.com/hashicorp/hcl/lex.go +++ /dev/null @@ -1,38 +0,0 @@ -package hcl - -import ( - "unicode" - "unicode/utf8" -) - -type lexModeValue byte - -const ( - lexModeUnknown lexModeValue = iota - lexModeHcl - lexModeJson -) - -// lexMode returns whether we're going to be parsing in JSON -// mode or HCL mode. -func lexMode(v []byte) lexModeValue { - var ( - r rune - w int - offset int - ) - - for { - r, w = utf8.DecodeRune(v[offset:]) - offset += w - if unicode.IsSpace(r) { - continue - } - if r == '{' { - return lexModeJson - } - break - } - - return lexModeHcl -} diff --git a/vendor/github.com/hashicorp/hcl/parse.go b/vendor/github.com/hashicorp/hcl/parse.go deleted file mode 100644 index 1fca53c..0000000 --- a/vendor/github.com/hashicorp/hcl/parse.go +++ /dev/null @@ -1,39 +0,0 @@ -package hcl - -import ( - "fmt" - - "github.com/hashicorp/hcl/hcl/ast" - hclParser "github.com/hashicorp/hcl/hcl/parser" - jsonParser "github.com/hashicorp/hcl/json/parser" -) - -// ParseBytes accepts as input byte slice and returns ast tree. -// -// Input can be either JSON or HCL -func ParseBytes(in []byte) (*ast.File, error) { - return parse(in) -} - -// ParseString accepts input as a string and returns ast tree. -func ParseString(input string) (*ast.File, error) { - return parse([]byte(input)) -} - -func parse(in []byte) (*ast.File, error) { - switch lexMode(in) { - case lexModeHcl: - return hclParser.Parse(in) - case lexModeJson: - return jsonParser.Parse(in) - } - - return nil, fmt.Errorf("unknown config format") -} - -// Parse parses the given input and returns the root object. -// -// The input format can be either HCL or JSON. -func Parse(input string) (*ast.File, error) { - return parse([]byte(input)) -} diff --git a/vendor/github.com/imdario/mergo/.gitignore b/vendor/github.com/imdario/mergo/.gitignore deleted file mode 100644 index 529c341..0000000 --- a/vendor/github.com/imdario/mergo/.gitignore +++ /dev/null @@ -1,33 +0,0 @@ -#### joe made this: http://goel.io/joe - -#### go #### -# Binaries for programs and plugins -*.exe -*.dll -*.so -*.dylib - -# Test binary, build with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 -.glide/ - -#### vim #### -# Swap -[._]*.s[a-v][a-z] -[._]*.sw[a-p] -[._]s[a-v][a-z] -[._]sw[a-p] - -# Session -Session.vim - -# Temporary -.netrwhist -*~ -# Auto-generated tag files -tags diff --git a/vendor/github.com/imdario/mergo/.travis.yml b/vendor/github.com/imdario/mergo/.travis.yml deleted file mode 100644 index b13a50e..0000000 --- a/vendor/github.com/imdario/mergo/.travis.yml +++ /dev/null @@ -1,7 +0,0 @@ -language: go -install: - - go get -t - - go get golang.org/x/tools/cmd/cover - - go get github.com/mattn/goveralls -script: - - $HOME/gopath/bin/goveralls -service=travis-ci -repotoken $COVERALLS_TOKEN diff --git a/vendor/github.com/imdario/mergo/CODE_OF_CONDUCT.md b/vendor/github.com/imdario/mergo/CODE_OF_CONDUCT.md deleted file mode 100644 index 469b449..0000000 --- a/vendor/github.com/imdario/mergo/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,46 +0,0 @@ -# Contributor Covenant Code of Conduct - -## Our Pledge - -In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. - -## Our Standards - -Examples of behavior that contributes to creating a positive environment include: - -* Using welcoming and inclusive language -* Being respectful of differing viewpoints and experiences -* Gracefully accepting constructive criticism -* Focusing on what is best for the community -* Showing empathy towards other community members - -Examples of unacceptable behavior by participants include: - -* The use of sexualized language or imagery and unwelcome sexual attention or advances -* Trolling, insulting/derogatory comments, and personal or political attacks -* Public or private harassment -* Publishing others' private information, such as a physical or electronic address, without explicit permission -* Other conduct which could reasonably be considered inappropriate in a professional setting - -## Our Responsibilities - -Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. - -Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. - -## Scope - -This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. - -## Enforcement - -Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at i@dario.im. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. - -Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. - -## Attribution - -This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] - -[homepage]: http://contributor-covenant.org -[version]: http://contributor-covenant.org/version/1/4/ diff --git a/vendor/github.com/imdario/mergo/LICENSE b/vendor/github.com/imdario/mergo/LICENSE deleted file mode 100644 index 6866802..0000000 --- a/vendor/github.com/imdario/mergo/LICENSE +++ /dev/null @@ -1,28 +0,0 @@ -Copyright (c) 2013 Dario Castañé. All rights reserved. -Copyright (c) 2012 The Go Authors. All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. diff --git a/vendor/github.com/imdario/mergo/README.md b/vendor/github.com/imdario/mergo/README.md deleted file mode 100644 index d1cefa8..0000000 --- a/vendor/github.com/imdario/mergo/README.md +++ /dev/null @@ -1,222 +0,0 @@ -# Mergo - -A helper to merge structs and maps in Golang. Useful for configuration default values, avoiding messy if-statements. - -Also a lovely [comune](http://en.wikipedia.org/wiki/Mergo) (municipality) in the Province of Ancona in the Italian region of Marche. - -## Status - -It is ready for production use. [It is used in several projects by Docker, Google, The Linux Foundation, VMWare, Shopify, etc](https://github.com/imdario/mergo#mergo-in-the-wild). - -[![GoDoc][3]][4] -[![GoCard][5]][6] -[![Build Status][1]][2] -[![Coverage Status][7]][8] -[![Sourcegraph][9]][10] - -[1]: https://travis-ci.org/imdario/mergo.png -[2]: https://travis-ci.org/imdario/mergo -[3]: https://godoc.org/github.com/imdario/mergo?status.svg -[4]: https://godoc.org/github.com/imdario/mergo -[5]: https://goreportcard.com/badge/imdario/mergo -[6]: https://goreportcard.com/report/github.com/imdario/mergo -[7]: https://coveralls.io/repos/github/imdario/mergo/badge.svg?branch=master -[8]: https://coveralls.io/github/imdario/mergo?branch=master -[9]: https://sourcegraph.com/github.com/imdario/mergo/-/badge.svg -[10]: https://sourcegraph.com/github.com/imdario/mergo?badge - -### Latest release - -[Release v0.3.4](https://github.com/imdario/mergo/releases/tag/v0.3.4). - -### Important note - -Please keep in mind that in [0.3.2](//github.com/imdario/mergo/releases/tag/0.3.2) Mergo changed `Merge()`and `Map()` signatures to support [transformers](#transformers). An optional/variadic argument has been added, so it won't break existing code. - -If you were using Mergo **before** April 6th 2015, please check your project works as intended after updating your local copy with ```go get -u github.com/imdario/mergo```. I apologize for any issue caused by its previous behavior and any future bug that Mergo could cause (I hope it won't!) in existing projects after the change (release 0.2.0). - -### Donations - -If Mergo is useful to you, consider buying me a coffee, a beer or making a monthly donation so I can keep building great free software. :heart_eyes: - -
Buy Me a Coffee at ko-fi.com -[![Beerpay](https://beerpay.io/imdario/mergo/badge.svg)](https://beerpay.io/imdario/mergo) -[![Beerpay](https://beerpay.io/imdario/mergo/make-wish.svg)](https://beerpay.io/imdario/mergo) -Donate using Liberapay - -### Mergo in the wild - -- [moby/moby](https://github.com/moby/moby) -- [kubernetes/kubernetes](https://github.com/kubernetes/kubernetes) -- [vmware/dispatch](https://github.com/vmware/dispatch) -- [Shopify/themekit](https://github.com/Shopify/themekit) -- [imdario/zas](https://github.com/imdario/zas) -- [matcornic/hermes](https://github.com/matcornic/hermes) -- [OpenBazaar/openbazaar-go](https://github.com/OpenBazaar/openbazaar-go) -- [kataras/iris](https://github.com/kataras/iris) -- [michaelsauter/crane](https://github.com/michaelsauter/crane) -- [go-task/task](https://github.com/go-task/task) -- [sensu/uchiwa](https://github.com/sensu/uchiwa) -- [ory/hydra](https://github.com/ory/hydra) -- [sisatech/vcli](https://github.com/sisatech/vcli) -- [dairycart/dairycart](https://github.com/dairycart/dairycart) -- [projectcalico/felix](https://github.com/projectcalico/felix) -- [resin-os/balena](https://github.com/resin-os/balena) -- [go-kivik/kivik](https://github.com/go-kivik/kivik) -- [Telefonica/govice](https://github.com/Telefonica/govice) -- [supergiant/supergiant](supergiant/supergiant) -- [SergeyTsalkov/brooce](https://github.com/SergeyTsalkov/brooce) -- [soniah/dnsmadeeasy](https://github.com/soniah/dnsmadeeasy) -- [ohsu-comp-bio/funnel](https://github.com/ohsu-comp-bio/funnel) -- [EagerIO/Stout](https://github.com/EagerIO/Stout) -- [lynndylanhurley/defsynth-api](https://github.com/lynndylanhurley/defsynth-api) -- [russross/canvasassignments](https://github.com/russross/canvasassignments) -- [rdegges/cryptly-api](https://github.com/rdegges/cryptly-api) -- [casualjim/exeggutor](https://github.com/casualjim/exeggutor) -- [divshot/gitling](https://github.com/divshot/gitling) -- [RWJMurphy/gorl](https://github.com/RWJMurphy/gorl) -- [andrerocker/deploy42](https://github.com/andrerocker/deploy42) -- [elwinar/rambler](https://github.com/elwinar/rambler) -- [tmaiaroto/gopartman](https://github.com/tmaiaroto/gopartman) -- [jfbus/impressionist](https://github.com/jfbus/impressionist) -- [Jmeyering/zealot](https://github.com/Jmeyering/zealot) -- [godep-migrator/rigger-host](https://github.com/godep-migrator/rigger-host) -- [Dronevery/MultiwaySwitch-Go](https://github.com/Dronevery/MultiwaySwitch-Go) -- [thoas/picfit](https://github.com/thoas/picfit) -- [mantasmatelis/whooplist-server](https://github.com/mantasmatelis/whooplist-server) -- [jnuthong/item_search](https://github.com/jnuthong/item_search) -- [bukalapak/snowboard](https://github.com/bukalapak/snowboard) - -## Installation - - go get github.com/imdario/mergo - - // use in your .go code - import ( - "github.com/imdario/mergo" - ) - -## Usage - -You can only merge same-type structs with exported fields initialized as zero value of their type and same-types maps. Mergo won't merge unexported (private) fields but will do recursively any exported one. It won't merge empty structs value as [they are not considered zero values](https://golang.org/ref/spec#The_zero_value) either. Also maps will be merged recursively except for structs inside maps (because they are not addressable using Go reflection). - -```go -if err := mergo.Merge(&dst, src); err != nil { - // ... -} -``` - -Also, you can merge overwriting values using the transformer `WithOverride`. - -```go -if err := mergo.Merge(&dst, src, mergo.WithOverride); err != nil { - // ... -} -``` - -Additionally, you can map a `map[string]interface{}` to a struct (and otherwise, from struct to map), following the same restrictions as in `Merge()`. Keys are capitalized to find each corresponding exported field. - -```go -if err := mergo.Map(&dst, srcMap); err != nil { - // ... -} -``` - -Warning: if you map a struct to map, it won't do it recursively. Don't expect Mergo to map struct members of your struct as `map[string]interface{}`. They will be just assigned as values. - -More information and examples in [godoc documentation](http://godoc.org/github.com/imdario/mergo). - -### Nice example - -```go -package main - -import ( - "fmt" - "github.com/imdario/mergo" -) - -type Foo struct { - A string - B int64 -} - -func main() { - src := Foo{ - A: "one", - B: 2, - } - dest := Foo{ - A: "two", - } - mergo.Merge(&dest, src) - fmt.Println(dest) - // Will print - // {two 2} -} -``` - -Note: if test are failing due missing package, please execute: - - go get gopkg.in/yaml.v2 - -### Transformers - -Transformers allow to merge specific types differently than in the default behavior. In other words, now you can customize how some types are merged. For example, `time.Time` is a struct; it doesn't have zero value but IsZero can return true because it has fields with zero value. How can we merge a non-zero `time.Time`? - -```go -package main - -import ( - "fmt" - "github.com/imdario/mergo" - "reflect" - "time" -) - -type timeTransfomer struct { -} - -func (t timeTransfomer) Transformer(typ reflect.Type) func(dst, src reflect.Value) error { - if typ == reflect.TypeOf(time.Time{}) { - return func(dst, src reflect.Value) error { - if dst.CanSet() { - isZero := dst.MethodByName("IsZero") - result := isZero.Call([]reflect.Value{}) - if result[0].Bool() { - dst.Set(src) - } - } - return nil - } - } - return nil -} - -type Snapshot struct { - Time time.Time - // ... -} - -func main() { - src := Snapshot{time.Now()} - dest := Snapshot{} - mergo.Merge(&dest, src, mergo.WithTransformers(timeTransfomer{})) - fmt.Println(dest) - // Will print - // { 2018-01-12 01:15:00 +0000 UTC m=+0.000000001 } -} -``` - - -## Contact me - -If I can help you, you have an idea or you are using Mergo in your projects, don't hesitate to drop me a line (or a pull request): [@im_dario](https://twitter.com/im_dario) - -## About - -Written by [Dario Castañé](http://dario.im). - -## License - -[BSD 3-Clause](http://opensource.org/licenses/BSD-3-Clause) license, as [Go language](http://golang.org/LICENSE). diff --git a/vendor/github.com/imdario/mergo/doc.go b/vendor/github.com/imdario/mergo/doc.go deleted file mode 100644 index 6e9aa7b..0000000 --- a/vendor/github.com/imdario/mergo/doc.go +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright 2013 Dario Castañé. All rights reserved. -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -/* -Package mergo merges same-type structs and maps by setting default values in zero-value fields. - -Mergo won't merge unexported (private) fields but will do recursively any exported one. It also won't merge structs inside maps (because they are not addressable using Go reflection). - -Usage - -From my own work-in-progress project: - - type networkConfig struct { - Protocol string - Address string - ServerType string `json: "server_type"` - Port uint16 - } - - type FssnConfig struct { - Network networkConfig - } - - var fssnDefault = FssnConfig { - networkConfig { - "tcp", - "127.0.0.1", - "http", - 31560, - }, - } - - // Inside a function [...] - - if err := mergo.Merge(&config, fssnDefault); err != nil { - log.Fatal(err) - } - - // More code [...] - -*/ -package mergo diff --git a/vendor/github.com/imdario/mergo/map.go b/vendor/github.com/imdario/mergo/map.go deleted file mode 100644 index 6ea38e6..0000000 --- a/vendor/github.com/imdario/mergo/map.go +++ /dev/null @@ -1,174 +0,0 @@ -// Copyright 2014 Dario Castañé. All rights reserved. -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Based on src/pkg/reflect/deepequal.go from official -// golang's stdlib. - -package mergo - -import ( - "fmt" - "reflect" - "unicode" - "unicode/utf8" -) - -func changeInitialCase(s string, mapper func(rune) rune) string { - if s == "" { - return s - } - r, n := utf8.DecodeRuneInString(s) - return string(mapper(r)) + s[n:] -} - -func isExported(field reflect.StructField) bool { - r, _ := utf8.DecodeRuneInString(field.Name) - return r >= 'A' && r <= 'Z' -} - -// Traverses recursively both values, assigning src's fields values to dst. -// The map argument tracks comparisons that have already been seen, which allows -// short circuiting on recursive types. -func deepMap(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { - overwrite := config.Overwrite - if dst.CanAddr() { - addr := dst.UnsafeAddr() - h := 17 * addr - seen := visited[h] - typ := dst.Type() - for p := seen; p != nil; p = p.next { - if p.ptr == addr && p.typ == typ { - return nil - } - } - // Remember, remember... - visited[h] = &visit{addr, typ, seen} - } - zeroValue := reflect.Value{} - switch dst.Kind() { - case reflect.Map: - dstMap := dst.Interface().(map[string]interface{}) - for i, n := 0, src.NumField(); i < n; i++ { - srcType := src.Type() - field := srcType.Field(i) - if !isExported(field) { - continue - } - fieldName := field.Name - fieldName = changeInitialCase(fieldName, unicode.ToLower) - if v, ok := dstMap[fieldName]; !ok || (isEmptyValue(reflect.ValueOf(v)) || overwrite) { - dstMap[fieldName] = src.Field(i).Interface() - } - } - case reflect.Ptr: - if dst.IsNil() { - v := reflect.New(dst.Type().Elem()) - dst.Set(v) - } - dst = dst.Elem() - fallthrough - case reflect.Struct: - srcMap := src.Interface().(map[string]interface{}) - for key := range srcMap { - srcValue := srcMap[key] - fieldName := changeInitialCase(key, unicode.ToUpper) - dstElement := dst.FieldByName(fieldName) - if dstElement == zeroValue { - // We discard it because the field doesn't exist. - continue - } - srcElement := reflect.ValueOf(srcValue) - dstKind := dstElement.Kind() - srcKind := srcElement.Kind() - if srcKind == reflect.Ptr && dstKind != reflect.Ptr { - srcElement = srcElement.Elem() - srcKind = reflect.TypeOf(srcElement.Interface()).Kind() - } else if dstKind == reflect.Ptr { - // Can this work? I guess it can't. - if srcKind != reflect.Ptr && srcElement.CanAddr() { - srcPtr := srcElement.Addr() - srcElement = reflect.ValueOf(srcPtr) - srcKind = reflect.Ptr - } - } - - if !srcElement.IsValid() { - continue - } - if srcKind == dstKind { - if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { - return - } - } else if dstKind == reflect.Interface && dstElement.Kind() == reflect.Interface { - if err = deepMerge(dstElement, srcElement, visited, depth+1, config); err != nil { - return - } - } else if srcKind == reflect.Map { - if err = deepMap(dstElement, srcElement, visited, depth+1, config); err != nil { - return - } - } else { - return fmt.Errorf("type mismatch on %s field: found %v, expected %v", fieldName, srcKind, dstKind) - } - } - } - return -} - -// Map sets fields' values in dst from src. -// src can be a map with string keys or a struct. dst must be the opposite: -// if src is a map, dst must be a valid pointer to struct. If src is a struct, -// dst must be map[string]interface{}. -// It won't merge unexported (private) fields and will do recursively -// any exported field. -// If dst is a map, keys will be src fields' names in lower camel case. -// Missing key in src that doesn't match a field in dst will be skipped. This -// doesn't apply if dst is a map. -// This is separated method from Merge because it is cleaner and it keeps sane -// semantics: merging equal types, mapping different (restricted) types. -func Map(dst, src interface{}, opts ...func(*Config)) error { - return _map(dst, src, opts...) -} - -// MapWithOverwrite will do the same as Map except that non-empty dst attributes will be overridden by -// non-empty src attribute values. -// Deprecated: Use Map(…) with WithOverride -func MapWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { - return _map(dst, src, append(opts, WithOverride)...) -} - -func _map(dst, src interface{}, opts ...func(*Config)) error { - var ( - vDst, vSrc reflect.Value - err error - ) - config := &Config{} - - for _, opt := range opts { - opt(config) - } - - if vDst, vSrc, err = resolveValues(dst, src); err != nil { - return err - } - // To be friction-less, we redirect equal-type arguments - // to deepMerge. Only because arguments can be anything. - if vSrc.Kind() == vDst.Kind() { - return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) - } - switch vSrc.Kind() { - case reflect.Struct: - if vDst.Kind() != reflect.Map { - return ErrExpectedMapAsDestination - } - case reflect.Map: - if vDst.Kind() != reflect.Struct { - return ErrExpectedStructAsDestination - } - default: - return ErrNotSupported - } - return deepMap(vDst, vSrc, make(map[uintptr]*visit), 0, config) -} diff --git a/vendor/github.com/imdario/mergo/merge.go b/vendor/github.com/imdario/mergo/merge.go deleted file mode 100644 index 706b220..0000000 --- a/vendor/github.com/imdario/mergo/merge.go +++ /dev/null @@ -1,245 +0,0 @@ -// Copyright 2013 Dario Castañé. All rights reserved. -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Based on src/pkg/reflect/deepequal.go from official -// golang's stdlib. - -package mergo - -import ( - "reflect" -) - -func hasExportedField(dst reflect.Value) (exported bool) { - for i, n := 0, dst.NumField(); i < n; i++ { - field := dst.Type().Field(i) - if field.Anonymous && dst.Field(i).Kind() == reflect.Struct { - exported = exported || hasExportedField(dst.Field(i)) - } else { - exported = exported || len(field.PkgPath) == 0 - } - } - return -} - -type Config struct { - Overwrite bool - AppendSlice bool - Transformers Transformers -} - -type Transformers interface { - Transformer(reflect.Type) func(dst, src reflect.Value) error -} - -// Traverses recursively both values, assigning src's fields values to dst. -// The map argument tracks comparisons that have already been seen, which allows -// short circuiting on recursive types. -func deepMerge(dst, src reflect.Value, visited map[uintptr]*visit, depth int, config *Config) (err error) { - overwrite := config.Overwrite - - if !src.IsValid() { - return - } - if dst.CanAddr() { - addr := dst.UnsafeAddr() - h := 17 * addr - seen := visited[h] - typ := dst.Type() - for p := seen; p != nil; p = p.next { - if p.ptr == addr && p.typ == typ { - return nil - } - } - // Remember, remember... - visited[h] = &visit{addr, typ, seen} - } - - if config.Transformers != nil && !isEmptyValue(dst) { - if fn := config.Transformers.Transformer(dst.Type()); fn != nil { - err = fn(dst, src) - return - } - } - - switch dst.Kind() { - case reflect.Struct: - if hasExportedField(dst) { - for i, n := 0, dst.NumField(); i < n; i++ { - if err = deepMerge(dst.Field(i), src.Field(i), visited, depth+1, config); err != nil { - return - } - } - } else { - if dst.CanSet() && !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) { - dst.Set(src) - } - } - case reflect.Map: - if dst.IsNil() && !src.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) - } - for _, key := range src.MapKeys() { - srcElement := src.MapIndex(key) - if !srcElement.IsValid() { - continue - } - dstElement := dst.MapIndex(key) - switch srcElement.Kind() { - case reflect.Chan, reflect.Func, reflect.Map, reflect.Interface, reflect.Slice: - if srcElement.IsNil() { - continue - } - fallthrough - default: - if !srcElement.CanInterface() { - continue - } - switch reflect.TypeOf(srcElement.Interface()).Kind() { - case reflect.Struct: - fallthrough - case reflect.Ptr: - fallthrough - case reflect.Map: - srcMapElm := srcElement - dstMapElm := dstElement - if srcMapElm.CanInterface() { - srcMapElm = reflect.ValueOf(srcMapElm.Interface()) - if dstMapElm.IsValid() { - dstMapElm = reflect.ValueOf(dstMapElm.Interface()) - } - } - if err = deepMerge(dstMapElm, srcMapElm, visited, depth+1, config); err != nil { - return - } - case reflect.Slice: - srcSlice := reflect.ValueOf(srcElement.Interface()) - - var dstSlice reflect.Value - if !dstElement.IsValid() || dstElement.IsNil() { - dstSlice = reflect.MakeSlice(srcSlice.Type(), 0, srcSlice.Len()) - } else { - dstSlice = reflect.ValueOf(dstElement.Interface()) - } - - if !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { - dstSlice = srcSlice - } else if config.AppendSlice { - dstSlice = reflect.AppendSlice(dstSlice, srcSlice) - } - dst.SetMapIndex(key, dstSlice) - } - } - if dstElement.IsValid() && reflect.TypeOf(srcElement.Interface()).Kind() == reflect.Map { - continue - } - - if srcElement.IsValid() && (overwrite || (!dstElement.IsValid() || isEmptyValue(dstElement))) { - if dst.IsNil() { - dst.Set(reflect.MakeMap(dst.Type())) - } - dst.SetMapIndex(key, srcElement) - } - } - case reflect.Slice: - if !dst.CanSet() { - break - } - if !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) && !config.AppendSlice { - dst.Set(src) - } else if config.AppendSlice { - dst.Set(reflect.AppendSlice(dst, src)) - } - case reflect.Ptr: - fallthrough - case reflect.Interface: - if src.IsNil() { - break - } - if src.Kind() != reflect.Interface { - if dst.IsNil() || overwrite { - if dst.CanSet() && (overwrite || isEmptyValue(dst)) { - dst.Set(src) - } - } else if src.Kind() == reflect.Ptr { - if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { - return - } - } else if dst.Elem().Type() == src.Type() { - if err = deepMerge(dst.Elem(), src, visited, depth+1, config); err != nil { - return - } - } else { - return ErrDifferentArgumentsTypes - } - break - } - if dst.IsNil() || overwrite { - if dst.CanSet() && (overwrite || isEmptyValue(dst)) { - dst.Set(src) - } - } else if err = deepMerge(dst.Elem(), src.Elem(), visited, depth+1, config); err != nil { - return - } - default: - if dst.CanSet() && !isEmptyValue(src) && (overwrite || isEmptyValue(dst)) { - dst.Set(src) - } - } - return -} - -// Merge will fill any empty for value type attributes on the dst struct using corresponding -// src attributes if they themselves are not empty. dst and src must be valid same-type structs -// and dst must be a pointer to struct. -// It won't merge unexported (private) fields and will do recursively any exported field. -func Merge(dst, src interface{}, opts ...func(*Config)) error { - return merge(dst, src, opts...) -} - -// MergeWithOverwrite will do the same as Merge except that non-empty dst attributes will be overriden by -// non-empty src attribute values. -// Deprecated: use Merge(…) with WithOverride -func MergeWithOverwrite(dst, src interface{}, opts ...func(*Config)) error { - return merge(dst, src, append(opts, WithOverride)...) -} - -// WithTransformers adds transformers to merge, allowing to customize the merging of some types. -func WithTransformers(transformers Transformers) func(*Config) { - return func(config *Config) { - config.Transformers = transformers - } -} - -// WithOverride will make merge override non-empty dst attributes with non-empty src attributes values. -func WithOverride(config *Config) { - config.Overwrite = true -} - -// WithAppendSlice will make merge append slices instead of overwriting it -func WithAppendSlice(config *Config) { - config.AppendSlice = true -} - -func merge(dst, src interface{}, opts ...func(*Config)) error { - var ( - vDst, vSrc reflect.Value - err error - ) - - config := &Config{} - - for _, opt := range opts { - opt(config) - } - - if vDst, vSrc, err = resolveValues(dst, src); err != nil { - return err - } - if vDst.Type() != vSrc.Type() { - return ErrDifferentArgumentsTypes - } - return deepMerge(vDst, vSrc, make(map[uintptr]*visit), 0, config) -} diff --git a/vendor/github.com/imdario/mergo/mergo.go b/vendor/github.com/imdario/mergo/mergo.go deleted file mode 100644 index a82fea2..0000000 --- a/vendor/github.com/imdario/mergo/mergo.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2013 Dario Castañé. All rights reserved. -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. - -// Based on src/pkg/reflect/deepequal.go from official -// golang's stdlib. - -package mergo - -import ( - "errors" - "reflect" -) - -// Errors reported by Mergo when it finds invalid arguments. -var ( - ErrNilArguments = errors.New("src and dst must not be nil") - ErrDifferentArgumentsTypes = errors.New("src and dst must be of same type") - ErrNotSupported = errors.New("only structs and maps are supported") - ErrExpectedMapAsDestination = errors.New("dst was expected to be a map") - ErrExpectedStructAsDestination = errors.New("dst was expected to be a struct") -) - -// During deepMerge, must keep track of checks that are -// in progress. The comparison algorithm assumes that all -// checks in progress are true when it reencounters them. -// Visited are stored in a map indexed by 17 * a1 + a2; -type visit struct { - ptr uintptr - typ reflect.Type - next *visit -} - -// From src/pkg/encoding/json/encode.go. -func isEmptyValue(v reflect.Value) bool { - switch v.Kind() { - case reflect.Array, reflect.Map, reflect.Slice, reflect.String: - return v.Len() == 0 - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Interface, reflect.Ptr: - if v.IsNil() { - return true - } - return isEmptyValue(v.Elem()) - case reflect.Func: - return v.IsNil() - case reflect.Invalid: - return true - } - return false -} - -func resolveValues(dst, src interface{}) (vDst, vSrc reflect.Value, err error) { - if dst == nil || src == nil { - err = ErrNilArguments - return - } - vDst = reflect.ValueOf(dst).Elem() - if vDst.Kind() != reflect.Struct && vDst.Kind() != reflect.Map { - err = ErrNotSupported - return - } - vSrc = reflect.ValueOf(src) - // We check if vSrc is a pointer to dereference it. - if vSrc.Kind() == reflect.Ptr { - vSrc = vSrc.Elem() - } - return -} - -// Traverses recursively both values, assigning src's fields values to dst. -// The map argument tracks comparisons that have already been seen, which allows -// short circuiting on recursive types. -func deeper(dst, src reflect.Value, visited map[uintptr]*visit, depth int) (err error) { - if dst.CanAddr() { - addr := dst.UnsafeAddr() - h := 17 * addr - seen := visited[h] - typ := dst.Type() - for p := seen; p != nil; p = p.next { - if p.ptr == addr && p.typ == typ { - return nil - } - } - // Remember, remember... - visited[h] = &visit{addr, typ, seen} - } - return // TODO refactor -} diff --git a/vendor/github.com/imdario/mergo/testdata/license.yml b/vendor/github.com/imdario/mergo/testdata/license.yml deleted file mode 100644 index 2f1ad00..0000000 --- a/vendor/github.com/imdario/mergo/testdata/license.yml +++ /dev/null @@ -1,4 +0,0 @@ -import: ../../../../fossene/db/schema/thing.yml -fields: - site: string - author: root diff --git a/vendor/github.com/json-iterator/go/.codecov.yml b/vendor/github.com/json-iterator/go/.codecov.yml deleted file mode 100644 index 955dc0b..0000000 --- a/vendor/github.com/json-iterator/go/.codecov.yml +++ /dev/null @@ -1,3 +0,0 @@ -ignore: - - "output_tests/.*" - diff --git a/vendor/github.com/json-iterator/go/.gitignore b/vendor/github.com/json-iterator/go/.gitignore deleted file mode 100644 index 1555653..0000000 --- a/vendor/github.com/json-iterator/go/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -/vendor -/bug_test.go -/coverage.txt -/.idea diff --git a/vendor/github.com/json-iterator/go/.travis.yml b/vendor/github.com/json-iterator/go/.travis.yml deleted file mode 100644 index 449e67c..0000000 --- a/vendor/github.com/json-iterator/go/.travis.yml +++ /dev/null @@ -1,14 +0,0 @@ -language: go - -go: - - 1.8.x - - 1.x - -before_install: - - go get -t -v ./... - -script: - - ./test.sh - -after_success: - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/json-iterator/go/Gopkg.lock b/vendor/github.com/json-iterator/go/Gopkg.lock deleted file mode 100644 index c8a9fbb..0000000 --- a/vendor/github.com/json-iterator/go/Gopkg.lock +++ /dev/null @@ -1,21 +0,0 @@ -# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'. - - -[[projects]] - name = "github.com/modern-go/concurrent" - packages = ["."] - revision = "e0a39a4cb4216ea8db28e22a69f4ec25610d513a" - version = "1.0.0" - -[[projects]] - name = "github.com/modern-go/reflect2" - packages = ["."] - revision = "4b7aa43c6742a2c18fdef89dd197aaae7dac7ccd" - version = "1.0.1" - -[solve-meta] - analyzer-name = "dep" - analyzer-version = 1 - inputs-digest = "ea54a775e5a354cb015502d2e7aa4b74230fc77e894f34a838b268c25ec8eeb8" - solver-name = "gps-cdcl" - solver-version = 1 diff --git a/vendor/github.com/json-iterator/go/Gopkg.toml b/vendor/github.com/json-iterator/go/Gopkg.toml deleted file mode 100644 index 313a0f8..0000000 --- a/vendor/github.com/json-iterator/go/Gopkg.toml +++ /dev/null @@ -1,26 +0,0 @@ -# Gopkg.toml example -# -# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md -# for detailed Gopkg.toml documentation. -# -# required = ["github.com/user/thing/cmd/thing"] -# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"] -# -# [[constraint]] -# name = "github.com/user/project" -# version = "1.0.0" -# -# [[constraint]] -# name = "github.com/user/project2" -# branch = "dev" -# source = "github.com/myfork/project2" -# -# [[override]] -# name = "github.com/x/y" -# version = "2.4.0" - -ignored = ["github.com/davecgh/go-spew*","github.com/google/gofuzz*","github.com/stretchr/testify*"] - -[[constraint]] - name = "github.com/modern-go/reflect2" - version = "1.0.1" diff --git a/vendor/github.com/json-iterator/go/LICENSE b/vendor/github.com/json-iterator/go/LICENSE deleted file mode 100644 index 2cf4f5a..0000000 --- a/vendor/github.com/json-iterator/go/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2016 json-iterator - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/vendor/github.com/json-iterator/go/README.md b/vendor/github.com/json-iterator/go/README.md deleted file mode 100644 index 54d5afe..0000000 --- a/vendor/github.com/json-iterator/go/README.md +++ /dev/null @@ -1,91 +0,0 @@ -[![Sourcegraph](https://sourcegraph.com/github.com/json-iterator/go/-/badge.svg)](https://sourcegraph.com/github.com/json-iterator/go?badge) -[![GoDoc](http://img.shields.io/badge/go-documentation-blue.svg?style=flat-square)](http://godoc.org/github.com/json-iterator/go) -[![Build Status](https://travis-ci.org/json-iterator/go.svg?branch=master)](https://travis-ci.org/json-iterator/go) -[![codecov](https://codecov.io/gh/json-iterator/go/branch/master/graph/badge.svg)](https://codecov.io/gh/json-iterator/go) -[![rcard](https://goreportcard.com/badge/github.com/json-iterator/go)](https://goreportcard.com/report/github.com/json-iterator/go) -[![License](http://img.shields.io/badge/license-mit-blue.svg?style=flat-square)](https://raw.githubusercontent.com/json-iterator/go/master/LICENSE) -[![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/json-iterator/Lobby) - -A high-performance 100% compatible drop-in replacement of "encoding/json" - -You can also use thrift like JSON using [thrift-iterator](https://github.com/thrift-iterator/go) - -``` -Go开发者们请加入我们,滴滴出行平台技术部 taowen@didichuxing.com -``` - -# Benchmark - -![benchmark](http://jsoniter.com/benchmarks/go-benchmark.png) - -Source code: https://github.com/json-iterator/go-benchmark/blob/master/src/github.com/json-iterator/go-benchmark/benchmark_medium_payload_test.go - -Raw Result (easyjson requires static code generation) - -| | ns/op | allocation bytes | allocation times | -| --- | --- | --- | --- | -| std decode | 35510 ns/op | 1960 B/op | 99 allocs/op | -| easyjson decode | 8499 ns/op | 160 B/op | 4 allocs/op | -| jsoniter decode | 5623 ns/op | 160 B/op | 3 allocs/op | -| std encode | 2213 ns/op | 712 B/op | 5 allocs/op | -| easyjson encode | 883 ns/op | 576 B/op | 3 allocs/op | -| jsoniter encode | 837 ns/op | 384 B/op | 4 allocs/op | - -Always benchmark with your own workload. -The result depends heavily on the data input. - -# Usage - -100% compatibility with standard lib - -Replace - -```go -import "encoding/json" -json.Marshal(&data) -``` - -with - -```go -import "github.com/json-iterator/go" - -var json = jsoniter.ConfigCompatibleWithStandardLibrary -json.Marshal(&data) -``` - -Replace - -```go -import "encoding/json" -json.Unmarshal(input, &data) -``` - -with - -```go -import "github.com/json-iterator/go" - -var json = jsoniter.ConfigCompatibleWithStandardLibrary -json.Unmarshal(input, &data) -``` - -[More documentation](http://jsoniter.com/migrate-from-go-std.html) - -# How to get - -``` -go get github.com/json-iterator/go -``` - -# Contribution Welcomed ! - -Contributors - -* [thockin](https://github.com/thockin) -* [mattn](https://github.com/mattn) -* [cch123](https://github.com/cch123) -* [Oleg Shaldybin](https://github.com/olegshaldybin) -* [Jason Toffaletti](https://github.com/toffaletti) - -Report issue or pull request, or email taowen@gmail.com, or [![Gitter chat](https://badges.gitter.im/gitterHQ/gitter.png)](https://gitter.im/json-iterator/Lobby) diff --git a/vendor/github.com/json-iterator/go/adapter.go b/vendor/github.com/json-iterator/go/adapter.go deleted file mode 100644 index f371bfe..0000000 --- a/vendor/github.com/json-iterator/go/adapter.go +++ /dev/null @@ -1,148 +0,0 @@ -package jsoniter - -import ( - "bytes" - "io" -) - -// RawMessage to make replace json with jsoniter -type RawMessage []byte - -// Unmarshal adapts to json/encoding Unmarshal API -// -// Unmarshal parses the JSON-encoded data and stores the result in the value pointed to by v. -// Refer to https://godoc.org/encoding/json#Unmarshal for more information -func Unmarshal(data []byte, v interface{}) error { - return ConfigDefault.Unmarshal(data, v) -} - -// UnmarshalFromString convenient method to read from string instead of []byte -func UnmarshalFromString(str string, v interface{}) error { - return ConfigDefault.UnmarshalFromString(str, v) -} - -// Get quick method to get value from deeply nested JSON structure -func Get(data []byte, path ...interface{}) Any { - return ConfigDefault.Get(data, path...) -} - -// Marshal adapts to json/encoding Marshal API -// -// Marshal returns the JSON encoding of v, adapts to json/encoding Marshal API -// Refer to https://godoc.org/encoding/json#Marshal for more information -func Marshal(v interface{}) ([]byte, error) { - return ConfigDefault.Marshal(v) -} - -// MarshalIndent same as json.MarshalIndent. Prefix is not supported. -func MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { - return ConfigDefault.MarshalIndent(v, prefix, indent) -} - -// MarshalToString convenient method to write as string instead of []byte -func MarshalToString(v interface{}) (string, error) { - return ConfigDefault.MarshalToString(v) -} - -// NewDecoder adapts to json/stream NewDecoder API. -// -// NewDecoder returns a new decoder that reads from r. -// -// Instead of a json/encoding Decoder, an Decoder is returned -// Refer to https://godoc.org/encoding/json#NewDecoder for more information -func NewDecoder(reader io.Reader) *Decoder { - return ConfigDefault.NewDecoder(reader) -} - -// Decoder reads and decodes JSON values from an input stream. -// Decoder provides identical APIs with json/stream Decoder (Token() and UseNumber() are in progress) -type Decoder struct { - iter *Iterator -} - -// Decode decode JSON into interface{} -func (adapter *Decoder) Decode(obj interface{}) error { - if adapter.iter.head == adapter.iter.tail && adapter.iter.reader != nil { - if !adapter.iter.loadMore() { - return io.EOF - } - } - adapter.iter.ReadVal(obj) - err := adapter.iter.Error - if err == io.EOF { - return nil - } - return adapter.iter.Error -} - -// More is there more? -func (adapter *Decoder) More() bool { - iter := adapter.iter - if iter.Error != nil { - return false - } - if iter.head != iter.tail { - return true - } - return iter.loadMore() -} - -// Buffered remaining buffer -func (adapter *Decoder) Buffered() io.Reader { - remaining := adapter.iter.buf[adapter.iter.head:adapter.iter.tail] - return bytes.NewReader(remaining) -} - -// UseNumber causes the Decoder to unmarshal a number into an interface{} as a -// Number instead of as a float64. -func (adapter *Decoder) UseNumber() { - cfg := adapter.iter.cfg.configBeforeFrozen - cfg.UseNumber = true - adapter.iter.cfg = cfg.frozeWithCacheReuse() -} - -// DisallowUnknownFields causes the Decoder to return an error when the destination -// is a struct and the input contains object keys which do not match any -// non-ignored, exported fields in the destination. -func (adapter *Decoder) DisallowUnknownFields() { - cfg := adapter.iter.cfg.configBeforeFrozen - cfg.DisallowUnknownFields = true - adapter.iter.cfg = cfg.frozeWithCacheReuse() -} - -// NewEncoder same as json.NewEncoder -func NewEncoder(writer io.Writer) *Encoder { - return ConfigDefault.NewEncoder(writer) -} - -// Encoder same as json.Encoder -type Encoder struct { - stream *Stream -} - -// Encode encode interface{} as JSON to io.Writer -func (adapter *Encoder) Encode(val interface{}) error { - adapter.stream.WriteVal(val) - adapter.stream.WriteRaw("\n") - adapter.stream.Flush() - return adapter.stream.Error -} - -// SetIndent set the indention. Prefix is not supported -func (adapter *Encoder) SetIndent(prefix, indent string) { - config := adapter.stream.cfg.configBeforeFrozen - config.IndentionStep = len(indent) - adapter.stream.cfg = config.frozeWithCacheReuse() -} - -// SetEscapeHTML escape html by default, set to false to disable -func (adapter *Encoder) SetEscapeHTML(escapeHTML bool) { - config := adapter.stream.cfg.configBeforeFrozen - config.EscapeHTML = escapeHTML - adapter.stream.cfg = config.frozeWithCacheReuse() -} - -// Valid reports whether data is a valid JSON encoding. -func Valid(data []byte) bool { - return ConfigDefault.Valid(data) -} diff --git a/vendor/github.com/json-iterator/go/any.go b/vendor/github.com/json-iterator/go/any.go deleted file mode 100644 index daecfed..0000000 --- a/vendor/github.com/json-iterator/go/any.go +++ /dev/null @@ -1,321 +0,0 @@ -package jsoniter - -import ( - "errors" - "fmt" - "github.com/modern-go/reflect2" - "io" - "reflect" - "strconv" - "unsafe" -) - -// Any generic object representation. -// The lazy json implementation holds []byte and parse lazily. -type Any interface { - LastError() error - ValueType() ValueType - MustBeValid() Any - ToBool() bool - ToInt() int - ToInt32() int32 - ToInt64() int64 - ToUint() uint - ToUint32() uint32 - ToUint64() uint64 - ToFloat32() float32 - ToFloat64() float64 - ToString() string - ToVal(val interface{}) - Get(path ...interface{}) Any - Size() int - Keys() []string - GetInterface() interface{} - WriteTo(stream *Stream) -} - -type baseAny struct{} - -func (any *baseAny) Get(path ...interface{}) Any { - return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} -} - -func (any *baseAny) Size() int { - return 0 -} - -func (any *baseAny) Keys() []string { - return []string{} -} - -func (any *baseAny) ToVal(obj interface{}) { - panic("not implemented") -} - -// WrapInt32 turn int32 into Any interface -func WrapInt32(val int32) Any { - return &int32Any{baseAny{}, val} -} - -// WrapInt64 turn int64 into Any interface -func WrapInt64(val int64) Any { - return &int64Any{baseAny{}, val} -} - -// WrapUint32 turn uint32 into Any interface -func WrapUint32(val uint32) Any { - return &uint32Any{baseAny{}, val} -} - -// WrapUint64 turn uint64 into Any interface -func WrapUint64(val uint64) Any { - return &uint64Any{baseAny{}, val} -} - -// WrapFloat64 turn float64 into Any interface -func WrapFloat64(val float64) Any { - return &floatAny{baseAny{}, val} -} - -// WrapString turn string into Any interface -func WrapString(val string) Any { - return &stringAny{baseAny{}, val} -} - -// Wrap turn a go object into Any interface -func Wrap(val interface{}) Any { - if val == nil { - return &nilAny{} - } - asAny, isAny := val.(Any) - if isAny { - return asAny - } - typ := reflect2.TypeOf(val) - switch typ.Kind() { - case reflect.Slice: - return wrapArray(val) - case reflect.Struct: - return wrapStruct(val) - case reflect.Map: - return wrapMap(val) - case reflect.String: - return WrapString(val.(string)) - case reflect.Int: - if strconv.IntSize == 32 { - return WrapInt32(int32(val.(int))) - } - return WrapInt64(int64(val.(int))) - case reflect.Int8: - return WrapInt32(int32(val.(int8))) - case reflect.Int16: - return WrapInt32(int32(val.(int16))) - case reflect.Int32: - return WrapInt32(val.(int32)) - case reflect.Int64: - return WrapInt64(val.(int64)) - case reflect.Uint: - if strconv.IntSize == 32 { - return WrapUint32(uint32(val.(uint))) - } - return WrapUint64(uint64(val.(uint))) - case reflect.Uintptr: - if ptrSize == 32 { - return WrapUint32(uint32(val.(uintptr))) - } - return WrapUint64(uint64(val.(uintptr))) - case reflect.Uint8: - return WrapUint32(uint32(val.(uint8))) - case reflect.Uint16: - return WrapUint32(uint32(val.(uint16))) - case reflect.Uint32: - return WrapUint32(uint32(val.(uint32))) - case reflect.Uint64: - return WrapUint64(val.(uint64)) - case reflect.Float32: - return WrapFloat64(float64(val.(float32))) - case reflect.Float64: - return WrapFloat64(val.(float64)) - case reflect.Bool: - if val.(bool) == true { - return &trueAny{} - } - return &falseAny{} - } - return &invalidAny{baseAny{}, fmt.Errorf("unsupported type: %v", typ)} -} - -// ReadAny read next JSON element as an Any object. It is a better json.RawMessage. -func (iter *Iterator) ReadAny() Any { - return iter.readAny() -} - -func (iter *Iterator) readAny() Any { - c := iter.nextToken() - switch c { - case '"': - iter.unreadByte() - return &stringAny{baseAny{}, iter.ReadString()} - case 'n': - iter.skipThreeBytes('u', 'l', 'l') // null - return &nilAny{} - case 't': - iter.skipThreeBytes('r', 'u', 'e') // true - return &trueAny{} - case 'f': - iter.skipFourBytes('a', 'l', 's', 'e') // false - return &falseAny{} - case '{': - return iter.readObjectAny() - case '[': - return iter.readArrayAny() - case '-': - return iter.readNumberAny(false) - case 0: - return &invalidAny{baseAny{}, errors.New("input is empty")} - default: - return iter.readNumberAny(true) - } -} - -func (iter *Iterator) readNumberAny(positive bool) Any { - iter.startCapture(iter.head - 1) - iter.skipNumber() - lazyBuf := iter.stopCapture() - return &numberLazyAny{baseAny{}, iter.cfg, lazyBuf, nil} -} - -func (iter *Iterator) readObjectAny() Any { - iter.startCapture(iter.head - 1) - iter.skipObject() - lazyBuf := iter.stopCapture() - return &objectLazyAny{baseAny{}, iter.cfg, lazyBuf, nil} -} - -func (iter *Iterator) readArrayAny() Any { - iter.startCapture(iter.head - 1) - iter.skipArray() - lazyBuf := iter.stopCapture() - return &arrayLazyAny{baseAny{}, iter.cfg, lazyBuf, nil} -} - -func locateObjectField(iter *Iterator, target string) []byte { - var found []byte - iter.ReadObjectCB(func(iter *Iterator, field string) bool { - if field == target { - found = iter.SkipAndReturnBytes() - return false - } - iter.Skip() - return true - }) - return found -} - -func locateArrayElement(iter *Iterator, target int) []byte { - var found []byte - n := 0 - iter.ReadArrayCB(func(iter *Iterator) bool { - if n == target { - found = iter.SkipAndReturnBytes() - return false - } - iter.Skip() - n++ - return true - }) - return found -} - -func locatePath(iter *Iterator, path []interface{}) Any { - for i, pathKeyObj := range path { - switch pathKey := pathKeyObj.(type) { - case string: - valueBytes := locateObjectField(iter, pathKey) - if valueBytes == nil { - return newInvalidAny(path[i:]) - } - iter.ResetBytes(valueBytes) - case int: - valueBytes := locateArrayElement(iter, pathKey) - if valueBytes == nil { - return newInvalidAny(path[i:]) - } - iter.ResetBytes(valueBytes) - case int32: - if '*' == pathKey { - return iter.readAny().Get(path[i:]...) - } - return newInvalidAny(path[i:]) - default: - return newInvalidAny(path[i:]) - } - } - if iter.Error != nil && iter.Error != io.EOF { - return &invalidAny{baseAny{}, iter.Error} - } - return iter.readAny() -} - -var anyType = reflect2.TypeOfPtr((*Any)(nil)).Elem() - -func createDecoderOfAny(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ == anyType { - return &directAnyCodec{} - } - if typ.Implements(anyType) { - return &anyCodec{ - valType: typ, - } - } - return nil -} - -func createEncoderOfAny(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ == anyType { - return &directAnyCodec{} - } - if typ.Implements(anyType) { - return &anyCodec{ - valType: typ, - } - } - return nil -} - -type anyCodec struct { - valType reflect2.Type -} - -func (codec *anyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - panic("not implemented") -} - -func (codec *anyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := codec.valType.UnsafeIndirect(ptr) - any := obj.(Any) - any.WriteTo(stream) -} - -func (codec *anyCodec) IsEmpty(ptr unsafe.Pointer) bool { - obj := codec.valType.UnsafeIndirect(ptr) - any := obj.(Any) - return any.Size() == 0 -} - -type directAnyCodec struct { -} - -func (codec *directAnyCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *(*Any)(ptr) = iter.readAny() -} - -func (codec *directAnyCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - any := *(*Any)(ptr) - any.WriteTo(stream) -} - -func (codec *directAnyCodec) IsEmpty(ptr unsafe.Pointer) bool { - any := *(*Any)(ptr) - return any.Size() == 0 -} diff --git a/vendor/github.com/json-iterator/go/any_array.go b/vendor/github.com/json-iterator/go/any_array.go deleted file mode 100644 index 0449e9a..0000000 --- a/vendor/github.com/json-iterator/go/any_array.go +++ /dev/null @@ -1,278 +0,0 @@ -package jsoniter - -import ( - "reflect" - "unsafe" -) - -type arrayLazyAny struct { - baseAny - cfg *frozenConfig - buf []byte - err error -} - -func (any *arrayLazyAny) ValueType() ValueType { - return ArrayValue -} - -func (any *arrayLazyAny) MustBeValid() Any { - return any -} - -func (any *arrayLazyAny) LastError() error { - return any.err -} - -func (any *arrayLazyAny) ToBool() bool { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - return iter.ReadArray() -} - -func (any *arrayLazyAny) ToInt() int { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToInt32() int32 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToInt64() int64 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToUint() uint { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToUint32() uint32 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToUint64() uint64 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToFloat32() float32 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToFloat64() float64 { - if any.ToBool() { - return 1 - } - return 0 -} - -func (any *arrayLazyAny) ToString() string { - return *(*string)(unsafe.Pointer(&any.buf)) -} - -func (any *arrayLazyAny) ToVal(val interface{}) { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadVal(val) -} - -func (any *arrayLazyAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - switch firstPath := path[0].(type) { - case int: - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - valueBytes := locateArrayElement(iter, firstPath) - if valueBytes == nil { - return newInvalidAny(path) - } - iter.ResetBytes(valueBytes) - return locatePath(iter, path[1:]) - case int32: - if '*' == firstPath { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - arr := make([]Any, 0) - iter.ReadArrayCB(func(iter *Iterator) bool { - found := iter.readAny().Get(path[1:]...) - if found.ValueType() != InvalidValue { - arr = append(arr, found) - } - return true - }) - return wrapArray(arr) - } - return newInvalidAny(path) - default: - return newInvalidAny(path) - } -} - -func (any *arrayLazyAny) Size() int { - size := 0 - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadArrayCB(func(iter *Iterator) bool { - size++ - iter.Skip() - return true - }) - return size -} - -func (any *arrayLazyAny) WriteTo(stream *Stream) { - stream.Write(any.buf) -} - -func (any *arrayLazyAny) GetInterface() interface{} { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - return iter.Read() -} - -type arrayAny struct { - baseAny - val reflect.Value -} - -func wrapArray(val interface{}) *arrayAny { - return &arrayAny{baseAny{}, reflect.ValueOf(val)} -} - -func (any *arrayAny) ValueType() ValueType { - return ArrayValue -} - -func (any *arrayAny) MustBeValid() Any { - return any -} - -func (any *arrayAny) LastError() error { - return nil -} - -func (any *arrayAny) ToBool() bool { - return any.val.Len() != 0 -} - -func (any *arrayAny) ToInt() int { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToInt32() int32 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToInt64() int64 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToUint() uint { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToUint32() uint32 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToUint64() uint64 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToFloat32() float32 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToFloat64() float64 { - if any.val.Len() == 0 { - return 0 - } - return 1 -} - -func (any *arrayAny) ToString() string { - str, _ := MarshalToString(any.val.Interface()) - return str -} - -func (any *arrayAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - switch firstPath := path[0].(type) { - case int: - if firstPath < 0 || firstPath >= any.val.Len() { - return newInvalidAny(path) - } - return Wrap(any.val.Index(firstPath).Interface()) - case int32: - if '*' == firstPath { - mappedAll := make([]Any, 0) - for i := 0; i < any.val.Len(); i++ { - mapped := Wrap(any.val.Index(i).Interface()).Get(path[1:]...) - if mapped.ValueType() != InvalidValue { - mappedAll = append(mappedAll, mapped) - } - } - return wrapArray(mappedAll) - } - return newInvalidAny(path) - default: - return newInvalidAny(path) - } -} - -func (any *arrayAny) Size() int { - return any.val.Len() -} - -func (any *arrayAny) WriteTo(stream *Stream) { - stream.WriteVal(any.val) -} - -func (any *arrayAny) GetInterface() interface{} { - return any.val.Interface() -} diff --git a/vendor/github.com/json-iterator/go/any_bool.go b/vendor/github.com/json-iterator/go/any_bool.go deleted file mode 100644 index 9452324..0000000 --- a/vendor/github.com/json-iterator/go/any_bool.go +++ /dev/null @@ -1,137 +0,0 @@ -package jsoniter - -type trueAny struct { - baseAny -} - -func (any *trueAny) LastError() error { - return nil -} - -func (any *trueAny) ToBool() bool { - return true -} - -func (any *trueAny) ToInt() int { - return 1 -} - -func (any *trueAny) ToInt32() int32 { - return 1 -} - -func (any *trueAny) ToInt64() int64 { - return 1 -} - -func (any *trueAny) ToUint() uint { - return 1 -} - -func (any *trueAny) ToUint32() uint32 { - return 1 -} - -func (any *trueAny) ToUint64() uint64 { - return 1 -} - -func (any *trueAny) ToFloat32() float32 { - return 1 -} - -func (any *trueAny) ToFloat64() float64 { - return 1 -} - -func (any *trueAny) ToString() string { - return "true" -} - -func (any *trueAny) WriteTo(stream *Stream) { - stream.WriteTrue() -} - -func (any *trueAny) Parse() *Iterator { - return nil -} - -func (any *trueAny) GetInterface() interface{} { - return true -} - -func (any *trueAny) ValueType() ValueType { - return BoolValue -} - -func (any *trueAny) MustBeValid() Any { - return any -} - -type falseAny struct { - baseAny -} - -func (any *falseAny) LastError() error { - return nil -} - -func (any *falseAny) ToBool() bool { - return false -} - -func (any *falseAny) ToInt() int { - return 0 -} - -func (any *falseAny) ToInt32() int32 { - return 0 -} - -func (any *falseAny) ToInt64() int64 { - return 0 -} - -func (any *falseAny) ToUint() uint { - return 0 -} - -func (any *falseAny) ToUint32() uint32 { - return 0 -} - -func (any *falseAny) ToUint64() uint64 { - return 0 -} - -func (any *falseAny) ToFloat32() float32 { - return 0 -} - -func (any *falseAny) ToFloat64() float64 { - return 0 -} - -func (any *falseAny) ToString() string { - return "false" -} - -func (any *falseAny) WriteTo(stream *Stream) { - stream.WriteFalse() -} - -func (any *falseAny) Parse() *Iterator { - return nil -} - -func (any *falseAny) GetInterface() interface{} { - return false -} - -func (any *falseAny) ValueType() ValueType { - return BoolValue -} - -func (any *falseAny) MustBeValid() Any { - return any -} diff --git a/vendor/github.com/json-iterator/go/any_float.go b/vendor/github.com/json-iterator/go/any_float.go deleted file mode 100644 index 35fdb09..0000000 --- a/vendor/github.com/json-iterator/go/any_float.go +++ /dev/null @@ -1,83 +0,0 @@ -package jsoniter - -import ( - "strconv" -) - -type floatAny struct { - baseAny - val float64 -} - -func (any *floatAny) Parse() *Iterator { - return nil -} - -func (any *floatAny) ValueType() ValueType { - return NumberValue -} - -func (any *floatAny) MustBeValid() Any { - return any -} - -func (any *floatAny) LastError() error { - return nil -} - -func (any *floatAny) ToBool() bool { - return any.ToFloat64() != 0 -} - -func (any *floatAny) ToInt() int { - return int(any.val) -} - -func (any *floatAny) ToInt32() int32 { - return int32(any.val) -} - -func (any *floatAny) ToInt64() int64 { - return int64(any.val) -} - -func (any *floatAny) ToUint() uint { - if any.val > 0 { - return uint(any.val) - } - return 0 -} - -func (any *floatAny) ToUint32() uint32 { - if any.val > 0 { - return uint32(any.val) - } - return 0 -} - -func (any *floatAny) ToUint64() uint64 { - if any.val > 0 { - return uint64(any.val) - } - return 0 -} - -func (any *floatAny) ToFloat32() float32 { - return float32(any.val) -} - -func (any *floatAny) ToFloat64() float64 { - return any.val -} - -func (any *floatAny) ToString() string { - return strconv.FormatFloat(any.val, 'E', -1, 64) -} - -func (any *floatAny) WriteTo(stream *Stream) { - stream.WriteFloat64(any.val) -} - -func (any *floatAny) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/any_int32.go b/vendor/github.com/json-iterator/go/any_int32.go deleted file mode 100644 index 1b56f39..0000000 --- a/vendor/github.com/json-iterator/go/any_int32.go +++ /dev/null @@ -1,74 +0,0 @@ -package jsoniter - -import ( - "strconv" -) - -type int32Any struct { - baseAny - val int32 -} - -func (any *int32Any) LastError() error { - return nil -} - -func (any *int32Any) ValueType() ValueType { - return NumberValue -} - -func (any *int32Any) MustBeValid() Any { - return any -} - -func (any *int32Any) ToBool() bool { - return any.val != 0 -} - -func (any *int32Any) ToInt() int { - return int(any.val) -} - -func (any *int32Any) ToInt32() int32 { - return any.val -} - -func (any *int32Any) ToInt64() int64 { - return int64(any.val) -} - -func (any *int32Any) ToUint() uint { - return uint(any.val) -} - -func (any *int32Any) ToUint32() uint32 { - return uint32(any.val) -} - -func (any *int32Any) ToUint64() uint64 { - return uint64(any.val) -} - -func (any *int32Any) ToFloat32() float32 { - return float32(any.val) -} - -func (any *int32Any) ToFloat64() float64 { - return float64(any.val) -} - -func (any *int32Any) ToString() string { - return strconv.FormatInt(int64(any.val), 10) -} - -func (any *int32Any) WriteTo(stream *Stream) { - stream.WriteInt32(any.val) -} - -func (any *int32Any) Parse() *Iterator { - return nil -} - -func (any *int32Any) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/any_int64.go b/vendor/github.com/json-iterator/go/any_int64.go deleted file mode 100644 index c440d72..0000000 --- a/vendor/github.com/json-iterator/go/any_int64.go +++ /dev/null @@ -1,74 +0,0 @@ -package jsoniter - -import ( - "strconv" -) - -type int64Any struct { - baseAny - val int64 -} - -func (any *int64Any) LastError() error { - return nil -} - -func (any *int64Any) ValueType() ValueType { - return NumberValue -} - -func (any *int64Any) MustBeValid() Any { - return any -} - -func (any *int64Any) ToBool() bool { - return any.val != 0 -} - -func (any *int64Any) ToInt() int { - return int(any.val) -} - -func (any *int64Any) ToInt32() int32 { - return int32(any.val) -} - -func (any *int64Any) ToInt64() int64 { - return any.val -} - -func (any *int64Any) ToUint() uint { - return uint(any.val) -} - -func (any *int64Any) ToUint32() uint32 { - return uint32(any.val) -} - -func (any *int64Any) ToUint64() uint64 { - return uint64(any.val) -} - -func (any *int64Any) ToFloat32() float32 { - return float32(any.val) -} - -func (any *int64Any) ToFloat64() float64 { - return float64(any.val) -} - -func (any *int64Any) ToString() string { - return strconv.FormatInt(any.val, 10) -} - -func (any *int64Any) WriteTo(stream *Stream) { - stream.WriteInt64(any.val) -} - -func (any *int64Any) Parse() *Iterator { - return nil -} - -func (any *int64Any) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/any_invalid.go b/vendor/github.com/json-iterator/go/any_invalid.go deleted file mode 100644 index 1d859ea..0000000 --- a/vendor/github.com/json-iterator/go/any_invalid.go +++ /dev/null @@ -1,82 +0,0 @@ -package jsoniter - -import "fmt" - -type invalidAny struct { - baseAny - err error -} - -func newInvalidAny(path []interface{}) *invalidAny { - return &invalidAny{baseAny{}, fmt.Errorf("%v not found", path)} -} - -func (any *invalidAny) LastError() error { - return any.err -} - -func (any *invalidAny) ValueType() ValueType { - return InvalidValue -} - -func (any *invalidAny) MustBeValid() Any { - panic(any.err) -} - -func (any *invalidAny) ToBool() bool { - return false -} - -func (any *invalidAny) ToInt() int { - return 0 -} - -func (any *invalidAny) ToInt32() int32 { - return 0 -} - -func (any *invalidAny) ToInt64() int64 { - return 0 -} - -func (any *invalidAny) ToUint() uint { - return 0 -} - -func (any *invalidAny) ToUint32() uint32 { - return 0 -} - -func (any *invalidAny) ToUint64() uint64 { - return 0 -} - -func (any *invalidAny) ToFloat32() float32 { - return 0 -} - -func (any *invalidAny) ToFloat64() float64 { - return 0 -} - -func (any *invalidAny) ToString() string { - return "" -} - -func (any *invalidAny) WriteTo(stream *Stream) { -} - -func (any *invalidAny) Get(path ...interface{}) Any { - if any.err == nil { - return &invalidAny{baseAny{}, fmt.Errorf("get %v from invalid", path)} - } - return &invalidAny{baseAny{}, fmt.Errorf("%v, get %v from invalid", any.err, path)} -} - -func (any *invalidAny) Parse() *Iterator { - return nil -} - -func (any *invalidAny) GetInterface() interface{} { - return nil -} diff --git a/vendor/github.com/json-iterator/go/any_nil.go b/vendor/github.com/json-iterator/go/any_nil.go deleted file mode 100644 index d04cb54..0000000 --- a/vendor/github.com/json-iterator/go/any_nil.go +++ /dev/null @@ -1,69 +0,0 @@ -package jsoniter - -type nilAny struct { - baseAny -} - -func (any *nilAny) LastError() error { - return nil -} - -func (any *nilAny) ValueType() ValueType { - return NilValue -} - -func (any *nilAny) MustBeValid() Any { - return any -} - -func (any *nilAny) ToBool() bool { - return false -} - -func (any *nilAny) ToInt() int { - return 0 -} - -func (any *nilAny) ToInt32() int32 { - return 0 -} - -func (any *nilAny) ToInt64() int64 { - return 0 -} - -func (any *nilAny) ToUint() uint { - return 0 -} - -func (any *nilAny) ToUint32() uint32 { - return 0 -} - -func (any *nilAny) ToUint64() uint64 { - return 0 -} - -func (any *nilAny) ToFloat32() float32 { - return 0 -} - -func (any *nilAny) ToFloat64() float64 { - return 0 -} - -func (any *nilAny) ToString() string { - return "" -} - -func (any *nilAny) WriteTo(stream *Stream) { - stream.WriteNil() -} - -func (any *nilAny) Parse() *Iterator { - return nil -} - -func (any *nilAny) GetInterface() interface{} { - return nil -} diff --git a/vendor/github.com/json-iterator/go/any_number.go b/vendor/github.com/json-iterator/go/any_number.go deleted file mode 100644 index 9d1e901..0000000 --- a/vendor/github.com/json-iterator/go/any_number.go +++ /dev/null @@ -1,123 +0,0 @@ -package jsoniter - -import ( - "io" - "unsafe" -) - -type numberLazyAny struct { - baseAny - cfg *frozenConfig - buf []byte - err error -} - -func (any *numberLazyAny) ValueType() ValueType { - return NumberValue -} - -func (any *numberLazyAny) MustBeValid() Any { - return any -} - -func (any *numberLazyAny) LastError() error { - return any.err -} - -func (any *numberLazyAny) ToBool() bool { - return any.ToFloat64() != 0 -} - -func (any *numberLazyAny) ToInt() int { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadInt() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToInt32() int32 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadInt32() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToInt64() int64 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadInt64() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToUint() uint { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadUint() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToUint32() uint32 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadUint32() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToUint64() uint64 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadUint64() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToFloat32() float32 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadFloat32() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToFloat64() float64 { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - val := iter.ReadFloat64() - if iter.Error != nil && iter.Error != io.EOF { - any.err = iter.Error - } - return val -} - -func (any *numberLazyAny) ToString() string { - return *(*string)(unsafe.Pointer(&any.buf)) -} - -func (any *numberLazyAny) WriteTo(stream *Stream) { - stream.Write(any.buf) -} - -func (any *numberLazyAny) GetInterface() interface{} { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - return iter.Read() -} diff --git a/vendor/github.com/json-iterator/go/any_object.go b/vendor/github.com/json-iterator/go/any_object.go deleted file mode 100644 index c44ef5c..0000000 --- a/vendor/github.com/json-iterator/go/any_object.go +++ /dev/null @@ -1,374 +0,0 @@ -package jsoniter - -import ( - "reflect" - "unsafe" -) - -type objectLazyAny struct { - baseAny - cfg *frozenConfig - buf []byte - err error -} - -func (any *objectLazyAny) ValueType() ValueType { - return ObjectValue -} - -func (any *objectLazyAny) MustBeValid() Any { - return any -} - -func (any *objectLazyAny) LastError() error { - return any.err -} - -func (any *objectLazyAny) ToBool() bool { - return true -} - -func (any *objectLazyAny) ToInt() int { - return 0 -} - -func (any *objectLazyAny) ToInt32() int32 { - return 0 -} - -func (any *objectLazyAny) ToInt64() int64 { - return 0 -} - -func (any *objectLazyAny) ToUint() uint { - return 0 -} - -func (any *objectLazyAny) ToUint32() uint32 { - return 0 -} - -func (any *objectLazyAny) ToUint64() uint64 { - return 0 -} - -func (any *objectLazyAny) ToFloat32() float32 { - return 0 -} - -func (any *objectLazyAny) ToFloat64() float64 { - return 0 -} - -func (any *objectLazyAny) ToString() string { - return *(*string)(unsafe.Pointer(&any.buf)) -} - -func (any *objectLazyAny) ToVal(obj interface{}) { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadVal(obj) -} - -func (any *objectLazyAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - switch firstPath := path[0].(type) { - case string: - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - valueBytes := locateObjectField(iter, firstPath) - if valueBytes == nil { - return newInvalidAny(path) - } - iter.ResetBytes(valueBytes) - return locatePath(iter, path[1:]) - case int32: - if '*' == firstPath { - mappedAll := map[string]Any{} - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadMapCB(func(iter *Iterator, field string) bool { - mapped := locatePath(iter, path[1:]) - if mapped.ValueType() != InvalidValue { - mappedAll[field] = mapped - } - return true - }) - return wrapMap(mappedAll) - } - return newInvalidAny(path) - default: - return newInvalidAny(path) - } -} - -func (any *objectLazyAny) Keys() []string { - keys := []string{} - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadMapCB(func(iter *Iterator, field string) bool { - iter.Skip() - keys = append(keys, field) - return true - }) - return keys -} - -func (any *objectLazyAny) Size() int { - size := 0 - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - iter.ReadObjectCB(func(iter *Iterator, field string) bool { - iter.Skip() - size++ - return true - }) - return size -} - -func (any *objectLazyAny) WriteTo(stream *Stream) { - stream.Write(any.buf) -} - -func (any *objectLazyAny) GetInterface() interface{} { - iter := any.cfg.BorrowIterator(any.buf) - defer any.cfg.ReturnIterator(iter) - return iter.Read() -} - -type objectAny struct { - baseAny - err error - val reflect.Value -} - -func wrapStruct(val interface{}) *objectAny { - return &objectAny{baseAny{}, nil, reflect.ValueOf(val)} -} - -func (any *objectAny) ValueType() ValueType { - return ObjectValue -} - -func (any *objectAny) MustBeValid() Any { - return any -} - -func (any *objectAny) Parse() *Iterator { - return nil -} - -func (any *objectAny) LastError() error { - return any.err -} - -func (any *objectAny) ToBool() bool { - return any.val.NumField() != 0 -} - -func (any *objectAny) ToInt() int { - return 0 -} - -func (any *objectAny) ToInt32() int32 { - return 0 -} - -func (any *objectAny) ToInt64() int64 { - return 0 -} - -func (any *objectAny) ToUint() uint { - return 0 -} - -func (any *objectAny) ToUint32() uint32 { - return 0 -} - -func (any *objectAny) ToUint64() uint64 { - return 0 -} - -func (any *objectAny) ToFloat32() float32 { - return 0 -} - -func (any *objectAny) ToFloat64() float64 { - return 0 -} - -func (any *objectAny) ToString() string { - str, err := MarshalToString(any.val.Interface()) - any.err = err - return str -} - -func (any *objectAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - switch firstPath := path[0].(type) { - case string: - field := any.val.FieldByName(firstPath) - if !field.IsValid() { - return newInvalidAny(path) - } - return Wrap(field.Interface()) - case int32: - if '*' == firstPath { - mappedAll := map[string]Any{} - for i := 0; i < any.val.NumField(); i++ { - field := any.val.Field(i) - if field.CanInterface() { - mapped := Wrap(field.Interface()).Get(path[1:]...) - if mapped.ValueType() != InvalidValue { - mappedAll[any.val.Type().Field(i).Name] = mapped - } - } - } - return wrapMap(mappedAll) - } - return newInvalidAny(path) - default: - return newInvalidAny(path) - } -} - -func (any *objectAny) Keys() []string { - keys := make([]string, 0, any.val.NumField()) - for i := 0; i < any.val.NumField(); i++ { - keys = append(keys, any.val.Type().Field(i).Name) - } - return keys -} - -func (any *objectAny) Size() int { - return any.val.NumField() -} - -func (any *objectAny) WriteTo(stream *Stream) { - stream.WriteVal(any.val) -} - -func (any *objectAny) GetInterface() interface{} { - return any.val.Interface() -} - -type mapAny struct { - baseAny - err error - val reflect.Value -} - -func wrapMap(val interface{}) *mapAny { - return &mapAny{baseAny{}, nil, reflect.ValueOf(val)} -} - -func (any *mapAny) ValueType() ValueType { - return ObjectValue -} - -func (any *mapAny) MustBeValid() Any { - return any -} - -func (any *mapAny) Parse() *Iterator { - return nil -} - -func (any *mapAny) LastError() error { - return any.err -} - -func (any *mapAny) ToBool() bool { - return true -} - -func (any *mapAny) ToInt() int { - return 0 -} - -func (any *mapAny) ToInt32() int32 { - return 0 -} - -func (any *mapAny) ToInt64() int64 { - return 0 -} - -func (any *mapAny) ToUint() uint { - return 0 -} - -func (any *mapAny) ToUint32() uint32 { - return 0 -} - -func (any *mapAny) ToUint64() uint64 { - return 0 -} - -func (any *mapAny) ToFloat32() float32 { - return 0 -} - -func (any *mapAny) ToFloat64() float64 { - return 0 -} - -func (any *mapAny) ToString() string { - str, err := MarshalToString(any.val.Interface()) - any.err = err - return str -} - -func (any *mapAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - switch firstPath := path[0].(type) { - case int32: - if '*' == firstPath { - mappedAll := map[string]Any{} - for _, key := range any.val.MapKeys() { - keyAsStr := key.String() - element := Wrap(any.val.MapIndex(key).Interface()) - mapped := element.Get(path[1:]...) - if mapped.ValueType() != InvalidValue { - mappedAll[keyAsStr] = mapped - } - } - return wrapMap(mappedAll) - } - return newInvalidAny(path) - default: - value := any.val.MapIndex(reflect.ValueOf(firstPath)) - if !value.IsValid() { - return newInvalidAny(path) - } - return Wrap(value.Interface()) - } -} - -func (any *mapAny) Keys() []string { - keys := make([]string, 0, any.val.Len()) - for _, key := range any.val.MapKeys() { - keys = append(keys, key.String()) - } - return keys -} - -func (any *mapAny) Size() int { - return any.val.Len() -} - -func (any *mapAny) WriteTo(stream *Stream) { - stream.WriteVal(any.val) -} - -func (any *mapAny) GetInterface() interface{} { - return any.val.Interface() -} diff --git a/vendor/github.com/json-iterator/go/any_str.go b/vendor/github.com/json-iterator/go/any_str.go deleted file mode 100644 index a4b93c7..0000000 --- a/vendor/github.com/json-iterator/go/any_str.go +++ /dev/null @@ -1,166 +0,0 @@ -package jsoniter - -import ( - "fmt" - "strconv" -) - -type stringAny struct { - baseAny - val string -} - -func (any *stringAny) Get(path ...interface{}) Any { - if len(path) == 0 { - return any - } - return &invalidAny{baseAny{}, fmt.Errorf("GetIndex %v from simple value", path)} -} - -func (any *stringAny) Parse() *Iterator { - return nil -} - -func (any *stringAny) ValueType() ValueType { - return StringValue -} - -func (any *stringAny) MustBeValid() Any { - return any -} - -func (any *stringAny) LastError() error { - return nil -} - -func (any *stringAny) ToBool() bool { - str := any.ToString() - if str == "0" { - return false - } - for _, c := range str { - switch c { - case ' ', '\n', '\r', '\t': - default: - return true - } - } - return false -} - -func (any *stringAny) ToInt() int { - return int(any.ToInt64()) - -} - -func (any *stringAny) ToInt32() int32 { - return int32(any.ToInt64()) -} - -func (any *stringAny) ToInt64() int64 { - if any.val == "" { - return 0 - } - - flag := 1 - startPos := 0 - endPos := 0 - if any.val[0] == '+' || any.val[0] == '-' { - startPos = 1 - } - - if any.val[0] == '-' { - flag = -1 - } - - for i := startPos; i < len(any.val); i++ { - if any.val[i] >= '0' && any.val[i] <= '9' { - endPos = i + 1 - } else { - break - } - } - parsed, _ := strconv.ParseInt(any.val[startPos:endPos], 10, 64) - return int64(flag) * parsed -} - -func (any *stringAny) ToUint() uint { - return uint(any.ToUint64()) -} - -func (any *stringAny) ToUint32() uint32 { - return uint32(any.ToUint64()) -} - -func (any *stringAny) ToUint64() uint64 { - if any.val == "" { - return 0 - } - - startPos := 0 - endPos := 0 - - if any.val[0] == '-' { - return 0 - } - if any.val[0] == '+' { - startPos = 1 - } - - for i := startPos; i < len(any.val); i++ { - if any.val[i] >= '0' && any.val[i] <= '9' { - endPos = i + 1 - } else { - break - } - } - parsed, _ := strconv.ParseUint(any.val[startPos:endPos], 10, 64) - return parsed -} - -func (any *stringAny) ToFloat32() float32 { - return float32(any.ToFloat64()) -} - -func (any *stringAny) ToFloat64() float64 { - if len(any.val) == 0 { - return 0 - } - - // first char invalid - if any.val[0] != '+' && any.val[0] != '-' && (any.val[0] > '9' || any.val[0] < '0') { - return 0 - } - - // extract valid num expression from string - // eg 123true => 123, -12.12xxa => -12.12 - endPos := 1 - for i := 1; i < len(any.val); i++ { - if any.val[i] == '.' || any.val[i] == 'e' || any.val[i] == 'E' || any.val[i] == '+' || any.val[i] == '-' { - endPos = i + 1 - continue - } - - // end position is the first char which is not digit - if any.val[i] >= '0' && any.val[i] <= '9' { - endPos = i + 1 - } else { - endPos = i - break - } - } - parsed, _ := strconv.ParseFloat(any.val[:endPos], 64) - return parsed -} - -func (any *stringAny) ToString() string { - return any.val -} - -func (any *stringAny) WriteTo(stream *Stream) { - stream.WriteString(any.val) -} - -func (any *stringAny) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/any_uint32.go b/vendor/github.com/json-iterator/go/any_uint32.go deleted file mode 100644 index 656bbd3..0000000 --- a/vendor/github.com/json-iterator/go/any_uint32.go +++ /dev/null @@ -1,74 +0,0 @@ -package jsoniter - -import ( - "strconv" -) - -type uint32Any struct { - baseAny - val uint32 -} - -func (any *uint32Any) LastError() error { - return nil -} - -func (any *uint32Any) ValueType() ValueType { - return NumberValue -} - -func (any *uint32Any) MustBeValid() Any { - return any -} - -func (any *uint32Any) ToBool() bool { - return any.val != 0 -} - -func (any *uint32Any) ToInt() int { - return int(any.val) -} - -func (any *uint32Any) ToInt32() int32 { - return int32(any.val) -} - -func (any *uint32Any) ToInt64() int64 { - return int64(any.val) -} - -func (any *uint32Any) ToUint() uint { - return uint(any.val) -} - -func (any *uint32Any) ToUint32() uint32 { - return any.val -} - -func (any *uint32Any) ToUint64() uint64 { - return uint64(any.val) -} - -func (any *uint32Any) ToFloat32() float32 { - return float32(any.val) -} - -func (any *uint32Any) ToFloat64() float64 { - return float64(any.val) -} - -func (any *uint32Any) ToString() string { - return strconv.FormatInt(int64(any.val), 10) -} - -func (any *uint32Any) WriteTo(stream *Stream) { - stream.WriteUint32(any.val) -} - -func (any *uint32Any) Parse() *Iterator { - return nil -} - -func (any *uint32Any) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/any_uint64.go b/vendor/github.com/json-iterator/go/any_uint64.go deleted file mode 100644 index 7df2fce..0000000 --- a/vendor/github.com/json-iterator/go/any_uint64.go +++ /dev/null @@ -1,74 +0,0 @@ -package jsoniter - -import ( - "strconv" -) - -type uint64Any struct { - baseAny - val uint64 -} - -func (any *uint64Any) LastError() error { - return nil -} - -func (any *uint64Any) ValueType() ValueType { - return NumberValue -} - -func (any *uint64Any) MustBeValid() Any { - return any -} - -func (any *uint64Any) ToBool() bool { - return any.val != 0 -} - -func (any *uint64Any) ToInt() int { - return int(any.val) -} - -func (any *uint64Any) ToInt32() int32 { - return int32(any.val) -} - -func (any *uint64Any) ToInt64() int64 { - return int64(any.val) -} - -func (any *uint64Any) ToUint() uint { - return uint(any.val) -} - -func (any *uint64Any) ToUint32() uint32 { - return uint32(any.val) -} - -func (any *uint64Any) ToUint64() uint64 { - return any.val -} - -func (any *uint64Any) ToFloat32() float32 { - return float32(any.val) -} - -func (any *uint64Any) ToFloat64() float64 { - return float64(any.val) -} - -func (any *uint64Any) ToString() string { - return strconv.FormatUint(any.val, 10) -} - -func (any *uint64Any) WriteTo(stream *Stream) { - stream.WriteUint64(any.val) -} - -func (any *uint64Any) Parse() *Iterator { - return nil -} - -func (any *uint64Any) GetInterface() interface{} { - return any.val -} diff --git a/vendor/github.com/json-iterator/go/build.sh b/vendor/github.com/json-iterator/go/build.sh deleted file mode 100755 index b45ef68..0000000 --- a/vendor/github.com/json-iterator/go/build.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/bash -set -e -set -x - -if [ ! -d /tmp/build-golang/src/github.com/json-iterator ]; then - mkdir -p /tmp/build-golang/src/github.com/json-iterator - ln -s $PWD /tmp/build-golang/src/github.com/json-iterator/go -fi -export GOPATH=/tmp/build-golang -go get -u github.com/golang/dep/cmd/dep -cd /tmp/build-golang/src/github.com/json-iterator/go -exec $GOPATH/bin/dep ensure -update diff --git a/vendor/github.com/json-iterator/go/config.go b/vendor/github.com/json-iterator/go/config.go deleted file mode 100644 index 8358191..0000000 --- a/vendor/github.com/json-iterator/go/config.go +++ /dev/null @@ -1,372 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "io" - "reflect" - "sync" - "unsafe" - - "github.com/modern-go/concurrent" - "github.com/modern-go/reflect2" -) - -// Config customize how the API should behave. -// The API is created from Config by Froze. -type Config struct { - IndentionStep int - MarshalFloatWith6Digits bool - EscapeHTML bool - SortMapKeys bool - UseNumber bool - DisallowUnknownFields bool - TagKey string - OnlyTaggedField bool - ValidateJsonRawMessage bool - ObjectFieldMustBeSimpleString bool - CaseSensitive bool -} - -// API the public interface of this package. -// Primary Marshal and Unmarshal. -type API interface { - IteratorPool - StreamPool - MarshalToString(v interface{}) (string, error) - Marshal(v interface{}) ([]byte, error) - MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) - UnmarshalFromString(str string, v interface{}) error - Unmarshal(data []byte, v interface{}) error - Get(data []byte, path ...interface{}) Any - NewEncoder(writer io.Writer) *Encoder - NewDecoder(reader io.Reader) *Decoder - Valid(data []byte) bool - RegisterExtension(extension Extension) - DecoderOf(typ reflect2.Type) ValDecoder - EncoderOf(typ reflect2.Type) ValEncoder -} - -// ConfigDefault the default API -var ConfigDefault = Config{ - EscapeHTML: true, -}.Froze() - -// ConfigCompatibleWithStandardLibrary tries to be 100% compatible with standard library behavior -var ConfigCompatibleWithStandardLibrary = Config{ - EscapeHTML: true, - SortMapKeys: true, - ValidateJsonRawMessage: true, -}.Froze() - -// ConfigFastest marshals float with only 6 digits precision -var ConfigFastest = Config{ - EscapeHTML: false, - MarshalFloatWith6Digits: true, // will lose precession - ObjectFieldMustBeSimpleString: true, // do not unescape object field -}.Froze() - -type frozenConfig struct { - configBeforeFrozen Config - sortMapKeys bool - indentionStep int - objectFieldMustBeSimpleString bool - onlyTaggedField bool - disallowUnknownFields bool - decoderCache *concurrent.Map - encoderCache *concurrent.Map - extensions []Extension - streamPool *sync.Pool - iteratorPool *sync.Pool - caseSensitive bool -} - -func (cfg *frozenConfig) initCache() { - cfg.decoderCache = concurrent.NewMap() - cfg.encoderCache = concurrent.NewMap() -} - -func (cfg *frozenConfig) addDecoderToCache(cacheKey uintptr, decoder ValDecoder) { - cfg.decoderCache.Store(cacheKey, decoder) -} - -func (cfg *frozenConfig) addEncoderToCache(cacheKey uintptr, encoder ValEncoder) { - cfg.encoderCache.Store(cacheKey, encoder) -} - -func (cfg *frozenConfig) getDecoderFromCache(cacheKey uintptr) ValDecoder { - decoder, found := cfg.decoderCache.Load(cacheKey) - if found { - return decoder.(ValDecoder) - } - return nil -} - -func (cfg *frozenConfig) getEncoderFromCache(cacheKey uintptr) ValEncoder { - encoder, found := cfg.encoderCache.Load(cacheKey) - if found { - return encoder.(ValEncoder) - } - return nil -} - -var cfgCache = concurrent.NewMap() - -func getFrozenConfigFromCache(cfg Config) *frozenConfig { - obj, found := cfgCache.Load(cfg) - if found { - return obj.(*frozenConfig) - } - return nil -} - -func addFrozenConfigToCache(cfg Config, frozenConfig *frozenConfig) { - cfgCache.Store(cfg, frozenConfig) -} - -// Froze forge API from config -func (cfg Config) Froze() API { - api := &frozenConfig{ - sortMapKeys: cfg.SortMapKeys, - indentionStep: cfg.IndentionStep, - objectFieldMustBeSimpleString: cfg.ObjectFieldMustBeSimpleString, - onlyTaggedField: cfg.OnlyTaggedField, - disallowUnknownFields: cfg.DisallowUnknownFields, - caseSensitive: cfg.CaseSensitive, - } - api.streamPool = &sync.Pool{ - New: func() interface{} { - return NewStream(api, nil, 512) - }, - } - api.iteratorPool = &sync.Pool{ - New: func() interface{} { - return NewIterator(api) - }, - } - api.initCache() - encoderExtension := EncoderExtension{} - decoderExtension := DecoderExtension{} - if cfg.MarshalFloatWith6Digits { - api.marshalFloatWith6Digits(encoderExtension) - } - if cfg.EscapeHTML { - api.escapeHTML(encoderExtension) - } - if cfg.UseNumber { - api.useNumber(decoderExtension) - } - if cfg.ValidateJsonRawMessage { - api.validateJsonRawMessage(encoderExtension) - } - if len(encoderExtension) > 0 { - api.extensions = append(api.extensions, encoderExtension) - } - if len(decoderExtension) > 0 { - api.extensions = append(api.extensions, decoderExtension) - } - api.configBeforeFrozen = cfg - return api -} - -func (cfg Config) frozeWithCacheReuse() *frozenConfig { - api := getFrozenConfigFromCache(cfg) - if api != nil { - return api - } - api = cfg.Froze().(*frozenConfig) - addFrozenConfigToCache(cfg, api) - return api -} - -func (cfg *frozenConfig) validateJsonRawMessage(extension EncoderExtension) { - encoder := &funcEncoder{func(ptr unsafe.Pointer, stream *Stream) { - rawMessage := *(*json.RawMessage)(ptr) - iter := cfg.BorrowIterator([]byte(rawMessage)) - iter.Read() - if iter.Error != nil { - stream.WriteRaw("null") - } else { - cfg.ReturnIterator(iter) - stream.WriteRaw(string(rawMessage)) - } - }, func(ptr unsafe.Pointer) bool { - return false - }} - extension[reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem()] = encoder - extension[reflect2.TypeOfPtr((*RawMessage)(nil)).Elem()] = encoder -} - -func (cfg *frozenConfig) useNumber(extension DecoderExtension) { - extension[reflect2.TypeOfPtr((*interface{})(nil)).Elem()] = &funcDecoder{func(ptr unsafe.Pointer, iter *Iterator) { - exitingValue := *((*interface{})(ptr)) - if exitingValue != nil && reflect.TypeOf(exitingValue).Kind() == reflect.Ptr { - iter.ReadVal(exitingValue) - return - } - if iter.WhatIsNext() == NumberValue { - *((*interface{})(ptr)) = json.Number(iter.readNumberAsString()) - } else { - *((*interface{})(ptr)) = iter.Read() - } - }} -} -func (cfg *frozenConfig) getTagKey() string { - tagKey := cfg.configBeforeFrozen.TagKey - if tagKey == "" { - return "json" - } - return tagKey -} - -func (cfg *frozenConfig) RegisterExtension(extension Extension) { - cfg.extensions = append(cfg.extensions, extension) -} - -type lossyFloat32Encoder struct { -} - -func (encoder *lossyFloat32Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat32Lossy(*((*float32)(ptr))) -} - -func (encoder *lossyFloat32Encoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float32)(ptr)) == 0 -} - -type lossyFloat64Encoder struct { -} - -func (encoder *lossyFloat64Encoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat64Lossy(*((*float64)(ptr))) -} - -func (encoder *lossyFloat64Encoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float64)(ptr)) == 0 -} - -// EnableLossyFloatMarshalling keeps 10**(-6) precision -// for float variables for better performance. -func (cfg *frozenConfig) marshalFloatWith6Digits(extension EncoderExtension) { - // for better performance - extension[reflect2.TypeOfPtr((*float32)(nil)).Elem()] = &lossyFloat32Encoder{} - extension[reflect2.TypeOfPtr((*float64)(nil)).Elem()] = &lossyFloat64Encoder{} -} - -type htmlEscapedStringEncoder struct { -} - -func (encoder *htmlEscapedStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - str := *((*string)(ptr)) - stream.WriteStringWithHTMLEscaped(str) -} - -func (encoder *htmlEscapedStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*string)(ptr)) == "" -} - -func (cfg *frozenConfig) escapeHTML(encoderExtension EncoderExtension) { - encoderExtension[reflect2.TypeOfPtr((*string)(nil)).Elem()] = &htmlEscapedStringEncoder{} -} - -func (cfg *frozenConfig) cleanDecoders() { - typeDecoders = map[string]ValDecoder{} - fieldDecoders = map[string]ValDecoder{} - *cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig)) -} - -func (cfg *frozenConfig) cleanEncoders() { - typeEncoders = map[string]ValEncoder{} - fieldEncoders = map[string]ValEncoder{} - *cfg = *(cfg.configBeforeFrozen.Froze().(*frozenConfig)) -} - -func (cfg *frozenConfig) MarshalToString(v interface{}) (string, error) { - stream := cfg.BorrowStream(nil) - defer cfg.ReturnStream(stream) - stream.WriteVal(v) - if stream.Error != nil { - return "", stream.Error - } - return string(stream.Buffer()), nil -} - -func (cfg *frozenConfig) Marshal(v interface{}) ([]byte, error) { - stream := cfg.BorrowStream(nil) - defer cfg.ReturnStream(stream) - stream.WriteVal(v) - if stream.Error != nil { - return nil, stream.Error - } - result := stream.Buffer() - copied := make([]byte, len(result)) - copy(copied, result) - return copied, nil -} - -func (cfg *frozenConfig) MarshalIndent(v interface{}, prefix, indent string) ([]byte, error) { - if prefix != "" { - panic("prefix is not supported") - } - for _, r := range indent { - if r != ' ' { - panic("indent can only be space") - } - } - newCfg := cfg.configBeforeFrozen - newCfg.IndentionStep = len(indent) - return newCfg.frozeWithCacheReuse().Marshal(v) -} - -func (cfg *frozenConfig) UnmarshalFromString(str string, v interface{}) error { - data := []byte(str) - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - iter.ReadVal(v) - c := iter.nextToken() - if c == 0 { - if iter.Error == io.EOF { - return nil - } - return iter.Error - } - iter.ReportError("Unmarshal", "there are bytes left after unmarshal") - return iter.Error -} - -func (cfg *frozenConfig) Get(data []byte, path ...interface{}) Any { - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - return locatePath(iter, path) -} - -func (cfg *frozenConfig) Unmarshal(data []byte, v interface{}) error { - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - iter.ReadVal(v) - c := iter.nextToken() - if c == 0 { - if iter.Error == io.EOF { - return nil - } - return iter.Error - } - iter.ReportError("Unmarshal", "there are bytes left after unmarshal") - return iter.Error -} - -func (cfg *frozenConfig) NewEncoder(writer io.Writer) *Encoder { - stream := NewStream(cfg, writer, 512) - return &Encoder{stream} -} - -func (cfg *frozenConfig) NewDecoder(reader io.Reader) *Decoder { - iter := Parse(cfg, reader, 512) - return &Decoder{iter} -} - -func (cfg *frozenConfig) Valid(data []byte) bool { - iter := cfg.BorrowIterator(data) - defer cfg.ReturnIterator(iter) - iter.Skip() - return iter.Error == nil -} diff --git a/vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md b/vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md deleted file mode 100644 index 3095662..0000000 --- a/vendor/github.com/json-iterator/go/fuzzy_mode_convert_table.md +++ /dev/null @@ -1,7 +0,0 @@ -| json type \ dest type | bool | int | uint | float |string| -| --- | --- | --- | --- |--|--| -| number | positive => true
negative => true
zero => false| 23.2 => 23
-32.1 => -32| 12.1 => 12
-12.1 => 0|as normal|same as origin| -| string | empty string => false
string "0" => false
other strings => true | "123.32" => 123
"-123.4" => -123
"123.23xxxw" => 123
"abcde12" => 0
"-32.1" => -32| 13.2 => 13
-1.1 => 0 |12.1 => 12.1
-12.3 => -12.3
12.4xxa => 12.4
+1.1e2 =>110 |same as origin| -| bool | true => true
false => false| true => 1
false => 0 | true => 1
false => 0 |true => 1
false => 0|true => "true"
false => "false"| -| object | true | 0 | 0 |0|originnal json| -| array | empty array => false
nonempty array => true| [] => 0
[1,2] => 1 | [] => 0
[1,2] => 1 |[] => 0
[1,2] => 1|original json| \ No newline at end of file diff --git a/vendor/github.com/json-iterator/go/iter.go b/vendor/github.com/json-iterator/go/iter.go deleted file mode 100644 index 95ae54f..0000000 --- a/vendor/github.com/json-iterator/go/iter.go +++ /dev/null @@ -1,322 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "fmt" - "io" -) - -// ValueType the type for JSON element -type ValueType int - -const ( - // InvalidValue invalid JSON element - InvalidValue ValueType = iota - // StringValue JSON element "string" - StringValue - // NumberValue JSON element 100 or 0.10 - NumberValue - // NilValue JSON element null - NilValue - // BoolValue JSON element true or false - BoolValue - // ArrayValue JSON element [] - ArrayValue - // ObjectValue JSON element {} - ObjectValue -) - -var hexDigits []byte -var valueTypes []ValueType - -func init() { - hexDigits = make([]byte, 256) - for i := 0; i < len(hexDigits); i++ { - hexDigits[i] = 255 - } - for i := '0'; i <= '9'; i++ { - hexDigits[i] = byte(i - '0') - } - for i := 'a'; i <= 'f'; i++ { - hexDigits[i] = byte((i - 'a') + 10) - } - for i := 'A'; i <= 'F'; i++ { - hexDigits[i] = byte((i - 'A') + 10) - } - valueTypes = make([]ValueType, 256) - for i := 0; i < len(valueTypes); i++ { - valueTypes[i] = InvalidValue - } - valueTypes['"'] = StringValue - valueTypes['-'] = NumberValue - valueTypes['0'] = NumberValue - valueTypes['1'] = NumberValue - valueTypes['2'] = NumberValue - valueTypes['3'] = NumberValue - valueTypes['4'] = NumberValue - valueTypes['5'] = NumberValue - valueTypes['6'] = NumberValue - valueTypes['7'] = NumberValue - valueTypes['8'] = NumberValue - valueTypes['9'] = NumberValue - valueTypes['t'] = BoolValue - valueTypes['f'] = BoolValue - valueTypes['n'] = NilValue - valueTypes['['] = ArrayValue - valueTypes['{'] = ObjectValue -} - -// Iterator is a io.Reader like object, with JSON specific read functions. -// Error is not returned as return value, but stored as Error member on this iterator instance. -type Iterator struct { - cfg *frozenConfig - reader io.Reader - buf []byte - head int - tail int - captureStartedAt int - captured []byte - Error error - Attachment interface{} // open for customized decoder -} - -// NewIterator creates an empty Iterator instance -func NewIterator(cfg API) *Iterator { - return &Iterator{ - cfg: cfg.(*frozenConfig), - reader: nil, - buf: nil, - head: 0, - tail: 0, - } -} - -// Parse creates an Iterator instance from io.Reader -func Parse(cfg API, reader io.Reader, bufSize int) *Iterator { - return &Iterator{ - cfg: cfg.(*frozenConfig), - reader: reader, - buf: make([]byte, bufSize), - head: 0, - tail: 0, - } -} - -// ParseBytes creates an Iterator instance from byte array -func ParseBytes(cfg API, input []byte) *Iterator { - return &Iterator{ - cfg: cfg.(*frozenConfig), - reader: nil, - buf: input, - head: 0, - tail: len(input), - } -} - -// ParseString creates an Iterator instance from string -func ParseString(cfg API, input string) *Iterator { - return ParseBytes(cfg, []byte(input)) -} - -// Pool returns a pool can provide more iterator with same configuration -func (iter *Iterator) Pool() IteratorPool { - return iter.cfg -} - -// Reset reuse iterator instance by specifying another reader -func (iter *Iterator) Reset(reader io.Reader) *Iterator { - iter.reader = reader - iter.head = 0 - iter.tail = 0 - return iter -} - -// ResetBytes reuse iterator instance by specifying another byte array as input -func (iter *Iterator) ResetBytes(input []byte) *Iterator { - iter.reader = nil - iter.buf = input - iter.head = 0 - iter.tail = len(input) - return iter -} - -// WhatIsNext gets ValueType of relatively next json element -func (iter *Iterator) WhatIsNext() ValueType { - valueType := valueTypes[iter.nextToken()] - iter.unreadByte() - return valueType -} - -func (iter *Iterator) skipWhitespacesWithoutLoadMore() bool { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - switch c { - case ' ', '\n', '\t', '\r': - continue - } - iter.head = i - return false - } - return true -} - -func (iter *Iterator) isObjectEnd() bool { - c := iter.nextToken() - if c == ',' { - return false - } - if c == '}' { - return true - } - iter.ReportError("isObjectEnd", "object ended prematurely, unexpected char "+string([]byte{c})) - return true -} - -func (iter *Iterator) nextToken() byte { - // a variation of skip whitespaces, returning the next non-whitespace token - for { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - switch c { - case ' ', '\n', '\t', '\r': - continue - } - iter.head = i + 1 - return c - } - if !iter.loadMore() { - return 0 - } - } -} - -// ReportError record a error in iterator instance with current position. -func (iter *Iterator) ReportError(operation string, msg string) { - if iter.Error != nil { - if iter.Error != io.EOF { - return - } - } - peekStart := iter.head - 10 - if peekStart < 0 { - peekStart = 0 - } - peekEnd := iter.head + 10 - if peekEnd > iter.tail { - peekEnd = iter.tail - } - parsing := string(iter.buf[peekStart:peekEnd]) - contextStart := iter.head - 50 - if contextStart < 0 { - contextStart = 0 - } - contextEnd := iter.head + 50 - if contextEnd > iter.tail { - contextEnd = iter.tail - } - context := string(iter.buf[contextStart:contextEnd]) - iter.Error = fmt.Errorf("%s: %s, error found in #%v byte of ...|%s|..., bigger context ...|%s|...", - operation, msg, iter.head-peekStart, parsing, context) -} - -// CurrentBuffer gets current buffer as string for debugging purpose -func (iter *Iterator) CurrentBuffer() string { - peekStart := iter.head - 10 - if peekStart < 0 { - peekStart = 0 - } - return fmt.Sprintf("parsing #%v byte, around ...|%s|..., whole buffer ...|%s|...", iter.head, - string(iter.buf[peekStart:iter.head]), string(iter.buf[0:iter.tail])) -} - -func (iter *Iterator) readByte() (ret byte) { - if iter.head == iter.tail { - if iter.loadMore() { - ret = iter.buf[iter.head] - iter.head++ - return ret - } - return 0 - } - ret = iter.buf[iter.head] - iter.head++ - return ret -} - -func (iter *Iterator) loadMore() bool { - if iter.reader == nil { - if iter.Error == nil { - iter.head = iter.tail - iter.Error = io.EOF - } - return false - } - if iter.captured != nil { - iter.captured = append(iter.captured, - iter.buf[iter.captureStartedAt:iter.tail]...) - iter.captureStartedAt = 0 - } - for { - n, err := iter.reader.Read(iter.buf) - if n == 0 { - if err != nil { - if iter.Error == nil { - iter.Error = err - } - return false - } - } else { - iter.head = 0 - iter.tail = n - return true - } - } -} - -func (iter *Iterator) unreadByte() { - if iter.Error != nil { - return - } - iter.head-- - return -} - -// Read read the next JSON element as generic interface{}. -func (iter *Iterator) Read() interface{} { - valueType := iter.WhatIsNext() - switch valueType { - case StringValue: - return iter.ReadString() - case NumberValue: - if iter.cfg.configBeforeFrozen.UseNumber { - return json.Number(iter.readNumberAsString()) - } - return iter.ReadFloat64() - case NilValue: - iter.skipFourBytes('n', 'u', 'l', 'l') - return nil - case BoolValue: - return iter.ReadBool() - case ArrayValue: - arr := []interface{}{} - iter.ReadArrayCB(func(iter *Iterator) bool { - var elem interface{} - iter.ReadVal(&elem) - arr = append(arr, elem) - return true - }) - return arr - case ObjectValue: - obj := map[string]interface{}{} - iter.ReadMapCB(func(Iter *Iterator, field string) bool { - var elem interface{} - iter.ReadVal(&elem) - obj[field] = elem - return true - }) - return obj - default: - iter.ReportError("Read", fmt.Sprintf("unexpected value type: %v", valueType)) - return nil - } -} diff --git a/vendor/github.com/json-iterator/go/iter_array.go b/vendor/github.com/json-iterator/go/iter_array.go deleted file mode 100644 index 6188cb4..0000000 --- a/vendor/github.com/json-iterator/go/iter_array.go +++ /dev/null @@ -1,58 +0,0 @@ -package jsoniter - -// ReadArray read array element, tells if the array has more element to read. -func (iter *Iterator) ReadArray() (ret bool) { - c := iter.nextToken() - switch c { - case 'n': - iter.skipThreeBytes('u', 'l', 'l') - return false // null - case '[': - c = iter.nextToken() - if c != ']' { - iter.unreadByte() - return true - } - return false - case ']': - return false - case ',': - return true - default: - iter.ReportError("ReadArray", "expect [ or , or ] or n, but found "+string([]byte{c})) - return - } -} - -// ReadArrayCB read array with callback -func (iter *Iterator) ReadArrayCB(callback func(*Iterator) bool) (ret bool) { - c := iter.nextToken() - if c == '[' { - c = iter.nextToken() - if c != ']' { - iter.unreadByte() - if !callback(iter) { - return false - } - c = iter.nextToken() - for c == ',' { - if !callback(iter) { - return false - } - c = iter.nextToken() - } - if c != ']' { - iter.ReportError("ReadArrayCB", "expect ] in the end, but found "+string([]byte{c})) - return false - } - return true - } - return true - } - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return true // null - } - iter.ReportError("ReadArrayCB", "expect [ or n, but found "+string([]byte{c})) - return false -} diff --git a/vendor/github.com/json-iterator/go/iter_float.go b/vendor/github.com/json-iterator/go/iter_float.go deleted file mode 100644 index 4f883c0..0000000 --- a/vendor/github.com/json-iterator/go/iter_float.go +++ /dev/null @@ -1,347 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "io" - "math/big" - "strconv" - "strings" - "unsafe" -) - -var floatDigits []int8 - -const invalidCharForNumber = int8(-1) -const endOfNumber = int8(-2) -const dotInNumber = int8(-3) - -func init() { - floatDigits = make([]int8, 256) - for i := 0; i < len(floatDigits); i++ { - floatDigits[i] = invalidCharForNumber - } - for i := int8('0'); i <= int8('9'); i++ { - floatDigits[i] = i - int8('0') - } - floatDigits[','] = endOfNumber - floatDigits[']'] = endOfNumber - floatDigits['}'] = endOfNumber - floatDigits[' '] = endOfNumber - floatDigits['\t'] = endOfNumber - floatDigits['\n'] = endOfNumber - floatDigits['.'] = dotInNumber -} - -// ReadBigFloat read big.Float -func (iter *Iterator) ReadBigFloat() (ret *big.Float) { - str := iter.readNumberAsString() - if iter.Error != nil && iter.Error != io.EOF { - return nil - } - prec := 64 - if len(str) > prec { - prec = len(str) - } - val, _, err := big.ParseFloat(str, 10, uint(prec), big.ToZero) - if err != nil { - iter.Error = err - return nil - } - return val -} - -// ReadBigInt read big.Int -func (iter *Iterator) ReadBigInt() (ret *big.Int) { - str := iter.readNumberAsString() - if iter.Error != nil && iter.Error != io.EOF { - return nil - } - ret = big.NewInt(0) - var success bool - ret, success = ret.SetString(str, 10) - if !success { - iter.ReportError("ReadBigInt", "invalid big int") - return nil - } - return ret -} - -//ReadFloat32 read float32 -func (iter *Iterator) ReadFloat32() (ret float32) { - c := iter.nextToken() - if c == '-' { - return -iter.readPositiveFloat32() - } - iter.unreadByte() - return iter.readPositiveFloat32() -} - -func (iter *Iterator) readPositiveFloat32() (ret float32) { - value := uint64(0) - c := byte(' ') - i := iter.head - // first char - if i == iter.tail { - return iter.readFloat32SlowPath() - } - c = iter.buf[i] - i++ - ind := floatDigits[c] - switch ind { - case invalidCharForNumber: - return iter.readFloat32SlowPath() - case endOfNumber: - iter.ReportError("readFloat32", "empty number") - return - case dotInNumber: - iter.ReportError("readFloat32", "leading dot is invalid") - return - case 0: - if i == iter.tail { - return iter.readFloat32SlowPath() - } - c = iter.buf[i] - switch c { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - iter.ReportError("readFloat32", "leading zero is invalid") - return - } - } - value = uint64(ind) - // chars before dot -non_decimal_loop: - for ; i < iter.tail; i++ { - c = iter.buf[i] - ind := floatDigits[c] - switch ind { - case invalidCharForNumber: - return iter.readFloat32SlowPath() - case endOfNumber: - iter.head = i - return float32(value) - case dotInNumber: - break non_decimal_loop - } - if value > uint64SafeToMultiple10 { - return iter.readFloat32SlowPath() - } - value = (value << 3) + (value << 1) + uint64(ind) // value = value * 10 + ind; - } - // chars after dot - if c == '.' { - i++ - decimalPlaces := 0 - if i == iter.tail { - return iter.readFloat32SlowPath() - } - for ; i < iter.tail; i++ { - c = iter.buf[i] - ind := floatDigits[c] - switch ind { - case endOfNumber: - if decimalPlaces > 0 && decimalPlaces < len(pow10) { - iter.head = i - return float32(float64(value) / float64(pow10[decimalPlaces])) - } - // too many decimal places - return iter.readFloat32SlowPath() - case invalidCharForNumber: - fallthrough - case dotInNumber: - return iter.readFloat32SlowPath() - } - decimalPlaces++ - if value > uint64SafeToMultiple10 { - return iter.readFloat32SlowPath() - } - value = (value << 3) + (value << 1) + uint64(ind) - } - } - return iter.readFloat32SlowPath() -} - -func (iter *Iterator) readNumberAsString() (ret string) { - strBuf := [16]byte{} - str := strBuf[0:0] -load_loop: - for { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - switch c { - case '+', '-', '.', 'e', 'E', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - str = append(str, c) - continue - default: - iter.head = i - break load_loop - } - } - if !iter.loadMore() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - return - } - if len(str) == 0 { - iter.ReportError("readNumberAsString", "invalid number") - } - return *(*string)(unsafe.Pointer(&str)) -} - -func (iter *Iterator) readFloat32SlowPath() (ret float32) { - str := iter.readNumberAsString() - if iter.Error != nil && iter.Error != io.EOF { - return - } - errMsg := validateFloat(str) - if errMsg != "" { - iter.ReportError("readFloat32SlowPath", errMsg) - return - } - val, err := strconv.ParseFloat(str, 32) - if err != nil { - iter.Error = err - return - } - return float32(val) -} - -// ReadFloat64 read float64 -func (iter *Iterator) ReadFloat64() (ret float64) { - c := iter.nextToken() - if c == '-' { - return -iter.readPositiveFloat64() - } - iter.unreadByte() - return iter.readPositiveFloat64() -} - -func (iter *Iterator) readPositiveFloat64() (ret float64) { - value := uint64(0) - c := byte(' ') - i := iter.head - // first char - if i == iter.tail { - return iter.readFloat64SlowPath() - } - c = iter.buf[i] - i++ - ind := floatDigits[c] - switch ind { - case invalidCharForNumber: - return iter.readFloat64SlowPath() - case endOfNumber: - iter.ReportError("readFloat64", "empty number") - return - case dotInNumber: - iter.ReportError("readFloat64", "leading dot is invalid") - return - case 0: - if i == iter.tail { - return iter.readFloat64SlowPath() - } - c = iter.buf[i] - switch c { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - iter.ReportError("readFloat64", "leading zero is invalid") - return - } - } - value = uint64(ind) - // chars before dot -non_decimal_loop: - for ; i < iter.tail; i++ { - c = iter.buf[i] - ind := floatDigits[c] - switch ind { - case invalidCharForNumber: - return iter.readFloat64SlowPath() - case endOfNumber: - iter.head = i - return float64(value) - case dotInNumber: - break non_decimal_loop - } - if value > uint64SafeToMultiple10 { - return iter.readFloat64SlowPath() - } - value = (value << 3) + (value << 1) + uint64(ind) // value = value * 10 + ind; - } - // chars after dot - if c == '.' { - i++ - decimalPlaces := 0 - if i == iter.tail { - return iter.readFloat64SlowPath() - } - for ; i < iter.tail; i++ { - c = iter.buf[i] - ind := floatDigits[c] - switch ind { - case endOfNumber: - if decimalPlaces > 0 && decimalPlaces < len(pow10) { - iter.head = i - return float64(value) / float64(pow10[decimalPlaces]) - } - // too many decimal places - return iter.readFloat64SlowPath() - case invalidCharForNumber: - fallthrough - case dotInNumber: - return iter.readFloat64SlowPath() - } - decimalPlaces++ - if value > uint64SafeToMultiple10 { - return iter.readFloat64SlowPath() - } - value = (value << 3) + (value << 1) + uint64(ind) - } - } - return iter.readFloat64SlowPath() -} - -func (iter *Iterator) readFloat64SlowPath() (ret float64) { - str := iter.readNumberAsString() - if iter.Error != nil && iter.Error != io.EOF { - return - } - errMsg := validateFloat(str) - if errMsg != "" { - iter.ReportError("readFloat64SlowPath", errMsg) - return - } - val, err := strconv.ParseFloat(str, 64) - if err != nil { - iter.Error = err - return - } - return val -} - -func validateFloat(str string) string { - // strconv.ParseFloat is not validating `1.` or `1.e1` - if len(str) == 0 { - return "empty number" - } - if str[0] == '-' { - return "-- is not valid" - } - dotPos := strings.IndexByte(str, '.') - if dotPos != -1 { - if dotPos == len(str)-1 { - return "dot can not be last character" - } - switch str[dotPos+1] { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - default: - return "missing digit after dot" - } - } - return "" -} - -// ReadNumber read json.Number -func (iter *Iterator) ReadNumber() (ret json.Number) { - return json.Number(iter.readNumberAsString()) -} diff --git a/vendor/github.com/json-iterator/go/iter_int.go b/vendor/github.com/json-iterator/go/iter_int.go deleted file mode 100644 index 2142320..0000000 --- a/vendor/github.com/json-iterator/go/iter_int.go +++ /dev/null @@ -1,345 +0,0 @@ -package jsoniter - -import ( - "math" - "strconv" -) - -var intDigits []int8 - -const uint32SafeToMultiply10 = uint32(0xffffffff)/10 - 1 -const uint64SafeToMultiple10 = uint64(0xffffffffffffffff)/10 - 1 - -func init() { - intDigits = make([]int8, 256) - for i := 0; i < len(intDigits); i++ { - intDigits[i] = invalidCharForNumber - } - for i := int8('0'); i <= int8('9'); i++ { - intDigits[i] = i - int8('0') - } -} - -// ReadUint read uint -func (iter *Iterator) ReadUint() uint { - if strconv.IntSize == 32 { - return uint(iter.ReadUint32()) - } - return uint(iter.ReadUint64()) -} - -// ReadInt read int -func (iter *Iterator) ReadInt() int { - if strconv.IntSize == 32 { - return int(iter.ReadInt32()) - } - return int(iter.ReadInt64()) -} - -// ReadInt8 read int8 -func (iter *Iterator) ReadInt8() (ret int8) { - c := iter.nextToken() - if c == '-' { - val := iter.readUint32(iter.readByte()) - if val > math.MaxInt8+1 { - iter.ReportError("ReadInt8", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return -int8(val) - } - val := iter.readUint32(c) - if val > math.MaxInt8 { - iter.ReportError("ReadInt8", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return int8(val) -} - -// ReadUint8 read uint8 -func (iter *Iterator) ReadUint8() (ret uint8) { - val := iter.readUint32(iter.nextToken()) - if val > math.MaxUint8 { - iter.ReportError("ReadUint8", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return uint8(val) -} - -// ReadInt16 read int16 -func (iter *Iterator) ReadInt16() (ret int16) { - c := iter.nextToken() - if c == '-' { - val := iter.readUint32(iter.readByte()) - if val > math.MaxInt16+1 { - iter.ReportError("ReadInt16", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return -int16(val) - } - val := iter.readUint32(c) - if val > math.MaxInt16 { - iter.ReportError("ReadInt16", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return int16(val) -} - -// ReadUint16 read uint16 -func (iter *Iterator) ReadUint16() (ret uint16) { - val := iter.readUint32(iter.nextToken()) - if val > math.MaxUint16 { - iter.ReportError("ReadUint16", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return uint16(val) -} - -// ReadInt32 read int32 -func (iter *Iterator) ReadInt32() (ret int32) { - c := iter.nextToken() - if c == '-' { - val := iter.readUint32(iter.readByte()) - if val > math.MaxInt32+1 { - iter.ReportError("ReadInt32", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return -int32(val) - } - val := iter.readUint32(c) - if val > math.MaxInt32 { - iter.ReportError("ReadInt32", "overflow: "+strconv.FormatInt(int64(val), 10)) - return - } - return int32(val) -} - -// ReadUint32 read uint32 -func (iter *Iterator) ReadUint32() (ret uint32) { - return iter.readUint32(iter.nextToken()) -} - -func (iter *Iterator) readUint32(c byte) (ret uint32) { - ind := intDigits[c] - if ind == 0 { - iter.assertInteger() - return 0 // single zero - } - if ind == invalidCharForNumber { - iter.ReportError("readUint32", "unexpected character: "+string([]byte{byte(ind)})) - return - } - value := uint32(ind) - if iter.tail-iter.head > 10 { - i := iter.head - ind2 := intDigits[iter.buf[i]] - if ind2 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value - } - i++ - ind3 := intDigits[iter.buf[i]] - if ind3 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*10 + uint32(ind2) - } - //iter.head = i + 1 - //value = value * 100 + uint32(ind2) * 10 + uint32(ind3) - i++ - ind4 := intDigits[iter.buf[i]] - if ind4 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*100 + uint32(ind2)*10 + uint32(ind3) - } - i++ - ind5 := intDigits[iter.buf[i]] - if ind5 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*1000 + uint32(ind2)*100 + uint32(ind3)*10 + uint32(ind4) - } - i++ - ind6 := intDigits[iter.buf[i]] - if ind6 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*10000 + uint32(ind2)*1000 + uint32(ind3)*100 + uint32(ind4)*10 + uint32(ind5) - } - i++ - ind7 := intDigits[iter.buf[i]] - if ind7 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*100000 + uint32(ind2)*10000 + uint32(ind3)*1000 + uint32(ind4)*100 + uint32(ind5)*10 + uint32(ind6) - } - i++ - ind8 := intDigits[iter.buf[i]] - if ind8 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*1000000 + uint32(ind2)*100000 + uint32(ind3)*10000 + uint32(ind4)*1000 + uint32(ind5)*100 + uint32(ind6)*10 + uint32(ind7) - } - i++ - ind9 := intDigits[iter.buf[i]] - value = value*10000000 + uint32(ind2)*1000000 + uint32(ind3)*100000 + uint32(ind4)*10000 + uint32(ind5)*1000 + uint32(ind6)*100 + uint32(ind7)*10 + uint32(ind8) - iter.head = i - if ind9 == invalidCharForNumber { - iter.assertInteger() - return value - } - } - for { - for i := iter.head; i < iter.tail; i++ { - ind = intDigits[iter.buf[i]] - if ind == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value - } - if value > uint32SafeToMultiply10 { - value2 := (value << 3) + (value << 1) + uint32(ind) - if value2 < value { - iter.ReportError("readUint32", "overflow") - return - } - value = value2 - continue - } - value = (value << 3) + (value << 1) + uint32(ind) - } - if !iter.loadMore() { - iter.assertInteger() - return value - } - } -} - -// ReadInt64 read int64 -func (iter *Iterator) ReadInt64() (ret int64) { - c := iter.nextToken() - if c == '-' { - val := iter.readUint64(iter.readByte()) - if val > math.MaxInt64+1 { - iter.ReportError("ReadInt64", "overflow: "+strconv.FormatUint(uint64(val), 10)) - return - } - return -int64(val) - } - val := iter.readUint64(c) - if val > math.MaxInt64 { - iter.ReportError("ReadInt64", "overflow: "+strconv.FormatUint(uint64(val), 10)) - return - } - return int64(val) -} - -// ReadUint64 read uint64 -func (iter *Iterator) ReadUint64() uint64 { - return iter.readUint64(iter.nextToken()) -} - -func (iter *Iterator) readUint64(c byte) (ret uint64) { - ind := intDigits[c] - if ind == 0 { - iter.assertInteger() - return 0 // single zero - } - if ind == invalidCharForNumber { - iter.ReportError("readUint64", "unexpected character: "+string([]byte{byte(ind)})) - return - } - value := uint64(ind) - if iter.tail-iter.head > 10 { - i := iter.head - ind2 := intDigits[iter.buf[i]] - if ind2 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value - } - i++ - ind3 := intDigits[iter.buf[i]] - if ind3 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*10 + uint64(ind2) - } - //iter.head = i + 1 - //value = value * 100 + uint32(ind2) * 10 + uint32(ind3) - i++ - ind4 := intDigits[iter.buf[i]] - if ind4 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*100 + uint64(ind2)*10 + uint64(ind3) - } - i++ - ind5 := intDigits[iter.buf[i]] - if ind5 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*1000 + uint64(ind2)*100 + uint64(ind3)*10 + uint64(ind4) - } - i++ - ind6 := intDigits[iter.buf[i]] - if ind6 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*10000 + uint64(ind2)*1000 + uint64(ind3)*100 + uint64(ind4)*10 + uint64(ind5) - } - i++ - ind7 := intDigits[iter.buf[i]] - if ind7 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*100000 + uint64(ind2)*10000 + uint64(ind3)*1000 + uint64(ind4)*100 + uint64(ind5)*10 + uint64(ind6) - } - i++ - ind8 := intDigits[iter.buf[i]] - if ind8 == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value*1000000 + uint64(ind2)*100000 + uint64(ind3)*10000 + uint64(ind4)*1000 + uint64(ind5)*100 + uint64(ind6)*10 + uint64(ind7) - } - i++ - ind9 := intDigits[iter.buf[i]] - value = value*10000000 + uint64(ind2)*1000000 + uint64(ind3)*100000 + uint64(ind4)*10000 + uint64(ind5)*1000 + uint64(ind6)*100 + uint64(ind7)*10 + uint64(ind8) - iter.head = i - if ind9 == invalidCharForNumber { - iter.assertInteger() - return value - } - } - for { - for i := iter.head; i < iter.tail; i++ { - ind = intDigits[iter.buf[i]] - if ind == invalidCharForNumber { - iter.head = i - iter.assertInteger() - return value - } - if value > uint64SafeToMultiple10 { - value2 := (value << 3) + (value << 1) + uint64(ind) - if value2 < value { - iter.ReportError("readUint64", "overflow") - return - } - value = value2 - continue - } - value = (value << 3) + (value << 1) + uint64(ind) - } - if !iter.loadMore() { - iter.assertInteger() - return value - } - } -} - -func (iter *Iterator) assertInteger() { - if iter.head < len(iter.buf) && iter.buf[iter.head] == '.' { - iter.ReportError("assertInteger", "can not decode float as int") - } -} diff --git a/vendor/github.com/json-iterator/go/iter_object.go b/vendor/github.com/json-iterator/go/iter_object.go deleted file mode 100644 index 6e7c370..0000000 --- a/vendor/github.com/json-iterator/go/iter_object.go +++ /dev/null @@ -1,252 +0,0 @@ -package jsoniter - -import ( - "fmt" - "unicode" -) - -// ReadObject read one field from object. -// If object ended, returns empty string. -// Otherwise, returns the field name. -func (iter *Iterator) ReadObject() (ret string) { - c := iter.nextToken() - switch c { - case 'n': - iter.skipThreeBytes('u', 'l', 'l') - return "" // null - case '{': - c = iter.nextToken() - if c == '"' { - iter.unreadByte() - field := iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - return field - } - if c == '}' { - return "" // end of object - } - iter.ReportError("ReadObject", `expect " after {, but found `+string([]byte{c})) - return - case ',': - field := iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - return field - case '}': - return "" // end of object - default: - iter.ReportError("ReadObject", fmt.Sprintf(`expect { or , or } or n, but found %s`, string([]byte{c}))) - return - } -} - -// CaseInsensitive -func (iter *Iterator) readFieldHash() int64 { - hash := int64(0x811c9dc5) - c := iter.nextToken() - if c != '"' { - iter.ReportError("readFieldHash", `expect ", but found `+string([]byte{c})) - return 0 - } - for { - for i := iter.head; i < iter.tail; i++ { - // require ascii string and no escape - b := iter.buf[i] - if b == '\\' { - iter.head = i - for _, b := range iter.readStringSlowPath() { - if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive { - b += 'a' - 'A' - } - hash ^= int64(b) - hash *= 0x1000193 - } - c = iter.nextToken() - if c != ':' { - iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) - return 0 - } - return hash - } - if b == '"' { - iter.head = i + 1 - c = iter.nextToken() - if c != ':' { - iter.ReportError("readFieldHash", `expect :, but found `+string([]byte{c})) - return 0 - } - return hash - } - if 'A' <= b && b <= 'Z' && !iter.cfg.caseSensitive { - b += 'a' - 'A' - } - hash ^= int64(b) - hash *= 0x1000193 - } - if !iter.loadMore() { - iter.ReportError("readFieldHash", `incomplete field name`) - return 0 - } - } -} - -func calcHash(str string, caseSensitive bool) int64 { - hash := int64(0x811c9dc5) - for _, b := range str { - if caseSensitive { - hash ^= int64(b) - } else { - hash ^= int64(unicode.ToLower(b)) - } - hash *= 0x1000193 - } - return int64(hash) -} - -// ReadObjectCB read object with callback, the key is ascii only and field name not copied -func (iter *Iterator) ReadObjectCB(callback func(*Iterator, string) bool) bool { - c := iter.nextToken() - var field string - if c == '{' { - c = iter.nextToken() - if c == '"' { - iter.unreadByte() - field = iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - if !callback(iter, field) { - return false - } - c = iter.nextToken() - for c == ',' { - field = iter.ReadString() - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - if !callback(iter, field) { - return false - } - c = iter.nextToken() - } - if c != '}' { - iter.ReportError("ReadObjectCB", `object not ended with }`) - return false - } - return true - } - if c == '}' { - return true - } - iter.ReportError("ReadObjectCB", `expect " after }, but found `+string([]byte{c})) - return false - } - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return true // null - } - iter.ReportError("ReadObjectCB", `expect { or n, but found `+string([]byte{c})) - return false -} - -// ReadMapCB read map with callback, the key can be any string -func (iter *Iterator) ReadMapCB(callback func(*Iterator, string) bool) bool { - c := iter.nextToken() - if c == '{' { - c = iter.nextToken() - if c == '"' { - iter.unreadByte() - field := iter.ReadString() - if iter.nextToken() != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) - return false - } - if !callback(iter, field) { - return false - } - c = iter.nextToken() - for c == ',' { - field = iter.ReadString() - if iter.nextToken() != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) - return false - } - if !callback(iter, field) { - return false - } - c = iter.nextToken() - } - if c != '}' { - iter.ReportError("ReadMapCB", `object not ended with }`) - return false - } - return true - } - if c == '}' { - return true - } - iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c})) - return false - } - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return true // null - } - iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c})) - return false -} - -func (iter *Iterator) readObjectStart() bool { - c := iter.nextToken() - if c == '{' { - c = iter.nextToken() - if c == '}' { - return false - } - iter.unreadByte() - return true - } else if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return false - } - iter.ReportError("readObjectStart", "expect { or n, but found "+string([]byte{c})) - return false -} - -func (iter *Iterator) readObjectFieldAsBytes() (ret []byte) { - str := iter.ReadStringAsSlice() - if iter.skipWhitespacesWithoutLoadMore() { - if ret == nil { - ret = make([]byte, len(str)) - copy(ret, str) - } - if !iter.loadMore() { - return - } - } - if iter.buf[iter.head] != ':' { - iter.ReportError("readObjectFieldAsBytes", "expect : after object field, but found "+string([]byte{iter.buf[iter.head]})) - return - } - iter.head++ - if iter.skipWhitespacesWithoutLoadMore() { - if ret == nil { - ret = make([]byte, len(str)) - copy(ret, str) - } - if !iter.loadMore() { - return - } - } - if ret == nil { - return str - } - return ret -} diff --git a/vendor/github.com/json-iterator/go/iter_skip.go b/vendor/github.com/json-iterator/go/iter_skip.go deleted file mode 100644 index f58beb9..0000000 --- a/vendor/github.com/json-iterator/go/iter_skip.go +++ /dev/null @@ -1,129 +0,0 @@ -package jsoniter - -import "fmt" - -// ReadNil reads a json object as nil and -// returns whether it's a nil or not -func (iter *Iterator) ReadNil() (ret bool) { - c := iter.nextToken() - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') // null - return true - } - iter.unreadByte() - return false -} - -// ReadBool reads a json object as BoolValue -func (iter *Iterator) ReadBool() (ret bool) { - c := iter.nextToken() - if c == 't' { - iter.skipThreeBytes('r', 'u', 'e') - return true - } - if c == 'f' { - iter.skipFourBytes('a', 'l', 's', 'e') - return false - } - iter.ReportError("ReadBool", "expect t or f, but found "+string([]byte{c})) - return -} - -// SkipAndReturnBytes skip next JSON element, and return its content as []byte. -// The []byte can be kept, it is a copy of data. -func (iter *Iterator) SkipAndReturnBytes() []byte { - iter.startCapture(iter.head) - iter.Skip() - return iter.stopCapture() -} - -type captureBuffer struct { - startedAt int - captured []byte -} - -func (iter *Iterator) startCapture(captureStartedAt int) { - if iter.captured != nil { - panic("already in capture mode") - } - iter.captureStartedAt = captureStartedAt - iter.captured = make([]byte, 0, 32) -} - -func (iter *Iterator) stopCapture() []byte { - if iter.captured == nil { - panic("not in capture mode") - } - captured := iter.captured - remaining := iter.buf[iter.captureStartedAt:iter.head] - iter.captureStartedAt = -1 - iter.captured = nil - if len(captured) == 0 { - copied := make([]byte, len(remaining)) - copy(copied, remaining) - return copied - } - captured = append(captured, remaining...) - return captured -} - -// Skip skips a json object and positions to relatively the next json object -func (iter *Iterator) Skip() { - c := iter.nextToken() - switch c { - case '"': - iter.skipString() - case 'n': - iter.skipThreeBytes('u', 'l', 'l') // null - case 't': - iter.skipThreeBytes('r', 'u', 'e') // true - case 'f': - iter.skipFourBytes('a', 'l', 's', 'e') // false - case '0': - iter.unreadByte() - iter.ReadFloat32() - case '-', '1', '2', '3', '4', '5', '6', '7', '8', '9': - iter.skipNumber() - case '[': - iter.skipArray() - case '{': - iter.skipObject() - default: - iter.ReportError("Skip", fmt.Sprintf("do not know how to skip: %v", c)) - return - } -} - -func (iter *Iterator) skipFourBytes(b1, b2, b3, b4 byte) { - if iter.readByte() != b1 { - iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) - return - } - if iter.readByte() != b2 { - iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) - return - } - if iter.readByte() != b3 { - iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) - return - } - if iter.readByte() != b4 { - iter.ReportError("skipFourBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3, b4}))) - return - } -} - -func (iter *Iterator) skipThreeBytes(b1, b2, b3 byte) { - if iter.readByte() != b1 { - iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3}))) - return - } - if iter.readByte() != b2 { - iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3}))) - return - } - if iter.readByte() != b3 { - iter.ReportError("skipThreeBytes", fmt.Sprintf("expect %s", string([]byte{b1, b2, b3}))) - return - } -} diff --git a/vendor/github.com/json-iterator/go/iter_skip_sloppy.go b/vendor/github.com/json-iterator/go/iter_skip_sloppy.go deleted file mode 100644 index 8fcdc3b..0000000 --- a/vendor/github.com/json-iterator/go/iter_skip_sloppy.go +++ /dev/null @@ -1,144 +0,0 @@ -//+build jsoniter_sloppy - -package jsoniter - -// sloppy but faster implementation, do not validate the input json - -func (iter *Iterator) skipNumber() { - for { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - switch c { - case ' ', '\n', '\r', '\t', ',', '}', ']': - iter.head = i - return - } - } - if !iter.loadMore() { - return - } - } -} - -func (iter *Iterator) skipArray() { - level := 1 - for { - for i := iter.head; i < iter.tail; i++ { - switch iter.buf[i] { - case '"': // If inside string, skip it - iter.head = i + 1 - iter.skipString() - i = iter.head - 1 // it will be i++ soon - case '[': // If open symbol, increase level - level++ - case ']': // If close symbol, increase level - level-- - - // If we have returned to the original level, we're done - if level == 0 { - iter.head = i + 1 - return - } - } - } - if !iter.loadMore() { - iter.ReportError("skipObject", "incomplete array") - return - } - } -} - -func (iter *Iterator) skipObject() { - level := 1 - for { - for i := iter.head; i < iter.tail; i++ { - switch iter.buf[i] { - case '"': // If inside string, skip it - iter.head = i + 1 - iter.skipString() - i = iter.head - 1 // it will be i++ soon - case '{': // If open symbol, increase level - level++ - case '}': // If close symbol, increase level - level-- - - // If we have returned to the original level, we're done - if level == 0 { - iter.head = i + 1 - return - } - } - } - if !iter.loadMore() { - iter.ReportError("skipObject", "incomplete object") - return - } - } -} - -func (iter *Iterator) skipString() { - for { - end, escaped := iter.findStringEnd() - if end == -1 { - if !iter.loadMore() { - iter.ReportError("skipString", "incomplete string") - return - } - if escaped { - iter.head = 1 // skip the first char as last char read is \ - } - } else { - iter.head = end - return - } - } -} - -// adapted from: https://github.com/buger/jsonparser/blob/master/parser.go -// Tries to find the end of string -// Support if string contains escaped quote symbols. -func (iter *Iterator) findStringEnd() (int, bool) { - escaped := false - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - if c == '"' { - if !escaped { - return i + 1, false - } - j := i - 1 - for { - if j < iter.head || iter.buf[j] != '\\' { - // even number of backslashes - // either end of buffer, or " found - return i + 1, true - } - j-- - if j < iter.head || iter.buf[j] != '\\' { - // odd number of backslashes - // it is \" or \\\" - break - } - j-- - } - } else if c == '\\' { - escaped = true - } - } - j := iter.tail - 1 - for { - if j < iter.head || iter.buf[j] != '\\' { - // even number of backslashes - // either end of buffer, or " found - return -1, false // do not end with \ - } - j-- - if j < iter.head || iter.buf[j] != '\\' { - // odd number of backslashes - // it is \" or \\\" - break - } - j-- - - } - return -1, true // end with \ -} diff --git a/vendor/github.com/json-iterator/go/iter_skip_strict.go b/vendor/github.com/json-iterator/go/iter_skip_strict.go deleted file mode 100644 index f67bc2e..0000000 --- a/vendor/github.com/json-iterator/go/iter_skip_strict.go +++ /dev/null @@ -1,89 +0,0 @@ -//+build !jsoniter_sloppy - -package jsoniter - -import "fmt" - -func (iter *Iterator) skipNumber() { - if !iter.trySkipNumber() { - iter.unreadByte() - iter.ReadFloat32() - } -} - -func (iter *Iterator) trySkipNumber() bool { - dotFound := false - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - switch c { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - case '.': - if dotFound { - iter.ReportError("validateNumber", `more than one dot found in number`) - return true // already failed - } - if i+1 == iter.tail { - return false - } - c = iter.buf[i+1] - switch c { - case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': - default: - iter.ReportError("validateNumber", `missing digit after dot`) - return true // already failed - } - dotFound = true - default: - switch c { - case ',', ']', '}', ' ', '\t', '\n', '\r': - if iter.head == i { - return false // if - without following digits - } - iter.head = i - return true // must be valid - } - return false // may be invalid - } - } - return false -} - -func (iter *Iterator) skipString() { - if !iter.trySkipString() { - iter.unreadByte() - iter.ReadString() - } -} - -func (iter *Iterator) trySkipString() bool { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - if c == '"' { - iter.head = i + 1 - return true // valid - } else if c == '\\' { - return false - } else if c < ' ' { - iter.ReportError("trySkipString", - fmt.Sprintf(`invalid control character found: %d`, c)) - return true // already failed - } - } - return false -} - -func (iter *Iterator) skipObject() { - iter.unreadByte() - iter.ReadObjectCB(func(iter *Iterator, field string) bool { - iter.Skip() - return true - }) -} - -func (iter *Iterator) skipArray() { - iter.unreadByte() - iter.ReadArrayCB(func(iter *Iterator) bool { - iter.Skip() - return true - }) -} diff --git a/vendor/github.com/json-iterator/go/iter_str.go b/vendor/github.com/json-iterator/go/iter_str.go deleted file mode 100644 index adc487e..0000000 --- a/vendor/github.com/json-iterator/go/iter_str.go +++ /dev/null @@ -1,215 +0,0 @@ -package jsoniter - -import ( - "fmt" - "unicode/utf16" -) - -// ReadString read string from iterator -func (iter *Iterator) ReadString() (ret string) { - c := iter.nextToken() - if c == '"' { - for i := iter.head; i < iter.tail; i++ { - c := iter.buf[i] - if c == '"' { - ret = string(iter.buf[iter.head:i]) - iter.head = i + 1 - return ret - } else if c == '\\' { - break - } else if c < ' ' { - iter.ReportError("ReadString", - fmt.Sprintf(`invalid control character found: %d`, c)) - return - } - } - return iter.readStringSlowPath() - } else if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return "" - } - iter.ReportError("ReadString", `expects " or n, but found `+string([]byte{c})) - return -} - -func (iter *Iterator) readStringSlowPath() (ret string) { - var str []byte - var c byte - for iter.Error == nil { - c = iter.readByte() - if c == '"' { - return string(str) - } - if c == '\\' { - c = iter.readByte() - str = iter.readEscapedChar(c, str) - } else { - str = append(str, c) - } - } - iter.ReportError("readStringSlowPath", "unexpected end of input") - return -} - -func (iter *Iterator) readEscapedChar(c byte, str []byte) []byte { - switch c { - case 'u': - r := iter.readU4() - if utf16.IsSurrogate(r) { - c = iter.readByte() - if iter.Error != nil { - return nil - } - if c != '\\' { - iter.unreadByte() - str = appendRune(str, r) - return str - } - c = iter.readByte() - if iter.Error != nil { - return nil - } - if c != 'u' { - str = appendRune(str, r) - return iter.readEscapedChar(c, str) - } - r2 := iter.readU4() - if iter.Error != nil { - return nil - } - combined := utf16.DecodeRune(r, r2) - if combined == '\uFFFD' { - str = appendRune(str, r) - str = appendRune(str, r2) - } else { - str = appendRune(str, combined) - } - } else { - str = appendRune(str, r) - } - case '"': - str = append(str, '"') - case '\\': - str = append(str, '\\') - case '/': - str = append(str, '/') - case 'b': - str = append(str, '\b') - case 'f': - str = append(str, '\f') - case 'n': - str = append(str, '\n') - case 'r': - str = append(str, '\r') - case 't': - str = append(str, '\t') - default: - iter.ReportError("readEscapedChar", - `invalid escape char after \`) - return nil - } - return str -} - -// ReadStringAsSlice read string from iterator without copying into string form. -// The []byte can not be kept, as it will change after next iterator call. -func (iter *Iterator) ReadStringAsSlice() (ret []byte) { - c := iter.nextToken() - if c == '"' { - for i := iter.head; i < iter.tail; i++ { - // require ascii string and no escape - // for: field name, base64, number - if iter.buf[i] == '"' { - // fast path: reuse the underlying buffer - ret = iter.buf[iter.head:i] - iter.head = i + 1 - return ret - } - } - readLen := iter.tail - iter.head - copied := make([]byte, readLen, readLen*2) - copy(copied, iter.buf[iter.head:iter.tail]) - iter.head = iter.tail - for iter.Error == nil { - c := iter.readByte() - if c == '"' { - return copied - } - copied = append(copied, c) - } - return copied - } - iter.ReportError("ReadStringAsSlice", `expects " or n, but found `+string([]byte{c})) - return -} - -func (iter *Iterator) readU4() (ret rune) { - for i := 0; i < 4; i++ { - c := iter.readByte() - if iter.Error != nil { - return - } - if c >= '0' && c <= '9' { - ret = ret*16 + rune(c-'0') - } else if c >= 'a' && c <= 'f' { - ret = ret*16 + rune(c-'a'+10) - } else if c >= 'A' && c <= 'F' { - ret = ret*16 + rune(c-'A'+10) - } else { - iter.ReportError("readU4", "expects 0~9 or a~f, but found "+string([]byte{c})) - return - } - } - return ret -} - -const ( - t1 = 0x00 // 0000 0000 - tx = 0x80 // 1000 0000 - t2 = 0xC0 // 1100 0000 - t3 = 0xE0 // 1110 0000 - t4 = 0xF0 // 1111 0000 - t5 = 0xF8 // 1111 1000 - - maskx = 0x3F // 0011 1111 - mask2 = 0x1F // 0001 1111 - mask3 = 0x0F // 0000 1111 - mask4 = 0x07 // 0000 0111 - - rune1Max = 1<<7 - 1 - rune2Max = 1<<11 - 1 - rune3Max = 1<<16 - 1 - - surrogateMin = 0xD800 - surrogateMax = 0xDFFF - - maxRune = '\U0010FFFF' // Maximum valid Unicode code point. - runeError = '\uFFFD' // the "error" Rune or "Unicode replacement character" -) - -func appendRune(p []byte, r rune) []byte { - // Negative values are erroneous. Making it unsigned addresses the problem. - switch i := uint32(r); { - case i <= rune1Max: - p = append(p, byte(r)) - return p - case i <= rune2Max: - p = append(p, t2|byte(r>>6)) - p = append(p, tx|byte(r)&maskx) - return p - case i > maxRune, surrogateMin <= i && i <= surrogateMax: - r = runeError - fallthrough - case i <= rune3Max: - p = append(p, t3|byte(r>>12)) - p = append(p, tx|byte(r>>6)&maskx) - p = append(p, tx|byte(r)&maskx) - return p - default: - p = append(p, t4|byte(r>>18)) - p = append(p, tx|byte(r>>12)&maskx) - p = append(p, tx|byte(r>>6)&maskx) - p = append(p, tx|byte(r)&maskx) - return p - } -} diff --git a/vendor/github.com/json-iterator/go/jsoniter.go b/vendor/github.com/json-iterator/go/jsoniter.go deleted file mode 100644 index c2934f9..0000000 --- a/vendor/github.com/json-iterator/go/jsoniter.go +++ /dev/null @@ -1,18 +0,0 @@ -// Package jsoniter implements encoding and decoding of JSON as defined in -// RFC 4627 and provides interfaces with identical syntax of standard lib encoding/json. -// Converting from encoding/json to jsoniter is no more than replacing the package with jsoniter -// and variable type declarations (if any). -// jsoniter interfaces gives 100% compatibility with code using standard lib. -// -// "JSON and Go" -// (https://golang.org/doc/articles/json_and_go.html) -// gives a description of how Marshal/Unmarshal operate -// between arbitrary or predefined json objects and bytes, -// and it applies to jsoniter.Marshal/Unmarshal as well. -// -// Besides, jsoniter.Iterator provides a different set of interfaces -// iterating given bytes/string/reader -// and yielding parsed elements one by one. -// This set of interfaces reads input as required and gives -// better performance. -package jsoniter diff --git a/vendor/github.com/json-iterator/go/pool.go b/vendor/github.com/json-iterator/go/pool.go deleted file mode 100644 index e2389b5..0000000 --- a/vendor/github.com/json-iterator/go/pool.go +++ /dev/null @@ -1,42 +0,0 @@ -package jsoniter - -import ( - "io" -) - -// IteratorPool a thread safe pool of iterators with same configuration -type IteratorPool interface { - BorrowIterator(data []byte) *Iterator - ReturnIterator(iter *Iterator) -} - -// StreamPool a thread safe pool of streams with same configuration -type StreamPool interface { - BorrowStream(writer io.Writer) *Stream - ReturnStream(stream *Stream) -} - -func (cfg *frozenConfig) BorrowStream(writer io.Writer) *Stream { - stream := cfg.streamPool.Get().(*Stream) - stream.Reset(writer) - return stream -} - -func (cfg *frozenConfig) ReturnStream(stream *Stream) { - stream.out = nil - stream.Error = nil - stream.Attachment = nil - cfg.streamPool.Put(stream) -} - -func (cfg *frozenConfig) BorrowIterator(data []byte) *Iterator { - iter := cfg.iteratorPool.Get().(*Iterator) - iter.ResetBytes(data) - return iter -} - -func (cfg *frozenConfig) ReturnIterator(iter *Iterator) { - iter.Error = nil - iter.Attachment = nil - cfg.iteratorPool.Put(iter) -} diff --git a/vendor/github.com/json-iterator/go/reflect.go b/vendor/github.com/json-iterator/go/reflect.go deleted file mode 100644 index be7a0e2..0000000 --- a/vendor/github.com/json-iterator/go/reflect.go +++ /dev/null @@ -1,330 +0,0 @@ -package jsoniter - -import ( - "fmt" - "reflect" - "unsafe" - - "github.com/modern-go/reflect2" -) - -// ValDecoder is an internal type registered to cache as needed. -// Don't confuse jsoniter.ValDecoder with json.Decoder. -// For json.Decoder's adapter, refer to jsoniter.AdapterDecoder(todo link). -// -// Reflection on type to create decoders, which is then cached -// Reflection on value is avoided as we can, as the reflect.Value itself will allocate, with following exceptions -// 1. create instance of new value, for example *int will need a int to be allocated -// 2. append to slice, if the existing cap is not enough, allocate will be done using Reflect.New -// 3. assignment to map, both key and value will be reflect.Value -// For a simple struct binding, it will be reflect.Value free and allocation free -type ValDecoder interface { - Decode(ptr unsafe.Pointer, iter *Iterator) -} - -// ValEncoder is an internal type registered to cache as needed. -// Don't confuse jsoniter.ValEncoder with json.Encoder. -// For json.Encoder's adapter, refer to jsoniter.AdapterEncoder(todo godoc link). -type ValEncoder interface { - IsEmpty(ptr unsafe.Pointer) bool - Encode(ptr unsafe.Pointer, stream *Stream) -} - -type checkIsEmpty interface { - IsEmpty(ptr unsafe.Pointer) bool -} - -type ctx struct { - *frozenConfig - prefix string - encoders map[reflect2.Type]ValEncoder - decoders map[reflect2.Type]ValDecoder -} - -func (b *ctx) caseSensitive() bool { - if b.frozenConfig == nil { - // default is case-insensitive - return false - } - return b.frozenConfig.caseSensitive -} - -func (b *ctx) append(prefix string) *ctx { - return &ctx{ - frozenConfig: b.frozenConfig, - prefix: b.prefix + " " + prefix, - encoders: b.encoders, - decoders: b.decoders, - } -} - -// ReadVal copy the underlying JSON into go interface, same as json.Unmarshal -func (iter *Iterator) ReadVal(obj interface{}) { - cacheKey := reflect2.RTypeOf(obj) - decoder := iter.cfg.getDecoderFromCache(cacheKey) - if decoder == nil { - typ := reflect2.TypeOf(obj) - if typ.Kind() != reflect.Ptr { - iter.ReportError("ReadVal", "can only unmarshal into pointer") - return - } - decoder = iter.cfg.DecoderOf(typ) - } - ptr := reflect2.PtrOf(obj) - if ptr == nil { - iter.ReportError("ReadVal", "can not read into nil pointer") - return - } - decoder.Decode(ptr, iter) -} - -// WriteVal copy the go interface into underlying JSON, same as json.Marshal -func (stream *Stream) WriteVal(val interface{}) { - if nil == val { - stream.WriteNil() - return - } - cacheKey := reflect2.RTypeOf(val) - encoder := stream.cfg.getEncoderFromCache(cacheKey) - if encoder == nil { - typ := reflect2.TypeOf(val) - encoder = stream.cfg.EncoderOf(typ) - } - encoder.Encode(reflect2.PtrOf(val), stream) -} - -func (cfg *frozenConfig) DecoderOf(typ reflect2.Type) ValDecoder { - cacheKey := typ.RType() - decoder := cfg.getDecoderFromCache(cacheKey) - if decoder != nil { - return decoder - } - ctx := &ctx{ - frozenConfig: cfg, - prefix: "", - decoders: map[reflect2.Type]ValDecoder{}, - encoders: map[reflect2.Type]ValEncoder{}, - } - ptrType := typ.(*reflect2.UnsafePtrType) - decoder = decoderOfType(ctx, ptrType.Elem()) - cfg.addDecoderToCache(cacheKey, decoder) - return decoder -} - -func decoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := getTypeDecoderFromExtension(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfType(ctx, typ) - for _, extension := range extensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - for _, extension := range ctx.extensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - return decoder -} - -func createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := ctx.decoders[typ] - if decoder != nil { - return decoder - } - placeholder := &placeholderDecoder{} - ctx.decoders[typ] = placeholder - decoder = _createDecoderOfType(ctx, typ) - placeholder.decoder = decoder - return decoder -} - -func _createDecoderOfType(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := createDecoderOfJsonRawMessage(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfJsonNumber(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfMarshaler(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfAny(ctx, typ) - if decoder != nil { - return decoder - } - decoder = createDecoderOfNative(ctx, typ) - if decoder != nil { - return decoder - } - switch typ.Kind() { - case reflect.Interface: - ifaceType, isIFace := typ.(*reflect2.UnsafeIFaceType) - if isIFace { - return &ifaceDecoder{valType: ifaceType} - } - return &efaceDecoder{} - case reflect.Struct: - return decoderOfStruct(ctx, typ) - case reflect.Array: - return decoderOfArray(ctx, typ) - case reflect.Slice: - return decoderOfSlice(ctx, typ) - case reflect.Map: - return decoderOfMap(ctx, typ) - case reflect.Ptr: - return decoderOfOptional(ctx, typ) - default: - return &lazyErrorDecoder{err: fmt.Errorf("%s%s is unsupported type", ctx.prefix, typ.String())} - } -} - -func (cfg *frozenConfig) EncoderOf(typ reflect2.Type) ValEncoder { - cacheKey := typ.RType() - encoder := cfg.getEncoderFromCache(cacheKey) - if encoder != nil { - return encoder - } - ctx := &ctx{ - frozenConfig: cfg, - prefix: "", - decoders: map[reflect2.Type]ValDecoder{}, - encoders: map[reflect2.Type]ValEncoder{}, - } - encoder = encoderOfType(ctx, typ) - if typ.LikePtr() { - encoder = &onePtrEncoder{encoder} - } - cfg.addEncoderToCache(cacheKey, encoder) - return encoder -} - -type onePtrEncoder struct { - encoder ValEncoder -} - -func (encoder *onePtrEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr)) -} - -func (encoder *onePtrEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.encoder.Encode(unsafe.Pointer(&ptr), stream) -} - -func encoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := getTypeEncoderFromExtension(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfType(ctx, typ) - for _, extension := range extensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - for _, extension := range ctx.extensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - return encoder -} - -func createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := ctx.encoders[typ] - if encoder != nil { - return encoder - } - placeholder := &placeholderEncoder{} - ctx.encoders[typ] = placeholder - encoder = _createEncoderOfType(ctx, typ) - placeholder.encoder = encoder - return encoder -} -func _createEncoderOfType(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := createEncoderOfJsonRawMessage(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfJsonNumber(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfMarshaler(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfAny(ctx, typ) - if encoder != nil { - return encoder - } - encoder = createEncoderOfNative(ctx, typ) - if encoder != nil { - return encoder - } - kind := typ.Kind() - switch kind { - case reflect.Interface: - return &dynamicEncoder{typ} - case reflect.Struct: - return encoderOfStruct(ctx, typ) - case reflect.Array: - return encoderOfArray(ctx, typ) - case reflect.Slice: - return encoderOfSlice(ctx, typ) - case reflect.Map: - return encoderOfMap(ctx, typ) - case reflect.Ptr: - return encoderOfOptional(ctx, typ) - default: - return &lazyErrorEncoder{err: fmt.Errorf("%s%s is unsupported type", ctx.prefix, typ.String())} - } -} - -type lazyErrorDecoder struct { - err error -} - -func (decoder *lazyErrorDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.WhatIsNext() != NilValue { - if iter.Error == nil { - iter.Error = decoder.err - } - } else { - iter.Skip() - } -} - -type lazyErrorEncoder struct { - err error -} - -func (encoder *lazyErrorEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if ptr == nil { - stream.WriteNil() - } else if stream.Error == nil { - stream.Error = encoder.err - } -} - -func (encoder *lazyErrorEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type placeholderDecoder struct { - decoder ValDecoder -} - -func (decoder *placeholderDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.decoder.Decode(ptr, iter) -} - -type placeholderEncoder struct { - encoder ValEncoder -} - -func (encoder *placeholderEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.encoder.Encode(ptr, stream) -} - -func (encoder *placeholderEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.encoder.IsEmpty(ptr) -} diff --git a/vendor/github.com/json-iterator/go/reflect_array.go b/vendor/github.com/json-iterator/go/reflect_array.go deleted file mode 100644 index 13a0b7b..0000000 --- a/vendor/github.com/json-iterator/go/reflect_array.go +++ /dev/null @@ -1,104 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "io" - "unsafe" -) - -func decoderOfArray(ctx *ctx, typ reflect2.Type) ValDecoder { - arrayType := typ.(*reflect2.UnsafeArrayType) - decoder := decoderOfType(ctx.append("[arrayElem]"), arrayType.Elem()) - return &arrayDecoder{arrayType, decoder} -} - -func encoderOfArray(ctx *ctx, typ reflect2.Type) ValEncoder { - arrayType := typ.(*reflect2.UnsafeArrayType) - if arrayType.Len() == 0 { - return emptyArrayEncoder{} - } - encoder := encoderOfType(ctx.append("[arrayElem]"), arrayType.Elem()) - return &arrayEncoder{arrayType, encoder} -} - -type emptyArrayEncoder struct{} - -func (encoder emptyArrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteEmptyArray() -} - -func (encoder emptyArrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return true -} - -type arrayEncoder struct { - arrayType *reflect2.UnsafeArrayType - elemEncoder ValEncoder -} - -func (encoder *arrayEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteArrayStart() - elemPtr := unsafe.Pointer(ptr) - encoder.elemEncoder.Encode(elemPtr, stream) - for i := 1; i < encoder.arrayType.Len(); i++ { - stream.WriteMore() - elemPtr = encoder.arrayType.UnsafeGetIndex(ptr, i) - encoder.elemEncoder.Encode(elemPtr, stream) - } - stream.WriteArrayEnd() - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%v: %s", encoder.arrayType, stream.Error.Error()) - } -} - -func (encoder *arrayEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type arrayDecoder struct { - arrayType *reflect2.UnsafeArrayType - elemDecoder ValDecoder -} - -func (decoder *arrayDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.doDecode(ptr, iter) - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.arrayType, iter.Error.Error()) - } -} - -func (decoder *arrayDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - arrayType := decoder.arrayType - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - return - } - if c != '[' { - iter.ReportError("decode array", "expect [ or n, but found "+string([]byte{c})) - return - } - c = iter.nextToken() - if c == ']' { - return - } - iter.unreadByte() - elemPtr := arrayType.UnsafeGetIndex(ptr, 0) - decoder.elemDecoder.Decode(elemPtr, iter) - length := 1 - for c = iter.nextToken(); c == ','; c = iter.nextToken() { - if length >= arrayType.Len() { - iter.Skip() - continue - } - idx := length - length += 1 - elemPtr = arrayType.UnsafeGetIndex(ptr, idx) - decoder.elemDecoder.Decode(elemPtr, iter) - } - if c != ']' { - iter.ReportError("decode array", "expect ], but found "+string([]byte{c})) - return - } -} diff --git a/vendor/github.com/json-iterator/go/reflect_dynamic.go b/vendor/github.com/json-iterator/go/reflect_dynamic.go deleted file mode 100644 index 8b6bc8b..0000000 --- a/vendor/github.com/json-iterator/go/reflect_dynamic.go +++ /dev/null @@ -1,70 +0,0 @@ -package jsoniter - -import ( - "github.com/modern-go/reflect2" - "reflect" - "unsafe" -) - -type dynamicEncoder struct { - valType reflect2.Type -} - -func (encoder *dynamicEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - stream.WriteVal(obj) -} - -func (encoder *dynamicEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.valType.UnsafeIndirect(ptr) == nil -} - -type efaceDecoder struct { -} - -func (decoder *efaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - pObj := (*interface{})(ptr) - obj := *pObj - if obj == nil { - *pObj = iter.Read() - return - } - typ := reflect2.TypeOf(obj) - if typ.Kind() != reflect.Ptr { - *pObj = iter.Read() - return - } - ptrType := typ.(*reflect2.UnsafePtrType) - ptrElemType := ptrType.Elem() - if iter.WhatIsNext() == NilValue { - if ptrElemType.Kind() != reflect.Ptr { - iter.skipFourBytes('n', 'u', 'l', 'l') - *pObj = nil - return - } - } - if reflect2.IsNil(obj) { - obj := ptrElemType.New() - iter.ReadVal(obj) - *pObj = obj - return - } - iter.ReadVal(obj) -} - -type ifaceDecoder struct { - valType *reflect2.UnsafeIFaceType -} - -func (decoder *ifaceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.ReadNil() { - decoder.valType.UnsafeSet(ptr, decoder.valType.UnsafeNew()) - return - } - obj := decoder.valType.UnsafeIndirect(ptr) - if reflect2.IsNil(obj) { - iter.ReportError("decode non empty interface", "can not unmarshal into nil") - return - } - iter.ReadVal(obj) -} diff --git a/vendor/github.com/json-iterator/go/reflect_extension.go b/vendor/github.com/json-iterator/go/reflect_extension.go deleted file mode 100644 index 917bbe8..0000000 --- a/vendor/github.com/json-iterator/go/reflect_extension.go +++ /dev/null @@ -1,471 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "reflect" - "sort" - "strings" - "unicode" - "unsafe" -) - -var typeDecoders = map[string]ValDecoder{} -var fieldDecoders = map[string]ValDecoder{} -var typeEncoders = map[string]ValEncoder{} -var fieldEncoders = map[string]ValEncoder{} -var extensions = []Extension{} - -// StructDescriptor describe how should we encode/decode the struct -type StructDescriptor struct { - Type reflect2.Type - Fields []*Binding -} - -// GetField get one field from the descriptor by its name. -// Can not use map here to keep field orders. -func (structDescriptor *StructDescriptor) GetField(fieldName string) *Binding { - for _, binding := range structDescriptor.Fields { - if binding.Field.Name() == fieldName { - return binding - } - } - return nil -} - -// Binding describe how should we encode/decode the struct field -type Binding struct { - levels []int - Field reflect2.StructField - FromNames []string - ToNames []string - Encoder ValEncoder - Decoder ValDecoder -} - -// Extension the one for all SPI. Customize encoding/decoding by specifying alternate encoder/decoder. -// Can also rename fields by UpdateStructDescriptor. -type Extension interface { - UpdateStructDescriptor(structDescriptor *StructDescriptor) - CreateMapKeyDecoder(typ reflect2.Type) ValDecoder - CreateMapKeyEncoder(typ reflect2.Type) ValEncoder - CreateDecoder(typ reflect2.Type) ValDecoder - CreateEncoder(typ reflect2.Type) ValEncoder - DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder - DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder -} - -// DummyExtension embed this type get dummy implementation for all methods of Extension -type DummyExtension struct { -} - -// UpdateStructDescriptor No-op -func (extension *DummyExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { -} - -// CreateMapKeyDecoder No-op -func (extension *DummyExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateMapKeyEncoder No-op -func (extension *DummyExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// CreateDecoder No-op -func (extension *DummyExtension) CreateDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateEncoder No-op -func (extension *DummyExtension) CreateEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// DecorateDecoder No-op -func (extension *DummyExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { - return decoder -} - -// DecorateEncoder No-op -func (extension *DummyExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { - return encoder -} - -type EncoderExtension map[reflect2.Type]ValEncoder - -// UpdateStructDescriptor No-op -func (extension EncoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { -} - -// CreateDecoder No-op -func (extension EncoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateEncoder get encoder from map -func (extension EncoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder { - return extension[typ] -} - -// CreateMapKeyDecoder No-op -func (extension EncoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateMapKeyEncoder No-op -func (extension EncoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// DecorateDecoder No-op -func (extension EncoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { - return decoder -} - -// DecorateEncoder No-op -func (extension EncoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { - return encoder -} - -type DecoderExtension map[reflect2.Type]ValDecoder - -// UpdateStructDescriptor No-op -func (extension DecoderExtension) UpdateStructDescriptor(structDescriptor *StructDescriptor) { -} - -// CreateMapKeyDecoder No-op -func (extension DecoderExtension) CreateMapKeyDecoder(typ reflect2.Type) ValDecoder { - return nil -} - -// CreateMapKeyEncoder No-op -func (extension DecoderExtension) CreateMapKeyEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// CreateDecoder get decoder from map -func (extension DecoderExtension) CreateDecoder(typ reflect2.Type) ValDecoder { - return extension[typ] -} - -// CreateEncoder No-op -func (extension DecoderExtension) CreateEncoder(typ reflect2.Type) ValEncoder { - return nil -} - -// DecorateDecoder No-op -func (extension DecoderExtension) DecorateDecoder(typ reflect2.Type, decoder ValDecoder) ValDecoder { - return decoder -} - -// DecorateEncoder No-op -func (extension DecoderExtension) DecorateEncoder(typ reflect2.Type, encoder ValEncoder) ValEncoder { - return encoder -} - -type funcDecoder struct { - fun DecoderFunc -} - -func (decoder *funcDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.fun(ptr, iter) -} - -type funcEncoder struct { - fun EncoderFunc - isEmptyFunc func(ptr unsafe.Pointer) bool -} - -func (encoder *funcEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.fun(ptr, stream) -} - -func (encoder *funcEncoder) IsEmpty(ptr unsafe.Pointer) bool { - if encoder.isEmptyFunc == nil { - return false - } - return encoder.isEmptyFunc(ptr) -} - -// DecoderFunc the function form of TypeDecoder -type DecoderFunc func(ptr unsafe.Pointer, iter *Iterator) - -// EncoderFunc the function form of TypeEncoder -type EncoderFunc func(ptr unsafe.Pointer, stream *Stream) - -// RegisterTypeDecoderFunc register TypeDecoder for a type with function -func RegisterTypeDecoderFunc(typ string, fun DecoderFunc) { - typeDecoders[typ] = &funcDecoder{fun} -} - -// RegisterTypeDecoder register TypeDecoder for a typ -func RegisterTypeDecoder(typ string, decoder ValDecoder) { - typeDecoders[typ] = decoder -} - -// RegisterFieldDecoderFunc register TypeDecoder for a struct field with function -func RegisterFieldDecoderFunc(typ string, field string, fun DecoderFunc) { - RegisterFieldDecoder(typ, field, &funcDecoder{fun}) -} - -// RegisterFieldDecoder register TypeDecoder for a struct field -func RegisterFieldDecoder(typ string, field string, decoder ValDecoder) { - fieldDecoders[fmt.Sprintf("%s/%s", typ, field)] = decoder -} - -// RegisterTypeEncoderFunc register TypeEncoder for a type with encode/isEmpty function -func RegisterTypeEncoderFunc(typ string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) { - typeEncoders[typ] = &funcEncoder{fun, isEmptyFunc} -} - -// RegisterTypeEncoder register TypeEncoder for a type -func RegisterTypeEncoder(typ string, encoder ValEncoder) { - typeEncoders[typ] = encoder -} - -// RegisterFieldEncoderFunc register TypeEncoder for a struct field with encode/isEmpty function -func RegisterFieldEncoderFunc(typ string, field string, fun EncoderFunc, isEmptyFunc func(unsafe.Pointer) bool) { - RegisterFieldEncoder(typ, field, &funcEncoder{fun, isEmptyFunc}) -} - -// RegisterFieldEncoder register TypeEncoder for a struct field -func RegisterFieldEncoder(typ string, field string, encoder ValEncoder) { - fieldEncoders[fmt.Sprintf("%s/%s", typ, field)] = encoder -} - -// RegisterExtension register extension -func RegisterExtension(extension Extension) { - extensions = append(extensions, extension) -} - -func getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder { - decoder := _getTypeDecoderFromExtension(ctx, typ) - if decoder != nil { - for _, extension := range extensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - for _, extension := range ctx.extensions { - decoder = extension.DecorateDecoder(typ, decoder) - } - } - return decoder -} -func _getTypeDecoderFromExtension(ctx *ctx, typ reflect2.Type) ValDecoder { - for _, extension := range extensions { - decoder := extension.CreateDecoder(typ) - if decoder != nil { - return decoder - } - } - for _, extension := range ctx.extensions { - decoder := extension.CreateDecoder(typ) - if decoder != nil { - return decoder - } - } - typeName := typ.String() - decoder := typeDecoders[typeName] - if decoder != nil { - return decoder - } - if typ.Kind() == reflect.Ptr { - ptrType := typ.(*reflect2.UnsafePtrType) - decoder := typeDecoders[ptrType.Elem().String()] - if decoder != nil { - return &OptionalDecoder{ptrType.Elem(), decoder} - } - } - return nil -} - -func getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder { - encoder := _getTypeEncoderFromExtension(ctx, typ) - if encoder != nil { - for _, extension := range extensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - for _, extension := range ctx.extensions { - encoder = extension.DecorateEncoder(typ, encoder) - } - } - return encoder -} - -func _getTypeEncoderFromExtension(ctx *ctx, typ reflect2.Type) ValEncoder { - for _, extension := range extensions { - encoder := extension.CreateEncoder(typ) - if encoder != nil { - return encoder - } - } - for _, extension := range ctx.extensions { - encoder := extension.CreateEncoder(typ) - if encoder != nil { - return encoder - } - } - typeName := typ.String() - encoder := typeEncoders[typeName] - if encoder != nil { - return encoder - } - if typ.Kind() == reflect.Ptr { - typePtr := typ.(*reflect2.UnsafePtrType) - encoder := typeEncoders[typePtr.Elem().String()] - if encoder != nil { - return &OptionalEncoder{encoder} - } - } - return nil -} - -func describeStruct(ctx *ctx, typ reflect2.Type) *StructDescriptor { - structType := typ.(*reflect2.UnsafeStructType) - embeddedBindings := []*Binding{} - bindings := []*Binding{} - for i := 0; i < structType.NumField(); i++ { - field := structType.Field(i) - tag, hastag := field.Tag().Lookup(ctx.getTagKey()) - if ctx.onlyTaggedField && !hastag { - continue - } - tagParts := strings.Split(tag, ",") - if tag == "-" { - continue - } - if field.Anonymous() && (tag == "" || tagParts[0] == "") { - if field.Type().Kind() == reflect.Struct { - structDescriptor := describeStruct(ctx, field.Type()) - for _, binding := range structDescriptor.Fields { - binding.levels = append([]int{i}, binding.levels...) - omitempty := binding.Encoder.(*structFieldEncoder).omitempty - binding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty} - binding.Decoder = &structFieldDecoder{field, binding.Decoder} - embeddedBindings = append(embeddedBindings, binding) - } - continue - } else if field.Type().Kind() == reflect.Ptr { - ptrType := field.Type().(*reflect2.UnsafePtrType) - if ptrType.Elem().Kind() == reflect.Struct { - structDescriptor := describeStruct(ctx, ptrType.Elem()) - for _, binding := range structDescriptor.Fields { - binding.levels = append([]int{i}, binding.levels...) - omitempty := binding.Encoder.(*structFieldEncoder).omitempty - binding.Encoder = &dereferenceEncoder{binding.Encoder} - binding.Encoder = &structFieldEncoder{field, binding.Encoder, omitempty} - binding.Decoder = &dereferenceDecoder{ptrType.Elem(), binding.Decoder} - binding.Decoder = &structFieldDecoder{field, binding.Decoder} - embeddedBindings = append(embeddedBindings, binding) - } - continue - } - } - } - fieldNames := calcFieldNames(field.Name(), tagParts[0], tag) - fieldCacheKey := fmt.Sprintf("%s/%s", typ.String(), field.Name()) - decoder := fieldDecoders[fieldCacheKey] - if decoder == nil { - decoder = decoderOfType(ctx.append(field.Name()), field.Type()) - } - encoder := fieldEncoders[fieldCacheKey] - if encoder == nil { - encoder = encoderOfType(ctx.append(field.Name()), field.Type()) - } - binding := &Binding{ - Field: field, - FromNames: fieldNames, - ToNames: fieldNames, - Decoder: decoder, - Encoder: encoder, - } - binding.levels = []int{i} - bindings = append(bindings, binding) - } - return createStructDescriptor(ctx, typ, bindings, embeddedBindings) -} -func createStructDescriptor(ctx *ctx, typ reflect2.Type, bindings []*Binding, embeddedBindings []*Binding) *StructDescriptor { - structDescriptor := &StructDescriptor{ - Type: typ, - Fields: bindings, - } - for _, extension := range extensions { - extension.UpdateStructDescriptor(structDescriptor) - } - for _, extension := range ctx.extensions { - extension.UpdateStructDescriptor(structDescriptor) - } - processTags(structDescriptor, ctx.frozenConfig) - // merge normal & embedded bindings & sort with original order - allBindings := sortableBindings(append(embeddedBindings, structDescriptor.Fields...)) - sort.Sort(allBindings) - structDescriptor.Fields = allBindings - return structDescriptor -} - -type sortableBindings []*Binding - -func (bindings sortableBindings) Len() int { - return len(bindings) -} - -func (bindings sortableBindings) Less(i, j int) bool { - left := bindings[i].levels - right := bindings[j].levels - k := 0 - for { - if left[k] < right[k] { - return true - } else if left[k] > right[k] { - return false - } - k++ - } -} - -func (bindings sortableBindings) Swap(i, j int) { - bindings[i], bindings[j] = bindings[j], bindings[i] -} - -func processTags(structDescriptor *StructDescriptor, cfg *frozenConfig) { - for _, binding := range structDescriptor.Fields { - shouldOmitEmpty := false - tagParts := strings.Split(binding.Field.Tag().Get(cfg.getTagKey()), ",") - for _, tagPart := range tagParts[1:] { - if tagPart == "omitempty" { - shouldOmitEmpty = true - } else if tagPart == "string" { - if binding.Field.Type().Kind() == reflect.String { - binding.Decoder = &stringModeStringDecoder{binding.Decoder, cfg} - binding.Encoder = &stringModeStringEncoder{binding.Encoder, cfg} - } else { - binding.Decoder = &stringModeNumberDecoder{binding.Decoder} - binding.Encoder = &stringModeNumberEncoder{binding.Encoder} - } - } - } - binding.Decoder = &structFieldDecoder{binding.Field, binding.Decoder} - binding.Encoder = &structFieldEncoder{binding.Field, binding.Encoder, shouldOmitEmpty} - } -} - -func calcFieldNames(originalFieldName string, tagProvidedFieldName string, wholeTag string) []string { - // ignore? - if wholeTag == "-" { - return []string{} - } - // rename? - var fieldNames []string - if tagProvidedFieldName == "" { - fieldNames = []string{originalFieldName} - } else { - fieldNames = []string{tagProvidedFieldName} - } - // private? - isNotExported := unicode.IsLower(rune(originalFieldName[0])) - if isNotExported { - fieldNames = []string{} - } - return fieldNames -} diff --git a/vendor/github.com/json-iterator/go/reflect_json_number.go b/vendor/github.com/json-iterator/go/reflect_json_number.go deleted file mode 100644 index 98d45c1..0000000 --- a/vendor/github.com/json-iterator/go/reflect_json_number.go +++ /dev/null @@ -1,112 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "github.com/modern-go/reflect2" - "strconv" - "unsafe" -) - -type Number string - -// String returns the literal text of the number. -func (n Number) String() string { return string(n) } - -// Float64 returns the number as a float64. -func (n Number) Float64() (float64, error) { - return strconv.ParseFloat(string(n), 64) -} - -// Int64 returns the number as an int64. -func (n Number) Int64() (int64, error) { - return strconv.ParseInt(string(n), 10, 64) -} - -func CastJsonNumber(val interface{}) (string, bool) { - switch typedVal := val.(type) { - case json.Number: - return string(typedVal), true - case Number: - return string(typedVal), true - } - return "", false -} - -var jsonNumberType = reflect2.TypeOfPtr((*json.Number)(nil)).Elem() -var jsoniterNumberType = reflect2.TypeOfPtr((*Number)(nil)).Elem() - -func createDecoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ.AssignableTo(jsonNumberType) { - return &jsonNumberCodec{} - } - if typ.AssignableTo(jsoniterNumberType) { - return &jsoniterNumberCodec{} - } - return nil -} - -func createEncoderOfJsonNumber(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ.AssignableTo(jsonNumberType) { - return &jsonNumberCodec{} - } - if typ.AssignableTo(jsoniterNumberType) { - return &jsoniterNumberCodec{} - } - return nil -} - -type jsonNumberCodec struct { -} - -func (codec *jsonNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - switch iter.WhatIsNext() { - case StringValue: - *((*json.Number)(ptr)) = json.Number(iter.ReadString()) - case NilValue: - iter.skipFourBytes('n', 'u', 'l', 'l') - *((*json.Number)(ptr)) = "" - default: - *((*json.Number)(ptr)) = json.Number([]byte(iter.readNumberAsString())) - } -} - -func (codec *jsonNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - number := *((*json.Number)(ptr)) - if len(number) == 0 { - stream.writeByte('0') - } else { - stream.WriteRaw(string(number)) - } -} - -func (codec *jsonNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*json.Number)(ptr))) == 0 -} - -type jsoniterNumberCodec struct { -} - -func (codec *jsoniterNumberCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - switch iter.WhatIsNext() { - case StringValue: - *((*Number)(ptr)) = Number(iter.ReadString()) - case NilValue: - iter.skipFourBytes('n', 'u', 'l', 'l') - *((*Number)(ptr)) = "" - default: - *((*Number)(ptr)) = Number([]byte(iter.readNumberAsString())) - } -} - -func (codec *jsoniterNumberCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - number := *((*Number)(ptr)) - if len(number) == 0 { - stream.writeByte('0') - } else { - stream.WriteRaw(string(number)) - } -} - -func (codec *jsoniterNumberCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*Number)(ptr))) == 0 -} diff --git a/vendor/github.com/json-iterator/go/reflect_json_raw_message.go b/vendor/github.com/json-iterator/go/reflect_json_raw_message.go deleted file mode 100644 index f261993..0000000 --- a/vendor/github.com/json-iterator/go/reflect_json_raw_message.go +++ /dev/null @@ -1,60 +0,0 @@ -package jsoniter - -import ( - "encoding/json" - "github.com/modern-go/reflect2" - "unsafe" -) - -var jsonRawMessageType = reflect2.TypeOfPtr((*json.RawMessage)(nil)).Elem() -var jsoniterRawMessageType = reflect2.TypeOfPtr((*RawMessage)(nil)).Elem() - -func createEncoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ == jsonRawMessageType { - return &jsonRawMessageCodec{} - } - if typ == jsoniterRawMessageType { - return &jsoniterRawMessageCodec{} - } - return nil -} - -func createDecoderOfJsonRawMessage(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ == jsonRawMessageType { - return &jsonRawMessageCodec{} - } - if typ == jsoniterRawMessageType { - return &jsoniterRawMessageCodec{} - } - return nil -} - -type jsonRawMessageCodec struct { -} - -func (codec *jsonRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*json.RawMessage)(ptr)) = json.RawMessage(iter.SkipAndReturnBytes()) -} - -func (codec *jsonRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*json.RawMessage)(ptr)))) -} - -func (codec *jsonRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*json.RawMessage)(ptr))) == 0 -} - -type jsoniterRawMessageCodec struct { -} - -func (codec *jsoniterRawMessageCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*RawMessage)(ptr)) = RawMessage(iter.SkipAndReturnBytes()) -} - -func (codec *jsoniterRawMessageCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteRaw(string(*((*RawMessage)(ptr)))) -} - -func (codec *jsoniterRawMessageCodec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*RawMessage)(ptr))) == 0 -} diff --git a/vendor/github.com/json-iterator/go/reflect_map.go b/vendor/github.com/json-iterator/go/reflect_map.go deleted file mode 100644 index 8812f08..0000000 --- a/vendor/github.com/json-iterator/go/reflect_map.go +++ /dev/null @@ -1,318 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "io" - "reflect" - "sort" - "unsafe" -) - -func decoderOfMap(ctx *ctx, typ reflect2.Type) ValDecoder { - mapType := typ.(*reflect2.UnsafeMapType) - keyDecoder := decoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()) - elemDecoder := decoderOfType(ctx.append("[mapElem]"), mapType.Elem()) - return &mapDecoder{ - mapType: mapType, - keyType: mapType.Key(), - elemType: mapType.Elem(), - keyDecoder: keyDecoder, - elemDecoder: elemDecoder, - } -} - -func encoderOfMap(ctx *ctx, typ reflect2.Type) ValEncoder { - mapType := typ.(*reflect2.UnsafeMapType) - if ctx.sortMapKeys { - return &sortKeysMapEncoder{ - mapType: mapType, - keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()), - elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()), - } - } - return &mapEncoder{ - mapType: mapType, - keyEncoder: encoderOfMapKey(ctx.append("[mapKey]"), mapType.Key()), - elemEncoder: encoderOfType(ctx.append("[mapElem]"), mapType.Elem()), - } -} - -func decoderOfMapKey(ctx *ctx, typ reflect2.Type) ValDecoder { - for _, extension := range ctx.extensions { - decoder := extension.CreateMapKeyDecoder(typ) - if decoder != nil { - return decoder - } - } - switch typ.Kind() { - case reflect.String: - return decoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String)) - case reflect.Bool, - reflect.Uint8, reflect.Int8, - reflect.Uint16, reflect.Int16, - reflect.Uint32, reflect.Int32, - reflect.Uint64, reflect.Int64, - reflect.Uint, reflect.Int, - reflect.Float32, reflect.Float64, - reflect.Uintptr: - typ = reflect2.DefaultTypeOfKind(typ.Kind()) - return &numericMapKeyDecoder{decoderOfType(ctx, typ)} - default: - ptrType := reflect2.PtrTo(typ) - if ptrType.Implements(textMarshalerType) { - return &referenceDecoder{ - &textUnmarshalerDecoder{ - valType: ptrType, - }, - } - } - if typ.Implements(textMarshalerType) { - return &textUnmarshalerDecoder{ - valType: typ, - } - } - return &lazyErrorDecoder{err: fmt.Errorf("unsupported map key type: %v", typ)} - } -} - -func encoderOfMapKey(ctx *ctx, typ reflect2.Type) ValEncoder { - for _, extension := range ctx.extensions { - encoder := extension.CreateMapKeyEncoder(typ) - if encoder != nil { - return encoder - } - } - switch typ.Kind() { - case reflect.String: - return encoderOfType(ctx, reflect2.DefaultTypeOfKind(reflect.String)) - case reflect.Bool, - reflect.Uint8, reflect.Int8, - reflect.Uint16, reflect.Int16, - reflect.Uint32, reflect.Int32, - reflect.Uint64, reflect.Int64, - reflect.Uint, reflect.Int, - reflect.Float32, reflect.Float64, - reflect.Uintptr: - typ = reflect2.DefaultTypeOfKind(typ.Kind()) - return &numericMapKeyEncoder{encoderOfType(ctx, typ)} - default: - if typ == textMarshalerType { - return &directTextMarshalerEncoder{ - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - } - } - if typ.Implements(textMarshalerType) { - return &textMarshalerEncoder{ - valType: typ, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - } - } - if typ.Kind() == reflect.Interface { - return &dynamicMapKeyEncoder{ctx, typ} - } - return &lazyErrorEncoder{err: fmt.Errorf("unsupported map key type: %v", typ)} - } -} - -type mapDecoder struct { - mapType *reflect2.UnsafeMapType - keyType reflect2.Type - elemType reflect2.Type - keyDecoder ValDecoder - elemDecoder ValDecoder -} - -func (decoder *mapDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - mapType := decoder.mapType - c := iter.nextToken() - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - *(*unsafe.Pointer)(ptr) = nil - mapType.UnsafeSet(ptr, mapType.UnsafeNew()) - return - } - if mapType.UnsafeIsNil(ptr) { - mapType.UnsafeSet(ptr, mapType.UnsafeMakeMap(0)) - } - if c != '{' { - iter.ReportError("ReadMapCB", `expect { or n, but found `+string([]byte{c})) - return - } - c = iter.nextToken() - if c == '}' { - return - } - if c != '"' { - iter.ReportError("ReadMapCB", `expect " after }, but found `+string([]byte{c})) - return - } - iter.unreadByte() - key := decoder.keyType.UnsafeNew() - decoder.keyDecoder.Decode(key, iter) - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) - return - } - elem := decoder.elemType.UnsafeNew() - decoder.elemDecoder.Decode(elem, iter) - decoder.mapType.UnsafeSetIndex(ptr, key, elem) - for c = iter.nextToken(); c == ','; c = iter.nextToken() { - key := decoder.keyType.UnsafeNew() - decoder.keyDecoder.Decode(key, iter) - c = iter.nextToken() - if c != ':' { - iter.ReportError("ReadMapCB", "expect : after object field, but found "+string([]byte{c})) - return - } - elem := decoder.elemType.UnsafeNew() - decoder.elemDecoder.Decode(elem, iter) - decoder.mapType.UnsafeSetIndex(ptr, key, elem) - } - if c != '}' { - iter.ReportError("ReadMapCB", `expect }, but found `+string([]byte{c})) - } -} - -type numericMapKeyDecoder struct { - decoder ValDecoder -} - -func (decoder *numericMapKeyDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - if c != '"' { - iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c})) - return - } - decoder.decoder.Decode(ptr, iter) - c = iter.nextToken() - if c != '"' { - iter.ReportError("ReadMapCB", `expect ", but found `+string([]byte{c})) - return - } -} - -type numericMapKeyEncoder struct { - encoder ValEncoder -} - -func (encoder *numericMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.writeByte('"') - encoder.encoder.Encode(ptr, stream) - stream.writeByte('"') -} - -func (encoder *numericMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type dynamicMapKeyEncoder struct { - ctx *ctx - valType reflect2.Type -} - -func (encoder *dynamicMapKeyEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).Encode(reflect2.PtrOf(obj), stream) -} - -func (encoder *dynamicMapKeyEncoder) IsEmpty(ptr unsafe.Pointer) bool { - obj := encoder.valType.UnsafeIndirect(ptr) - return encoderOfMapKey(encoder.ctx, reflect2.TypeOf(obj)).IsEmpty(reflect2.PtrOf(obj)) -} - -type mapEncoder struct { - mapType *reflect2.UnsafeMapType - keyEncoder ValEncoder - elemEncoder ValEncoder -} - -func (encoder *mapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteObjectStart() - iter := encoder.mapType.UnsafeIterate(ptr) - for i := 0; iter.HasNext(); i++ { - if i != 0 { - stream.WriteMore() - } - key, elem := iter.UnsafeNext() - encoder.keyEncoder.Encode(key, stream) - if stream.indention > 0 { - stream.writeTwoBytes(byte(':'), byte(' ')) - } else { - stream.writeByte(':') - } - encoder.elemEncoder.Encode(elem, stream) - } - stream.WriteObjectEnd() -} - -func (encoder *mapEncoder) IsEmpty(ptr unsafe.Pointer) bool { - iter := encoder.mapType.UnsafeIterate(ptr) - return !iter.HasNext() -} - -type sortKeysMapEncoder struct { - mapType *reflect2.UnsafeMapType - keyEncoder ValEncoder - elemEncoder ValEncoder -} - -func (encoder *sortKeysMapEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *(*unsafe.Pointer)(ptr) == nil { - stream.WriteNil() - return - } - stream.WriteObjectStart() - mapIter := encoder.mapType.UnsafeIterate(ptr) - subStream := stream.cfg.BorrowStream(nil) - subIter := stream.cfg.BorrowIterator(nil) - keyValues := encodedKeyValues{} - for mapIter.HasNext() { - subStream.buf = make([]byte, 0, 64) - key, elem := mapIter.UnsafeNext() - encoder.keyEncoder.Encode(key, subStream) - if subStream.Error != nil && subStream.Error != io.EOF && stream.Error == nil { - stream.Error = subStream.Error - } - encodedKey := subStream.Buffer() - subIter.ResetBytes(encodedKey) - decodedKey := subIter.ReadString() - if stream.indention > 0 { - subStream.writeTwoBytes(byte(':'), byte(' ')) - } else { - subStream.writeByte(':') - } - encoder.elemEncoder.Encode(elem, subStream) - keyValues = append(keyValues, encodedKV{ - key: decodedKey, - keyValue: subStream.Buffer(), - }) - } - sort.Sort(keyValues) - for i, keyValue := range keyValues { - if i != 0 { - stream.WriteMore() - } - stream.Write(keyValue.keyValue) - } - stream.WriteObjectEnd() - stream.cfg.ReturnStream(subStream) - stream.cfg.ReturnIterator(subIter) -} - -func (encoder *sortKeysMapEncoder) IsEmpty(ptr unsafe.Pointer) bool { - iter := encoder.mapType.UnsafeIterate(ptr) - return !iter.HasNext() -} - -type encodedKeyValues []encodedKV - -type encodedKV struct { - key string - keyValue []byte -} - -func (sv encodedKeyValues) Len() int { return len(sv) } -func (sv encodedKeyValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } -func (sv encodedKeyValues) Less(i, j int) bool { return sv[i].key < sv[j].key } diff --git a/vendor/github.com/json-iterator/go/reflect_marshaler.go b/vendor/github.com/json-iterator/go/reflect_marshaler.go deleted file mode 100644 index 58ac959..0000000 --- a/vendor/github.com/json-iterator/go/reflect_marshaler.go +++ /dev/null @@ -1,218 +0,0 @@ -package jsoniter - -import ( - "encoding" - "encoding/json" - "github.com/modern-go/reflect2" - "unsafe" -) - -var marshalerType = reflect2.TypeOfPtr((*json.Marshaler)(nil)).Elem() -var unmarshalerType = reflect2.TypeOfPtr((*json.Unmarshaler)(nil)).Elem() -var textMarshalerType = reflect2.TypeOfPtr((*encoding.TextMarshaler)(nil)).Elem() -var textUnmarshalerType = reflect2.TypeOfPtr((*encoding.TextUnmarshaler)(nil)).Elem() - -func createDecoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValDecoder { - ptrType := reflect2.PtrTo(typ) - if ptrType.Implements(unmarshalerType) { - return &referenceDecoder{ - &unmarshalerDecoder{ptrType}, - } - } - if ptrType.Implements(textUnmarshalerType) { - return &referenceDecoder{ - &textUnmarshalerDecoder{ptrType}, - } - } - return nil -} - -func createEncoderOfMarshaler(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ == marshalerType { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &directMarshalerEncoder{ - checkIsEmpty: checkIsEmpty, - } - return encoder - } - if typ.Implements(marshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &marshalerEncoder{ - valType: typ, - checkIsEmpty: checkIsEmpty, - } - return encoder - } - ptrType := reflect2.PtrTo(typ) - if ctx.prefix != "" && ptrType.Implements(marshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, ptrType) - var encoder ValEncoder = &marshalerEncoder{ - valType: ptrType, - checkIsEmpty: checkIsEmpty, - } - return &referenceEncoder{encoder} - } - if typ == textMarshalerType { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &directTextMarshalerEncoder{ - checkIsEmpty: checkIsEmpty, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - } - return encoder - } - if typ.Implements(textMarshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, typ) - var encoder ValEncoder = &textMarshalerEncoder{ - valType: typ, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - checkIsEmpty: checkIsEmpty, - } - return encoder - } - // if prefix is empty, the type is the root type - if ctx.prefix != "" && ptrType.Implements(textMarshalerType) { - checkIsEmpty := createCheckIsEmpty(ctx, ptrType) - var encoder ValEncoder = &textMarshalerEncoder{ - valType: ptrType, - stringEncoder: ctx.EncoderOf(reflect2.TypeOf("")), - checkIsEmpty: checkIsEmpty, - } - return &referenceEncoder{encoder} - } - return nil -} - -type marshalerEncoder struct { - checkIsEmpty checkIsEmpty - valType reflect2.Type -} - -func (encoder *marshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - if encoder.valType.IsNullable() && reflect2.IsNil(obj) { - stream.WriteNil() - return - } - marshaler := obj.(json.Marshaler) - bytes, err := marshaler.MarshalJSON() - if err != nil { - stream.Error = err - } else { - stream.Write(bytes) - } -} - -func (encoder *marshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type directMarshalerEncoder struct { - checkIsEmpty checkIsEmpty -} - -func (encoder *directMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - marshaler := *(*json.Marshaler)(ptr) - if marshaler == nil { - stream.WriteNil() - return - } - bytes, err := marshaler.MarshalJSON() - if err != nil { - stream.Error = err - } else { - stream.Write(bytes) - } -} - -func (encoder *directMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type textMarshalerEncoder struct { - valType reflect2.Type - stringEncoder ValEncoder - checkIsEmpty checkIsEmpty -} - -func (encoder *textMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - obj := encoder.valType.UnsafeIndirect(ptr) - if encoder.valType.IsNullable() && reflect2.IsNil(obj) { - stream.WriteNil() - return - } - marshaler := (obj).(encoding.TextMarshaler) - bytes, err := marshaler.MarshalText() - if err != nil { - stream.Error = err - } else { - str := string(bytes) - encoder.stringEncoder.Encode(unsafe.Pointer(&str), stream) - } -} - -func (encoder *textMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type directTextMarshalerEncoder struct { - stringEncoder ValEncoder - checkIsEmpty checkIsEmpty -} - -func (encoder *directTextMarshalerEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - marshaler := *(*encoding.TextMarshaler)(ptr) - if marshaler == nil { - stream.WriteNil() - return - } - bytes, err := marshaler.MarshalText() - if err != nil { - stream.Error = err - } else { - str := string(bytes) - encoder.stringEncoder.Encode(unsafe.Pointer(&str), stream) - } -} - -func (encoder *directTextMarshalerEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.checkIsEmpty.IsEmpty(ptr) -} - -type unmarshalerDecoder struct { - valType reflect2.Type -} - -func (decoder *unmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - valType := decoder.valType - obj := valType.UnsafeIndirect(ptr) - unmarshaler := obj.(json.Unmarshaler) - iter.nextToken() - iter.unreadByte() // skip spaces - bytes := iter.SkipAndReturnBytes() - err := unmarshaler.UnmarshalJSON(bytes) - if err != nil { - iter.ReportError("unmarshalerDecoder", err.Error()) - } -} - -type textUnmarshalerDecoder struct { - valType reflect2.Type -} - -func (decoder *textUnmarshalerDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - valType := decoder.valType - obj := valType.UnsafeIndirect(ptr) - if reflect2.IsNil(obj) { - ptrType := valType.(*reflect2.UnsafePtrType) - elemType := ptrType.Elem() - elem := elemType.UnsafeNew() - ptrType.UnsafeSet(ptr, unsafe.Pointer(&elem)) - obj = valType.UnsafeIndirect(ptr) - } - unmarshaler := (obj).(encoding.TextUnmarshaler) - str := iter.ReadString() - err := unmarshaler.UnmarshalText([]byte(str)) - if err != nil { - iter.ReportError("textUnmarshalerDecoder", err.Error()) - } -} diff --git a/vendor/github.com/json-iterator/go/reflect_native.go b/vendor/github.com/json-iterator/go/reflect_native.go deleted file mode 100644 index 9042eb0..0000000 --- a/vendor/github.com/json-iterator/go/reflect_native.go +++ /dev/null @@ -1,451 +0,0 @@ -package jsoniter - -import ( - "encoding/base64" - "reflect" - "strconv" - "unsafe" - - "github.com/modern-go/reflect2" -) - -const ptrSize = 32 << uintptr(^uintptr(0)>>63) - -func createEncoderOfNative(ctx *ctx, typ reflect2.Type) ValEncoder { - if typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 { - sliceDecoder := decoderOfSlice(ctx, typ) - return &base64Codec{sliceDecoder: sliceDecoder} - } - typeName := typ.String() - kind := typ.Kind() - switch kind { - case reflect.String: - if typeName != "string" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem()) - } - return &stringCodec{} - case reflect.Int: - if typeName != "int" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &int32Codec{} - } - return &int64Codec{} - case reflect.Int8: - if typeName != "int8" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem()) - } - return &int8Codec{} - case reflect.Int16: - if typeName != "int16" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem()) - } - return &int16Codec{} - case reflect.Int32: - if typeName != "int32" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem()) - } - return &int32Codec{} - case reflect.Int64: - if typeName != "int64" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem()) - } - return &int64Codec{} - case reflect.Uint: - if typeName != "uint" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint8: - if typeName != "uint8" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem()) - } - return &uint8Codec{} - case reflect.Uint16: - if typeName != "uint16" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem()) - } - return &uint16Codec{} - case reflect.Uint32: - if typeName != "uint32" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem()) - } - return &uint32Codec{} - case reflect.Uintptr: - if typeName != "uintptr" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem()) - } - if ptrSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint64: - if typeName != "uint64" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem()) - } - return &uint64Codec{} - case reflect.Float32: - if typeName != "float32" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem()) - } - return &float32Codec{} - case reflect.Float64: - if typeName != "float64" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem()) - } - return &float64Codec{} - case reflect.Bool: - if typeName != "bool" { - return encoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem()) - } - return &boolCodec{} - } - return nil -} - -func createDecoderOfNative(ctx *ctx, typ reflect2.Type) ValDecoder { - if typ.Kind() == reflect.Slice && typ.(reflect2.SliceType).Elem().Kind() == reflect.Uint8 { - sliceDecoder := decoderOfSlice(ctx, typ) - return &base64Codec{sliceDecoder: sliceDecoder} - } - typeName := typ.String() - switch typ.Kind() { - case reflect.String: - if typeName != "string" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*string)(nil)).Elem()) - } - return &stringCodec{} - case reflect.Int: - if typeName != "int" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &int32Codec{} - } - return &int64Codec{} - case reflect.Int8: - if typeName != "int8" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int8)(nil)).Elem()) - } - return &int8Codec{} - case reflect.Int16: - if typeName != "int16" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int16)(nil)).Elem()) - } - return &int16Codec{} - case reflect.Int32: - if typeName != "int32" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int32)(nil)).Elem()) - } - return &int32Codec{} - case reflect.Int64: - if typeName != "int64" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*int64)(nil)).Elem()) - } - return &int64Codec{} - case reflect.Uint: - if typeName != "uint" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint)(nil)).Elem()) - } - if strconv.IntSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint8: - if typeName != "uint8" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint8)(nil)).Elem()) - } - return &uint8Codec{} - case reflect.Uint16: - if typeName != "uint16" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint16)(nil)).Elem()) - } - return &uint16Codec{} - case reflect.Uint32: - if typeName != "uint32" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint32)(nil)).Elem()) - } - return &uint32Codec{} - case reflect.Uintptr: - if typeName != "uintptr" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uintptr)(nil)).Elem()) - } - if ptrSize == 32 { - return &uint32Codec{} - } - return &uint64Codec{} - case reflect.Uint64: - if typeName != "uint64" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*uint64)(nil)).Elem()) - } - return &uint64Codec{} - case reflect.Float32: - if typeName != "float32" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*float32)(nil)).Elem()) - } - return &float32Codec{} - case reflect.Float64: - if typeName != "float64" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*float64)(nil)).Elem()) - } - return &float64Codec{} - case reflect.Bool: - if typeName != "bool" { - return decoderOfType(ctx, reflect2.TypeOfPtr((*bool)(nil)).Elem()) - } - return &boolCodec{} - } - return nil -} - -type stringCodec struct { -} - -func (codec *stringCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - *((*string)(ptr)) = iter.ReadString() -} - -func (codec *stringCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - str := *((*string)(ptr)) - stream.WriteString(str) -} - -func (codec *stringCodec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*string)(ptr)) == "" -} - -type int8Codec struct { -} - -func (codec *int8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int8)(ptr)) = iter.ReadInt8() - } -} - -func (codec *int8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt8(*((*int8)(ptr))) -} - -func (codec *int8Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int8)(ptr)) == 0 -} - -type int16Codec struct { -} - -func (codec *int16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int16)(ptr)) = iter.ReadInt16() - } -} - -func (codec *int16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt16(*((*int16)(ptr))) -} - -func (codec *int16Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int16)(ptr)) == 0 -} - -type int32Codec struct { -} - -func (codec *int32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int32)(ptr)) = iter.ReadInt32() - } -} - -func (codec *int32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt32(*((*int32)(ptr))) -} - -func (codec *int32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int32)(ptr)) == 0 -} - -type int64Codec struct { -} - -func (codec *int64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*int64)(ptr)) = iter.ReadInt64() - } -} - -func (codec *int64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteInt64(*((*int64)(ptr))) -} - -func (codec *int64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*int64)(ptr)) == 0 -} - -type uint8Codec struct { -} - -func (codec *uint8Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint8)(ptr)) = iter.ReadUint8() - } -} - -func (codec *uint8Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint8(*((*uint8)(ptr))) -} - -func (codec *uint8Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint8)(ptr)) == 0 -} - -type uint16Codec struct { -} - -func (codec *uint16Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint16)(ptr)) = iter.ReadUint16() - } -} - -func (codec *uint16Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint16(*((*uint16)(ptr))) -} - -func (codec *uint16Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint16)(ptr)) == 0 -} - -type uint32Codec struct { -} - -func (codec *uint32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint32)(ptr)) = iter.ReadUint32() - } -} - -func (codec *uint32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint32(*((*uint32)(ptr))) -} - -func (codec *uint32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint32)(ptr)) == 0 -} - -type uint64Codec struct { -} - -func (codec *uint64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*uint64)(ptr)) = iter.ReadUint64() - } -} - -func (codec *uint64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteUint64(*((*uint64)(ptr))) -} - -func (codec *uint64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*uint64)(ptr)) == 0 -} - -type float32Codec struct { -} - -func (codec *float32Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*float32)(ptr)) = iter.ReadFloat32() - } -} - -func (codec *float32Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat32(*((*float32)(ptr))) -} - -func (codec *float32Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float32)(ptr)) == 0 -} - -type float64Codec struct { -} - -func (codec *float64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*float64)(ptr)) = iter.ReadFloat64() - } -} - -func (codec *float64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteFloat64(*((*float64)(ptr))) -} - -func (codec *float64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return *((*float64)(ptr)) == 0 -} - -type boolCodec struct { -} - -func (codec *boolCodec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.ReadNil() { - *((*bool)(ptr)) = iter.ReadBool() - } -} - -func (codec *boolCodec) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteBool(*((*bool)(ptr))) -} - -func (codec *boolCodec) IsEmpty(ptr unsafe.Pointer) bool { - return !(*((*bool)(ptr))) -} - -type base64Codec struct { - sliceType *reflect2.UnsafeSliceType - sliceDecoder ValDecoder -} - -func (codec *base64Codec) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.ReadNil() { - codec.sliceType.UnsafeSetNil(ptr) - return - } - switch iter.WhatIsNext() { - case StringValue: - src := iter.ReadString() - dst, err := base64.StdEncoding.DecodeString(src) - if err != nil { - iter.ReportError("decode base64", err.Error()) - } else { - codec.sliceType.UnsafeSet(ptr, unsafe.Pointer(&dst)) - } - case ArrayValue: - codec.sliceDecoder.Decode(ptr, iter) - default: - iter.ReportError("base64Codec", "invalid input") - } -} - -func (codec *base64Codec) Encode(ptr unsafe.Pointer, stream *Stream) { - src := *((*[]byte)(ptr)) - if len(src) == 0 { - stream.WriteNil() - return - } - encoding := base64.StdEncoding - stream.writeByte('"') - size := encoding.EncodedLen(len(src)) - buf := make([]byte, size) - encoding.Encode(buf, src) - stream.buf = append(stream.buf, buf...) - stream.writeByte('"') -} - -func (codec *base64Codec) IsEmpty(ptr unsafe.Pointer) bool { - return len(*((*[]byte)(ptr))) == 0 -} diff --git a/vendor/github.com/json-iterator/go/reflect_optional.go b/vendor/github.com/json-iterator/go/reflect_optional.go deleted file mode 100644 index 43ec71d..0000000 --- a/vendor/github.com/json-iterator/go/reflect_optional.go +++ /dev/null @@ -1,133 +0,0 @@ -package jsoniter - -import ( - "github.com/modern-go/reflect2" - "reflect" - "unsafe" -) - -func decoderOfOptional(ctx *ctx, typ reflect2.Type) ValDecoder { - ptrType := typ.(*reflect2.UnsafePtrType) - elemType := ptrType.Elem() - decoder := decoderOfType(ctx, elemType) - if ctx.prefix == "" && elemType.Kind() == reflect.Ptr { - return &dereferenceDecoder{elemType, decoder} - } - return &OptionalDecoder{elemType, decoder} -} - -func encoderOfOptional(ctx *ctx, typ reflect2.Type) ValEncoder { - ptrType := typ.(*reflect2.UnsafePtrType) - elemType := ptrType.Elem() - elemEncoder := encoderOfType(ctx, elemType) - encoder := &OptionalEncoder{elemEncoder} - return encoder -} - -type OptionalDecoder struct { - ValueType reflect2.Type - ValueDecoder ValDecoder -} - -func (decoder *OptionalDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if iter.ReadNil() { - *((*unsafe.Pointer)(ptr)) = nil - } else { - if *((*unsafe.Pointer)(ptr)) == nil { - //pointer to null, we have to allocate memory to hold the value - newPtr := decoder.ValueType.UnsafeNew() - decoder.ValueDecoder.Decode(newPtr, iter) - *((*unsafe.Pointer)(ptr)) = newPtr - } else { - //reuse existing instance - decoder.ValueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) - } - } -} - -type dereferenceDecoder struct { - // only to deference a pointer - valueType reflect2.Type - valueDecoder ValDecoder -} - -func (decoder *dereferenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if *((*unsafe.Pointer)(ptr)) == nil { - //pointer to null, we have to allocate memory to hold the value - newPtr := decoder.valueType.UnsafeNew() - decoder.valueDecoder.Decode(newPtr, iter) - *((*unsafe.Pointer)(ptr)) = newPtr - } else { - //reuse existing instance - decoder.valueDecoder.Decode(*((*unsafe.Pointer)(ptr)), iter) - } -} - -type OptionalEncoder struct { - ValueEncoder ValEncoder -} - -func (encoder *OptionalEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *((*unsafe.Pointer)(ptr)) == nil { - stream.WriteNil() - } else { - encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) - } -} - -func (encoder *OptionalEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return *((*unsafe.Pointer)(ptr)) == nil -} - -type dereferenceEncoder struct { - ValueEncoder ValEncoder -} - -func (encoder *dereferenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if *((*unsafe.Pointer)(ptr)) == nil { - stream.WriteNil() - } else { - encoder.ValueEncoder.Encode(*((*unsafe.Pointer)(ptr)), stream) - } -} - -func (encoder *dereferenceEncoder) IsEmpty(ptr unsafe.Pointer) bool { - dePtr := *((*unsafe.Pointer)(ptr)) - if dePtr == nil { - return true - } - return encoder.ValueEncoder.IsEmpty(dePtr) -} - -func (encoder *dereferenceEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool { - deReferenced := *((*unsafe.Pointer)(ptr)) - if deReferenced == nil { - return true - } - isEmbeddedPtrNil, converted := encoder.ValueEncoder.(IsEmbeddedPtrNil) - if !converted { - return false - } - fieldPtr := unsafe.Pointer(deReferenced) - return isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr) -} - -type referenceEncoder struct { - encoder ValEncoder -} - -func (encoder *referenceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - encoder.encoder.Encode(unsafe.Pointer(&ptr), stream) -} - -func (encoder *referenceEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.encoder.IsEmpty(unsafe.Pointer(&ptr)) -} - -type referenceDecoder struct { - decoder ValDecoder -} - -func (decoder *referenceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.decoder.Decode(unsafe.Pointer(&ptr), iter) -} diff --git a/vendor/github.com/json-iterator/go/reflect_slice.go b/vendor/github.com/json-iterator/go/reflect_slice.go deleted file mode 100644 index 9441d79..0000000 --- a/vendor/github.com/json-iterator/go/reflect_slice.go +++ /dev/null @@ -1,99 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "io" - "unsafe" -) - -func decoderOfSlice(ctx *ctx, typ reflect2.Type) ValDecoder { - sliceType := typ.(*reflect2.UnsafeSliceType) - decoder := decoderOfType(ctx.append("[sliceElem]"), sliceType.Elem()) - return &sliceDecoder{sliceType, decoder} -} - -func encoderOfSlice(ctx *ctx, typ reflect2.Type) ValEncoder { - sliceType := typ.(*reflect2.UnsafeSliceType) - encoder := encoderOfType(ctx.append("[sliceElem]"), sliceType.Elem()) - return &sliceEncoder{sliceType, encoder} -} - -type sliceEncoder struct { - sliceType *reflect2.UnsafeSliceType - elemEncoder ValEncoder -} - -func (encoder *sliceEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - if encoder.sliceType.UnsafeIsNil(ptr) { - stream.WriteNil() - return - } - length := encoder.sliceType.UnsafeLengthOf(ptr) - if length == 0 { - stream.WriteEmptyArray() - return - } - stream.WriteArrayStart() - encoder.elemEncoder.Encode(encoder.sliceType.UnsafeGetIndex(ptr, 0), stream) - for i := 1; i < length; i++ { - stream.WriteMore() - elemPtr := encoder.sliceType.UnsafeGetIndex(ptr, i) - encoder.elemEncoder.Encode(elemPtr, stream) - } - stream.WriteArrayEnd() - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%v: %s", encoder.sliceType, stream.Error.Error()) - } -} - -func (encoder *sliceEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.sliceType.UnsafeLengthOf(ptr) == 0 -} - -type sliceDecoder struct { - sliceType *reflect2.UnsafeSliceType - elemDecoder ValDecoder -} - -func (decoder *sliceDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.doDecode(ptr, iter) - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v: %s", decoder.sliceType, iter.Error.Error()) - } -} - -func (decoder *sliceDecoder) doDecode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - sliceType := decoder.sliceType - if c == 'n' { - iter.skipThreeBytes('u', 'l', 'l') - sliceType.UnsafeSetNil(ptr) - return - } - if c != '[' { - iter.ReportError("decode slice", "expect [ or n, but found "+string([]byte{c})) - return - } - c = iter.nextToken() - if c == ']' { - sliceType.UnsafeSet(ptr, sliceType.UnsafeMakeSlice(0, 0)) - return - } - iter.unreadByte() - sliceType.UnsafeGrow(ptr, 1) - elemPtr := sliceType.UnsafeGetIndex(ptr, 0) - decoder.elemDecoder.Decode(elemPtr, iter) - length := 1 - for c = iter.nextToken(); c == ','; c = iter.nextToken() { - idx := length - length += 1 - sliceType.UnsafeGrow(ptr, length) - elemPtr = sliceType.UnsafeGetIndex(ptr, idx) - decoder.elemDecoder.Decode(elemPtr, iter) - } - if c != ']' { - iter.ReportError("decode slice", "expect ], but found "+string([]byte{c})) - return - } -} diff --git a/vendor/github.com/json-iterator/go/reflect_struct_decoder.go b/vendor/github.com/json-iterator/go/reflect_struct_decoder.go deleted file mode 100644 index 355d2d1..0000000 --- a/vendor/github.com/json-iterator/go/reflect_struct_decoder.go +++ /dev/null @@ -1,1048 +0,0 @@ -package jsoniter - -import ( - "fmt" - "io" - "strings" - "unsafe" - - "github.com/modern-go/reflect2" -) - -func decoderOfStruct(ctx *ctx, typ reflect2.Type) ValDecoder { - bindings := map[string]*Binding{} - structDescriptor := describeStruct(ctx, typ) - for _, binding := range structDescriptor.Fields { - for _, fromName := range binding.FromNames { - old := bindings[fromName] - if old == nil { - bindings[fromName] = binding - continue - } - ignoreOld, ignoreNew := resolveConflictBinding(ctx.frozenConfig, old, binding) - if ignoreOld { - delete(bindings, fromName) - } - if !ignoreNew { - bindings[fromName] = binding - } - } - } - fields := map[string]*structFieldDecoder{} - for k, binding := range bindings { - fields[k] = binding.Decoder.(*structFieldDecoder) - } - - if !ctx.caseSensitive() { - for k, binding := range bindings { - if _, found := fields[strings.ToLower(k)]; !found { - fields[strings.ToLower(k)] = binding.Decoder.(*structFieldDecoder) - } - } - } - - return createStructDecoder(ctx, typ, fields) -} - -func createStructDecoder(ctx *ctx, typ reflect2.Type, fields map[string]*structFieldDecoder) ValDecoder { - if ctx.disallowUnknownFields { - return &generalStructDecoder{typ: typ, fields: fields, disallowUnknownFields: true} - } - knownHash := map[int64]struct{}{ - 0: {}, - } - - switch len(fields) { - case 0: - return &skipObjectDecoder{typ} - case 1: - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - return &oneFieldStructDecoder{typ, fieldHash, fieldDecoder} - } - case 2: - var fieldHash1 int64 - var fieldHash2 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldHash1 == 0 { - fieldHash1 = fieldHash - fieldDecoder1 = fieldDecoder - } else { - fieldHash2 = fieldHash - fieldDecoder2 = fieldDecoder - } - } - return &twoFieldsStructDecoder{typ, fieldHash1, fieldDecoder1, fieldHash2, fieldDecoder2} - case 3: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } - } - return &threeFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3} - case 4: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } - } - return &fourFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4} - case 5: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } - } - return &fiveFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5} - case 6: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - var fieldDecoder6 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else if fieldName5 == 0 { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } else { - fieldName6 = fieldHash - fieldDecoder6 = fieldDecoder - } - } - return &sixFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6} - case 7: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - var fieldDecoder6 *structFieldDecoder - var fieldDecoder7 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else if fieldName5 == 0 { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } else if fieldName6 == 0 { - fieldName6 = fieldHash - fieldDecoder6 = fieldDecoder - } else { - fieldName7 = fieldHash - fieldDecoder7 = fieldDecoder - } - } - return &sevenFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7} - case 8: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 - var fieldName8 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - var fieldDecoder6 *structFieldDecoder - var fieldDecoder7 *structFieldDecoder - var fieldDecoder8 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else if fieldName5 == 0 { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } else if fieldName6 == 0 { - fieldName6 = fieldHash - fieldDecoder6 = fieldDecoder - } else if fieldName7 == 0 { - fieldName7 = fieldHash - fieldDecoder7 = fieldDecoder - } else { - fieldName8 = fieldHash - fieldDecoder8 = fieldDecoder - } - } - return &eightFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, - fieldName8, fieldDecoder8} - case 9: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 - var fieldName8 int64 - var fieldName9 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - var fieldDecoder6 *structFieldDecoder - var fieldDecoder7 *structFieldDecoder - var fieldDecoder8 *structFieldDecoder - var fieldDecoder9 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else if fieldName5 == 0 { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } else if fieldName6 == 0 { - fieldName6 = fieldHash - fieldDecoder6 = fieldDecoder - } else if fieldName7 == 0 { - fieldName7 = fieldHash - fieldDecoder7 = fieldDecoder - } else if fieldName8 == 0 { - fieldName8 = fieldHash - fieldDecoder8 = fieldDecoder - } else { - fieldName9 = fieldHash - fieldDecoder9 = fieldDecoder - } - } - return &nineFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, - fieldName8, fieldDecoder8, - fieldName9, fieldDecoder9} - case 10: - var fieldName1 int64 - var fieldName2 int64 - var fieldName3 int64 - var fieldName4 int64 - var fieldName5 int64 - var fieldName6 int64 - var fieldName7 int64 - var fieldName8 int64 - var fieldName9 int64 - var fieldName10 int64 - var fieldDecoder1 *structFieldDecoder - var fieldDecoder2 *structFieldDecoder - var fieldDecoder3 *structFieldDecoder - var fieldDecoder4 *structFieldDecoder - var fieldDecoder5 *structFieldDecoder - var fieldDecoder6 *structFieldDecoder - var fieldDecoder7 *structFieldDecoder - var fieldDecoder8 *structFieldDecoder - var fieldDecoder9 *structFieldDecoder - var fieldDecoder10 *structFieldDecoder - for fieldName, fieldDecoder := range fields { - fieldHash := calcHash(fieldName, ctx.caseSensitive()) - _, known := knownHash[fieldHash] - if known { - return &generalStructDecoder{typ, fields, false} - } - knownHash[fieldHash] = struct{}{} - if fieldName1 == 0 { - fieldName1 = fieldHash - fieldDecoder1 = fieldDecoder - } else if fieldName2 == 0 { - fieldName2 = fieldHash - fieldDecoder2 = fieldDecoder - } else if fieldName3 == 0 { - fieldName3 = fieldHash - fieldDecoder3 = fieldDecoder - } else if fieldName4 == 0 { - fieldName4 = fieldHash - fieldDecoder4 = fieldDecoder - } else if fieldName5 == 0 { - fieldName5 = fieldHash - fieldDecoder5 = fieldDecoder - } else if fieldName6 == 0 { - fieldName6 = fieldHash - fieldDecoder6 = fieldDecoder - } else if fieldName7 == 0 { - fieldName7 = fieldHash - fieldDecoder7 = fieldDecoder - } else if fieldName8 == 0 { - fieldName8 = fieldHash - fieldDecoder8 = fieldDecoder - } else if fieldName9 == 0 { - fieldName9 = fieldHash - fieldDecoder9 = fieldDecoder - } else { - fieldName10 = fieldHash - fieldDecoder10 = fieldDecoder - } - } - return &tenFieldsStructDecoder{typ, - fieldName1, fieldDecoder1, - fieldName2, fieldDecoder2, - fieldName3, fieldDecoder3, - fieldName4, fieldDecoder4, - fieldName5, fieldDecoder5, - fieldName6, fieldDecoder6, - fieldName7, fieldDecoder7, - fieldName8, fieldDecoder8, - fieldName9, fieldDecoder9, - fieldName10, fieldDecoder10} - } - return &generalStructDecoder{typ, fields, false} -} - -type generalStructDecoder struct { - typ reflect2.Type - fields map[string]*structFieldDecoder - disallowUnknownFields bool -} - -func (decoder *generalStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - var c byte - for c = ','; c == ','; c = iter.nextToken() { - decoder.decodeOneField(ptr, iter) - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } - if c != '}' { - iter.ReportError("struct Decode", `expect }, but found `+string([]byte{c})) - } -} - -func (decoder *generalStructDecoder) decodeOneField(ptr unsafe.Pointer, iter *Iterator) { - var field string - var fieldDecoder *structFieldDecoder - if iter.cfg.objectFieldMustBeSimpleString { - fieldBytes := iter.ReadStringAsSlice() - field = *(*string)(unsafe.Pointer(&fieldBytes)) - fieldDecoder = decoder.fields[field] - if fieldDecoder == nil && !iter.cfg.caseSensitive { - fieldDecoder = decoder.fields[strings.ToLower(field)] - } - } else { - field = iter.ReadString() - fieldDecoder = decoder.fields[field] - if fieldDecoder == nil && !iter.cfg.caseSensitive { - fieldDecoder = decoder.fields[strings.ToLower(field)] - } - } - if fieldDecoder == nil { - msg := "found unknown field: " + field - if decoder.disallowUnknownFields { - iter.ReportError("ReadObject", msg) - } - c := iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - iter.Skip() - return - } - c := iter.nextToken() - if c != ':' { - iter.ReportError("ReadObject", "expect : after object field, but found "+string([]byte{c})) - } - fieldDecoder.Decode(ptr, iter) -} - -type skipObjectDecoder struct { - typ reflect2.Type -} - -func (decoder *skipObjectDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - valueType := iter.WhatIsNext() - if valueType != ObjectValue && valueType != NilValue { - iter.ReportError("skipObjectDecoder", "expect object or null") - return - } - iter.Skip() -} - -type oneFieldStructDecoder struct { - typ reflect2.Type - fieldHash int64 - fieldDecoder *structFieldDecoder -} - -func (decoder *oneFieldStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - for { - if iter.readFieldHash() == decoder.fieldHash { - decoder.fieldDecoder.Decode(ptr, iter) - } else { - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } -} - -type twoFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder -} - -func (decoder *twoFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } -} - -type threeFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder -} - -func (decoder *threeFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } -} - -type fourFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder -} - -func (decoder *fourFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } -} - -type fiveFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder -} - -func (decoder *fiveFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } -} - -type sixFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder - fieldHash6 int64 - fieldDecoder6 *structFieldDecoder -} - -func (decoder *sixFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - case decoder.fieldHash6: - decoder.fieldDecoder6.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } -} - -type sevenFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder - fieldHash6 int64 - fieldDecoder6 *structFieldDecoder - fieldHash7 int64 - fieldDecoder7 *structFieldDecoder -} - -func (decoder *sevenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - case decoder.fieldHash6: - decoder.fieldDecoder6.Decode(ptr, iter) - case decoder.fieldHash7: - decoder.fieldDecoder7.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } -} - -type eightFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder - fieldHash6 int64 - fieldDecoder6 *structFieldDecoder - fieldHash7 int64 - fieldDecoder7 *structFieldDecoder - fieldHash8 int64 - fieldDecoder8 *structFieldDecoder -} - -func (decoder *eightFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - case decoder.fieldHash6: - decoder.fieldDecoder6.Decode(ptr, iter) - case decoder.fieldHash7: - decoder.fieldDecoder7.Decode(ptr, iter) - case decoder.fieldHash8: - decoder.fieldDecoder8.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } -} - -type nineFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder - fieldHash6 int64 - fieldDecoder6 *structFieldDecoder - fieldHash7 int64 - fieldDecoder7 *structFieldDecoder - fieldHash8 int64 - fieldDecoder8 *structFieldDecoder - fieldHash9 int64 - fieldDecoder9 *structFieldDecoder -} - -func (decoder *nineFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - case decoder.fieldHash6: - decoder.fieldDecoder6.Decode(ptr, iter) - case decoder.fieldHash7: - decoder.fieldDecoder7.Decode(ptr, iter) - case decoder.fieldHash8: - decoder.fieldDecoder8.Decode(ptr, iter) - case decoder.fieldHash9: - decoder.fieldDecoder9.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } -} - -type tenFieldsStructDecoder struct { - typ reflect2.Type - fieldHash1 int64 - fieldDecoder1 *structFieldDecoder - fieldHash2 int64 - fieldDecoder2 *structFieldDecoder - fieldHash3 int64 - fieldDecoder3 *structFieldDecoder - fieldHash4 int64 - fieldDecoder4 *structFieldDecoder - fieldHash5 int64 - fieldDecoder5 *structFieldDecoder - fieldHash6 int64 - fieldDecoder6 *structFieldDecoder - fieldHash7 int64 - fieldDecoder7 *structFieldDecoder - fieldHash8 int64 - fieldDecoder8 *structFieldDecoder - fieldHash9 int64 - fieldDecoder9 *structFieldDecoder - fieldHash10 int64 - fieldDecoder10 *structFieldDecoder -} - -func (decoder *tenFieldsStructDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - if !iter.readObjectStart() { - return - } - for { - switch iter.readFieldHash() { - case decoder.fieldHash1: - decoder.fieldDecoder1.Decode(ptr, iter) - case decoder.fieldHash2: - decoder.fieldDecoder2.Decode(ptr, iter) - case decoder.fieldHash3: - decoder.fieldDecoder3.Decode(ptr, iter) - case decoder.fieldHash4: - decoder.fieldDecoder4.Decode(ptr, iter) - case decoder.fieldHash5: - decoder.fieldDecoder5.Decode(ptr, iter) - case decoder.fieldHash6: - decoder.fieldDecoder6.Decode(ptr, iter) - case decoder.fieldHash7: - decoder.fieldDecoder7.Decode(ptr, iter) - case decoder.fieldHash8: - decoder.fieldDecoder8.Decode(ptr, iter) - case decoder.fieldHash9: - decoder.fieldDecoder9.Decode(ptr, iter) - case decoder.fieldHash10: - decoder.fieldDecoder10.Decode(ptr, iter) - default: - iter.Skip() - } - if iter.isObjectEnd() { - break - } - } - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%v.%s", decoder.typ, iter.Error.Error()) - } -} - -type structFieldDecoder struct { - field reflect2.StructField - fieldDecoder ValDecoder -} - -func (decoder *structFieldDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - fieldPtr := decoder.field.UnsafeGet(ptr) - decoder.fieldDecoder.Decode(fieldPtr, iter) - if iter.Error != nil && iter.Error != io.EOF { - iter.Error = fmt.Errorf("%s: %s", decoder.field.Name(), iter.Error.Error()) - } -} - -type stringModeStringDecoder struct { - elemDecoder ValDecoder - cfg *frozenConfig -} - -func (decoder *stringModeStringDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - decoder.elemDecoder.Decode(ptr, iter) - str := *((*string)(ptr)) - tempIter := decoder.cfg.BorrowIterator([]byte(str)) - defer decoder.cfg.ReturnIterator(tempIter) - *((*string)(ptr)) = tempIter.ReadString() -} - -type stringModeNumberDecoder struct { - elemDecoder ValDecoder -} - -func (decoder *stringModeNumberDecoder) Decode(ptr unsafe.Pointer, iter *Iterator) { - c := iter.nextToken() - if c != '"' { - iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) - return - } - decoder.elemDecoder.Decode(ptr, iter) - if iter.Error != nil { - return - } - c = iter.readByte() - if c != '"' { - iter.ReportError("stringModeNumberDecoder", `expect ", but found `+string([]byte{c})) - return - } -} diff --git a/vendor/github.com/json-iterator/go/reflect_struct_encoder.go b/vendor/github.com/json-iterator/go/reflect_struct_encoder.go deleted file mode 100644 index d0759cf..0000000 --- a/vendor/github.com/json-iterator/go/reflect_struct_encoder.go +++ /dev/null @@ -1,210 +0,0 @@ -package jsoniter - -import ( - "fmt" - "github.com/modern-go/reflect2" - "io" - "reflect" - "unsafe" -) - -func encoderOfStruct(ctx *ctx, typ reflect2.Type) ValEncoder { - type bindingTo struct { - binding *Binding - toName string - ignored bool - } - orderedBindings := []*bindingTo{} - structDescriptor := describeStruct(ctx, typ) - for _, binding := range structDescriptor.Fields { - for _, toName := range binding.ToNames { - new := &bindingTo{ - binding: binding, - toName: toName, - } - for _, old := range orderedBindings { - if old.toName != toName { - continue - } - old.ignored, new.ignored = resolveConflictBinding(ctx.frozenConfig, old.binding, new.binding) - } - orderedBindings = append(orderedBindings, new) - } - } - if len(orderedBindings) == 0 { - return &emptyStructEncoder{} - } - finalOrderedFields := []structFieldTo{} - for _, bindingTo := range orderedBindings { - if !bindingTo.ignored { - finalOrderedFields = append(finalOrderedFields, structFieldTo{ - encoder: bindingTo.binding.Encoder.(*structFieldEncoder), - toName: bindingTo.toName, - }) - } - } - return &structEncoder{typ, finalOrderedFields} -} - -func createCheckIsEmpty(ctx *ctx, typ reflect2.Type) checkIsEmpty { - encoder := createEncoderOfNative(ctx, typ) - if encoder != nil { - return encoder - } - kind := typ.Kind() - switch kind { - case reflect.Interface: - return &dynamicEncoder{typ} - case reflect.Struct: - return &structEncoder{typ: typ} - case reflect.Array: - return &arrayEncoder{} - case reflect.Slice: - return &sliceEncoder{} - case reflect.Map: - return encoderOfMap(ctx, typ) - case reflect.Ptr: - return &OptionalEncoder{} - default: - return &lazyErrorEncoder{err: fmt.Errorf("unsupported type: %v", typ)} - } -} - -func resolveConflictBinding(cfg *frozenConfig, old, new *Binding) (ignoreOld, ignoreNew bool) { - newTagged := new.Field.Tag().Get(cfg.getTagKey()) != "" - oldTagged := old.Field.Tag().Get(cfg.getTagKey()) != "" - if newTagged { - if oldTagged { - if len(old.levels) > len(new.levels) { - return true, false - } else if len(new.levels) > len(old.levels) { - return false, true - } else { - return true, true - } - } else { - return true, false - } - } else { - if oldTagged { - return true, false - } - if len(old.levels) > len(new.levels) { - return true, false - } else if len(new.levels) > len(old.levels) { - return false, true - } else { - return true, true - } - } -} - -type structFieldEncoder struct { - field reflect2.StructField - fieldEncoder ValEncoder - omitempty bool -} - -func (encoder *structFieldEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - fieldPtr := encoder.field.UnsafeGet(ptr) - encoder.fieldEncoder.Encode(fieldPtr, stream) - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%s: %s", encoder.field.Name(), stream.Error.Error()) - } -} - -func (encoder *structFieldEncoder) IsEmpty(ptr unsafe.Pointer) bool { - fieldPtr := encoder.field.UnsafeGet(ptr) - return encoder.fieldEncoder.IsEmpty(fieldPtr) -} - -func (encoder *structFieldEncoder) IsEmbeddedPtrNil(ptr unsafe.Pointer) bool { - isEmbeddedPtrNil, converted := encoder.fieldEncoder.(IsEmbeddedPtrNil) - if !converted { - return false - } - fieldPtr := encoder.field.UnsafeGet(ptr) - return isEmbeddedPtrNil.IsEmbeddedPtrNil(fieldPtr) -} - -type IsEmbeddedPtrNil interface { - IsEmbeddedPtrNil(ptr unsafe.Pointer) bool -} - -type structEncoder struct { - typ reflect2.Type - fields []structFieldTo -} - -type structFieldTo struct { - encoder *structFieldEncoder - toName string -} - -func (encoder *structEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteObjectStart() - isNotFirst := false - for _, field := range encoder.fields { - if field.encoder.omitempty && field.encoder.IsEmpty(ptr) { - continue - } - if field.encoder.IsEmbeddedPtrNil(ptr) { - continue - } - if isNotFirst { - stream.WriteMore() - } - stream.WriteObjectField(field.toName) - field.encoder.Encode(ptr, stream) - isNotFirst = true - } - stream.WriteObjectEnd() - if stream.Error != nil && stream.Error != io.EOF { - stream.Error = fmt.Errorf("%v.%s", encoder.typ, stream.Error.Error()) - } -} - -func (encoder *structEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type emptyStructEncoder struct { -} - -func (encoder *emptyStructEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.WriteEmptyObject() -} - -func (encoder *emptyStructEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return false -} - -type stringModeNumberEncoder struct { - elemEncoder ValEncoder -} - -func (encoder *stringModeNumberEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - stream.writeByte('"') - encoder.elemEncoder.Encode(ptr, stream) - stream.writeByte('"') -} - -func (encoder *stringModeNumberEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.elemEncoder.IsEmpty(ptr) -} - -type stringModeStringEncoder struct { - elemEncoder ValEncoder - cfg *frozenConfig -} - -func (encoder *stringModeStringEncoder) Encode(ptr unsafe.Pointer, stream *Stream) { - tempStream := encoder.cfg.BorrowStream(nil) - defer encoder.cfg.ReturnStream(tempStream) - encoder.elemEncoder.Encode(ptr, tempStream) - stream.WriteString(string(tempStream.Buffer())) -} - -func (encoder *stringModeStringEncoder) IsEmpty(ptr unsafe.Pointer) bool { - return encoder.elemEncoder.IsEmpty(ptr) -} diff --git a/vendor/github.com/json-iterator/go/stream.go b/vendor/github.com/json-iterator/go/stream.go deleted file mode 100644 index 17662fd..0000000 --- a/vendor/github.com/json-iterator/go/stream.go +++ /dev/null @@ -1,211 +0,0 @@ -package jsoniter - -import ( - "io" -) - -// stream is a io.Writer like object, with JSON specific write functions. -// Error is not returned as return value, but stored as Error member on this stream instance. -type Stream struct { - cfg *frozenConfig - out io.Writer - buf []byte - Error error - indention int - Attachment interface{} // open for customized encoder -} - -// NewStream create new stream instance. -// cfg can be jsoniter.ConfigDefault. -// out can be nil if write to internal buffer. -// bufSize is the initial size for the internal buffer in bytes. -func NewStream(cfg API, out io.Writer, bufSize int) *Stream { - return &Stream{ - cfg: cfg.(*frozenConfig), - out: out, - buf: make([]byte, 0, bufSize), - Error: nil, - indention: 0, - } -} - -// Pool returns a pool can provide more stream with same configuration -func (stream *Stream) Pool() StreamPool { - return stream.cfg -} - -// Reset reuse this stream instance by assign a new writer -func (stream *Stream) Reset(out io.Writer) { - stream.out = out - stream.buf = stream.buf[:0] -} - -// Available returns how many bytes are unused in the buffer. -func (stream *Stream) Available() int { - return cap(stream.buf) - len(stream.buf) -} - -// Buffered returns the number of bytes that have been written into the current buffer. -func (stream *Stream) Buffered() int { - return len(stream.buf) -} - -// Buffer if writer is nil, use this method to take the result -func (stream *Stream) Buffer() []byte { - return stream.buf -} - -// SetBuffer allows to append to the internal buffer directly -func (stream *Stream) SetBuffer(buf []byte) { - stream.buf = buf -} - -// Write writes the contents of p into the buffer. -// It returns the number of bytes written. -// If nn < len(p), it also returns an error explaining -// why the write is short. -func (stream *Stream) Write(p []byte) (nn int, err error) { - stream.buf = append(stream.buf, p...) - if stream.out != nil { - nn, err = stream.out.Write(stream.buf) - stream.buf = stream.buf[nn:] - return - } - return len(p), nil -} - -// WriteByte writes a single byte. -func (stream *Stream) writeByte(c byte) { - stream.buf = append(stream.buf, c) -} - -func (stream *Stream) writeTwoBytes(c1 byte, c2 byte) { - stream.buf = append(stream.buf, c1, c2) -} - -func (stream *Stream) writeThreeBytes(c1 byte, c2 byte, c3 byte) { - stream.buf = append(stream.buf, c1, c2, c3) -} - -func (stream *Stream) writeFourBytes(c1 byte, c2 byte, c3 byte, c4 byte) { - stream.buf = append(stream.buf, c1, c2, c3, c4) -} - -func (stream *Stream) writeFiveBytes(c1 byte, c2 byte, c3 byte, c4 byte, c5 byte) { - stream.buf = append(stream.buf, c1, c2, c3, c4, c5) -} - -// Flush writes any buffered data to the underlying io.Writer. -func (stream *Stream) Flush() error { - if stream.out == nil { - return nil - } - if stream.Error != nil { - return stream.Error - } - n, err := stream.out.Write(stream.buf) - if err != nil { - if stream.Error == nil { - stream.Error = err - } - return err - } - stream.buf = stream.buf[n:] - return nil -} - -// WriteRaw write string out without quotes, just like []byte -func (stream *Stream) WriteRaw(s string) { - stream.buf = append(stream.buf, s...) -} - -// WriteNil write null to stream -func (stream *Stream) WriteNil() { - stream.writeFourBytes('n', 'u', 'l', 'l') -} - -// WriteTrue write true to stream -func (stream *Stream) WriteTrue() { - stream.writeFourBytes('t', 'r', 'u', 'e') -} - -// WriteFalse write false to stream -func (stream *Stream) WriteFalse() { - stream.writeFiveBytes('f', 'a', 'l', 's', 'e') -} - -// WriteBool write true or false into stream -func (stream *Stream) WriteBool(val bool) { - if val { - stream.WriteTrue() - } else { - stream.WriteFalse() - } -} - -// WriteObjectStart write { with possible indention -func (stream *Stream) WriteObjectStart() { - stream.indention += stream.cfg.indentionStep - stream.writeByte('{') - stream.writeIndention(0) -} - -// WriteObjectField write "field": with possible indention -func (stream *Stream) WriteObjectField(field string) { - stream.WriteString(field) - if stream.indention > 0 { - stream.writeTwoBytes(':', ' ') - } else { - stream.writeByte(':') - } -} - -// WriteObjectEnd write } with possible indention -func (stream *Stream) WriteObjectEnd() { - stream.writeIndention(stream.cfg.indentionStep) - stream.indention -= stream.cfg.indentionStep - stream.writeByte('}') -} - -// WriteEmptyObject write {} -func (stream *Stream) WriteEmptyObject() { - stream.writeByte('{') - stream.writeByte('}') -} - -// WriteMore write , with possible indention -func (stream *Stream) WriteMore() { - stream.writeByte(',') - stream.writeIndention(0) - stream.Flush() -} - -// WriteArrayStart write [ with possible indention -func (stream *Stream) WriteArrayStart() { - stream.indention += stream.cfg.indentionStep - stream.writeByte('[') - stream.writeIndention(0) -} - -// WriteEmptyArray write [] -func (stream *Stream) WriteEmptyArray() { - stream.writeTwoBytes('[', ']') -} - -// WriteArrayEnd write ] with possible indention -func (stream *Stream) WriteArrayEnd() { - stream.writeIndention(stream.cfg.indentionStep) - stream.indention -= stream.cfg.indentionStep - stream.writeByte(']') -} - -func (stream *Stream) writeIndention(delta int) { - if stream.indention == 0 { - return - } - stream.writeByte('\n') - toWrite := stream.indention - delta - for i := 0; i < toWrite; i++ { - stream.buf = append(stream.buf, ' ') - } -} diff --git a/vendor/github.com/json-iterator/go/stream_float.go b/vendor/github.com/json-iterator/go/stream_float.go deleted file mode 100644 index f318d2c..0000000 --- a/vendor/github.com/json-iterator/go/stream_float.go +++ /dev/null @@ -1,94 +0,0 @@ -package jsoniter - -import ( - "math" - "strconv" -) - -var pow10 []uint64 - -func init() { - pow10 = []uint64{1, 10, 100, 1000, 10000, 100000, 1000000} -} - -// WriteFloat32 write float32 to stream -func (stream *Stream) WriteFloat32(val float32) { - abs := math.Abs(float64(val)) - fmt := byte('f') - // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. - if abs != 0 { - if float32(abs) < 1e-6 || float32(abs) >= 1e21 { - fmt = 'e' - } - } - stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 32) -} - -// WriteFloat32Lossy write float32 to stream with ONLY 6 digits precision although much much faster -func (stream *Stream) WriteFloat32Lossy(val float32) { - if val < 0 { - stream.writeByte('-') - val = -val - } - if val > 0x4ffffff { - stream.WriteFloat32(val) - return - } - precision := 6 - exp := uint64(1000000) // 6 - lval := uint64(float64(val)*float64(exp) + 0.5) - stream.WriteUint64(lval / exp) - fval := lval % exp - if fval == 0 { - return - } - stream.writeByte('.') - for p := precision - 1; p > 0 && fval < pow10[p]; p-- { - stream.writeByte('0') - } - stream.WriteUint64(fval) - for stream.buf[len(stream.buf)-1] == '0' { - stream.buf = stream.buf[:len(stream.buf)-1] - } -} - -// WriteFloat64 write float64 to stream -func (stream *Stream) WriteFloat64(val float64) { - abs := math.Abs(val) - fmt := byte('f') - // Note: Must use float32 comparisons for underlying float32 value to get precise cutoffs right. - if abs != 0 { - if abs < 1e-6 || abs >= 1e21 { - fmt = 'e' - } - } - stream.buf = strconv.AppendFloat(stream.buf, float64(val), fmt, -1, 64) -} - -// WriteFloat64Lossy write float64 to stream with ONLY 6 digits precision although much much faster -func (stream *Stream) WriteFloat64Lossy(val float64) { - if val < 0 { - stream.writeByte('-') - val = -val - } - if val > 0x4ffffff { - stream.WriteFloat64(val) - return - } - precision := 6 - exp := uint64(1000000) // 6 - lval := uint64(val*float64(exp) + 0.5) - stream.WriteUint64(lval / exp) - fval := lval % exp - if fval == 0 { - return - } - stream.writeByte('.') - for p := precision - 1; p > 0 && fval < pow10[p]; p-- { - stream.writeByte('0') - } - stream.WriteUint64(fval) - for stream.buf[len(stream.buf)-1] == '0' { - stream.buf = stream.buf[:len(stream.buf)-1] - } -} diff --git a/vendor/github.com/json-iterator/go/stream_int.go b/vendor/github.com/json-iterator/go/stream_int.go deleted file mode 100644 index d1059ee..0000000 --- a/vendor/github.com/json-iterator/go/stream_int.go +++ /dev/null @@ -1,190 +0,0 @@ -package jsoniter - -var digits []uint32 - -func init() { - digits = make([]uint32, 1000) - for i := uint32(0); i < 1000; i++ { - digits[i] = (((i / 100) + '0') << 16) + ((((i / 10) % 10) + '0') << 8) + i%10 + '0' - if i < 10 { - digits[i] += 2 << 24 - } else if i < 100 { - digits[i] += 1 << 24 - } - } -} - -func writeFirstBuf(space []byte, v uint32) []byte { - start := v >> 24 - if start == 0 { - space = append(space, byte(v>>16), byte(v>>8)) - } else if start == 1 { - space = append(space, byte(v>>8)) - } - space = append(space, byte(v)) - return space -} - -func writeBuf(buf []byte, v uint32) []byte { - return append(buf, byte(v>>16), byte(v>>8), byte(v)) -} - -// WriteUint8 write uint8 to stream -func (stream *Stream) WriteUint8(val uint8) { - stream.buf = writeFirstBuf(stream.buf, digits[val]) -} - -// WriteInt8 write int8 to stream -func (stream *Stream) WriteInt8(nval int8) { - var val uint8 - if nval < 0 { - val = uint8(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint8(nval) - } - stream.buf = writeFirstBuf(stream.buf, digits[val]) -} - -// WriteUint16 write uint16 to stream -func (stream *Stream) WriteUint16(val uint16) { - q1 := val / 1000 - if q1 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[val]) - return - } - r1 := val - q1*1000 - stream.buf = writeFirstBuf(stream.buf, digits[q1]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return -} - -// WriteInt16 write int16 to stream -func (stream *Stream) WriteInt16(nval int16) { - var val uint16 - if nval < 0 { - val = uint16(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint16(nval) - } - stream.WriteUint16(val) -} - -// WriteUint32 write uint32 to stream -func (stream *Stream) WriteUint32(val uint32) { - q1 := val / 1000 - if q1 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[val]) - return - } - r1 := val - q1*1000 - q2 := q1 / 1000 - if q2 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q1]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r2 := q1 - q2*1000 - q3 := q2 / 1000 - if q3 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q2]) - } else { - r3 := q2 - q3*1000 - stream.buf = append(stream.buf, byte(q3+'0')) - stream.buf = writeBuf(stream.buf, digits[r3]) - } - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) -} - -// WriteInt32 write int32 to stream -func (stream *Stream) WriteInt32(nval int32) { - var val uint32 - if nval < 0 { - val = uint32(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint32(nval) - } - stream.WriteUint32(val) -} - -// WriteUint64 write uint64 to stream -func (stream *Stream) WriteUint64(val uint64) { - q1 := val / 1000 - if q1 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[val]) - return - } - r1 := val - q1*1000 - q2 := q1 / 1000 - if q2 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q1]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r2 := q1 - q2*1000 - q3 := q2 / 1000 - if q3 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q2]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r3 := q2 - q3*1000 - q4 := q3 / 1000 - if q4 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q3]) - stream.buf = writeBuf(stream.buf, digits[r3]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r4 := q3 - q4*1000 - q5 := q4 / 1000 - if q5 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q4]) - stream.buf = writeBuf(stream.buf, digits[r4]) - stream.buf = writeBuf(stream.buf, digits[r3]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) - return - } - r5 := q4 - q5*1000 - q6 := q5 / 1000 - if q6 == 0 { - stream.buf = writeFirstBuf(stream.buf, digits[q5]) - } else { - stream.buf = writeFirstBuf(stream.buf, digits[q6]) - r6 := q5 - q6*1000 - stream.buf = writeBuf(stream.buf, digits[r6]) - } - stream.buf = writeBuf(stream.buf, digits[r5]) - stream.buf = writeBuf(stream.buf, digits[r4]) - stream.buf = writeBuf(stream.buf, digits[r3]) - stream.buf = writeBuf(stream.buf, digits[r2]) - stream.buf = writeBuf(stream.buf, digits[r1]) -} - -// WriteInt64 write int64 to stream -func (stream *Stream) WriteInt64(nval int64) { - var val uint64 - if nval < 0 { - val = uint64(-nval) - stream.buf = append(stream.buf, '-') - } else { - val = uint64(nval) - } - stream.WriteUint64(val) -} - -// WriteInt write int to stream -func (stream *Stream) WriteInt(val int) { - stream.WriteInt64(int64(val)) -} - -// WriteUint write uint to stream -func (stream *Stream) WriteUint(val uint) { - stream.WriteUint64(uint64(val)) -} diff --git a/vendor/github.com/json-iterator/go/stream_str.go b/vendor/github.com/json-iterator/go/stream_str.go deleted file mode 100644 index 54c2ba0..0000000 --- a/vendor/github.com/json-iterator/go/stream_str.go +++ /dev/null @@ -1,372 +0,0 @@ -package jsoniter - -import ( - "unicode/utf8" -) - -// htmlSafeSet holds the value true if the ASCII character with the given -// array position can be safely represented inside a JSON string, embedded -// inside of HTML