mirror of
				https://github.com/superseriousbusiness/gotosocial.git
				synced 2025-10-31 11:42:25 -05:00 
			
		
		
		
	[bugfix] Fix Swagger spec and add test script (#2698)
* Add Swagger spec test script * Fix Swagger spec errors not related to statuses with polls * Add API tests that post a status with a poll * Fix creating a status with a poll from form params * Fix Swagger spec errors related to statuses with polls (this is the last error) * Fix Swagger spec warnings not related to unused definitions * Suppress a duplicate list update params definition that was somehow causing wrong param names * Add Swagger test to CI - updates Drone config - vendorizes go-swagger - fixes a file extension issue that caused the test script to generate JSON instead of YAML with the vendorized version * Put `Sample: ` on its own line everywhere * Remove unused id param from emojiCategoriesGet * Add 5 more pairs of profile fields to account update API Swagger * Remove Swagger prefix from dummy fields It makes the generated code look weird * Manually annotate params for statusCreate operation * Fix all remaining Swagger spec warnings - Change some models into operation parameters - Ignore models that already correspond to manually documented operation parameters but can't be trivially changed (those with file fields) * Documented that creating a status with scheduled_at isn't implemented yet * sign drone.yml * Fix filter API Swagger errors * fixup! Fix filter API Swagger errors --------- Co-authored-by: tobi <tobi.smethurst@protonmail.com>
This commit is contained in:
		
					parent
					
						
							
								68c8fe67cc
							
						
					
				
			
			
				commit
				
					
						fc3741365c
					
				
			
		
					 672 changed files with 135624 additions and 713 deletions
				
			
		
							
								
								
									
										26
									
								
								vendor/github.com/go-openapi/spec/.editorconfig
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								vendor/github.com/go-openapi/spec/.editorconfig
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,26 @@ | |||
| # top-most EditorConfig file | ||||
| root = true | ||||
| 
 | ||||
| # Unix-style newlines with a newline ending every file | ||||
| [*] | ||||
| end_of_line = lf | ||||
| insert_final_newline = true | ||||
| indent_style = space | ||||
| indent_size = 2 | ||||
| trim_trailing_whitespace = true | ||||
| 
 | ||||
| # Set default charset | ||||
| [*.{js,py,go,scala,rb,java,html,css,less,sass,md}] | ||||
| charset = utf-8 | ||||
| 
 | ||||
| # Tab indentation (no size specified) | ||||
| [*.go] | ||||
| indent_style = tab | ||||
| 
 | ||||
| [*.md] | ||||
| trim_trailing_whitespace = false | ||||
| 
 | ||||
| # Matches the exact files either package.json or .travis.yml | ||||
| [{package.json,.travis.yml}] | ||||
| indent_style = space | ||||
| indent_size = 2 | ||||
							
								
								
									
										2
									
								
								vendor/github.com/go-openapi/spec/.gitignore
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/go-openapi/spec/.gitignore
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,2 @@ | |||
| secrets.yml | ||||
| coverage.out | ||||
							
								
								
									
										42
									
								
								vendor/github.com/go-openapi/spec/.golangci.yml
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								vendor/github.com/go-openapi/spec/.golangci.yml
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,42 @@ | |||
| linters-settings: | ||||
|   govet: | ||||
|     check-shadowing: true | ||||
|   golint: | ||||
|     min-confidence: 0 | ||||
|   gocyclo: | ||||
|     min-complexity: 45 | ||||
|   maligned: | ||||
|     suggest-new: true | ||||
|   dupl: | ||||
|     threshold: 200 | ||||
|   goconst: | ||||
|     min-len: 2 | ||||
|     min-occurrences: 2 | ||||
| 
 | ||||
| linters: | ||||
|   enable-all: true | ||||
|   disable: | ||||
|     - maligned | ||||
|     - unparam | ||||
|     - lll | ||||
|     - gochecknoinits | ||||
|     - gochecknoglobals | ||||
|     - funlen | ||||
|     - godox | ||||
|     - gocognit | ||||
|     - whitespace | ||||
|     - wsl | ||||
|     - wrapcheck | ||||
|     - testpackage | ||||
|     - nlreturn | ||||
|     - gomnd | ||||
|     - exhaustivestruct | ||||
|     - goerr113 | ||||
|     - errorlint | ||||
|     - nestif | ||||
|     - godot | ||||
|     - gofumpt | ||||
|     - paralleltest | ||||
|     - tparallel | ||||
|     - thelper | ||||
|     - ifshort | ||||
							
								
								
									
										74
									
								
								vendor/github.com/go-openapi/spec/CODE_OF_CONDUCT.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								vendor/github.com/go-openapi/spec/CODE_OF_CONDUCT.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,74 @@ | |||
| # 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 ivan+abuse@flanders.co.nz. All | ||||
| complaints will be reviewed and investigated and will result in a response that | ||||
| is deemed necessary and 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/ | ||||
							
								
								
									
										202
									
								
								vendor/github.com/go-openapi/spec/LICENSE
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								vendor/github.com/go-openapi/spec/LICENSE
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,202 @@ | |||
| 
 | ||||
|                                  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. | ||||
							
								
								
									
										34
									
								
								vendor/github.com/go-openapi/spec/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								vendor/github.com/go-openapi/spec/README.md
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,34 @@ | |||
| # OAI object model | ||||
| 
 | ||||
| [](https://travis-ci.org/go-openapi/spec) | ||||
| <!-- [](https://ci.appveyor.com/project/casualjim/go-openapi/spec/branch/master) --> | ||||
| [](https://codecov.io/gh/go-openapi/spec) | ||||
| [](https://slackin.goswagger.io) | ||||
| [](https://raw.githubusercontent.com/go-openapi/spec/master/LICENSE) | ||||
| [](https://pkg.go.dev/github.com/go-openapi/spec) | ||||
| [](https://goreportcard.com/report/github.com/go-openapi/spec) | ||||
| 
 | ||||
| The object model for OpenAPI specification documents. | ||||
| 
 | ||||
| ### FAQ | ||||
| 
 | ||||
| * What does this do? | ||||
| 
 | ||||
| > 1. This package knows how to marshal and unmarshal Swagger API specifications into a golang object model | ||||
| > 2. It knows how to resolve $ref and expand them to make a single root document | ||||
| 
 | ||||
| * How does it play with the rest of the go-openapi packages ? | ||||
| 
 | ||||
| > 1. This package is at the core of the go-openapi suite of packages and [code generator](https://github.com/go-swagger/go-swagger) | ||||
| > 2. There is a [spec loading package](https://github.com/go-openapi/loads) to fetch specs as JSON or YAML from local or remote locations | ||||
| > 3. There is a [spec validation package](https://github.com/go-openapi/validate) built on top of it | ||||
| > 4. There is a [spec analysis package](https://github.com/go-openapi/analysis) built on top of it, to analyze, flatten, fix and merge spec documents | ||||
| 
 | ||||
| * Does this library support OpenAPI 3? | ||||
| 
 | ||||
| > No. | ||||
| > This package currently only supports OpenAPI 2.0 (aka Swagger 2.0). | ||||
| > There is no plan to make it evolve toward supporting OpenAPI 3.x. | ||||
| > This [discussion thread](https://github.com/go-openapi/spec/issues/21) relates the full story. | ||||
| > | ||||
| > An early attempt to support Swagger 3 may be found at: https://github.com/go-openapi/spec3 | ||||
							
								
								
									
										32
									
								
								vendor/github.com/go-openapi/spec/appveyor.yml
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								vendor/github.com/go-openapi/spec/appveyor.yml
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,32 @@ | |||
| version: "0.1.{build}" | ||||
| 
 | ||||
| clone_folder: C:\go-openapi\spec | ||||
| shallow_clone: true # for startup speed | ||||
| pull_requests: | ||||
|   do_not_increment_build_number: true | ||||
| 
 | ||||
| #skip_tags: true | ||||
| #skip_branch_with_pr: true | ||||
| 
 | ||||
| # appveyor.yml | ||||
| build: off | ||||
| 
 | ||||
| environment: | ||||
|   GOPATH: c:\gopath | ||||
| 
 | ||||
| stack: go 1.15 | ||||
| 
 | ||||
| test_script: | ||||
|   - go test -v -timeout 20m ./... | ||||
| 
 | ||||
| deploy: off | ||||
| 
 | ||||
| notifications: | ||||
|   - provider: Slack | ||||
|     incoming_webhook: https://hooks.slack.com/services/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 | ||||
|     auth_token: | ||||
|       secure: Sf7kZf7ZGbnwWUMpffHwMu5A0cHkLK2MYY32LNTPj4+/3qC3Ghl7+9v4TSLOqOlCwdRNjOGblAq7s+GDJed6/xgRQl1JtCi1klzZNrYX4q01pgTPvvGcwbBkIYgeMaPeIRcK9OZnud7sRXdttozgTOpytps2U6Js32ip7uj5mHSg2ub0FwoSJwlS6dbezZ8+eDhoha0F/guY99BEwx8Bd+zROrT2TFGsSGOFGN6wFc7moCqTHO/YkWib13a2QNXqOxCCVBy/lt76Wp+JkeFppjHlzs/2lP3EAk13RIUAaesdEUHvIHrzCyNJEd3/+KO2DzsWOYfpktd+KBCvgaYOsoo7ubdT3IROeAegZdCgo/6xgCEsmFc9ZcqCfN5yNx2A+BZ2Vwmpws+bQ1E1+B5HDzzaiLcYfG4X2O210QVGVDLWsv1jqD+uPYeHY2WRfh5ZsIUFvaqgUEnwHwrK44/8REAhQavt1QAj5uJpsRd7CkRVPWRNK+yIky+wgbVUFEchRNmS55E7QWf+W4+4QZkQi7vUTMc9nbTUu2Es9NfvfudOpM2wZbn98fjpb/qq/nRv6Bk+ca+7XD5/IgNLMbWp2ouDdzbiHLCOfDUiHiDJhLfFZx9Bwo7ZwfzeOlbrQX66bx7xRKYmOe4DLrXhNcpbsMa8qbfxlZRCmYbubB/Y8h4= | ||||
|     channel: bots | ||||
|     on_build_success: false | ||||
|     on_build_failure: true | ||||
|     on_build_status_changed: true | ||||
							
								
								
									
										297
									
								
								vendor/github.com/go-openapi/spec/bindata.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										297
									
								
								vendor/github.com/go-openapi/spec/bindata.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because one or more lines are too long
											
										
									
								
							
							
								
								
									
										98
									
								
								vendor/github.com/go-openapi/spec/cache.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										98
									
								
								vendor/github.com/go-openapi/spec/cache.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,98 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"sync" | ||||
| ) | ||||
| 
 | ||||
| // ResolutionCache a cache for resolving urls | ||||
| type ResolutionCache interface { | ||||
| 	Get(string) (interface{}, bool) | ||||
| 	Set(string, interface{}) | ||||
| } | ||||
| 
 | ||||
| type simpleCache struct { | ||||
| 	lock  sync.RWMutex | ||||
| 	store map[string]interface{} | ||||
| } | ||||
| 
 | ||||
| func (s *simpleCache) ShallowClone() ResolutionCache { | ||||
| 	store := make(map[string]interface{}, len(s.store)) | ||||
| 	s.lock.RLock() | ||||
| 	for k, v := range s.store { | ||||
| 		store[k] = v | ||||
| 	} | ||||
| 	s.lock.RUnlock() | ||||
| 
 | ||||
| 	return &simpleCache{ | ||||
| 		store: store, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Get retrieves a cached URI | ||||
| func (s *simpleCache) Get(uri string) (interface{}, bool) { | ||||
| 	s.lock.RLock() | ||||
| 	v, ok := s.store[uri] | ||||
| 
 | ||||
| 	s.lock.RUnlock() | ||||
| 	return v, ok | ||||
| } | ||||
| 
 | ||||
| // Set caches a URI | ||||
| func (s *simpleCache) Set(uri string, data interface{}) { | ||||
| 	s.lock.Lock() | ||||
| 	s.store[uri] = data | ||||
| 	s.lock.Unlock() | ||||
| } | ||||
| 
 | ||||
| var ( | ||||
| 	// resCache is a package level cache for $ref resolution and expansion. | ||||
| 	// It is initialized lazily by methods that have the need for it: no | ||||
| 	// memory is allocated unless some expander methods are called. | ||||
| 	// | ||||
| 	// It is initialized with JSON schema and swagger schema, | ||||
| 	// which do not mutate during normal operations. | ||||
| 	// | ||||
| 	// All subsequent utilizations of this cache are produced from a shallow | ||||
| 	// clone of this initial version. | ||||
| 	resCache  *simpleCache | ||||
| 	onceCache sync.Once | ||||
| 
 | ||||
| 	_ ResolutionCache = &simpleCache{} | ||||
| ) | ||||
| 
 | ||||
| // initResolutionCache initializes the URI resolution cache. To be wrapped in a sync.Once.Do call. | ||||
| func initResolutionCache() { | ||||
| 	resCache = defaultResolutionCache() | ||||
| } | ||||
| 
 | ||||
| func defaultResolutionCache() *simpleCache { | ||||
| 	return &simpleCache{store: map[string]interface{}{ | ||||
| 		"http://swagger.io/v2/schema.json":       MustLoadSwagger20Schema(), | ||||
| 		"http://json-schema.org/draft-04/schema": MustLoadJSONSchemaDraft04(), | ||||
| 	}} | ||||
| } | ||||
| 
 | ||||
| func cacheOrDefault(cache ResolutionCache) ResolutionCache { | ||||
| 	onceCache.Do(initResolutionCache) | ||||
| 
 | ||||
| 	if cache != nil { | ||||
| 		return cache | ||||
| 	} | ||||
| 
 | ||||
| 	// get a shallow clone of the base cache with swagger and json schema | ||||
| 	return resCache.ShallowClone() | ||||
| } | ||||
							
								
								
									
										57
									
								
								vendor/github.com/go-openapi/spec/contact_info.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										57
									
								
								vendor/github.com/go-openapi/spec/contact_info.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,57 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 
 | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // ContactInfo contact information for the exposed API. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#contactObject | ||||
| type ContactInfo struct { | ||||
| 	ContactInfoProps | ||||
| 	VendorExtensible | ||||
| } | ||||
| 
 | ||||
| // ContactInfoProps hold the properties of a ContactInfo object | ||||
| type ContactInfoProps struct { | ||||
| 	Name  string `json:"name,omitempty"` | ||||
| 	URL   string `json:"url,omitempty"` | ||||
| 	Email string `json:"email,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON hydrates ContactInfo from json | ||||
| func (c *ContactInfo) UnmarshalJSON(data []byte) error { | ||||
| 	if err := json.Unmarshal(data, &c.ContactInfoProps); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(data, &c.VendorExtensible) | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON produces ContactInfo as json | ||||
| func (c ContactInfo) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(c.ContactInfoProps) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b2, err := json.Marshal(c.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return swag.ConcatJSON(b1, b2), nil | ||||
| } | ||||
							
								
								
									
										49
									
								
								vendor/github.com/go-openapi/spec/debug.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										49
									
								
								vendor/github.com/go-openapi/spec/debug.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,49 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 	"log" | ||||
| 	"os" | ||||
| 	"path" | ||||
| 	"runtime" | ||||
| ) | ||||
| 
 | ||||
| // Debug is true when the SWAGGER_DEBUG env var is not empty. | ||||
| // | ||||
| // It enables a more verbose logging of this package. | ||||
| var Debug = os.Getenv("SWAGGER_DEBUG") != "" | ||||
| 
 | ||||
| var ( | ||||
| 	// specLogger is a debug logger for this package | ||||
| 	specLogger *log.Logger | ||||
| ) | ||||
| 
 | ||||
| func init() { | ||||
| 	debugOptions() | ||||
| } | ||||
| 
 | ||||
| func debugOptions() { | ||||
| 	specLogger = log.New(os.Stdout, "spec:", log.LstdFlags) | ||||
| } | ||||
| 
 | ||||
| func debugLog(msg string, args ...interface{}) { | ||||
| 	// A private, trivial trace logger, based on go-openapi/spec/expander.go:debugLog() | ||||
| 	if Debug { | ||||
| 		_, file1, pos1, _ := runtime.Caller(1) | ||||
| 		specLogger.Printf("%s:%d: %s", path.Base(file1), pos1, fmt.Sprintf(msg, args...)) | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										19
									
								
								vendor/github.com/go-openapi/spec/errors.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								vendor/github.com/go-openapi/spec/errors.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,19 @@ | |||
| package spec | ||||
| 
 | ||||
| import "errors" | ||||
| 
 | ||||
| // Error codes | ||||
| var ( | ||||
| 	// ErrUnknownTypeForReference indicates that a resolved reference was found in an unsupported container type | ||||
| 	ErrUnknownTypeForReference = errors.New("unknown type for the resolved reference") | ||||
| 
 | ||||
| 	// ErrResolveRefNeedsAPointer indicates that a $ref target must be a valid JSON pointer | ||||
| 	ErrResolveRefNeedsAPointer = errors.New("resolve ref: target needs to be a pointer") | ||||
| 
 | ||||
| 	// ErrDerefUnsupportedType indicates that a resolved reference was found in an unsupported container type. | ||||
| 	// At the moment, $ref are supported only inside: schemas, parameters, responses, path items | ||||
| 	ErrDerefUnsupportedType = errors.New("deref: unsupported type") | ||||
| 
 | ||||
| 	// ErrExpandUnsupportedType indicates that $ref expansion is attempted on some invalid type | ||||
| 	ErrExpandUnsupportedType = errors.New("expand: unsupported type. Input should be of type *Parameter or *Response") | ||||
| ) | ||||
							
								
								
									
										594
									
								
								vendor/github.com/go-openapi/spec/expander.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										594
									
								
								vendor/github.com/go-openapi/spec/expander.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,594 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| ) | ||||
| 
 | ||||
| // ExpandOptions provides options for the spec expander. | ||||
| // | ||||
| // RelativeBase is the path to the root document. This can be a remote URL or a path to a local file. | ||||
| // | ||||
| // If left empty, the root document is assumed to be located in the current working directory: | ||||
| // all relative $ref's will be resolved from there. | ||||
| // | ||||
| // PathLoader injects a document loading method. By default, this resolves to the function provided by the SpecLoader package variable. | ||||
| // | ||||
| type ExpandOptions struct { | ||||
| 	RelativeBase        string                                // the path to the root document to expand. This is a file, not a directory | ||||
| 	SkipSchemas         bool                                  // do not expand schemas, just paths, parameters and responses | ||||
| 	ContinueOnError     bool                                  // continue expanding even after and error is found | ||||
| 	PathLoader          func(string) (json.RawMessage, error) `json:"-"` // the document loading method that takes a path as input and yields a json document | ||||
| 	AbsoluteCircularRef bool                                  // circular $ref remaining after expansion remain absolute URLs | ||||
| } | ||||
| 
 | ||||
| func optionsOrDefault(opts *ExpandOptions) *ExpandOptions { | ||||
| 	if opts != nil { | ||||
| 		clone := *opts // shallow clone to avoid internal changes to be propagated to the caller | ||||
| 		if clone.RelativeBase != "" { | ||||
| 			clone.RelativeBase = normalizeBase(clone.RelativeBase) | ||||
| 		} | ||||
| 		// if the relative base is empty, let the schema loader choose a pseudo root document | ||||
| 		return &clone | ||||
| 	} | ||||
| 	return &ExpandOptions{} | ||||
| } | ||||
| 
 | ||||
| // ExpandSpec expands the references in a swagger spec | ||||
| func ExpandSpec(spec *Swagger, options *ExpandOptions) error { | ||||
| 	options = optionsOrDefault(options) | ||||
| 	resolver := defaultSchemaLoader(spec, options, nil, nil) | ||||
| 
 | ||||
| 	specBasePath := options.RelativeBase | ||||
| 
 | ||||
| 	if !options.SkipSchemas { | ||||
| 		for key, definition := range spec.Definitions { | ||||
| 			parentRefs := make([]string, 0, 10) | ||||
| 			parentRefs = append(parentRefs, fmt.Sprintf("#/definitions/%s", key)) | ||||
| 
 | ||||
| 			def, err := expandSchema(definition, parentRefs, resolver, specBasePath) | ||||
| 			if resolver.shouldStopOnError(err) { | ||||
| 				return err | ||||
| 			} | ||||
| 			if def != nil { | ||||
| 				spec.Definitions[key] = *def | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for key := range spec.Parameters { | ||||
| 		parameter := spec.Parameters[key] | ||||
| 		if err := expandParameterOrResponse(¶meter, resolver, specBasePath); resolver.shouldStopOnError(err) { | ||||
| 			return err | ||||
| 		} | ||||
| 		spec.Parameters[key] = parameter | ||||
| 	} | ||||
| 
 | ||||
| 	for key := range spec.Responses { | ||||
| 		response := spec.Responses[key] | ||||
| 		if err := expandParameterOrResponse(&response, resolver, specBasePath); resolver.shouldStopOnError(err) { | ||||
| 			return err | ||||
| 		} | ||||
| 		spec.Responses[key] = response | ||||
| 	} | ||||
| 
 | ||||
| 	if spec.Paths != nil { | ||||
| 		for key := range spec.Paths.Paths { | ||||
| 			pth := spec.Paths.Paths[key] | ||||
| 			if err := expandPathItem(&pth, resolver, specBasePath); resolver.shouldStopOnError(err) { | ||||
| 				return err | ||||
| 			} | ||||
| 			spec.Paths.Paths[key] = pth | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| const rootBase = ".root" | ||||
| 
 | ||||
| // baseForRoot loads in the cache the root document and produces a fake ".root" base path entry | ||||
| // for further $ref resolution | ||||
| // | ||||
| // Setting the cache is optional and this parameter may safely be left to nil. | ||||
| func baseForRoot(root interface{}, cache ResolutionCache) string { | ||||
| 	if root == nil { | ||||
| 		return "" | ||||
| 	} | ||||
| 
 | ||||
| 	// cache the root document to resolve $ref's | ||||
| 	normalizedBase := normalizeBase(rootBase) | ||||
| 	cache.Set(normalizedBase, root) | ||||
| 
 | ||||
| 	return normalizedBase | ||||
| } | ||||
| 
 | ||||
| // ExpandSchema expands the refs in the schema object with reference to the root object. | ||||
| // | ||||
| // go-openapi/validate uses this function. | ||||
| // | ||||
| // Notice that it is impossible to reference a json schema in a different document other than root | ||||
| // (use ExpandSchemaWithBasePath to resolve external references). | ||||
| // | ||||
| // Setting the cache is optional and this parameter may safely be left to nil. | ||||
| func ExpandSchema(schema *Schema, root interface{}, cache ResolutionCache) error { | ||||
| 	cache = cacheOrDefault(cache) | ||||
| 	if root == nil { | ||||
| 		root = schema | ||||
| 	} | ||||
| 
 | ||||
| 	opts := &ExpandOptions{ | ||||
| 		// when a root is specified, cache the root as an in-memory document for $ref retrieval | ||||
| 		RelativeBase:    baseForRoot(root, cache), | ||||
| 		SkipSchemas:     false, | ||||
| 		ContinueOnError: false, | ||||
| 	} | ||||
| 
 | ||||
| 	return ExpandSchemaWithBasePath(schema, cache, opts) | ||||
| } | ||||
| 
 | ||||
| // ExpandSchemaWithBasePath expands the refs in the schema object, base path configured through expand options. | ||||
| // | ||||
| // Setting the cache is optional and this parameter may safely be left to nil. | ||||
| func ExpandSchemaWithBasePath(schema *Schema, cache ResolutionCache, opts *ExpandOptions) error { | ||||
| 	if schema == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	cache = cacheOrDefault(cache) | ||||
| 
 | ||||
| 	opts = optionsOrDefault(opts) | ||||
| 
 | ||||
| 	resolver := defaultSchemaLoader(nil, opts, cache, nil) | ||||
| 
 | ||||
| 	parentRefs := make([]string, 0, 10) | ||||
| 	s, err := expandSchema(*schema, parentRefs, resolver, opts.RelativeBase) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if s != nil { | ||||
| 		// guard for when continuing on error | ||||
| 		*schema = *s | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func expandItems(target Schema, parentRefs []string, resolver *schemaLoader, basePath string) (*Schema, error) { | ||||
| 	if target.Items == nil { | ||||
| 		return &target, nil | ||||
| 	} | ||||
| 
 | ||||
| 	// array | ||||
| 	if target.Items.Schema != nil { | ||||
| 		t, err := expandSchema(*target.Items.Schema, parentRefs, resolver, basePath) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		*target.Items.Schema = *t | ||||
| 	} | ||||
| 
 | ||||
| 	// tuple | ||||
| 	for i := range target.Items.Schemas { | ||||
| 		t, err := expandSchema(target.Items.Schemas[i], parentRefs, resolver, basePath) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		target.Items.Schemas[i] = *t | ||||
| 	} | ||||
| 
 | ||||
| 	return &target, nil | ||||
| } | ||||
| 
 | ||||
| func expandSchema(target Schema, parentRefs []string, resolver *schemaLoader, basePath string) (*Schema, error) { | ||||
| 	if target.Ref.String() == "" && target.Ref.IsRoot() { | ||||
| 		newRef := normalizeRef(&target.Ref, basePath) | ||||
| 		target.Ref = *newRef | ||||
| 		return &target, nil | ||||
| 	} | ||||
| 
 | ||||
| 	// change the base path of resolution when an ID is encountered | ||||
| 	// otherwise the basePath should inherit the parent's | ||||
| 	if target.ID != "" { | ||||
| 		basePath, _ = resolver.setSchemaID(target, target.ID, basePath) | ||||
| 	} | ||||
| 
 | ||||
| 	if target.Ref.String() != "" { | ||||
| 		return expandSchemaRef(target, parentRefs, resolver, basePath) | ||||
| 	} | ||||
| 
 | ||||
| 	for k := range target.Definitions { | ||||
| 		tt, err := expandSchema(target.Definitions[k], parentRefs, resolver, basePath) | ||||
| 		if resolver.shouldStopOnError(err) { | ||||
| 			return &target, err | ||||
| 		} | ||||
| 		if tt != nil { | ||||
| 			target.Definitions[k] = *tt | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	t, err := expandItems(target, parentRefs, resolver, basePath) | ||||
| 	if resolver.shouldStopOnError(err) { | ||||
| 		return &target, err | ||||
| 	} | ||||
| 	if t != nil { | ||||
| 		target = *t | ||||
| 	} | ||||
| 
 | ||||
| 	for i := range target.AllOf { | ||||
| 		t, err := expandSchema(target.AllOf[i], parentRefs, resolver, basePath) | ||||
| 		if resolver.shouldStopOnError(err) { | ||||
| 			return &target, err | ||||
| 		} | ||||
| 		if t != nil { | ||||
| 			target.AllOf[i] = *t | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for i := range target.AnyOf { | ||||
| 		t, err := expandSchema(target.AnyOf[i], parentRefs, resolver, basePath) | ||||
| 		if resolver.shouldStopOnError(err) { | ||||
| 			return &target, err | ||||
| 		} | ||||
| 		if t != nil { | ||||
| 			target.AnyOf[i] = *t | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for i := range target.OneOf { | ||||
| 		t, err := expandSchema(target.OneOf[i], parentRefs, resolver, basePath) | ||||
| 		if resolver.shouldStopOnError(err) { | ||||
| 			return &target, err | ||||
| 		} | ||||
| 		if t != nil { | ||||
| 			target.OneOf[i] = *t | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if target.Not != nil { | ||||
| 		t, err := expandSchema(*target.Not, parentRefs, resolver, basePath) | ||||
| 		if resolver.shouldStopOnError(err) { | ||||
| 			return &target, err | ||||
| 		} | ||||
| 		if t != nil { | ||||
| 			*target.Not = *t | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for k := range target.Properties { | ||||
| 		t, err := expandSchema(target.Properties[k], parentRefs, resolver, basePath) | ||||
| 		if resolver.shouldStopOnError(err) { | ||||
| 			return &target, err | ||||
| 		} | ||||
| 		if t != nil { | ||||
| 			target.Properties[k] = *t | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if target.AdditionalProperties != nil && target.AdditionalProperties.Schema != nil { | ||||
| 		t, err := expandSchema(*target.AdditionalProperties.Schema, parentRefs, resolver, basePath) | ||||
| 		if resolver.shouldStopOnError(err) { | ||||
| 			return &target, err | ||||
| 		} | ||||
| 		if t != nil { | ||||
| 			*target.AdditionalProperties.Schema = *t | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for k := range target.PatternProperties { | ||||
| 		t, err := expandSchema(target.PatternProperties[k], parentRefs, resolver, basePath) | ||||
| 		if resolver.shouldStopOnError(err) { | ||||
| 			return &target, err | ||||
| 		} | ||||
| 		if t != nil { | ||||
| 			target.PatternProperties[k] = *t | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	for k := range target.Dependencies { | ||||
| 		if target.Dependencies[k].Schema != nil { | ||||
| 			t, err := expandSchema(*target.Dependencies[k].Schema, parentRefs, resolver, basePath) | ||||
| 			if resolver.shouldStopOnError(err) { | ||||
| 				return &target, err | ||||
| 			} | ||||
| 			if t != nil { | ||||
| 				*target.Dependencies[k].Schema = *t | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if target.AdditionalItems != nil && target.AdditionalItems.Schema != nil { | ||||
| 		t, err := expandSchema(*target.AdditionalItems.Schema, parentRefs, resolver, basePath) | ||||
| 		if resolver.shouldStopOnError(err) { | ||||
| 			return &target, err | ||||
| 		} | ||||
| 		if t != nil { | ||||
| 			*target.AdditionalItems.Schema = *t | ||||
| 		} | ||||
| 	} | ||||
| 	return &target, nil | ||||
| } | ||||
| 
 | ||||
| func expandSchemaRef(target Schema, parentRefs []string, resolver *schemaLoader, basePath string) (*Schema, error) { | ||||
| 	// if a Ref is found, all sibling fields are skipped | ||||
| 	// Ref also changes the resolution scope of children expandSchema | ||||
| 
 | ||||
| 	// here the resolution scope is changed because a $ref was encountered | ||||
| 	normalizedRef := normalizeRef(&target.Ref, basePath) | ||||
| 	normalizedBasePath := normalizedRef.RemoteURI() | ||||
| 
 | ||||
| 	if resolver.isCircular(normalizedRef, basePath, parentRefs...) { | ||||
| 		// this means there is a cycle in the recursion tree: return the Ref | ||||
| 		// - circular refs cannot be expanded. We leave them as ref. | ||||
| 		// - denormalization means that a new local file ref is set relative to the original basePath | ||||
| 		debugLog("short circuit circular ref: basePath: %s, normalizedPath: %s, normalized ref: %s", | ||||
| 			basePath, normalizedBasePath, normalizedRef.String()) | ||||
| 		if !resolver.options.AbsoluteCircularRef { | ||||
| 			target.Ref = denormalizeRef(normalizedRef, resolver.context.basePath, resolver.context.rootID) | ||||
| 		} else { | ||||
| 			target.Ref = *normalizedRef | ||||
| 		} | ||||
| 		return &target, nil | ||||
| 	} | ||||
| 
 | ||||
| 	var t *Schema | ||||
| 	err := resolver.Resolve(&target.Ref, &t, basePath) | ||||
| 	if resolver.shouldStopOnError(err) { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	if t == nil { | ||||
| 		// guard for when continuing on error | ||||
| 		return &target, nil | ||||
| 	} | ||||
| 
 | ||||
| 	parentRefs = append(parentRefs, normalizedRef.String()) | ||||
| 	transitiveResolver := resolver.transitiveResolver(basePath, target.Ref) | ||||
| 
 | ||||
| 	basePath = resolver.updateBasePath(transitiveResolver, normalizedBasePath) | ||||
| 
 | ||||
| 	return expandSchema(*t, parentRefs, transitiveResolver, basePath) | ||||
| } | ||||
| 
 | ||||
| func expandPathItem(pathItem *PathItem, resolver *schemaLoader, basePath string) error { | ||||
| 	if pathItem == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	parentRefs := make([]string, 0, 10) | ||||
| 	if err := resolver.deref(pathItem, parentRefs, basePath); resolver.shouldStopOnError(err) { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if pathItem.Ref.String() != "" { | ||||
| 		transitiveResolver := resolver.transitiveResolver(basePath, pathItem.Ref) | ||||
| 		basePath = transitiveResolver.updateBasePath(resolver, basePath) | ||||
| 		resolver = transitiveResolver | ||||
| 	} | ||||
| 
 | ||||
| 	pathItem.Ref = Ref{} | ||||
| 	for i := range pathItem.Parameters { | ||||
| 		if err := expandParameterOrResponse(&(pathItem.Parameters[i]), resolver, basePath); resolver.shouldStopOnError(err) { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	ops := []*Operation{ | ||||
| 		pathItem.Get, | ||||
| 		pathItem.Head, | ||||
| 		pathItem.Options, | ||||
| 		pathItem.Put, | ||||
| 		pathItem.Post, | ||||
| 		pathItem.Patch, | ||||
| 		pathItem.Delete, | ||||
| 	} | ||||
| 	for _, op := range ops { | ||||
| 		if err := expandOperation(op, resolver, basePath); resolver.shouldStopOnError(err) { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| func expandOperation(op *Operation, resolver *schemaLoader, basePath string) error { | ||||
| 	if op == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	for i := range op.Parameters { | ||||
| 		param := op.Parameters[i] | ||||
| 		if err := expandParameterOrResponse(¶m, resolver, basePath); resolver.shouldStopOnError(err) { | ||||
| 			return err | ||||
| 		} | ||||
| 		op.Parameters[i] = param | ||||
| 	} | ||||
| 
 | ||||
| 	if op.Responses == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	responses := op.Responses | ||||
| 	if err := expandParameterOrResponse(responses.Default, resolver, basePath); resolver.shouldStopOnError(err) { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	for code := range responses.StatusCodeResponses { | ||||
| 		response := responses.StatusCodeResponses[code] | ||||
| 		if err := expandParameterOrResponse(&response, resolver, basePath); resolver.shouldStopOnError(err) { | ||||
| 			return err | ||||
| 		} | ||||
| 		responses.StatusCodeResponses[code] = response | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // ExpandResponseWithRoot expands a response based on a root document, not a fetchable document | ||||
| // | ||||
| // Notice that it is impossible to reference a json schema in a different document other than root | ||||
| // (use ExpandResponse to resolve external references). | ||||
| // | ||||
| // Setting the cache is optional and this parameter may safely be left to nil. | ||||
| func ExpandResponseWithRoot(response *Response, root interface{}, cache ResolutionCache) error { | ||||
| 	cache = cacheOrDefault(cache) | ||||
| 	opts := &ExpandOptions{ | ||||
| 		RelativeBase: baseForRoot(root, cache), | ||||
| 	} | ||||
| 	resolver := defaultSchemaLoader(root, opts, cache, nil) | ||||
| 
 | ||||
| 	return expandParameterOrResponse(response, resolver, opts.RelativeBase) | ||||
| } | ||||
| 
 | ||||
| // ExpandResponse expands a response based on a basepath | ||||
| // | ||||
| // All refs inside response will be resolved relative to basePath | ||||
| func ExpandResponse(response *Response, basePath string) error { | ||||
| 	opts := optionsOrDefault(&ExpandOptions{ | ||||
| 		RelativeBase: basePath, | ||||
| 	}) | ||||
| 	resolver := defaultSchemaLoader(nil, opts, nil, nil) | ||||
| 
 | ||||
| 	return expandParameterOrResponse(response, resolver, opts.RelativeBase) | ||||
| } | ||||
| 
 | ||||
| // ExpandParameterWithRoot expands a parameter based on a root document, not a fetchable document. | ||||
| // | ||||
| // Notice that it is impossible to reference a json schema in a different document other than root | ||||
| // (use ExpandParameter to resolve external references). | ||||
| func ExpandParameterWithRoot(parameter *Parameter, root interface{}, cache ResolutionCache) error { | ||||
| 	cache = cacheOrDefault(cache) | ||||
| 
 | ||||
| 	opts := &ExpandOptions{ | ||||
| 		RelativeBase: baseForRoot(root, cache), | ||||
| 	} | ||||
| 	resolver := defaultSchemaLoader(root, opts, cache, nil) | ||||
| 
 | ||||
| 	return expandParameterOrResponse(parameter, resolver, opts.RelativeBase) | ||||
| } | ||||
| 
 | ||||
| // ExpandParameter expands a parameter based on a basepath. | ||||
| // This is the exported version of expandParameter | ||||
| // all refs inside parameter will be resolved relative to basePath | ||||
| func ExpandParameter(parameter *Parameter, basePath string) error { | ||||
| 	opts := optionsOrDefault(&ExpandOptions{ | ||||
| 		RelativeBase: basePath, | ||||
| 	}) | ||||
| 	resolver := defaultSchemaLoader(nil, opts, nil, nil) | ||||
| 
 | ||||
| 	return expandParameterOrResponse(parameter, resolver, opts.RelativeBase) | ||||
| } | ||||
| 
 | ||||
| func getRefAndSchema(input interface{}) (*Ref, *Schema, error) { | ||||
| 	var ( | ||||
| 		ref *Ref | ||||
| 		sch *Schema | ||||
| 	) | ||||
| 
 | ||||
| 	switch refable := input.(type) { | ||||
| 	case *Parameter: | ||||
| 		if refable == nil { | ||||
| 			return nil, nil, nil | ||||
| 		} | ||||
| 		ref = &refable.Ref | ||||
| 		sch = refable.Schema | ||||
| 	case *Response: | ||||
| 		if refable == nil { | ||||
| 			return nil, nil, nil | ||||
| 		} | ||||
| 		ref = &refable.Ref | ||||
| 		sch = refable.Schema | ||||
| 	default: | ||||
| 		return nil, nil, fmt.Errorf("unsupported type: %T: %w", input, ErrExpandUnsupportedType) | ||||
| 	} | ||||
| 
 | ||||
| 	return ref, sch, nil | ||||
| } | ||||
| 
 | ||||
| func expandParameterOrResponse(input interface{}, resolver *schemaLoader, basePath string) error { | ||||
| 	ref, _, err := getRefAndSchema(input) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if ref == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	parentRefs := make([]string, 0, 10) | ||||
| 	if err = resolver.deref(input, parentRefs, basePath); resolver.shouldStopOnError(err) { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	ref, sch, _ := getRefAndSchema(input) | ||||
| 	if ref.String() != "" { | ||||
| 		transitiveResolver := resolver.transitiveResolver(basePath, *ref) | ||||
| 		basePath = resolver.updateBasePath(transitiveResolver, basePath) | ||||
| 		resolver = transitiveResolver | ||||
| 	} | ||||
| 
 | ||||
| 	if sch == nil { | ||||
| 		// nothing to be expanded | ||||
| 		if ref != nil { | ||||
| 			*ref = Ref{} | ||||
| 		} | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	if sch.Ref.String() != "" { | ||||
| 		rebasedRef, ern := NewRef(normalizeURI(sch.Ref.String(), basePath)) | ||||
| 		if ern != nil { | ||||
| 			return ern | ||||
| 		} | ||||
| 
 | ||||
| 		switch { | ||||
| 		case resolver.isCircular(&rebasedRef, basePath, parentRefs...): | ||||
| 			// this is a circular $ref: stop expansion | ||||
| 			if !resolver.options.AbsoluteCircularRef { | ||||
| 				sch.Ref = denormalizeRef(&rebasedRef, resolver.context.basePath, resolver.context.rootID) | ||||
| 			} else { | ||||
| 				sch.Ref = rebasedRef | ||||
| 			} | ||||
| 		case !resolver.options.SkipSchemas: | ||||
| 			// schema expanded to a $ref in another root | ||||
| 			sch.Ref = rebasedRef | ||||
| 			debugLog("rebased to: %s", sch.Ref.String()) | ||||
| 		default: | ||||
| 			// skip schema expansion but rebase $ref to schema | ||||
| 			sch.Ref = denormalizeRef(&rebasedRef, resolver.context.basePath, resolver.context.rootID) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if ref != nil { | ||||
| 		*ref = Ref{} | ||||
| 	} | ||||
| 
 | ||||
| 	// expand schema | ||||
| 	if !resolver.options.SkipSchemas { | ||||
| 		s, err := expandSchema(*sch, parentRefs, resolver, basePath) | ||||
| 		if resolver.shouldStopOnError(err) { | ||||
| 			return err | ||||
| 		} | ||||
| 		if s == nil { | ||||
| 			// guard for when continuing on error | ||||
| 			return nil | ||||
| 		} | ||||
| 		*sch = *s | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										24
									
								
								vendor/github.com/go-openapi/spec/external_docs.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								vendor/github.com/go-openapi/spec/external_docs.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,24 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| // ExternalDocumentation allows referencing an external resource for | ||||
| // extended documentation. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#externalDocumentationObject | ||||
| type ExternalDocumentation struct { | ||||
| 	Description string `json:"description,omitempty"` | ||||
| 	URL         string `json:"url,omitempty"` | ||||
| } | ||||
							
								
								
									
										203
									
								
								vendor/github.com/go-openapi/spec/header.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										203
									
								
								vendor/github.com/go-openapi/spec/header.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,203 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	jsonArray = "array" | ||||
| ) | ||||
| 
 | ||||
| // HeaderProps describes a response header | ||||
| type HeaderProps struct { | ||||
| 	Description string `json:"description,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // Header describes a header for a response of the API | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#headerObject | ||||
| type Header struct { | ||||
| 	CommonValidations | ||||
| 	SimpleSchema | ||||
| 	VendorExtensible | ||||
| 	HeaderProps | ||||
| } | ||||
| 
 | ||||
| // ResponseHeader creates a new header instance for use in a response | ||||
| func ResponseHeader() *Header { | ||||
| 	return new(Header) | ||||
| } | ||||
| 
 | ||||
| // WithDescription sets the description on this response, allows for chaining | ||||
| func (h *Header) WithDescription(description string) *Header { | ||||
| 	h.Description = description | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // Typed a fluent builder method for the type of parameter | ||||
| func (h *Header) Typed(tpe, format string) *Header { | ||||
| 	h.Type = tpe | ||||
| 	h.Format = format | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // CollectionOf a fluent builder method for an array item | ||||
| func (h *Header) CollectionOf(items *Items, format string) *Header { | ||||
| 	h.Type = jsonArray | ||||
| 	h.Items = items | ||||
| 	h.CollectionFormat = format | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // WithDefault sets the default value on this item | ||||
| func (h *Header) WithDefault(defaultValue interface{}) *Header { | ||||
| 	h.Default = defaultValue | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // WithMaxLength sets a max length value | ||||
| func (h *Header) WithMaxLength(max int64) *Header { | ||||
| 	h.MaxLength = &max | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // WithMinLength sets a min length value | ||||
| func (h *Header) WithMinLength(min int64) *Header { | ||||
| 	h.MinLength = &min | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // WithPattern sets a pattern value | ||||
| func (h *Header) WithPattern(pattern string) *Header { | ||||
| 	h.Pattern = pattern | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // WithMultipleOf sets a multiple of value | ||||
| func (h *Header) WithMultipleOf(number float64) *Header { | ||||
| 	h.MultipleOf = &number | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // WithMaximum sets a maximum number value | ||||
| func (h *Header) WithMaximum(max float64, exclusive bool) *Header { | ||||
| 	h.Maximum = &max | ||||
| 	h.ExclusiveMaximum = exclusive | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // WithMinimum sets a minimum number value | ||||
| func (h *Header) WithMinimum(min float64, exclusive bool) *Header { | ||||
| 	h.Minimum = &min | ||||
| 	h.ExclusiveMinimum = exclusive | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // WithEnum sets a the enum values (replace) | ||||
| func (h *Header) WithEnum(values ...interface{}) *Header { | ||||
| 	h.Enum = append([]interface{}{}, values...) | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // WithMaxItems sets the max items | ||||
| func (h *Header) WithMaxItems(size int64) *Header { | ||||
| 	h.MaxItems = &size | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // WithMinItems sets the min items | ||||
| func (h *Header) WithMinItems(size int64) *Header { | ||||
| 	h.MinItems = &size | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // UniqueValues dictates that this array can only have unique items | ||||
| func (h *Header) UniqueValues() *Header { | ||||
| 	h.UniqueItems = true | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // AllowDuplicates this array can have duplicates | ||||
| func (h *Header) AllowDuplicates() *Header { | ||||
| 	h.UniqueItems = false | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // WithValidations is a fluent method to set header validations | ||||
| func (h *Header) WithValidations(val CommonValidations) *Header { | ||||
| 	h.SetValidations(SchemaValidations{CommonValidations: val}) | ||||
| 	return h | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON marshal this to JSON | ||||
| func (h Header) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(h.CommonValidations) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b2, err := json.Marshal(h.SimpleSchema) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b3, err := json.Marshal(h.HeaderProps) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return swag.ConcatJSON(b1, b2, b3), nil | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON unmarshals this header from JSON | ||||
| func (h *Header) UnmarshalJSON(data []byte) error { | ||||
| 	if err := json.Unmarshal(data, &h.CommonValidations); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := json.Unmarshal(data, &h.SimpleSchema); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := json.Unmarshal(data, &h.VendorExtensible); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(data, &h.HeaderProps) | ||||
| } | ||||
| 
 | ||||
| // JSONLookup look up a value by the json property name | ||||
| func (h Header) JSONLookup(token string) (interface{}, error) { | ||||
| 	if ex, ok := h.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 
 | ||||
| 	r, _, err := jsonpointer.GetForToken(h.CommonValidations, token) | ||||
| 	if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if r != nil { | ||||
| 		return r, nil | ||||
| 	} | ||||
| 	r, _, err = jsonpointer.GetForToken(h.SimpleSchema, token) | ||||
| 	if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if r != nil { | ||||
| 		return r, nil | ||||
| 	} | ||||
| 	r, _, err = jsonpointer.GetForToken(h.HeaderProps, token) | ||||
| 	return r, err | ||||
| } | ||||
							
								
								
									
										184
									
								
								vendor/github.com/go-openapi/spec/info.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								vendor/github.com/go-openapi/spec/info.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,184 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // Extensions vendor specific extensions | ||||
| type Extensions map[string]interface{} | ||||
| 
 | ||||
| // Add adds a value to these extensions | ||||
| func (e Extensions) Add(key string, value interface{}) { | ||||
| 	realKey := strings.ToLower(key) | ||||
| 	e[realKey] = value | ||||
| } | ||||
| 
 | ||||
| // GetString gets a string value from the extensions | ||||
| func (e Extensions) GetString(key string) (string, bool) { | ||||
| 	if v, ok := e[strings.ToLower(key)]; ok { | ||||
| 		str, ok := v.(string) | ||||
| 		return str, ok | ||||
| 	} | ||||
| 	return "", false | ||||
| } | ||||
| 
 | ||||
| // GetInt gets a int value from the extensions | ||||
| func (e Extensions) GetInt(key string) (int, bool) { | ||||
| 	realKey := strings.ToLower(key) | ||||
| 
 | ||||
| 	if v, ok := e.GetString(realKey); ok { | ||||
| 		if r, err := strconv.Atoi(v); err == nil { | ||||
| 			return r, true | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if v, ok := e[realKey]; ok { | ||||
| 		if r, rOk := v.(float64); rOk { | ||||
| 			return int(r), true | ||||
| 		} | ||||
| 	} | ||||
| 	return -1, false | ||||
| } | ||||
| 
 | ||||
| // GetBool gets a string value from the extensions | ||||
| func (e Extensions) GetBool(key string) (bool, bool) { | ||||
| 	if v, ok := e[strings.ToLower(key)]; ok { | ||||
| 		str, ok := v.(bool) | ||||
| 		return str, ok | ||||
| 	} | ||||
| 	return false, false | ||||
| } | ||||
| 
 | ||||
| // GetStringSlice gets a string value from the extensions | ||||
| func (e Extensions) GetStringSlice(key string) ([]string, bool) { | ||||
| 	if v, ok := e[strings.ToLower(key)]; ok { | ||||
| 		arr, isSlice := v.([]interface{}) | ||||
| 		if !isSlice { | ||||
| 			return nil, false | ||||
| 		} | ||||
| 		var strs []string | ||||
| 		for _, iface := range arr { | ||||
| 			str, isString := iface.(string) | ||||
| 			if !isString { | ||||
| 				return nil, false | ||||
| 			} | ||||
| 			strs = append(strs, str) | ||||
| 		} | ||||
| 		return strs, ok | ||||
| 	} | ||||
| 	return nil, false | ||||
| } | ||||
| 
 | ||||
| // VendorExtensible composition block. | ||||
| type VendorExtensible struct { | ||||
| 	Extensions Extensions | ||||
| } | ||||
| 
 | ||||
| // AddExtension adds an extension to this extensible object | ||||
| func (v *VendorExtensible) AddExtension(key string, value interface{}) { | ||||
| 	if value == nil { | ||||
| 		return | ||||
| 	} | ||||
| 	if v.Extensions == nil { | ||||
| 		v.Extensions = make(map[string]interface{}) | ||||
| 	} | ||||
| 	v.Extensions.Add(key, value) | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON marshals the extensions to json | ||||
| func (v VendorExtensible) MarshalJSON() ([]byte, error) { | ||||
| 	toser := make(map[string]interface{}) | ||||
| 	for k, v := range v.Extensions { | ||||
| 		lk := strings.ToLower(k) | ||||
| 		if strings.HasPrefix(lk, "x-") { | ||||
| 			toser[k] = v | ||||
| 		} | ||||
| 	} | ||||
| 	return json.Marshal(toser) | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON for this extensible object | ||||
| func (v *VendorExtensible) UnmarshalJSON(data []byte) error { | ||||
| 	var d map[string]interface{} | ||||
| 	if err := json.Unmarshal(data, &d); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for k, vv := range d { | ||||
| 		lk := strings.ToLower(k) | ||||
| 		if strings.HasPrefix(lk, "x-") { | ||||
| 			if v.Extensions == nil { | ||||
| 				v.Extensions = map[string]interface{}{} | ||||
| 			} | ||||
| 			v.Extensions[k] = vv | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // InfoProps the properties for an info definition | ||||
| type InfoProps struct { | ||||
| 	Description    string       `json:"description,omitempty"` | ||||
| 	Title          string       `json:"title,omitempty"` | ||||
| 	TermsOfService string       `json:"termsOfService,omitempty"` | ||||
| 	Contact        *ContactInfo `json:"contact,omitempty"` | ||||
| 	License        *License     `json:"license,omitempty"` | ||||
| 	Version        string       `json:"version,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // Info object provides metadata about the API. | ||||
| // The metadata can be used by the clients if needed, and can be presented in the Swagger-UI for convenience. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#infoObject | ||||
| type Info struct { | ||||
| 	VendorExtensible | ||||
| 	InfoProps | ||||
| } | ||||
| 
 | ||||
| // JSONLookup look up a value by the json property name | ||||
| func (i Info) JSONLookup(token string) (interface{}, error) { | ||||
| 	if ex, ok := i.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 	r, _, err := jsonpointer.GetForToken(i.InfoProps, token) | ||||
| 	return r, err | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON marshal this to JSON | ||||
| func (i Info) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(i.InfoProps) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b2, err := json.Marshal(i.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return swag.ConcatJSON(b1, b2), nil | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON marshal this from JSON | ||||
| func (i *Info) UnmarshalJSON(data []byte) error { | ||||
| 	if err := json.Unmarshal(data, &i.InfoProps); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(data, &i.VendorExtensible) | ||||
| } | ||||
							
								
								
									
										234
									
								
								vendor/github.com/go-openapi/spec/items.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										234
									
								
								vendor/github.com/go-openapi/spec/items.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,234 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	jsonRef = "$ref" | ||||
| ) | ||||
| 
 | ||||
| // SimpleSchema describe swagger simple schemas for parameters and headers | ||||
| type SimpleSchema struct { | ||||
| 	Type             string      `json:"type,omitempty"` | ||||
| 	Nullable         bool        `json:"nullable,omitempty"` | ||||
| 	Format           string      `json:"format,omitempty"` | ||||
| 	Items            *Items      `json:"items,omitempty"` | ||||
| 	CollectionFormat string      `json:"collectionFormat,omitempty"` | ||||
| 	Default          interface{} `json:"default,omitempty"` | ||||
| 	Example          interface{} `json:"example,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // TypeName return the type (or format) of a simple schema | ||||
| func (s *SimpleSchema) TypeName() string { | ||||
| 	if s.Format != "" { | ||||
| 		return s.Format | ||||
| 	} | ||||
| 	return s.Type | ||||
| } | ||||
| 
 | ||||
| // ItemsTypeName yields the type of items in a simple schema array | ||||
| func (s *SimpleSchema) ItemsTypeName() string { | ||||
| 	if s.Items == nil { | ||||
| 		return "" | ||||
| 	} | ||||
| 	return s.Items.TypeName() | ||||
| } | ||||
| 
 | ||||
| // Items a limited subset of JSON-Schema's items object. | ||||
| // It is used by parameter definitions that are not located in "body". | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#items-object | ||||
| type Items struct { | ||||
| 	Refable | ||||
| 	CommonValidations | ||||
| 	SimpleSchema | ||||
| 	VendorExtensible | ||||
| } | ||||
| 
 | ||||
| // NewItems creates a new instance of items | ||||
| func NewItems() *Items { | ||||
| 	return &Items{} | ||||
| } | ||||
| 
 | ||||
| // Typed a fluent builder method for the type of item | ||||
| func (i *Items) Typed(tpe, format string) *Items { | ||||
| 	i.Type = tpe | ||||
| 	i.Format = format | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // AsNullable flags this schema as nullable. | ||||
| func (i *Items) AsNullable() *Items { | ||||
| 	i.Nullable = true | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // CollectionOf a fluent builder method for an array item | ||||
| func (i *Items) CollectionOf(items *Items, format string) *Items { | ||||
| 	i.Type = jsonArray | ||||
| 	i.Items = items | ||||
| 	i.CollectionFormat = format | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // WithDefault sets the default value on this item | ||||
| func (i *Items) WithDefault(defaultValue interface{}) *Items { | ||||
| 	i.Default = defaultValue | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // WithMaxLength sets a max length value | ||||
| func (i *Items) WithMaxLength(max int64) *Items { | ||||
| 	i.MaxLength = &max | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // WithMinLength sets a min length value | ||||
| func (i *Items) WithMinLength(min int64) *Items { | ||||
| 	i.MinLength = &min | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // WithPattern sets a pattern value | ||||
| func (i *Items) WithPattern(pattern string) *Items { | ||||
| 	i.Pattern = pattern | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // WithMultipleOf sets a multiple of value | ||||
| func (i *Items) WithMultipleOf(number float64) *Items { | ||||
| 	i.MultipleOf = &number | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // WithMaximum sets a maximum number value | ||||
| func (i *Items) WithMaximum(max float64, exclusive bool) *Items { | ||||
| 	i.Maximum = &max | ||||
| 	i.ExclusiveMaximum = exclusive | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // WithMinimum sets a minimum number value | ||||
| func (i *Items) WithMinimum(min float64, exclusive bool) *Items { | ||||
| 	i.Minimum = &min | ||||
| 	i.ExclusiveMinimum = exclusive | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // WithEnum sets a the enum values (replace) | ||||
| func (i *Items) WithEnum(values ...interface{}) *Items { | ||||
| 	i.Enum = append([]interface{}{}, values...) | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // WithMaxItems sets the max items | ||||
| func (i *Items) WithMaxItems(size int64) *Items { | ||||
| 	i.MaxItems = &size | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // WithMinItems sets the min items | ||||
| func (i *Items) WithMinItems(size int64) *Items { | ||||
| 	i.MinItems = &size | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // UniqueValues dictates that this array can only have unique items | ||||
| func (i *Items) UniqueValues() *Items { | ||||
| 	i.UniqueItems = true | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // AllowDuplicates this array can have duplicates | ||||
| func (i *Items) AllowDuplicates() *Items { | ||||
| 	i.UniqueItems = false | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // WithValidations is a fluent method to set Items validations | ||||
| func (i *Items) WithValidations(val CommonValidations) *Items { | ||||
| 	i.SetValidations(SchemaValidations{CommonValidations: val}) | ||||
| 	return i | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON hydrates this items instance with the data from JSON | ||||
| func (i *Items) UnmarshalJSON(data []byte) error { | ||||
| 	var validations CommonValidations | ||||
| 	if err := json.Unmarshal(data, &validations); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	var ref Refable | ||||
| 	if err := json.Unmarshal(data, &ref); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	var simpleSchema SimpleSchema | ||||
| 	if err := json.Unmarshal(data, &simpleSchema); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	var vendorExtensible VendorExtensible | ||||
| 	if err := json.Unmarshal(data, &vendorExtensible); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	i.Refable = ref | ||||
| 	i.CommonValidations = validations | ||||
| 	i.SimpleSchema = simpleSchema | ||||
| 	i.VendorExtensible = vendorExtensible | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON converts this items object to JSON | ||||
| func (i Items) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(i.CommonValidations) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b2, err := json.Marshal(i.SimpleSchema) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b3, err := json.Marshal(i.Refable) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b4, err := json.Marshal(i.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return swag.ConcatJSON(b4, b3, b1, b2), nil | ||||
| } | ||||
| 
 | ||||
| // JSONLookup look up a value by the json property name | ||||
| func (i Items) JSONLookup(token string) (interface{}, error) { | ||||
| 	if token == jsonRef { | ||||
| 		return &i.Ref, nil | ||||
| 	} | ||||
| 
 | ||||
| 	r, _, err := jsonpointer.GetForToken(i.CommonValidations, token) | ||||
| 	if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if r != nil { | ||||
| 		return r, nil | ||||
| 	} | ||||
| 	r, _, err = jsonpointer.GetForToken(i.SimpleSchema, token) | ||||
| 	return r, err | ||||
| } | ||||
							
								
								
									
										56
									
								
								vendor/github.com/go-openapi/spec/license.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								vendor/github.com/go-openapi/spec/license.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,56 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 
 | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // License information for the exposed API. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#licenseObject | ||||
| type License struct { | ||||
| 	LicenseProps | ||||
| 	VendorExtensible | ||||
| } | ||||
| 
 | ||||
| // LicenseProps holds the properties of a License object | ||||
| type LicenseProps struct { | ||||
| 	Name string `json:"name,omitempty"` | ||||
| 	URL  string `json:"url,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON hydrates License from json | ||||
| func (l *License) UnmarshalJSON(data []byte) error { | ||||
| 	if err := json.Unmarshal(data, &l.LicenseProps); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(data, &l.VendorExtensible) | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON produces License as json | ||||
| func (l License) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(l.LicenseProps) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b2, err := json.Marshal(l.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return swag.ConcatJSON(b1, b2), nil | ||||
| } | ||||
							
								
								
									
										202
									
								
								vendor/github.com/go-openapi/spec/normalizer.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										202
									
								
								vendor/github.com/go-openapi/spec/normalizer.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,202 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"net/url" | ||||
| 	"path" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| const fileScheme = "file" | ||||
| 
 | ||||
| // normalizeURI ensures that all $ref paths used internally by the expander are canonicalized. | ||||
| // | ||||
| // NOTE(windows): there is a tolerance over the strict URI format on windows. | ||||
| // | ||||
| // The normalizer accepts relative file URLs like 'Path\File.JSON' as well as absolute file URLs like | ||||
| // 'C:\Path\file.Yaml'. | ||||
| // | ||||
| // Both are canonicalized with a "file://" scheme, slashes and a lower-cased path: | ||||
| // 'file:///c:/path/file.yaml' | ||||
| // | ||||
| // URLs can be specified with a file scheme, like in 'file:///folder/file.json' or | ||||
| // 'file:///c:\folder\File.json'. | ||||
| // | ||||
| // URLs like file://C:\folder are considered invalid (i.e. there is no host 'c:\folder') and a "repair" | ||||
| // is attempted. | ||||
| // | ||||
| // The base path argument is assumed to be canonicalized (e.g. using normalizeBase()). | ||||
| func normalizeURI(refPath, base string) string { | ||||
| 	refURL, err := parseURL(refPath) | ||||
| 	if err != nil { | ||||
| 		specLogger.Printf("warning: invalid URI in $ref  %q: %v", refPath, err) | ||||
| 		refURL, refPath = repairURI(refPath) | ||||
| 	} | ||||
| 
 | ||||
| 	fixWindowsURI(refURL, refPath) // noop on non-windows OS | ||||
| 
 | ||||
| 	refURL.Path = path.Clean(refURL.Path) | ||||
| 	if refURL.Path == "." { | ||||
| 		refURL.Path = "" | ||||
| 	} | ||||
| 
 | ||||
| 	r := MustCreateRef(refURL.String()) | ||||
| 	if r.IsCanonical() { | ||||
| 		return refURL.String() | ||||
| 	} | ||||
| 
 | ||||
| 	baseURL, _ := parseURL(base) | ||||
| 	if path.IsAbs(refURL.Path) { | ||||
| 		baseURL.Path = refURL.Path | ||||
| 	} else if refURL.Path != "" { | ||||
| 		baseURL.Path = path.Join(path.Dir(baseURL.Path), refURL.Path) | ||||
| 	} | ||||
| 	// copying fragment from ref to base | ||||
| 	baseURL.Fragment = refURL.Fragment | ||||
| 
 | ||||
| 	return baseURL.String() | ||||
| } | ||||
| 
 | ||||
| // denormalizeRef returns the simplest notation for a normalized $ref, given the path of the original root document. | ||||
| // | ||||
| // When calling this, we assume that: | ||||
| // * $ref is a canonical URI | ||||
| // * originalRelativeBase is a canonical URI | ||||
| // | ||||
| // denormalizeRef is currently used when we rewrite a $ref after a circular $ref has been detected. | ||||
| // In this case, expansion stops and normally renders the internal canonical $ref. | ||||
| // | ||||
| // This internal $ref is eventually rebased to the original RelativeBase used for the expansion. | ||||
| // | ||||
| // There is a special case for schemas that are anchored with an "id": | ||||
| // in that case, the rebasing is performed // against the id only if this is an anchor for the initial root document. | ||||
| // All other intermediate "id"'s found along the way are ignored for the purpose of rebasing. | ||||
| func denormalizeRef(ref *Ref, originalRelativeBase, id string) Ref { | ||||
| 	debugLog("denormalizeRef called:\n$ref: %q\noriginal: %s\nroot ID:%s", ref.String(), originalRelativeBase, id) | ||||
| 
 | ||||
| 	if ref.String() == "" || ref.IsRoot() || ref.HasFragmentOnly { | ||||
| 		// short circuit: $ref to current doc | ||||
| 		return *ref | ||||
| 	} | ||||
| 
 | ||||
| 	if id != "" { | ||||
| 		idBaseURL, err := parseURL(id) | ||||
| 		if err == nil { // if the schema id is not usable as a URI, ignore it | ||||
| 			if ref, ok := rebase(ref, idBaseURL, true); ok { // rebase, but keep references to root unchaged (do not want $ref: "") | ||||
| 				// $ref relative to the ID of the schema in the root document | ||||
| 				return ref | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	originalRelativeBaseURL, _ := parseURL(originalRelativeBase) | ||||
| 
 | ||||
| 	r, _ := rebase(ref, originalRelativeBaseURL, false) | ||||
| 
 | ||||
| 	return r | ||||
| } | ||||
| 
 | ||||
| func rebase(ref *Ref, v *url.URL, notEqual bool) (Ref, bool) { | ||||
| 	var newBase url.URL | ||||
| 
 | ||||
| 	u := ref.GetURL() | ||||
| 
 | ||||
| 	if u.Scheme != v.Scheme || u.Host != v.Host { | ||||
| 		return *ref, false | ||||
| 	} | ||||
| 
 | ||||
| 	docPath := v.Path | ||||
| 	v.Path = path.Dir(v.Path) | ||||
| 
 | ||||
| 	if v.Path == "." { | ||||
| 		v.Path = "" | ||||
| 	} else if !strings.HasSuffix(v.Path, "/") { | ||||
| 		v.Path += "/" | ||||
| 	} | ||||
| 
 | ||||
| 	newBase.Fragment = u.Fragment | ||||
| 
 | ||||
| 	if strings.HasPrefix(u.Path, docPath) { | ||||
| 		newBase.Path = strings.TrimPrefix(u.Path, docPath) | ||||
| 	} else { | ||||
| 		newBase.Path = strings.TrimPrefix(u.Path, v.Path) | ||||
| 	} | ||||
| 
 | ||||
| 	if notEqual && newBase.Path == "" && newBase.Fragment == "" { | ||||
| 		// do not want rebasing to end up in an empty $ref | ||||
| 		return *ref, false | ||||
| 	} | ||||
| 
 | ||||
| 	if path.IsAbs(newBase.Path) { | ||||
| 		// whenever we end up with an absolute path, specify the scheme and host | ||||
| 		newBase.Scheme = v.Scheme | ||||
| 		newBase.Host = v.Host | ||||
| 	} | ||||
| 
 | ||||
| 	return MustCreateRef(newBase.String()), true | ||||
| } | ||||
| 
 | ||||
| // normalizeRef canonicalize a Ref, using a canonical relativeBase as its absolute anchor | ||||
| func normalizeRef(ref *Ref, relativeBase string) *Ref { | ||||
| 	r := MustCreateRef(normalizeURI(ref.String(), relativeBase)) | ||||
| 	return &r | ||||
| } | ||||
| 
 | ||||
| // normalizeBase performs a normalization of the input base path. | ||||
| // | ||||
| // This always yields a canonical URI (absolute), usable for the document cache. | ||||
| // | ||||
| // It ensures that all further internal work on basePath may safely assume | ||||
| // a non-empty, cross-platform, canonical URI (i.e. absolute). | ||||
| // | ||||
| // This normalization tolerates windows paths (e.g. C:\x\y\File.dat) and transform this | ||||
| // in a file:// URL with lower cased drive letter and path. | ||||
| // | ||||
| // See also: https://en.wikipedia.org/wiki/File_URI_scheme | ||||
| func normalizeBase(in string) string { | ||||
| 	u, err := parseURL(in) | ||||
| 	if err != nil { | ||||
| 		specLogger.Printf("warning: invalid URI in RelativeBase  %q: %v", in, err) | ||||
| 		u, in = repairURI(in) | ||||
| 	} | ||||
| 
 | ||||
| 	u.Fragment = "" // any fragment in the base is irrelevant | ||||
| 
 | ||||
| 	fixWindowsURI(u, in) // noop on non-windows OS | ||||
| 
 | ||||
| 	u.Path = path.Clean(u.Path) | ||||
| 	if u.Path == "." { // empty after Clean() | ||||
| 		u.Path = "" | ||||
| 	} | ||||
| 
 | ||||
| 	if u.Scheme != "" { | ||||
| 		if path.IsAbs(u.Path) || u.Scheme != fileScheme { | ||||
| 			// this is absolute or explicitly not a local file: we're good | ||||
| 			return u.String() | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	// no scheme or file scheme with relative path: assume file and make it absolute | ||||
| 	// enforce scheme file://... with absolute path. | ||||
| 	// | ||||
| 	// If the input path is relative, we anchor the path to the current working directory. | ||||
| 	// NOTE: we may end up with a host component. Leave it unchanged: e.g. file://host/folder/file.json | ||||
| 
 | ||||
| 	u.Scheme = fileScheme | ||||
| 	u.Path = absPath(u.Path) // platform-dependent | ||||
| 	u.RawQuery = ""          // any query component is irrelevant for a base | ||||
| 	return u.String() | ||||
| } | ||||
							
								
								
									
										44
									
								
								vendor/github.com/go-openapi/spec/normalizer_nonwindows.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								vendor/github.com/go-openapi/spec/normalizer_nonwindows.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,44 @@ | |||
| //go:build !windows | ||||
| // +build !windows | ||||
| 
 | ||||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"net/url" | ||||
| 	"path/filepath" | ||||
| ) | ||||
| 
 | ||||
| // absPath makes a file path absolute and compatible with a URI path component. | ||||
| // | ||||
| // The parameter must be a path, not an URI. | ||||
| func absPath(in string) string { | ||||
| 	anchored, err := filepath.Abs(in) | ||||
| 	if err != nil { | ||||
| 		specLogger.Printf("warning: could not resolve current working directory: %v", err) | ||||
| 		return in | ||||
| 	} | ||||
| 	return anchored | ||||
| } | ||||
| 
 | ||||
| func repairURI(in string) (*url.URL, string) { | ||||
| 	u, _ := parseURL("") | ||||
| 	debugLog("repaired URI: original: %q, repaired: %q", in, "") | ||||
| 	return u, "" | ||||
| } | ||||
| 
 | ||||
| func fixWindowsURI(u *url.URL, in string) { | ||||
| } | ||||
							
								
								
									
										154
									
								
								vendor/github.com/go-openapi/spec/normalizer_windows.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										154
									
								
								vendor/github.com/go-openapi/spec/normalizer_windows.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,154 @@ | |||
| // -build windows | ||||
| 
 | ||||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"net/url" | ||||
| 	"os" | ||||
| 	"path" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| ) | ||||
| 
 | ||||
| // absPath makes a file path absolute and compatible with a URI path component | ||||
| // | ||||
| // The parameter must be a path, not an URI. | ||||
| func absPath(in string) string { | ||||
| 	// NOTE(windows): filepath.Abs exhibits a special behavior on windows for empty paths. | ||||
| 	// See https://github.com/golang/go/issues/24441 | ||||
| 	if in == "" { | ||||
| 		in = "." | ||||
| 	} | ||||
| 
 | ||||
| 	anchored, err := filepath.Abs(in) | ||||
| 	if err != nil { | ||||
| 		specLogger.Printf("warning: could not resolve current working directory: %v", err) | ||||
| 		return in | ||||
| 	} | ||||
| 
 | ||||
| 	pth := strings.ReplaceAll(strings.ToLower(anchored), `\`, `/`) | ||||
| 	if !strings.HasPrefix(pth, "/") { | ||||
| 		pth = "/" + pth | ||||
| 	} | ||||
| 
 | ||||
| 	return path.Clean(pth) | ||||
| } | ||||
| 
 | ||||
| // repairURI tolerates invalid file URIs with common typos | ||||
| // such as 'file://E:\folder\file', that break the regular URL parser. | ||||
| // | ||||
| // Adopting the same defaults as for unixes (e.g. return an empty path) would | ||||
| // result into a counter-intuitive result for that case (e.g. E:\folder\file is | ||||
| // eventually resolved as the current directory). The repair will detect the missing "/". | ||||
| // | ||||
| // Note that this only works for the file scheme. | ||||
| func repairURI(in string) (*url.URL, string) { | ||||
| 	const prefix = fileScheme + "://" | ||||
| 	if !strings.HasPrefix(in, prefix) { | ||||
| 		// giving up: resolve to empty path | ||||
| 		u, _ := parseURL("") | ||||
| 
 | ||||
| 		return u, "" | ||||
| 	} | ||||
| 
 | ||||
| 	// attempt the repair, stripping the scheme should be sufficient | ||||
| 	u, _ := parseURL(strings.TrimPrefix(in, prefix)) | ||||
| 	debugLog("repaired URI: original: %q, repaired: %q", in, u.String()) | ||||
| 
 | ||||
| 	return u, u.String() | ||||
| } | ||||
| 
 | ||||
| // fixWindowsURI tolerates an absolute file path on windows such as C:\Base\File.yaml or \\host\share\Base\File.yaml | ||||
| // and makes it a canonical URI: file:///c:/base/file.yaml | ||||
| // | ||||
| // Catch 22 notes for Windows: | ||||
| // | ||||
| // * There may be a drive letter on windows (it is lower-cased) | ||||
| // * There may be a share UNC, e.g. \\server\folder\data.xml | ||||
| // * Paths are case insensitive | ||||
| // * Paths may already contain slashes | ||||
| // * Paths must be slashed | ||||
| // | ||||
| // NOTE: there is no escaping. "/" may be valid separators just like "\". | ||||
| // We don't use ToSlash() (which escapes everything) because windows now also | ||||
| // tolerates the use of "/". Hence, both C:\File.yaml and C:/File.yaml will work. | ||||
| func fixWindowsURI(u *url.URL, in string) { | ||||
| 	drive := filepath.VolumeName(in) | ||||
| 
 | ||||
| 	if len(drive) > 0 { | ||||
| 		if len(u.Scheme) == 1 && strings.EqualFold(u.Scheme, drive[:1]) { // a path with a drive letter | ||||
| 			u.Scheme = fileScheme | ||||
| 			u.Host = "" | ||||
| 			u.Path = strings.Join([]string{drive, u.Opaque, u.Path}, `/`) // reconstruct the full path component (no fragment, no query) | ||||
| 		} else if u.Host == "" && strings.HasPrefix(u.Path, drive) { // a path with a \\host volume | ||||
| 			// NOTE: the special host@port syntax for UNC is not supported (yet) | ||||
| 			u.Scheme = fileScheme | ||||
| 
 | ||||
| 			// this is a modified version of filepath.Dir() to apply on the VolumeName itself | ||||
| 			i := len(drive) - 1 | ||||
| 			for i >= 0 && !os.IsPathSeparator(drive[i]) { | ||||
| 				i-- | ||||
| 			} | ||||
| 			host := drive[:i] // \\host\share => host | ||||
| 
 | ||||
| 			u.Path = strings.TrimPrefix(u.Path, host) | ||||
| 			u.Host = strings.TrimPrefix(host, `\\`) | ||||
| 		} | ||||
| 
 | ||||
| 		u.Opaque = "" | ||||
| 		u.Path = strings.ReplaceAll(strings.ToLower(u.Path), `\`, `/`) | ||||
| 
 | ||||
| 		// ensure we form an absolute path | ||||
| 		if !strings.HasPrefix(u.Path, "/") { | ||||
| 			u.Path = "/" + u.Path | ||||
| 		} | ||||
| 
 | ||||
| 		u.Path = path.Clean(u.Path) | ||||
| 
 | ||||
| 		return | ||||
| 	} | ||||
| 
 | ||||
| 	if u.Scheme == fileScheme { | ||||
| 		// Handle dodgy cases for file://{...} URIs on windows. | ||||
| 		// A canonical URI should always be followed by an absolute path. | ||||
| 		// | ||||
| 		// Examples: | ||||
| 		//   * file:///folder/file => valid, unchanged | ||||
| 		//   * file:///c:\folder\file => slashed | ||||
| 		//   * file:///./folder/file => valid, cleaned to remove the dot | ||||
| 		//   * file:///.\folder\file => remapped to cwd | ||||
| 		//   * file:///. => dodgy, remapped to / (consistent with the behavior on unix) | ||||
| 		//   * file:///.. => dodgy, remapped to / (consistent with the behavior on unix) | ||||
| 		if (!path.IsAbs(u.Path) && !filepath.IsAbs(u.Path)) || (strings.HasPrefix(u.Path, `/.`) && strings.Contains(u.Path, `\`)) { | ||||
| 			// ensure we form an absolute path | ||||
| 			u.Path, _ = filepath.Abs(strings.TrimLeft(u.Path, `/`)) | ||||
| 			if !strings.HasPrefix(u.Path, "/") { | ||||
| 				u.Path = "/" + u.Path | ||||
| 			} | ||||
| 		} | ||||
| 		u.Path = strings.ToLower(u.Path) | ||||
| 	} | ||||
| 
 | ||||
| 	// NOTE: lower case normalization does not propagate to inner resources, | ||||
| 	// generated when rebasing: when joining a relative URI with a file to an absolute base, | ||||
| 	// only the base is currently lower-cased. | ||||
| 	// | ||||
| 	// For now, we assume this is good enough for most use cases | ||||
| 	// and try not to generate too many differences | ||||
| 	// between the output produced on different platforms. | ||||
| 	u.Path = path.Clean(strings.ReplaceAll(u.Path, `\`, `/`)) | ||||
| } | ||||
							
								
								
									
										397
									
								
								vendor/github.com/go-openapi/spec/operation.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										397
									
								
								vendor/github.com/go-openapi/spec/operation.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,397 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/gob" | ||||
| 	"encoding/json" | ||||
| 	"sort" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| func init() { | ||||
| 	gob.Register(map[string]interface{}{}) | ||||
| 	gob.Register([]interface{}{}) | ||||
| } | ||||
| 
 | ||||
| // OperationProps describes an operation | ||||
| // | ||||
| // NOTES: | ||||
| // - schemes, when present must be from [http, https, ws, wss]: see validate | ||||
| // - Security is handled as a special case: see MarshalJSON function | ||||
| type OperationProps struct { | ||||
| 	Description  string                 `json:"description,omitempty"` | ||||
| 	Consumes     []string               `json:"consumes,omitempty"` | ||||
| 	Produces     []string               `json:"produces,omitempty"` | ||||
| 	Schemes      []string               `json:"schemes,omitempty"` | ||||
| 	Tags         []string               `json:"tags,omitempty"` | ||||
| 	Summary      string                 `json:"summary,omitempty"` | ||||
| 	ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` | ||||
| 	ID           string                 `json:"operationId,omitempty"` | ||||
| 	Deprecated   bool                   `json:"deprecated,omitempty"` | ||||
| 	Security     []map[string][]string  `json:"security,omitempty"` | ||||
| 	Parameters   []Parameter            `json:"parameters,omitempty"` | ||||
| 	Responses    *Responses             `json:"responses,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON takes care of serializing operation properties to JSON | ||||
| // | ||||
| // We use a custom marhaller here to handle a special cases related to | ||||
| // the Security field. We need to preserve zero length slice | ||||
| // while omitting the field when the value is nil/unset. | ||||
| func (op OperationProps) MarshalJSON() ([]byte, error) { | ||||
| 	type Alias OperationProps | ||||
| 	if op.Security == nil { | ||||
| 		return json.Marshal(&struct { | ||||
| 			Security []map[string][]string `json:"security,omitempty"` | ||||
| 			*Alias | ||||
| 		}{ | ||||
| 			Security: op.Security, | ||||
| 			Alias:    (*Alias)(&op), | ||||
| 		}) | ||||
| 	} | ||||
| 	return json.Marshal(&struct { | ||||
| 		Security []map[string][]string `json:"security"` | ||||
| 		*Alias | ||||
| 	}{ | ||||
| 		Security: op.Security, | ||||
| 		Alias:    (*Alias)(&op), | ||||
| 	}) | ||||
| } | ||||
| 
 | ||||
| // Operation describes a single API operation on a path. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#operationObject | ||||
| type Operation struct { | ||||
| 	VendorExtensible | ||||
| 	OperationProps | ||||
| } | ||||
| 
 | ||||
| // SuccessResponse gets a success response model | ||||
| func (o *Operation) SuccessResponse() (*Response, int, bool) { | ||||
| 	if o.Responses == nil { | ||||
| 		return nil, 0, false | ||||
| 	} | ||||
| 
 | ||||
| 	responseCodes := make([]int, 0, len(o.Responses.StatusCodeResponses)) | ||||
| 	for k := range o.Responses.StatusCodeResponses { | ||||
| 		if k >= 200 && k < 300 { | ||||
| 			responseCodes = append(responseCodes, k) | ||||
| 		} | ||||
| 	} | ||||
| 	if len(responseCodes) > 0 { | ||||
| 		sort.Ints(responseCodes) | ||||
| 		v := o.Responses.StatusCodeResponses[responseCodes[0]] | ||||
| 		return &v, responseCodes[0], true | ||||
| 	} | ||||
| 
 | ||||
| 	return o.Responses.Default, 0, false | ||||
| } | ||||
| 
 | ||||
| // JSONLookup look up a value by the json property name | ||||
| func (o Operation) JSONLookup(token string) (interface{}, error) { | ||||
| 	if ex, ok := o.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 	r, _, err := jsonpointer.GetForToken(o.OperationProps, token) | ||||
| 	return r, err | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON hydrates this items instance with the data from JSON | ||||
| func (o *Operation) UnmarshalJSON(data []byte) error { | ||||
| 	if err := json.Unmarshal(data, &o.OperationProps); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(data, &o.VendorExtensible) | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON converts this items object to JSON | ||||
| func (o Operation) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(o.OperationProps) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b2, err := json.Marshal(o.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	concated := swag.ConcatJSON(b1, b2) | ||||
| 	return concated, nil | ||||
| } | ||||
| 
 | ||||
| // NewOperation creates a new operation instance. | ||||
| // It expects an ID as parameter but not passing an ID is also valid. | ||||
| func NewOperation(id string) *Operation { | ||||
| 	op := new(Operation) | ||||
| 	op.ID = id | ||||
| 	return op | ||||
| } | ||||
| 
 | ||||
| // WithID sets the ID property on this operation, allows for chaining. | ||||
| func (o *Operation) WithID(id string) *Operation { | ||||
| 	o.ID = id | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // WithDescription sets the description on this operation, allows for chaining | ||||
| func (o *Operation) WithDescription(description string) *Operation { | ||||
| 	o.Description = description | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // WithSummary sets the summary on this operation, allows for chaining | ||||
| func (o *Operation) WithSummary(summary string) *Operation { | ||||
| 	o.Summary = summary | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // WithExternalDocs sets/removes the external docs for/from this operation. | ||||
| // When you pass empty strings as params the external documents will be removed. | ||||
| // When you pass non-empty string as one value then those values will be used on the external docs object. | ||||
| // So when you pass a non-empty description, you should also pass the url and vice versa. | ||||
| func (o *Operation) WithExternalDocs(description, url string) *Operation { | ||||
| 	if description == "" && url == "" { | ||||
| 		o.ExternalDocs = nil | ||||
| 		return o | ||||
| 	} | ||||
| 
 | ||||
| 	if o.ExternalDocs == nil { | ||||
| 		o.ExternalDocs = &ExternalDocumentation{} | ||||
| 	} | ||||
| 	o.ExternalDocs.Description = description | ||||
| 	o.ExternalDocs.URL = url | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // Deprecate marks the operation as deprecated | ||||
| func (o *Operation) Deprecate() *Operation { | ||||
| 	o.Deprecated = true | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // Undeprecate marks the operation as not deprected | ||||
| func (o *Operation) Undeprecate() *Operation { | ||||
| 	o.Deprecated = false | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // WithConsumes adds media types for incoming body values | ||||
| func (o *Operation) WithConsumes(mediaTypes ...string) *Operation { | ||||
| 	o.Consumes = append(o.Consumes, mediaTypes...) | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // WithProduces adds media types for outgoing body values | ||||
| func (o *Operation) WithProduces(mediaTypes ...string) *Operation { | ||||
| 	o.Produces = append(o.Produces, mediaTypes...) | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // WithTags adds tags for this operation | ||||
| func (o *Operation) WithTags(tags ...string) *Operation { | ||||
| 	o.Tags = append(o.Tags, tags...) | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // AddParam adds a parameter to this operation, when a parameter for that location | ||||
| // and with that name already exists it will be replaced | ||||
| func (o *Operation) AddParam(param *Parameter) *Operation { | ||||
| 	if param == nil { | ||||
| 		return o | ||||
| 	} | ||||
| 
 | ||||
| 	for i, p := range o.Parameters { | ||||
| 		if p.Name == param.Name && p.In == param.In { | ||||
| 			params := append(o.Parameters[:i], *param) | ||||
| 			params = append(params, o.Parameters[i+1:]...) | ||||
| 			o.Parameters = params | ||||
| 			return o | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	o.Parameters = append(o.Parameters, *param) | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // RemoveParam removes a parameter from the operation | ||||
| func (o *Operation) RemoveParam(name, in string) *Operation { | ||||
| 	for i, p := range o.Parameters { | ||||
| 		if p.Name == name && p.In == in { | ||||
| 			o.Parameters = append(o.Parameters[:i], o.Parameters[i+1:]...) | ||||
| 			return o | ||||
| 		} | ||||
| 	} | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // SecuredWith adds a security scope to this operation. | ||||
| func (o *Operation) SecuredWith(name string, scopes ...string) *Operation { | ||||
| 	o.Security = append(o.Security, map[string][]string{name: scopes}) | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| // WithDefaultResponse adds a default response to the operation. | ||||
| // Passing a nil value will remove the response | ||||
| func (o *Operation) WithDefaultResponse(response *Response) *Operation { | ||||
| 	return o.RespondsWith(0, response) | ||||
| } | ||||
| 
 | ||||
| // RespondsWith adds a status code response to the operation. | ||||
| // When the code is 0 the value of the response will be used as default response value. | ||||
| // When the value of the response is nil it will be removed from the operation | ||||
| func (o *Operation) RespondsWith(code int, response *Response) *Operation { | ||||
| 	if o.Responses == nil { | ||||
| 		o.Responses = new(Responses) | ||||
| 	} | ||||
| 	if code == 0 { | ||||
| 		o.Responses.Default = response | ||||
| 		return o | ||||
| 	} | ||||
| 	if response == nil { | ||||
| 		delete(o.Responses.StatusCodeResponses, code) | ||||
| 		return o | ||||
| 	} | ||||
| 	if o.Responses.StatusCodeResponses == nil { | ||||
| 		o.Responses.StatusCodeResponses = make(map[int]Response) | ||||
| 	} | ||||
| 	o.Responses.StatusCodeResponses[code] = *response | ||||
| 	return o | ||||
| } | ||||
| 
 | ||||
| type opsAlias OperationProps | ||||
| 
 | ||||
| type gobAlias struct { | ||||
| 	Security []map[string]struct { | ||||
| 		List []string | ||||
| 		Pad  bool | ||||
| 	} | ||||
| 	Alias           *opsAlias | ||||
| 	SecurityIsEmpty bool | ||||
| } | ||||
| 
 | ||||
| // GobEncode provides a safe gob encoder for Operation, including empty security requirements | ||||
| func (o Operation) GobEncode() ([]byte, error) { | ||||
| 	raw := struct { | ||||
| 		Ext   VendorExtensible | ||||
| 		Props OperationProps | ||||
| 	}{ | ||||
| 		Ext:   o.VendorExtensible, | ||||
| 		Props: o.OperationProps, | ||||
| 	} | ||||
| 	var b bytes.Buffer | ||||
| 	err := gob.NewEncoder(&b).Encode(raw) | ||||
| 	return b.Bytes(), err | ||||
| } | ||||
| 
 | ||||
| // GobDecode provides a safe gob decoder for Operation, including empty security requirements | ||||
| func (o *Operation) GobDecode(b []byte) error { | ||||
| 	var raw struct { | ||||
| 		Ext   VendorExtensible | ||||
| 		Props OperationProps | ||||
| 	} | ||||
| 
 | ||||
| 	buf := bytes.NewBuffer(b) | ||||
| 	err := gob.NewDecoder(buf).Decode(&raw) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	o.VendorExtensible = raw.Ext | ||||
| 	o.OperationProps = raw.Props | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // GobEncode provides a safe gob encoder for Operation, including empty security requirements | ||||
| func (op OperationProps) GobEncode() ([]byte, error) { | ||||
| 	raw := gobAlias{ | ||||
| 		Alias: (*opsAlias)(&op), | ||||
| 	} | ||||
| 
 | ||||
| 	var b bytes.Buffer | ||||
| 	if op.Security == nil { | ||||
| 		// nil security requirement | ||||
| 		err := gob.NewEncoder(&b).Encode(raw) | ||||
| 		return b.Bytes(), err | ||||
| 	} | ||||
| 
 | ||||
| 	if len(op.Security) == 0 { | ||||
| 		// empty, but non-nil security requirement | ||||
| 		raw.SecurityIsEmpty = true | ||||
| 		raw.Alias.Security = nil | ||||
| 		err := gob.NewEncoder(&b).Encode(raw) | ||||
| 		return b.Bytes(), err | ||||
| 	} | ||||
| 
 | ||||
| 	raw.Security = make([]map[string]struct { | ||||
| 		List []string | ||||
| 		Pad  bool | ||||
| 	}, 0, len(op.Security)) | ||||
| 	for _, req := range op.Security { | ||||
| 		v := make(map[string]struct { | ||||
| 			List []string | ||||
| 			Pad  bool | ||||
| 		}, len(req)) | ||||
| 		for k, val := range req { | ||||
| 			v[k] = struct { | ||||
| 				List []string | ||||
| 				Pad  bool | ||||
| 			}{ | ||||
| 				List: val, | ||||
| 			} | ||||
| 		} | ||||
| 		raw.Security = append(raw.Security, v) | ||||
| 	} | ||||
| 
 | ||||
| 	err := gob.NewEncoder(&b).Encode(raw) | ||||
| 	return b.Bytes(), err | ||||
| } | ||||
| 
 | ||||
| // GobDecode provides a safe gob decoder for Operation, including empty security requirements | ||||
| func (op *OperationProps) GobDecode(b []byte) error { | ||||
| 	var raw gobAlias | ||||
| 
 | ||||
| 	buf := bytes.NewBuffer(b) | ||||
| 	err := gob.NewDecoder(buf).Decode(&raw) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if raw.Alias == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	switch { | ||||
| 	case raw.SecurityIsEmpty: | ||||
| 		// empty, but non-nil security requirement | ||||
| 		raw.Alias.Security = []map[string][]string{} | ||||
| 	case len(raw.Alias.Security) == 0: | ||||
| 		// nil security requirement | ||||
| 		raw.Alias.Security = nil | ||||
| 	default: | ||||
| 		raw.Alias.Security = make([]map[string][]string, 0, len(raw.Security)) | ||||
| 		for _, req := range raw.Security { | ||||
| 			v := make(map[string][]string, len(req)) | ||||
| 			for k, val := range req { | ||||
| 				v[k] = make([]string, 0, len(val.List)) | ||||
| 				v[k] = append(v[k], val.List...) | ||||
| 			} | ||||
| 			raw.Alias.Security = append(raw.Alias.Security, v) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	*op = *(*OperationProps)(raw.Alias) | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										326
									
								
								vendor/github.com/go-openapi/spec/parameter.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										326
									
								
								vendor/github.com/go-openapi/spec/parameter.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,326 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // QueryParam creates a query parameter | ||||
| func QueryParam(name string) *Parameter { | ||||
| 	return &Parameter{ParamProps: ParamProps{Name: name, In: "query"}} | ||||
| } | ||||
| 
 | ||||
| // HeaderParam creates a header parameter, this is always required by default | ||||
| func HeaderParam(name string) *Parameter { | ||||
| 	return &Parameter{ParamProps: ParamProps{Name: name, In: "header", Required: true}} | ||||
| } | ||||
| 
 | ||||
| // PathParam creates a path parameter, this is always required | ||||
| func PathParam(name string) *Parameter { | ||||
| 	return &Parameter{ParamProps: ParamProps{Name: name, In: "path", Required: true}} | ||||
| } | ||||
| 
 | ||||
| // BodyParam creates a body parameter | ||||
| func BodyParam(name string, schema *Schema) *Parameter { | ||||
| 	return &Parameter{ParamProps: ParamProps{Name: name, In: "body", Schema: schema}} | ||||
| } | ||||
| 
 | ||||
| // FormDataParam creates a body parameter | ||||
| func FormDataParam(name string) *Parameter { | ||||
| 	return &Parameter{ParamProps: ParamProps{Name: name, In: "formData"}} | ||||
| } | ||||
| 
 | ||||
| // FileParam creates a body parameter | ||||
| func FileParam(name string) *Parameter { | ||||
| 	return &Parameter{ParamProps: ParamProps{Name: name, In: "formData"}, | ||||
| 		SimpleSchema: SimpleSchema{Type: "file"}} | ||||
| } | ||||
| 
 | ||||
| // SimpleArrayParam creates a param for a simple array (string, int, date etc) | ||||
| func SimpleArrayParam(name, tpe, fmt string) *Parameter { | ||||
| 	return &Parameter{ParamProps: ParamProps{Name: name}, | ||||
| 		SimpleSchema: SimpleSchema{Type: jsonArray, CollectionFormat: "csv", | ||||
| 			Items: &Items{SimpleSchema: SimpleSchema{Type: tpe, Format: fmt}}}} | ||||
| } | ||||
| 
 | ||||
| // ParamRef creates a parameter that's a json reference | ||||
| func ParamRef(uri string) *Parameter { | ||||
| 	p := new(Parameter) | ||||
| 	p.Ref = MustCreateRef(uri) | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // ParamProps describes the specific attributes of an operation parameter | ||||
| // | ||||
| // NOTE: | ||||
| // - Schema is defined when "in" == "body": see validate | ||||
| // - AllowEmptyValue is allowed where "in" == "query" || "formData" | ||||
| type ParamProps struct { | ||||
| 	Description     string  `json:"description,omitempty"` | ||||
| 	Name            string  `json:"name,omitempty"` | ||||
| 	In              string  `json:"in,omitempty"` | ||||
| 	Required        bool    `json:"required,omitempty"` | ||||
| 	Schema          *Schema `json:"schema,omitempty"` | ||||
| 	AllowEmptyValue bool    `json:"allowEmptyValue,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // Parameter a unique parameter is defined by a combination of a [name](#parameterName) and [location](#parameterIn). | ||||
| // | ||||
| // There are five possible parameter types. | ||||
| // * Path - Used together with [Path Templating](#pathTemplating), where the parameter value is actually part | ||||
| //   of the operation's URL. This does not include the host or base path of the API. For example, in `/items/{itemId}`, | ||||
| //   the path parameter is `itemId`. | ||||
| // * Query - Parameters that are appended to the URL. For example, in `/items?id=###`, the query parameter is `id`. | ||||
| // * Header - Custom headers that are expected as part of the request. | ||||
| // * Body - The payload that's appended to the HTTP request. Since there can only be one payload, there can only be | ||||
| //   _one_ body parameter. The name of the body parameter has no effect on the parameter itself and is used for | ||||
| //   documentation purposes only. Since Form parameters are also in the payload, body and form parameters cannot exist | ||||
| //   together for the same operation. | ||||
| // * Form - Used to describe the payload of an HTTP request when either `application/x-www-form-urlencoded` or | ||||
| //   `multipart/form-data` are used as the content type of the request (in Swagger's definition, | ||||
| //   the [`consumes`](#operationConsumes) property of an operation). This is the only parameter type that can be used | ||||
| //   to send files, thus supporting the `file` type. Since form parameters are sent in the payload, they cannot be | ||||
| //   declared together with a body parameter for the same operation. Form parameters have a different format based on | ||||
| //   the content-type used (for further details, consult http://www.w3.org/TR/html401/interact/forms.html#h-17.13.4). | ||||
| //   * `application/x-www-form-urlencoded` - Similar to the format of Query parameters but as a payload. | ||||
| //   For example, `foo=1&bar=swagger` - both `foo` and `bar` are form parameters. This is normally used for simple | ||||
| //   parameters that are being transferred. | ||||
| //   * `multipart/form-data` - each parameter takes a section in the payload with an internal header. | ||||
| //   For example, for the header `Content-Disposition: form-data; name="submit-name"` the name of the parameter is | ||||
| //   `submit-name`. This type of form parameters is more commonly used for file transfers. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#parameterObject | ||||
| type Parameter struct { | ||||
| 	Refable | ||||
| 	CommonValidations | ||||
| 	SimpleSchema | ||||
| 	VendorExtensible | ||||
| 	ParamProps | ||||
| } | ||||
| 
 | ||||
| // JSONLookup look up a value by the json property name | ||||
| func (p Parameter) JSONLookup(token string) (interface{}, error) { | ||||
| 	if ex, ok := p.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 	if token == jsonRef { | ||||
| 		return &p.Ref, nil | ||||
| 	} | ||||
| 
 | ||||
| 	r, _, err := jsonpointer.GetForToken(p.CommonValidations, token) | ||||
| 	if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if r != nil { | ||||
| 		return r, nil | ||||
| 	} | ||||
| 	r, _, err = jsonpointer.GetForToken(p.SimpleSchema, token) | ||||
| 	if err != nil && !strings.HasPrefix(err.Error(), "object has no field") { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	if r != nil { | ||||
| 		return r, nil | ||||
| 	} | ||||
| 	r, _, err = jsonpointer.GetForToken(p.ParamProps, token) | ||||
| 	return r, err | ||||
| } | ||||
| 
 | ||||
| // WithDescription a fluent builder method for the description of the parameter | ||||
| func (p *Parameter) WithDescription(description string) *Parameter { | ||||
| 	p.Description = description | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // Named a fluent builder method to override the name of the parameter | ||||
| func (p *Parameter) Named(name string) *Parameter { | ||||
| 	p.Name = name | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithLocation a fluent builder method to override the location of the parameter | ||||
| func (p *Parameter) WithLocation(in string) *Parameter { | ||||
| 	p.In = in | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // Typed a fluent builder method for the type of the parameter value | ||||
| func (p *Parameter) Typed(tpe, format string) *Parameter { | ||||
| 	p.Type = tpe | ||||
| 	p.Format = format | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // CollectionOf a fluent builder method for an array parameter | ||||
| func (p *Parameter) CollectionOf(items *Items, format string) *Parameter { | ||||
| 	p.Type = jsonArray | ||||
| 	p.Items = items | ||||
| 	p.CollectionFormat = format | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithDefault sets the default value on this parameter | ||||
| func (p *Parameter) WithDefault(defaultValue interface{}) *Parameter { | ||||
| 	p.AsOptional() // with default implies optional | ||||
| 	p.Default = defaultValue | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // AllowsEmptyValues flags this parameter as being ok with empty values | ||||
| func (p *Parameter) AllowsEmptyValues() *Parameter { | ||||
| 	p.AllowEmptyValue = true | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // NoEmptyValues flags this parameter as not liking empty values | ||||
| func (p *Parameter) NoEmptyValues() *Parameter { | ||||
| 	p.AllowEmptyValue = false | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // AsOptional flags this parameter as optional | ||||
| func (p *Parameter) AsOptional() *Parameter { | ||||
| 	p.Required = false | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // AsRequired flags this parameter as required | ||||
| func (p *Parameter) AsRequired() *Parameter { | ||||
| 	if p.Default != nil { // with a default required makes no sense | ||||
| 		return p | ||||
| 	} | ||||
| 	p.Required = true | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithMaxLength sets a max length value | ||||
| func (p *Parameter) WithMaxLength(max int64) *Parameter { | ||||
| 	p.MaxLength = &max | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithMinLength sets a min length value | ||||
| func (p *Parameter) WithMinLength(min int64) *Parameter { | ||||
| 	p.MinLength = &min | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithPattern sets a pattern value | ||||
| func (p *Parameter) WithPattern(pattern string) *Parameter { | ||||
| 	p.Pattern = pattern | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithMultipleOf sets a multiple of value | ||||
| func (p *Parameter) WithMultipleOf(number float64) *Parameter { | ||||
| 	p.MultipleOf = &number | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithMaximum sets a maximum number value | ||||
| func (p *Parameter) WithMaximum(max float64, exclusive bool) *Parameter { | ||||
| 	p.Maximum = &max | ||||
| 	p.ExclusiveMaximum = exclusive | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithMinimum sets a minimum number value | ||||
| func (p *Parameter) WithMinimum(min float64, exclusive bool) *Parameter { | ||||
| 	p.Minimum = &min | ||||
| 	p.ExclusiveMinimum = exclusive | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithEnum sets a the enum values (replace) | ||||
| func (p *Parameter) WithEnum(values ...interface{}) *Parameter { | ||||
| 	p.Enum = append([]interface{}{}, values...) | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithMaxItems sets the max items | ||||
| func (p *Parameter) WithMaxItems(size int64) *Parameter { | ||||
| 	p.MaxItems = &size | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithMinItems sets the min items | ||||
| func (p *Parameter) WithMinItems(size int64) *Parameter { | ||||
| 	p.MinItems = &size | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // UniqueValues dictates that this array can only have unique items | ||||
| func (p *Parameter) UniqueValues() *Parameter { | ||||
| 	p.UniqueItems = true | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // AllowDuplicates this array can have duplicates | ||||
| func (p *Parameter) AllowDuplicates() *Parameter { | ||||
| 	p.UniqueItems = false | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // WithValidations is a fluent method to set parameter validations | ||||
| func (p *Parameter) WithValidations(val CommonValidations) *Parameter { | ||||
| 	p.SetValidations(SchemaValidations{CommonValidations: val}) | ||||
| 	return p | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON hydrates this items instance with the data from JSON | ||||
| func (p *Parameter) UnmarshalJSON(data []byte) error { | ||||
| 	if err := json.Unmarshal(data, &p.CommonValidations); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := json.Unmarshal(data, &p.Refable); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := json.Unmarshal(data, &p.SimpleSchema); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := json.Unmarshal(data, &p.VendorExtensible); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(data, &p.ParamProps) | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON converts this items object to JSON | ||||
| func (p Parameter) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(p.CommonValidations) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b2, err := json.Marshal(p.SimpleSchema) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b3, err := json.Marshal(p.Refable) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b4, err := json.Marshal(p.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b5, err := json.Marshal(p.ParamProps) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return swag.ConcatJSON(b3, b1, b2, b4, b5), nil | ||||
| } | ||||
							
								
								
									
										87
									
								
								vendor/github.com/go-openapi/spec/path_item.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										87
									
								
								vendor/github.com/go-openapi/spec/path_item.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,87 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // PathItemProps the path item specific properties | ||||
| type PathItemProps struct { | ||||
| 	Get        *Operation  `json:"get,omitempty"` | ||||
| 	Put        *Operation  `json:"put,omitempty"` | ||||
| 	Post       *Operation  `json:"post,omitempty"` | ||||
| 	Delete     *Operation  `json:"delete,omitempty"` | ||||
| 	Options    *Operation  `json:"options,omitempty"` | ||||
| 	Head       *Operation  `json:"head,omitempty"` | ||||
| 	Patch      *Operation  `json:"patch,omitempty"` | ||||
| 	Parameters []Parameter `json:"parameters,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // PathItem describes the operations available on a single path. | ||||
| // A Path Item may be empty, due to [ACL constraints](http://goo.gl/8us55a#securityFiltering). | ||||
| // The path itself is still exposed to the documentation viewer but they will | ||||
| // not know which operations and parameters are available. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#pathItemObject | ||||
| type PathItem struct { | ||||
| 	Refable | ||||
| 	VendorExtensible | ||||
| 	PathItemProps | ||||
| } | ||||
| 
 | ||||
| // JSONLookup look up a value by the json property name | ||||
| func (p PathItem) JSONLookup(token string) (interface{}, error) { | ||||
| 	if ex, ok := p.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 	if token == jsonRef { | ||||
| 		return &p.Ref, nil | ||||
| 	} | ||||
| 	r, _, err := jsonpointer.GetForToken(p.PathItemProps, token) | ||||
| 	return r, err | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON hydrates this items instance with the data from JSON | ||||
| func (p *PathItem) UnmarshalJSON(data []byte) error { | ||||
| 	if err := json.Unmarshal(data, &p.Refable); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := json.Unmarshal(data, &p.VendorExtensible); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(data, &p.PathItemProps) | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON converts this items object to JSON | ||||
| func (p PathItem) MarshalJSON() ([]byte, error) { | ||||
| 	b3, err := json.Marshal(p.Refable) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b4, err := json.Marshal(p.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b5, err := json.Marshal(p.PathItemProps) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	concated := swag.ConcatJSON(b3, b4, b5) | ||||
| 	return concated, nil | ||||
| } | ||||
							
								
								
									
										97
									
								
								vendor/github.com/go-openapi/spec/paths.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										97
									
								
								vendor/github.com/go-openapi/spec/paths.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,97 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // Paths holds the relative paths to the individual endpoints. | ||||
| // The path is appended to the [`basePath`](http://goo.gl/8us55a#swaggerBasePath) in order | ||||
| // to construct the full URL. | ||||
| // The Paths may be empty, due to [ACL constraints](http://goo.gl/8us55a#securityFiltering). | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#pathsObject | ||||
| type Paths struct { | ||||
| 	VendorExtensible | ||||
| 	Paths map[string]PathItem `json:"-"` // custom serializer to flatten this, each entry must start with "/" | ||||
| } | ||||
| 
 | ||||
| // JSONLookup look up a value by the json property name | ||||
| func (p Paths) JSONLookup(token string) (interface{}, error) { | ||||
| 	if pi, ok := p.Paths[token]; ok { | ||||
| 		return &pi, nil | ||||
| 	} | ||||
| 	if ex, ok := p.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 	return nil, fmt.Errorf("object has no field %q", token) | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON hydrates this items instance with the data from JSON | ||||
| func (p *Paths) UnmarshalJSON(data []byte) error { | ||||
| 	var res map[string]json.RawMessage | ||||
| 	if err := json.Unmarshal(data, &res); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	for k, v := range res { | ||||
| 		if strings.HasPrefix(strings.ToLower(k), "x-") { | ||||
| 			if p.Extensions == nil { | ||||
| 				p.Extensions = make(map[string]interface{}) | ||||
| 			} | ||||
| 			var d interface{} | ||||
| 			if err := json.Unmarshal(v, &d); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			p.Extensions[k] = d | ||||
| 		} | ||||
| 		if strings.HasPrefix(k, "/") { | ||||
| 			if p.Paths == nil { | ||||
| 				p.Paths = make(map[string]PathItem) | ||||
| 			} | ||||
| 			var pi PathItem | ||||
| 			if err := json.Unmarshal(v, &pi); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			p.Paths[k] = pi | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON converts this items object to JSON | ||||
| func (p Paths) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(p.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	pths := make(map[string]PathItem) | ||||
| 	for k, v := range p.Paths { | ||||
| 		if strings.HasPrefix(k, "/") { | ||||
| 			pths[k] = v | ||||
| 		} | ||||
| 	} | ||||
| 	b2, err := json.Marshal(pths) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	concated := swag.ConcatJSON(b1, b2) | ||||
| 	return concated, nil | ||||
| } | ||||
							
								
								
									
										91
									
								
								vendor/github.com/go-openapi/spec/properties.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								vendor/github.com/go-openapi/spec/properties.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,91 @@ | |||
| package spec | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/json" | ||||
| 	"reflect" | ||||
| 	"sort" | ||||
| ) | ||||
| 
 | ||||
| // OrderSchemaItem holds a named schema (e.g. from a property of an object) | ||||
| type OrderSchemaItem struct { | ||||
| 	Name string | ||||
| 	Schema | ||||
| } | ||||
| 
 | ||||
| // OrderSchemaItems is a sortable slice of named schemas. | ||||
| // The ordering is defined by the x-order schema extension. | ||||
| type OrderSchemaItems []OrderSchemaItem | ||||
| 
 | ||||
| // MarshalJSON produces a json object with keys defined by the name schemas | ||||
| // of the OrderSchemaItems slice, keeping the original order of the slice. | ||||
| func (items OrderSchemaItems) MarshalJSON() ([]byte, error) { | ||||
| 	buf := bytes.NewBuffer(nil) | ||||
| 	buf.WriteString("{") | ||||
| 	for i := range items { | ||||
| 		if i > 0 { | ||||
| 			buf.WriteString(",") | ||||
| 		} | ||||
| 		buf.WriteString("\"") | ||||
| 		buf.WriteString(items[i].Name) | ||||
| 		buf.WriteString("\":") | ||||
| 		bs, err := json.Marshal(&items[i].Schema) | ||||
| 		if err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		buf.Write(bs) | ||||
| 	} | ||||
| 	buf.WriteString("}") | ||||
| 	return buf.Bytes(), nil | ||||
| } | ||||
| 
 | ||||
| func (items OrderSchemaItems) Len() int      { return len(items) } | ||||
| func (items OrderSchemaItems) Swap(i, j int) { items[i], items[j] = items[j], items[i] } | ||||
| func (items OrderSchemaItems) Less(i, j int) (ret bool) { | ||||
| 	ii, oki := items[i].Extensions.GetInt("x-order") | ||||
| 	ij, okj := items[j].Extensions.GetInt("x-order") | ||||
| 	if oki { | ||||
| 		if okj { | ||||
| 			defer func() { | ||||
| 				if err := recover(); err != nil { | ||||
| 					defer func() { | ||||
| 						if err = recover(); err != nil { | ||||
| 							ret = items[i].Name < items[j].Name | ||||
| 						} | ||||
| 					}() | ||||
| 					ret = reflect.ValueOf(ii).String() < reflect.ValueOf(ij).String() | ||||
| 				} | ||||
| 			}() | ||||
| 			return ii < ij | ||||
| 		} | ||||
| 		return true | ||||
| 	} else if okj { | ||||
| 		return false | ||||
| 	} | ||||
| 	return items[i].Name < items[j].Name | ||||
| } | ||||
| 
 | ||||
| // SchemaProperties is a map representing the properties of a Schema object. | ||||
| // It knows how to transform its keys into an ordered slice. | ||||
| type SchemaProperties map[string]Schema | ||||
| 
 | ||||
| // ToOrderedSchemaItems transforms the map of properties into a sortable slice | ||||
| func (properties SchemaProperties) ToOrderedSchemaItems() OrderSchemaItems { | ||||
| 	items := make(OrderSchemaItems, 0, len(properties)) | ||||
| 	for k, v := range properties { | ||||
| 		items = append(items, OrderSchemaItem{ | ||||
| 			Name:   k, | ||||
| 			Schema: v, | ||||
| 		}) | ||||
| 	} | ||||
| 	sort.Sort(items) | ||||
| 	return items | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON produces properties as json, keeping their order. | ||||
| func (properties SchemaProperties) MarshalJSON() ([]byte, error) { | ||||
| 	if properties == nil { | ||||
| 		return []byte("null"), nil | ||||
| 	} | ||||
| 	return json.Marshal(properties.ToOrderedSchemaItems()) | ||||
| } | ||||
							
								
								
									
										193
									
								
								vendor/github.com/go-openapi/spec/ref.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								vendor/github.com/go-openapi/spec/ref.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,193 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/gob" | ||||
| 	"encoding/json" | ||||
| 	"net/http" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonreference" | ||||
| ) | ||||
| 
 | ||||
| // Refable is a struct for things that accept a $ref property | ||||
| type Refable struct { | ||||
| 	Ref Ref | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON marshals the ref to json | ||||
| func (r Refable) MarshalJSON() ([]byte, error) { | ||||
| 	return r.Ref.MarshalJSON() | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON unmarshalss the ref from json | ||||
| func (r *Refable) UnmarshalJSON(d []byte) error { | ||||
| 	return json.Unmarshal(d, &r.Ref) | ||||
| } | ||||
| 
 | ||||
| // Ref represents a json reference that is potentially resolved | ||||
| type Ref struct { | ||||
| 	jsonreference.Ref | ||||
| } | ||||
| 
 | ||||
| // RemoteURI gets the remote uri part of the ref | ||||
| func (r *Ref) RemoteURI() string { | ||||
| 	if r.String() == "" { | ||||
| 		return "" | ||||
| 	} | ||||
| 
 | ||||
| 	u := *r.GetURL() | ||||
| 	u.Fragment = "" | ||||
| 	return u.String() | ||||
| } | ||||
| 
 | ||||
| // IsValidURI returns true when the url the ref points to can be found | ||||
| func (r *Ref) IsValidURI(basepaths ...string) bool { | ||||
| 	if r.String() == "" { | ||||
| 		return true | ||||
| 	} | ||||
| 
 | ||||
| 	v := r.RemoteURI() | ||||
| 	if v == "" { | ||||
| 		return true | ||||
| 	} | ||||
| 
 | ||||
| 	if r.HasFullURL { | ||||
| 		//nolint:noctx,gosec | ||||
| 		rr, err := http.Get(v) | ||||
| 		if err != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 		defer rr.Body.Close() | ||||
| 
 | ||||
| 		return rr.StatusCode/100 == 2 | ||||
| 	} | ||||
| 
 | ||||
| 	if !(r.HasFileScheme || r.HasFullFilePath || r.HasURLPathOnly) { | ||||
| 		return false | ||||
| 	} | ||||
| 
 | ||||
| 	// check for local file | ||||
| 	pth := v | ||||
| 	if r.HasURLPathOnly { | ||||
| 		base := "." | ||||
| 		if len(basepaths) > 0 { | ||||
| 			base = filepath.Dir(filepath.Join(basepaths...)) | ||||
| 		} | ||||
| 		p, e := filepath.Abs(filepath.ToSlash(filepath.Join(base, pth))) | ||||
| 		if e != nil { | ||||
| 			return false | ||||
| 		} | ||||
| 		pth = p | ||||
| 	} | ||||
| 
 | ||||
| 	fi, err := os.Stat(filepath.ToSlash(pth)) | ||||
| 	if err != nil { | ||||
| 		return false | ||||
| 	} | ||||
| 
 | ||||
| 	return !fi.IsDir() | ||||
| } | ||||
| 
 | ||||
| // Inherits creates a new reference from a parent and a child | ||||
| // If the child cannot inherit from the parent, an error is returned | ||||
| func (r *Ref) Inherits(child Ref) (*Ref, error) { | ||||
| 	ref, err := r.Ref.Inherits(child.Ref) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return &Ref{Ref: *ref}, nil | ||||
| } | ||||
| 
 | ||||
| // NewRef creates a new instance of a ref object | ||||
| // returns an error when the reference uri is an invalid uri | ||||
| func NewRef(refURI string) (Ref, error) { | ||||
| 	ref, err := jsonreference.New(refURI) | ||||
| 	if err != nil { | ||||
| 		return Ref{}, err | ||||
| 	} | ||||
| 	return Ref{Ref: ref}, nil | ||||
| } | ||||
| 
 | ||||
| // MustCreateRef creates a ref object but panics when refURI is invalid. | ||||
| // Use the NewRef method for a version that returns an error. | ||||
| func MustCreateRef(refURI string) Ref { | ||||
| 	return Ref{Ref: jsonreference.MustCreateRef(refURI)} | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON marshals this ref into a JSON object | ||||
| func (r Ref) MarshalJSON() ([]byte, error) { | ||||
| 	str := r.String() | ||||
| 	if str == "" { | ||||
| 		if r.IsRoot() { | ||||
| 			return []byte(`{"$ref":""}`), nil | ||||
| 		} | ||||
| 		return []byte("{}"), nil | ||||
| 	} | ||||
| 	v := map[string]interface{}{"$ref": str} | ||||
| 	return json.Marshal(v) | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON unmarshals this ref from a JSON object | ||||
| func (r *Ref) UnmarshalJSON(d []byte) error { | ||||
| 	var v map[string]interface{} | ||||
| 	if err := json.Unmarshal(d, &v); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return r.fromMap(v) | ||||
| } | ||||
| 
 | ||||
| // GobEncode provides a safe gob encoder for Ref | ||||
| func (r Ref) GobEncode() ([]byte, error) { | ||||
| 	var b bytes.Buffer | ||||
| 	raw, err := r.MarshalJSON() | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	err = gob.NewEncoder(&b).Encode(raw) | ||||
| 	return b.Bytes(), err | ||||
| } | ||||
| 
 | ||||
| // GobDecode provides a safe gob decoder for Ref | ||||
| func (r *Ref) GobDecode(b []byte) error { | ||||
| 	var raw []byte | ||||
| 	buf := bytes.NewBuffer(b) | ||||
| 	err := gob.NewDecoder(buf).Decode(&raw) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(raw, r) | ||||
| } | ||||
| 
 | ||||
| func (r *Ref) fromMap(v map[string]interface{}) error { | ||||
| 	if v == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	if vv, ok := v["$ref"]; ok { | ||||
| 		if str, ok := vv.(string); ok { | ||||
| 			ref, err := jsonreference.New(str) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			*r = Ref{Ref: ref} | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										127
									
								
								vendor/github.com/go-openapi/spec/resolver.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										127
									
								
								vendor/github.com/go-openapi/spec/resolver.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,127 @@ | |||
| package spec | ||||
| 
 | ||||
| import ( | ||||
| 	"fmt" | ||||
| 
 | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| func resolveAnyWithBase(root interface{}, ref *Ref, result interface{}, options *ExpandOptions) error { | ||||
| 	options = optionsOrDefault(options) | ||||
| 	resolver := defaultSchemaLoader(root, options, nil, nil) | ||||
| 
 | ||||
| 	if err := resolver.Resolve(ref, result, options.RelativeBase); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // ResolveRefWithBase resolves a reference against a context root with preservation of base path | ||||
| func ResolveRefWithBase(root interface{}, ref *Ref, options *ExpandOptions) (*Schema, error) { | ||||
| 	result := new(Schema) | ||||
| 
 | ||||
| 	if err := resolveAnyWithBase(root, ref, result, options); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return result, nil | ||||
| } | ||||
| 
 | ||||
| // ResolveRef resolves a reference for a schema against a context root | ||||
| // ref is guaranteed to be in root (no need to go to external files) | ||||
| // | ||||
| // ResolveRef is ONLY called from the code generation module | ||||
| func ResolveRef(root interface{}, ref *Ref) (*Schema, error) { | ||||
| 	res, _, err := ref.GetPointer().Get(root) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	switch sch := res.(type) { | ||||
| 	case Schema: | ||||
| 		return &sch, nil | ||||
| 	case *Schema: | ||||
| 		return sch, nil | ||||
| 	case map[string]interface{}: | ||||
| 		newSch := new(Schema) | ||||
| 		if err = swag.DynamicJSONToStruct(sch, newSch); err != nil { | ||||
| 			return nil, err | ||||
| 		} | ||||
| 		return newSch, nil | ||||
| 	default: | ||||
| 		return nil, fmt.Errorf("type: %T: %w", sch, ErrUnknownTypeForReference) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // ResolveParameterWithBase resolves a parameter reference against a context root and base path | ||||
| func ResolveParameterWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Parameter, error) { | ||||
| 	result := new(Parameter) | ||||
| 
 | ||||
| 	if err := resolveAnyWithBase(root, &ref, result, options); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return result, nil | ||||
| } | ||||
| 
 | ||||
| // ResolveParameter resolves a parameter reference against a context root | ||||
| func ResolveParameter(root interface{}, ref Ref) (*Parameter, error) { | ||||
| 	return ResolveParameterWithBase(root, ref, nil) | ||||
| } | ||||
| 
 | ||||
| // ResolveResponseWithBase resolves response a reference against a context root and base path | ||||
| func ResolveResponseWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Response, error) { | ||||
| 	result := new(Response) | ||||
| 
 | ||||
| 	err := resolveAnyWithBase(root, &ref, result, options) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return result, nil | ||||
| } | ||||
| 
 | ||||
| // ResolveResponse resolves response a reference against a context root | ||||
| func ResolveResponse(root interface{}, ref Ref) (*Response, error) { | ||||
| 	return ResolveResponseWithBase(root, ref, nil) | ||||
| } | ||||
| 
 | ||||
| // ResolvePathItemWithBase resolves response a path item against a context root and base path | ||||
| func ResolvePathItemWithBase(root interface{}, ref Ref, options *ExpandOptions) (*PathItem, error) { | ||||
| 	result := new(PathItem) | ||||
| 
 | ||||
| 	if err := resolveAnyWithBase(root, &ref, result, options); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return result, nil | ||||
| } | ||||
| 
 | ||||
| // ResolvePathItem resolves response a path item against a context root and base path | ||||
| // | ||||
| // Deprecated: use ResolvePathItemWithBase instead | ||||
| func ResolvePathItem(root interface{}, ref Ref, options *ExpandOptions) (*PathItem, error) { | ||||
| 	return ResolvePathItemWithBase(root, ref, options) | ||||
| } | ||||
| 
 | ||||
| // ResolveItemsWithBase resolves parameter items reference against a context root and base path. | ||||
| // | ||||
| // NOTE: stricly speaking, this construct is not supported by Swagger 2.0. | ||||
| // Similarly, $ref are forbidden in response headers. | ||||
| func ResolveItemsWithBase(root interface{}, ref Ref, options *ExpandOptions) (*Items, error) { | ||||
| 	result := new(Items) | ||||
| 
 | ||||
| 	if err := resolveAnyWithBase(root, &ref, result, options); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	return result, nil | ||||
| } | ||||
| 
 | ||||
| // ResolveItems resolves parameter items reference against a context root and base path. | ||||
| // | ||||
| // Deprecated: use ResolveItemsWithBase instead | ||||
| func ResolveItems(root interface{}, ref Ref, options *ExpandOptions) (*Items, error) { | ||||
| 	return ResolveItemsWithBase(root, ref, options) | ||||
| } | ||||
							
								
								
									
										152
									
								
								vendor/github.com/go-openapi/spec/response.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										152
									
								
								vendor/github.com/go-openapi/spec/response.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,152 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // ResponseProps properties specific to a response | ||||
| type ResponseProps struct { | ||||
| 	Description string                 `json:"description"` | ||||
| 	Schema      *Schema                `json:"schema,omitempty"` | ||||
| 	Headers     map[string]Header      `json:"headers,omitempty"` | ||||
| 	Examples    map[string]interface{} `json:"examples,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // Response describes a single response from an API Operation. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#responseObject | ||||
| type Response struct { | ||||
| 	Refable | ||||
| 	ResponseProps | ||||
| 	VendorExtensible | ||||
| } | ||||
| 
 | ||||
| // JSONLookup look up a value by the json property name | ||||
| func (r Response) JSONLookup(token string) (interface{}, error) { | ||||
| 	if ex, ok := r.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 	if token == "$ref" { | ||||
| 		return &r.Ref, nil | ||||
| 	} | ||||
| 	ptr, _, err := jsonpointer.GetForToken(r.ResponseProps, token) | ||||
| 	return ptr, err | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON hydrates this items instance with the data from JSON | ||||
| func (r *Response) UnmarshalJSON(data []byte) error { | ||||
| 	if err := json.Unmarshal(data, &r.ResponseProps); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := json.Unmarshal(data, &r.Refable); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(data, &r.VendorExtensible) | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON converts this items object to JSON | ||||
| func (r Response) MarshalJSON() ([]byte, error) { | ||||
| 	var ( | ||||
| 		b1  []byte | ||||
| 		err error | ||||
| 	) | ||||
| 
 | ||||
| 	if r.Ref.String() == "" { | ||||
| 		// when there is no $ref, empty description is rendered as an empty string | ||||
| 		b1, err = json.Marshal(r.ResponseProps) | ||||
| 	} else { | ||||
| 		// when there is $ref inside the schema, description should be omitempty-ied | ||||
| 		b1, err = json.Marshal(struct { | ||||
| 			Description string                 `json:"description,omitempty"` | ||||
| 			Schema      *Schema                `json:"schema,omitempty"` | ||||
| 			Headers     map[string]Header      `json:"headers,omitempty"` | ||||
| 			Examples    map[string]interface{} `json:"examples,omitempty"` | ||||
| 		}{ | ||||
| 			Description: r.ResponseProps.Description, | ||||
| 			Schema:      r.ResponseProps.Schema, | ||||
| 			Examples:    r.ResponseProps.Examples, | ||||
| 		}) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	b2, err := json.Marshal(r.Refable) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b3, err := json.Marshal(r.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return swag.ConcatJSON(b1, b2, b3), nil | ||||
| } | ||||
| 
 | ||||
| // NewResponse creates a new response instance | ||||
| func NewResponse() *Response { | ||||
| 	return new(Response) | ||||
| } | ||||
| 
 | ||||
| // ResponseRef creates a response as a json reference | ||||
| func ResponseRef(url string) *Response { | ||||
| 	resp := NewResponse() | ||||
| 	resp.Ref = MustCreateRef(url) | ||||
| 	return resp | ||||
| } | ||||
| 
 | ||||
| // WithDescription sets the description on this response, allows for chaining | ||||
| func (r *Response) WithDescription(description string) *Response { | ||||
| 	r.Description = description | ||||
| 	return r | ||||
| } | ||||
| 
 | ||||
| // WithSchema sets the schema on this response, allows for chaining. | ||||
| // Passing a nil argument removes the schema from this response | ||||
| func (r *Response) WithSchema(schema *Schema) *Response { | ||||
| 	r.Schema = schema | ||||
| 	return r | ||||
| } | ||||
| 
 | ||||
| // AddHeader adds a header to this response | ||||
| func (r *Response) AddHeader(name string, header *Header) *Response { | ||||
| 	if header == nil { | ||||
| 		return r.RemoveHeader(name) | ||||
| 	} | ||||
| 	if r.Headers == nil { | ||||
| 		r.Headers = make(map[string]Header) | ||||
| 	} | ||||
| 	r.Headers[name] = *header | ||||
| 	return r | ||||
| } | ||||
| 
 | ||||
| // RemoveHeader removes a header from this response | ||||
| func (r *Response) RemoveHeader(name string) *Response { | ||||
| 	delete(r.Headers, name) | ||||
| 	return r | ||||
| } | ||||
| 
 | ||||
| // AddExample adds an example to this response | ||||
| func (r *Response) AddExample(mediaType string, example interface{}) *Response { | ||||
| 	if r.Examples == nil { | ||||
| 		r.Examples = make(map[string]interface{}) | ||||
| 	} | ||||
| 	r.Examples[mediaType] = example | ||||
| 	return r | ||||
| } | ||||
							
								
								
									
										140
									
								
								vendor/github.com/go-openapi/spec/responses.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										140
									
								
								vendor/github.com/go-openapi/spec/responses.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,140 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"reflect" | ||||
| 	"strconv" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // Responses is a container for the expected responses of an operation. | ||||
| // The container maps a HTTP response code to the expected response. | ||||
| // It is not expected from the documentation to necessarily cover all possible HTTP response codes, | ||||
| // since they may not be known in advance. However, it is expected from the documentation to cover | ||||
| // a successful operation response and any known errors. | ||||
| // | ||||
| // The `default` can be used a default response object for all HTTP codes that are not covered | ||||
| // individually by the specification. | ||||
| // | ||||
| // The `Responses Object` MUST contain at least one response code, and it SHOULD be the response | ||||
| // for a successful operation call. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#responsesObject | ||||
| type Responses struct { | ||||
| 	VendorExtensible | ||||
| 	ResponsesProps | ||||
| } | ||||
| 
 | ||||
| // JSONLookup implements an interface to customize json pointer lookup | ||||
| func (r Responses) JSONLookup(token string) (interface{}, error) { | ||||
| 	if token == "default" { | ||||
| 		return r.Default, nil | ||||
| 	} | ||||
| 	if ex, ok := r.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 	if i, err := strconv.Atoi(token); err == nil { | ||||
| 		if scr, ok := r.StatusCodeResponses[i]; ok { | ||||
| 			return scr, nil | ||||
| 		} | ||||
| 	} | ||||
| 	return nil, fmt.Errorf("object has no field %q", token) | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON hydrates this items instance with the data from JSON | ||||
| func (r *Responses) UnmarshalJSON(data []byte) error { | ||||
| 	if err := json.Unmarshal(data, &r.ResponsesProps); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if err := json.Unmarshal(data, &r.VendorExtensible); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if reflect.DeepEqual(ResponsesProps{}, r.ResponsesProps) { | ||||
| 		r.ResponsesProps = ResponsesProps{} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON converts this items object to JSON | ||||
| func (r Responses) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(r.ResponsesProps) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b2, err := json.Marshal(r.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	concated := swag.ConcatJSON(b1, b2) | ||||
| 	return concated, nil | ||||
| } | ||||
| 
 | ||||
| // ResponsesProps describes all responses for an operation. | ||||
| // It tells what is the default response and maps all responses with a | ||||
| // HTTP status code. | ||||
| type ResponsesProps struct { | ||||
| 	Default             *Response | ||||
| 	StatusCodeResponses map[int]Response | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON marshals responses as JSON | ||||
| func (r ResponsesProps) MarshalJSON() ([]byte, error) { | ||||
| 	toser := map[string]Response{} | ||||
| 	if r.Default != nil { | ||||
| 		toser["default"] = *r.Default | ||||
| 	} | ||||
| 	for k, v := range r.StatusCodeResponses { | ||||
| 		toser[strconv.Itoa(k)] = v | ||||
| 	} | ||||
| 	return json.Marshal(toser) | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON unmarshals responses from JSON | ||||
| func (r *ResponsesProps) UnmarshalJSON(data []byte) error { | ||||
| 	var res map[string]json.RawMessage | ||||
| 	if err := json.Unmarshal(data, &res); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if v, ok := res["default"]; ok { | ||||
| 		var defaultRes Response | ||||
| 		if err := json.Unmarshal(v, &defaultRes); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		r.Default = &defaultRes | ||||
| 		delete(res, "default") | ||||
| 	} | ||||
| 	for k, v := range res { | ||||
| 		if !strings.HasPrefix(k, "x-") { | ||||
| 			var statusCodeResp Response | ||||
| 			if err := json.Unmarshal(v, &statusCodeResp); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			if nk, err := strconv.Atoi(k); err == nil { | ||||
| 				if r.StatusCodeResponses == nil { | ||||
| 					r.StatusCodeResponses = map[int]Response{} | ||||
| 				} | ||||
| 				r.StatusCodeResponses[nk] = statusCodeResp | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										645
									
								
								vendor/github.com/go-openapi/spec/schema.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										645
									
								
								vendor/github.com/go-openapi/spec/schema.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,645 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // BooleanProperty creates a boolean property | ||||
| func BooleanProperty() *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"boolean"}}} | ||||
| } | ||||
| 
 | ||||
| // BoolProperty creates a boolean property | ||||
| func BoolProperty() *Schema { return BooleanProperty() } | ||||
| 
 | ||||
| // StringProperty creates a string property | ||||
| func StringProperty() *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}} | ||||
| } | ||||
| 
 | ||||
| // CharProperty creates a string property | ||||
| func CharProperty() *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}}} | ||||
| } | ||||
| 
 | ||||
| // Float64Property creates a float64/double property | ||||
| func Float64Property() *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"number"}, Format: "double"}} | ||||
| } | ||||
| 
 | ||||
| // Float32Property creates a float32/float property | ||||
| func Float32Property() *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"number"}, Format: "float"}} | ||||
| } | ||||
| 
 | ||||
| // Int8Property creates an int8 property | ||||
| func Int8Property() *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int8"}} | ||||
| } | ||||
| 
 | ||||
| // Int16Property creates an int16 property | ||||
| func Int16Property() *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int16"}} | ||||
| } | ||||
| 
 | ||||
| // Int32Property creates an int32 property | ||||
| func Int32Property() *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int32"}} | ||||
| } | ||||
| 
 | ||||
| // Int64Property creates an int64 property | ||||
| func Int64Property() *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"integer"}, Format: "int64"}} | ||||
| } | ||||
| 
 | ||||
| // StrFmtProperty creates a property for the named string format | ||||
| func StrFmtProperty(format string) *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: format}} | ||||
| } | ||||
| 
 | ||||
| // DateProperty creates a date property | ||||
| func DateProperty() *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: "date"}} | ||||
| } | ||||
| 
 | ||||
| // DateTimeProperty creates a date time property | ||||
| func DateTimeProperty() *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"string"}, Format: "date-time"}} | ||||
| } | ||||
| 
 | ||||
| // MapProperty creates a map property | ||||
| func MapProperty(property *Schema) *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Type: []string{"object"}, | ||||
| 		AdditionalProperties: &SchemaOrBool{Allows: true, Schema: property}}} | ||||
| } | ||||
| 
 | ||||
| // RefProperty creates a ref property | ||||
| func RefProperty(name string) *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Ref: MustCreateRef(name)}} | ||||
| } | ||||
| 
 | ||||
| // RefSchema creates a ref property | ||||
| func RefSchema(name string) *Schema { | ||||
| 	return &Schema{SchemaProps: SchemaProps{Ref: MustCreateRef(name)}} | ||||
| } | ||||
| 
 | ||||
| // ArrayProperty creates an array property | ||||
| func ArrayProperty(items *Schema) *Schema { | ||||
| 	if items == nil { | ||||
| 		return &Schema{SchemaProps: SchemaProps{Type: []string{"array"}}} | ||||
| 	} | ||||
| 	return &Schema{SchemaProps: SchemaProps{Items: &SchemaOrArray{Schema: items}, Type: []string{"array"}}} | ||||
| } | ||||
| 
 | ||||
| // ComposedSchema creates a schema with allOf | ||||
| func ComposedSchema(schemas ...Schema) *Schema { | ||||
| 	s := new(Schema) | ||||
| 	s.AllOf = schemas | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // SchemaURL represents a schema url | ||||
| type SchemaURL string | ||||
| 
 | ||||
| // MarshalJSON marshal this to JSON | ||||
| func (r SchemaURL) MarshalJSON() ([]byte, error) { | ||||
| 	if r == "" { | ||||
| 		return []byte("{}"), nil | ||||
| 	} | ||||
| 	v := map[string]interface{}{"$schema": string(r)} | ||||
| 	return json.Marshal(v) | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON unmarshal this from JSON | ||||
| func (r *SchemaURL) UnmarshalJSON(data []byte) error { | ||||
| 	var v map[string]interface{} | ||||
| 	if err := json.Unmarshal(data, &v); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return r.fromMap(v) | ||||
| } | ||||
| 
 | ||||
| func (r *SchemaURL) fromMap(v map[string]interface{}) error { | ||||
| 	if v == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	if vv, ok := v["$schema"]; ok { | ||||
| 		if str, ok := vv.(string); ok { | ||||
| 			u, err := parseURL(str) | ||||
| 			if err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 
 | ||||
| 			*r = SchemaURL(u.String()) | ||||
| 		} | ||||
| 	} | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // SchemaProps describes a JSON schema (draft 4) | ||||
| type SchemaProps struct { | ||||
| 	ID                   string           `json:"id,omitempty"` | ||||
| 	Ref                  Ref              `json:"-"` | ||||
| 	Schema               SchemaURL        `json:"-"` | ||||
| 	Description          string           `json:"description,omitempty"` | ||||
| 	Type                 StringOrArray    `json:"type,omitempty"` | ||||
| 	Nullable             bool             `json:"nullable,omitempty"` | ||||
| 	Format               string           `json:"format,omitempty"` | ||||
| 	Title                string           `json:"title,omitempty"` | ||||
| 	Default              interface{}      `json:"default,omitempty"` | ||||
| 	Maximum              *float64         `json:"maximum,omitempty"` | ||||
| 	ExclusiveMaximum     bool             `json:"exclusiveMaximum,omitempty"` | ||||
| 	Minimum              *float64         `json:"minimum,omitempty"` | ||||
| 	ExclusiveMinimum     bool             `json:"exclusiveMinimum,omitempty"` | ||||
| 	MaxLength            *int64           `json:"maxLength,omitempty"` | ||||
| 	MinLength            *int64           `json:"minLength,omitempty"` | ||||
| 	Pattern              string           `json:"pattern,omitempty"` | ||||
| 	MaxItems             *int64           `json:"maxItems,omitempty"` | ||||
| 	MinItems             *int64           `json:"minItems,omitempty"` | ||||
| 	UniqueItems          bool             `json:"uniqueItems,omitempty"` | ||||
| 	MultipleOf           *float64         `json:"multipleOf,omitempty"` | ||||
| 	Enum                 []interface{}    `json:"enum,omitempty"` | ||||
| 	MaxProperties        *int64           `json:"maxProperties,omitempty"` | ||||
| 	MinProperties        *int64           `json:"minProperties,omitempty"` | ||||
| 	Required             []string         `json:"required,omitempty"` | ||||
| 	Items                *SchemaOrArray   `json:"items,omitempty"` | ||||
| 	AllOf                []Schema         `json:"allOf,omitempty"` | ||||
| 	OneOf                []Schema         `json:"oneOf,omitempty"` | ||||
| 	AnyOf                []Schema         `json:"anyOf,omitempty"` | ||||
| 	Not                  *Schema          `json:"not,omitempty"` | ||||
| 	Properties           SchemaProperties `json:"properties,omitempty"` | ||||
| 	AdditionalProperties *SchemaOrBool    `json:"additionalProperties,omitempty"` | ||||
| 	PatternProperties    SchemaProperties `json:"patternProperties,omitempty"` | ||||
| 	Dependencies         Dependencies     `json:"dependencies,omitempty"` | ||||
| 	AdditionalItems      *SchemaOrBool    `json:"additionalItems,omitempty"` | ||||
| 	Definitions          Definitions      `json:"definitions,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // SwaggerSchemaProps are additional properties supported by swagger schemas, but not JSON-schema (draft 4) | ||||
| type SwaggerSchemaProps struct { | ||||
| 	Discriminator string                 `json:"discriminator,omitempty"` | ||||
| 	ReadOnly      bool                   `json:"readOnly,omitempty"` | ||||
| 	XML           *XMLObject             `json:"xml,omitempty"` | ||||
| 	ExternalDocs  *ExternalDocumentation `json:"externalDocs,omitempty"` | ||||
| 	Example       interface{}            `json:"example,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // Schema the schema object allows the definition of input and output data types. | ||||
| // These types can be objects, but also primitives and arrays. | ||||
| // This object is based on the [JSON Schema Specification Draft 4](http://json-schema.org/) | ||||
| // and uses a predefined subset of it. | ||||
| // On top of this subset, there are extensions provided by this specification to allow for more complete documentation. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#schemaObject | ||||
| type Schema struct { | ||||
| 	VendorExtensible | ||||
| 	SchemaProps | ||||
| 	SwaggerSchemaProps | ||||
| 	ExtraProps map[string]interface{} `json:"-"` | ||||
| } | ||||
| 
 | ||||
| // JSONLookup implements an interface to customize json pointer lookup | ||||
| func (s Schema) JSONLookup(token string) (interface{}, error) { | ||||
| 	if ex, ok := s.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 
 | ||||
| 	if ex, ok := s.ExtraProps[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 
 | ||||
| 	r, _, err := jsonpointer.GetForToken(s.SchemaProps, token) | ||||
| 	if r != nil || (err != nil && !strings.HasPrefix(err.Error(), "object has no field")) { | ||||
| 		return r, err | ||||
| 	} | ||||
| 	r, _, err = jsonpointer.GetForToken(s.SwaggerSchemaProps, token) | ||||
| 	return r, err | ||||
| } | ||||
| 
 | ||||
| // WithID sets the id for this schema, allows for chaining | ||||
| func (s *Schema) WithID(id string) *Schema { | ||||
| 	s.ID = id | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithTitle sets the title for this schema, allows for chaining | ||||
| func (s *Schema) WithTitle(title string) *Schema { | ||||
| 	s.Title = title | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithDescription sets the description for this schema, allows for chaining | ||||
| func (s *Schema) WithDescription(description string) *Schema { | ||||
| 	s.Description = description | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithProperties sets the properties for this schema | ||||
| func (s *Schema) WithProperties(schemas map[string]Schema) *Schema { | ||||
| 	s.Properties = schemas | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // SetProperty sets a property on this schema | ||||
| func (s *Schema) SetProperty(name string, schema Schema) *Schema { | ||||
| 	if s.Properties == nil { | ||||
| 		s.Properties = make(map[string]Schema) | ||||
| 	} | ||||
| 	s.Properties[name] = schema | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithAllOf sets the all of property | ||||
| func (s *Schema) WithAllOf(schemas ...Schema) *Schema { | ||||
| 	s.AllOf = schemas | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithMaxProperties sets the max number of properties an object can have | ||||
| func (s *Schema) WithMaxProperties(max int64) *Schema { | ||||
| 	s.MaxProperties = &max | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithMinProperties sets the min number of properties an object must have | ||||
| func (s *Schema) WithMinProperties(min int64) *Schema { | ||||
| 	s.MinProperties = &min | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // Typed sets the type of this schema for a single value item | ||||
| func (s *Schema) Typed(tpe, format string) *Schema { | ||||
| 	s.Type = []string{tpe} | ||||
| 	s.Format = format | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // AddType adds a type with potential format to the types for this schema | ||||
| func (s *Schema) AddType(tpe, format string) *Schema { | ||||
| 	s.Type = append(s.Type, tpe) | ||||
| 	if format != "" { | ||||
| 		s.Format = format | ||||
| 	} | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // AsNullable flags this schema as nullable. | ||||
| func (s *Schema) AsNullable() *Schema { | ||||
| 	s.Nullable = true | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // CollectionOf a fluent builder method for an array parameter | ||||
| func (s *Schema) CollectionOf(items Schema) *Schema { | ||||
| 	s.Type = []string{jsonArray} | ||||
| 	s.Items = &SchemaOrArray{Schema: &items} | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithDefault sets the default value on this parameter | ||||
| func (s *Schema) WithDefault(defaultValue interface{}) *Schema { | ||||
| 	s.Default = defaultValue | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithRequired flags this parameter as required | ||||
| func (s *Schema) WithRequired(items ...string) *Schema { | ||||
| 	s.Required = items | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // AddRequired  adds field names to the required properties array | ||||
| func (s *Schema) AddRequired(items ...string) *Schema { | ||||
| 	s.Required = append(s.Required, items...) | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithMaxLength sets a max length value | ||||
| func (s *Schema) WithMaxLength(max int64) *Schema { | ||||
| 	s.MaxLength = &max | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithMinLength sets a min length value | ||||
| func (s *Schema) WithMinLength(min int64) *Schema { | ||||
| 	s.MinLength = &min | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithPattern sets a pattern value | ||||
| func (s *Schema) WithPattern(pattern string) *Schema { | ||||
| 	s.Pattern = pattern | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithMultipleOf sets a multiple of value | ||||
| func (s *Schema) WithMultipleOf(number float64) *Schema { | ||||
| 	s.MultipleOf = &number | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithMaximum sets a maximum number value | ||||
| func (s *Schema) WithMaximum(max float64, exclusive bool) *Schema { | ||||
| 	s.Maximum = &max | ||||
| 	s.ExclusiveMaximum = exclusive | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithMinimum sets a minimum number value | ||||
| func (s *Schema) WithMinimum(min float64, exclusive bool) *Schema { | ||||
| 	s.Minimum = &min | ||||
| 	s.ExclusiveMinimum = exclusive | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithEnum sets a the enum values (replace) | ||||
| func (s *Schema) WithEnum(values ...interface{}) *Schema { | ||||
| 	s.Enum = append([]interface{}{}, values...) | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithMaxItems sets the max items | ||||
| func (s *Schema) WithMaxItems(size int64) *Schema { | ||||
| 	s.MaxItems = &size | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithMinItems sets the min items | ||||
| func (s *Schema) WithMinItems(size int64) *Schema { | ||||
| 	s.MinItems = &size | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // UniqueValues dictates that this array can only have unique items | ||||
| func (s *Schema) UniqueValues() *Schema { | ||||
| 	s.UniqueItems = true | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // AllowDuplicates this array can have duplicates | ||||
| func (s *Schema) AllowDuplicates() *Schema { | ||||
| 	s.UniqueItems = false | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // AddToAllOf adds a schema to the allOf property | ||||
| func (s *Schema) AddToAllOf(schemas ...Schema) *Schema { | ||||
| 	s.AllOf = append(s.AllOf, schemas...) | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithDiscriminator sets the name of the discriminator field | ||||
| func (s *Schema) WithDiscriminator(discriminator string) *Schema { | ||||
| 	s.Discriminator = discriminator | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // AsReadOnly flags this schema as readonly | ||||
| func (s *Schema) AsReadOnly() *Schema { | ||||
| 	s.ReadOnly = true | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // AsWritable flags this schema as writeable (not read-only) | ||||
| func (s *Schema) AsWritable() *Schema { | ||||
| 	s.ReadOnly = false | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithExample sets the example for this schema | ||||
| func (s *Schema) WithExample(example interface{}) *Schema { | ||||
| 	s.Example = example | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithExternalDocs sets/removes the external docs for/from this schema. | ||||
| // When you pass empty strings as params the external documents will be removed. | ||||
| // When you pass non-empty string as one value then those values will be used on the external docs object. | ||||
| // So when you pass a non-empty description, you should also pass the url and vice versa. | ||||
| func (s *Schema) WithExternalDocs(description, url string) *Schema { | ||||
| 	if description == "" && url == "" { | ||||
| 		s.ExternalDocs = nil | ||||
| 		return s | ||||
| 	} | ||||
| 
 | ||||
| 	if s.ExternalDocs == nil { | ||||
| 		s.ExternalDocs = &ExternalDocumentation{} | ||||
| 	} | ||||
| 	s.ExternalDocs.Description = description | ||||
| 	s.ExternalDocs.URL = url | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithXMLName sets the xml name for the object | ||||
| func (s *Schema) WithXMLName(name string) *Schema { | ||||
| 	if s.XML == nil { | ||||
| 		s.XML = new(XMLObject) | ||||
| 	} | ||||
| 	s.XML.Name = name | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithXMLNamespace sets the xml namespace for the object | ||||
| func (s *Schema) WithXMLNamespace(namespace string) *Schema { | ||||
| 	if s.XML == nil { | ||||
| 		s.XML = new(XMLObject) | ||||
| 	} | ||||
| 	s.XML.Namespace = namespace | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // WithXMLPrefix sets the xml prefix for the object | ||||
| func (s *Schema) WithXMLPrefix(prefix string) *Schema { | ||||
| 	if s.XML == nil { | ||||
| 		s.XML = new(XMLObject) | ||||
| 	} | ||||
| 	s.XML.Prefix = prefix | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // AsXMLAttribute flags this object as xml attribute | ||||
| func (s *Schema) AsXMLAttribute() *Schema { | ||||
| 	if s.XML == nil { | ||||
| 		s.XML = new(XMLObject) | ||||
| 	} | ||||
| 	s.XML.Attribute = true | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // AsXMLElement flags this object as an xml node | ||||
| func (s *Schema) AsXMLElement() *Schema { | ||||
| 	if s.XML == nil { | ||||
| 		s.XML = new(XMLObject) | ||||
| 	} | ||||
| 	s.XML.Attribute = false | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // AsWrappedXML flags this object as wrapped, this is mostly useful for array types | ||||
| func (s *Schema) AsWrappedXML() *Schema { | ||||
| 	if s.XML == nil { | ||||
| 		s.XML = new(XMLObject) | ||||
| 	} | ||||
| 	s.XML.Wrapped = true | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // AsUnwrappedXML flags this object as an xml node | ||||
| func (s *Schema) AsUnwrappedXML() *Schema { | ||||
| 	if s.XML == nil { | ||||
| 		s.XML = new(XMLObject) | ||||
| 	} | ||||
| 	s.XML.Wrapped = false | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // SetValidations defines all schema validations. | ||||
| // | ||||
| // NOTE: Required, ReadOnly, AllOf, AnyOf, OneOf and Not are not considered. | ||||
| func (s *Schema) SetValidations(val SchemaValidations) { | ||||
| 	s.Maximum = val.Maximum | ||||
| 	s.ExclusiveMaximum = val.ExclusiveMaximum | ||||
| 	s.Minimum = val.Minimum | ||||
| 	s.ExclusiveMinimum = val.ExclusiveMinimum | ||||
| 	s.MaxLength = val.MaxLength | ||||
| 	s.MinLength = val.MinLength | ||||
| 	s.Pattern = val.Pattern | ||||
| 	s.MaxItems = val.MaxItems | ||||
| 	s.MinItems = val.MinItems | ||||
| 	s.UniqueItems = val.UniqueItems | ||||
| 	s.MultipleOf = val.MultipleOf | ||||
| 	s.Enum = val.Enum | ||||
| 	s.MinProperties = val.MinProperties | ||||
| 	s.MaxProperties = val.MaxProperties | ||||
| 	s.PatternProperties = val.PatternProperties | ||||
| } | ||||
| 
 | ||||
| // WithValidations is a fluent method to set schema validations | ||||
| func (s *Schema) WithValidations(val SchemaValidations) *Schema { | ||||
| 	s.SetValidations(val) | ||||
| 	return s | ||||
| } | ||||
| 
 | ||||
| // Validations returns a clone of the validations for this schema | ||||
| func (s Schema) Validations() SchemaValidations { | ||||
| 	return SchemaValidations{ | ||||
| 		CommonValidations: CommonValidations{ | ||||
| 			Maximum:          s.Maximum, | ||||
| 			ExclusiveMaximum: s.ExclusiveMaximum, | ||||
| 			Minimum:          s.Minimum, | ||||
| 			ExclusiveMinimum: s.ExclusiveMinimum, | ||||
| 			MaxLength:        s.MaxLength, | ||||
| 			MinLength:        s.MinLength, | ||||
| 			Pattern:          s.Pattern, | ||||
| 			MaxItems:         s.MaxItems, | ||||
| 			MinItems:         s.MinItems, | ||||
| 			UniqueItems:      s.UniqueItems, | ||||
| 			MultipleOf:       s.MultipleOf, | ||||
| 			Enum:             s.Enum, | ||||
| 		}, | ||||
| 		MinProperties:     s.MinProperties, | ||||
| 		MaxProperties:     s.MaxProperties, | ||||
| 		PatternProperties: s.PatternProperties, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON marshal this to JSON | ||||
| func (s Schema) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(s.SchemaProps) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("schema props %v", err) | ||||
| 	} | ||||
| 	b2, err := json.Marshal(s.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("vendor props %v", err) | ||||
| 	} | ||||
| 	b3, err := s.Ref.MarshalJSON() | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("ref prop %v", err) | ||||
| 	} | ||||
| 	b4, err := s.Schema.MarshalJSON() | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("schema prop %v", err) | ||||
| 	} | ||||
| 	b5, err := json.Marshal(s.SwaggerSchemaProps) | ||||
| 	if err != nil { | ||||
| 		return nil, fmt.Errorf("common validations %v", err) | ||||
| 	} | ||||
| 	var b6 []byte | ||||
| 	if s.ExtraProps != nil { | ||||
| 		jj, err := json.Marshal(s.ExtraProps) | ||||
| 		if err != nil { | ||||
| 			return nil, fmt.Errorf("extra props %v", err) | ||||
| 		} | ||||
| 		b6 = jj | ||||
| 	} | ||||
| 	return swag.ConcatJSON(b1, b2, b3, b4, b5, b6), nil | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON marshal this from JSON | ||||
| func (s *Schema) UnmarshalJSON(data []byte) error { | ||||
| 	props := struct { | ||||
| 		SchemaProps | ||||
| 		SwaggerSchemaProps | ||||
| 	}{} | ||||
| 	if err := json.Unmarshal(data, &props); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	sch := Schema{ | ||||
| 		SchemaProps:        props.SchemaProps, | ||||
| 		SwaggerSchemaProps: props.SwaggerSchemaProps, | ||||
| 	} | ||||
| 
 | ||||
| 	var d map[string]interface{} | ||||
| 	if err := json.Unmarshal(data, &d); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	_ = sch.Ref.fromMap(d) | ||||
| 	_ = sch.Schema.fromMap(d) | ||||
| 
 | ||||
| 	delete(d, "$ref") | ||||
| 	delete(d, "$schema") | ||||
| 	for _, pn := range swag.DefaultJSONNameProvider.GetJSONNames(s) { | ||||
| 		delete(d, pn) | ||||
| 	} | ||||
| 
 | ||||
| 	for k, vv := range d { | ||||
| 		lk := strings.ToLower(k) | ||||
| 		if strings.HasPrefix(lk, "x-") { | ||||
| 			if sch.Extensions == nil { | ||||
| 				sch.Extensions = map[string]interface{}{} | ||||
| 			} | ||||
| 			sch.Extensions[k] = vv | ||||
| 			continue | ||||
| 		} | ||||
| 		if sch.ExtraProps == nil { | ||||
| 			sch.ExtraProps = map[string]interface{}{} | ||||
| 		} | ||||
| 		sch.ExtraProps[k] = vv | ||||
| 	} | ||||
| 
 | ||||
| 	*s = sch | ||||
| 
 | ||||
| 	return nil | ||||
| } | ||||
							
								
								
									
										338
									
								
								vendor/github.com/go-openapi/spec/schema_loader.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										338
									
								
								vendor/github.com/go-openapi/spec/schema_loader.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,338 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"log" | ||||
| 	"net/url" | ||||
| 	"reflect" | ||||
| 	"strings" | ||||
| 
 | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // PathLoader is a function to use when loading remote refs. | ||||
| // | ||||
| // This is a package level default. It may be overridden or bypassed by | ||||
| // specifying the loader in ExpandOptions. | ||||
| // | ||||
| // NOTE: if you are using the go-openapi/loads package, it will override | ||||
| // this value with its own default (a loader to retrieve YAML documents as | ||||
| // well as JSON ones). | ||||
| var PathLoader = func(pth string) (json.RawMessage, error) { | ||||
| 	data, err := swag.LoadFromFileOrHTTP(pth) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return json.RawMessage(data), nil | ||||
| } | ||||
| 
 | ||||
| // resolverContext allows to share a context during spec processing. | ||||
| // At the moment, it just holds the index of circular references found. | ||||
| type resolverContext struct { | ||||
| 	// circulars holds all visited circular references, to shortcircuit $ref resolution. | ||||
| 	// | ||||
| 	// This structure is privately instantiated and needs not be locked against | ||||
| 	// concurrent access, unless we chose to implement a parallel spec walking. | ||||
| 	circulars map[string]bool | ||||
| 	basePath  string | ||||
| 	loadDoc   func(string) (json.RawMessage, error) | ||||
| 	rootID    string | ||||
| } | ||||
| 
 | ||||
| func newResolverContext(options *ExpandOptions) *resolverContext { | ||||
| 	expandOptions := optionsOrDefault(options) | ||||
| 
 | ||||
| 	// path loader may be overridden by options | ||||
| 	var loader func(string) (json.RawMessage, error) | ||||
| 	if expandOptions.PathLoader == nil { | ||||
| 		loader = PathLoader | ||||
| 	} else { | ||||
| 		loader = expandOptions.PathLoader | ||||
| 	} | ||||
| 
 | ||||
| 	return &resolverContext{ | ||||
| 		circulars: make(map[string]bool), | ||||
| 		basePath:  expandOptions.RelativeBase, // keep the root base path in context | ||||
| 		loadDoc:   loader, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| type schemaLoader struct { | ||||
| 	root    interface{} | ||||
| 	options *ExpandOptions | ||||
| 	cache   ResolutionCache | ||||
| 	context *resolverContext | ||||
| } | ||||
| 
 | ||||
| func (r *schemaLoader) transitiveResolver(basePath string, ref Ref) *schemaLoader { | ||||
| 	if ref.IsRoot() || ref.HasFragmentOnly { | ||||
| 		return r | ||||
| 	} | ||||
| 
 | ||||
| 	baseRef := MustCreateRef(basePath) | ||||
| 	currentRef := normalizeRef(&ref, basePath) | ||||
| 	if strings.HasPrefix(currentRef.String(), baseRef.String()) { | ||||
| 		return r | ||||
| 	} | ||||
| 
 | ||||
| 	// set a new root against which to resolve | ||||
| 	rootURL := currentRef.GetURL() | ||||
| 	rootURL.Fragment = "" | ||||
| 	root, _ := r.cache.Get(rootURL.String()) | ||||
| 
 | ||||
| 	// shallow copy of resolver options to set a new RelativeBase when | ||||
| 	// traversing multiple documents | ||||
| 	newOptions := r.options | ||||
| 	newOptions.RelativeBase = rootURL.String() | ||||
| 
 | ||||
| 	return defaultSchemaLoader(root, newOptions, r.cache, r.context) | ||||
| } | ||||
| 
 | ||||
| func (r *schemaLoader) updateBasePath(transitive *schemaLoader, basePath string) string { | ||||
| 	if transitive != r { | ||||
| 		if transitive.options != nil && transitive.options.RelativeBase != "" { | ||||
| 			return normalizeBase(transitive.options.RelativeBase) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	return basePath | ||||
| } | ||||
| 
 | ||||
| func (r *schemaLoader) resolveRef(ref *Ref, target interface{}, basePath string) error { | ||||
| 	tgt := reflect.ValueOf(target) | ||||
| 	if tgt.Kind() != reflect.Ptr { | ||||
| 		return ErrResolveRefNeedsAPointer | ||||
| 	} | ||||
| 
 | ||||
| 	if ref.GetURL() == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	var ( | ||||
| 		res  interface{} | ||||
| 		data interface{} | ||||
| 		err  error | ||||
| 	) | ||||
| 
 | ||||
| 	// Resolve against the root if it isn't nil, and if ref is pointing at the root, or has a fragment only which means | ||||
| 	// it is pointing somewhere in the root. | ||||
| 	root := r.root | ||||
| 	if (ref.IsRoot() || ref.HasFragmentOnly) && root == nil && basePath != "" { | ||||
| 		if baseRef, erb := NewRef(basePath); erb == nil { | ||||
| 			root, _, _, _ = r.load(baseRef.GetURL()) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	if (ref.IsRoot() || ref.HasFragmentOnly) && root != nil { | ||||
| 		data = root | ||||
| 	} else { | ||||
| 		baseRef := normalizeRef(ref, basePath) | ||||
| 		data, _, _, err = r.load(baseRef.GetURL()) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	res = data | ||||
| 	if ref.String() != "" { | ||||
| 		res, _, err = ref.GetPointer().Get(data) | ||||
| 		if err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	return swag.DynamicJSONToStruct(res, target) | ||||
| } | ||||
| 
 | ||||
| func (r *schemaLoader) load(refURL *url.URL) (interface{}, url.URL, bool, error) { | ||||
| 	debugLog("loading schema from url: %s", refURL) | ||||
| 	toFetch := *refURL | ||||
| 	toFetch.Fragment = "" | ||||
| 
 | ||||
| 	var err error | ||||
| 	pth := toFetch.String() | ||||
| 	normalized := normalizeBase(pth) | ||||
| 	debugLog("loading doc from: %s", normalized) | ||||
| 
 | ||||
| 	unescaped, err := url.PathUnescape(normalized) | ||||
| 	if err != nil { | ||||
| 		return nil, url.URL{}, false, err | ||||
| 	} | ||||
| 
 | ||||
| 	u := url.URL{Path: unescaped} | ||||
| 
 | ||||
| 	data, fromCache := r.cache.Get(u.RequestURI()) | ||||
| 	if fromCache { | ||||
| 		return data, toFetch, fromCache, nil | ||||
| 	} | ||||
| 
 | ||||
| 	b, err := r.context.loadDoc(normalized) | ||||
| 	if err != nil { | ||||
| 		return nil, url.URL{}, false, err | ||||
| 	} | ||||
| 
 | ||||
| 	var doc interface{} | ||||
| 	if err := json.Unmarshal(b, &doc); err != nil { | ||||
| 		return nil, url.URL{}, false, err | ||||
| 	} | ||||
| 	r.cache.Set(normalized, doc) | ||||
| 
 | ||||
| 	return doc, toFetch, fromCache, nil | ||||
| } | ||||
| 
 | ||||
| // isCircular detects cycles in sequences of $ref. | ||||
| // | ||||
| // It relies on a private context (which needs not be locked). | ||||
| func (r *schemaLoader) isCircular(ref *Ref, basePath string, parentRefs ...string) (foundCycle bool) { | ||||
| 	normalizedRef := normalizeURI(ref.String(), basePath) | ||||
| 	if _, ok := r.context.circulars[normalizedRef]; ok { | ||||
| 		// circular $ref has been already detected in another explored cycle | ||||
| 		foundCycle = true | ||||
| 		return | ||||
| 	} | ||||
| 	foundCycle = swag.ContainsStrings(parentRefs, normalizedRef) // normalized windows url's are lower cased | ||||
| 	if foundCycle { | ||||
| 		r.context.circulars[normalizedRef] = true | ||||
| 	} | ||||
| 	return | ||||
| } | ||||
| 
 | ||||
| // Resolve resolves a reference against basePath and stores the result in target. | ||||
| // | ||||
| // Resolve is not in charge of following references: it only resolves ref by following its URL. | ||||
| // | ||||
| // If the schema the ref is referring to holds nested refs, Resolve doesn't resolve them. | ||||
| // | ||||
| // If basePath is an empty string, ref is resolved against the root schema stored in the schemaLoader struct | ||||
| func (r *schemaLoader) Resolve(ref *Ref, target interface{}, basePath string) error { | ||||
| 	return r.resolveRef(ref, target, basePath) | ||||
| } | ||||
| 
 | ||||
| func (r *schemaLoader) deref(input interface{}, parentRefs []string, basePath string) error { | ||||
| 	var ref *Ref | ||||
| 	switch refable := input.(type) { | ||||
| 	case *Schema: | ||||
| 		ref = &refable.Ref | ||||
| 	case *Parameter: | ||||
| 		ref = &refable.Ref | ||||
| 	case *Response: | ||||
| 		ref = &refable.Ref | ||||
| 	case *PathItem: | ||||
| 		ref = &refable.Ref | ||||
| 	default: | ||||
| 		return fmt.Errorf("unsupported type: %T: %w", input, ErrDerefUnsupportedType) | ||||
| 	} | ||||
| 
 | ||||
| 	curRef := ref.String() | ||||
| 	if curRef == "" { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	normalizedRef := normalizeRef(ref, basePath) | ||||
| 	normalizedBasePath := normalizedRef.RemoteURI() | ||||
| 
 | ||||
| 	if r.isCircular(normalizedRef, basePath, parentRefs...) { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	if err := r.resolveRef(ref, input, basePath); r.shouldStopOnError(err) { | ||||
| 		return err | ||||
| 	} | ||||
| 
 | ||||
| 	if ref.String() == "" || ref.String() == curRef { | ||||
| 		// done with rereferencing | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	parentRefs = append(parentRefs, normalizedRef.String()) | ||||
| 	return r.deref(input, parentRefs, normalizedBasePath) | ||||
| } | ||||
| 
 | ||||
| func (r *schemaLoader) shouldStopOnError(err error) bool { | ||||
| 	if err != nil && !r.options.ContinueOnError { | ||||
| 		return true | ||||
| 	} | ||||
| 
 | ||||
| 	if err != nil { | ||||
| 		log.Println(err) | ||||
| 	} | ||||
| 
 | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| func (r *schemaLoader) setSchemaID(target interface{}, id, basePath string) (string, string) { | ||||
| 	debugLog("schema has ID: %s", id) | ||||
| 
 | ||||
| 	// handling the case when id is a folder | ||||
| 	// remember that basePath has to point to a file | ||||
| 	var refPath string | ||||
| 	if strings.HasSuffix(id, "/") { | ||||
| 		// ensure this is detected as a file, not a folder | ||||
| 		refPath = fmt.Sprintf("%s%s", id, "placeholder.json") | ||||
| 	} else { | ||||
| 		refPath = id | ||||
| 	} | ||||
| 
 | ||||
| 	// updates the current base path | ||||
| 	// * important: ID can be a relative path | ||||
| 	// * registers target to be fetchable from the new base proposed by this id | ||||
| 	newBasePath := normalizeURI(refPath, basePath) | ||||
| 
 | ||||
| 	// store found IDs for possible future reuse in $ref | ||||
| 	r.cache.Set(newBasePath, target) | ||||
| 
 | ||||
| 	// the root document has an ID: all $ref relative to that ID may | ||||
| 	// be rebased relative to the root document | ||||
| 	if basePath == r.context.basePath { | ||||
| 		debugLog("root document is a schema with ID: %s (normalized as:%s)", id, newBasePath) | ||||
| 		r.context.rootID = newBasePath | ||||
| 	} | ||||
| 
 | ||||
| 	return newBasePath, refPath | ||||
| } | ||||
| 
 | ||||
| func defaultSchemaLoader( | ||||
| 	root interface{}, | ||||
| 	expandOptions *ExpandOptions, | ||||
| 	cache ResolutionCache, | ||||
| 	context *resolverContext) *schemaLoader { | ||||
| 
 | ||||
| 	if expandOptions == nil { | ||||
| 		expandOptions = &ExpandOptions{} | ||||
| 	} | ||||
| 
 | ||||
| 	cache = cacheOrDefault(cache) | ||||
| 
 | ||||
| 	if expandOptions.RelativeBase == "" { | ||||
| 		// if no relative base is provided, assume the root document | ||||
| 		// contains all $ref, or at least, that the relative documents | ||||
| 		// may be resolved from the current working directory. | ||||
| 		expandOptions.RelativeBase = baseForRoot(root, cache) | ||||
| 	} | ||||
| 	debugLog("effective expander options: %#v", expandOptions) | ||||
| 
 | ||||
| 	if context == nil { | ||||
| 		context = newResolverContext(expandOptions) | ||||
| 	} | ||||
| 
 | ||||
| 	return &schemaLoader{ | ||||
| 		root:    root, | ||||
| 		options: expandOptions, | ||||
| 		cache:   cache, | ||||
| 		context: context, | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										170
									
								
								vendor/github.com/go-openapi/spec/security_scheme.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										170
									
								
								vendor/github.com/go-openapi/spec/security_scheme.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,170 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| const ( | ||||
| 	basic       = "basic" | ||||
| 	apiKey      = "apiKey" | ||||
| 	oauth2      = "oauth2" | ||||
| 	implicit    = "implicit" | ||||
| 	password    = "password" | ||||
| 	application = "application" | ||||
| 	accessCode  = "accessCode" | ||||
| ) | ||||
| 
 | ||||
| // BasicAuth creates a basic auth security scheme | ||||
| func BasicAuth() *SecurityScheme { | ||||
| 	return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{Type: basic}} | ||||
| } | ||||
| 
 | ||||
| // APIKeyAuth creates an api key auth security scheme | ||||
| func APIKeyAuth(fieldName, valueSource string) *SecurityScheme { | ||||
| 	return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{Type: apiKey, Name: fieldName, In: valueSource}} | ||||
| } | ||||
| 
 | ||||
| // OAuth2Implicit creates an implicit flow oauth2 security scheme | ||||
| func OAuth2Implicit(authorizationURL string) *SecurityScheme { | ||||
| 	return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ | ||||
| 		Type:             oauth2, | ||||
| 		Flow:             implicit, | ||||
| 		AuthorizationURL: authorizationURL, | ||||
| 	}} | ||||
| } | ||||
| 
 | ||||
| // OAuth2Password creates a password flow oauth2 security scheme | ||||
| func OAuth2Password(tokenURL string) *SecurityScheme { | ||||
| 	return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ | ||||
| 		Type:     oauth2, | ||||
| 		Flow:     password, | ||||
| 		TokenURL: tokenURL, | ||||
| 	}} | ||||
| } | ||||
| 
 | ||||
| // OAuth2Application creates an application flow oauth2 security scheme | ||||
| func OAuth2Application(tokenURL string) *SecurityScheme { | ||||
| 	return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ | ||||
| 		Type:     oauth2, | ||||
| 		Flow:     application, | ||||
| 		TokenURL: tokenURL, | ||||
| 	}} | ||||
| } | ||||
| 
 | ||||
| // OAuth2AccessToken creates an access token flow oauth2 security scheme | ||||
| func OAuth2AccessToken(authorizationURL, tokenURL string) *SecurityScheme { | ||||
| 	return &SecurityScheme{SecuritySchemeProps: SecuritySchemeProps{ | ||||
| 		Type:             oauth2, | ||||
| 		Flow:             accessCode, | ||||
| 		AuthorizationURL: authorizationURL, | ||||
| 		TokenURL:         tokenURL, | ||||
| 	}} | ||||
| } | ||||
| 
 | ||||
| // SecuritySchemeProps describes a swagger security scheme in the securityDefinitions section | ||||
| type SecuritySchemeProps struct { | ||||
| 	Description      string            `json:"description,omitempty"` | ||||
| 	Type             string            `json:"type"` | ||||
| 	Name             string            `json:"name,omitempty"`     // api key | ||||
| 	In               string            `json:"in,omitempty"`       // api key | ||||
| 	Flow             string            `json:"flow,omitempty"`     // oauth2 | ||||
| 	AuthorizationURL string            `json:"authorizationUrl"`   // oauth2 | ||||
| 	TokenURL         string            `json:"tokenUrl,omitempty"` // oauth2 | ||||
| 	Scopes           map[string]string `json:"scopes,omitempty"`   // oauth2 | ||||
| } | ||||
| 
 | ||||
| // AddScope adds a scope to this security scheme | ||||
| func (s *SecuritySchemeProps) AddScope(scope, description string) { | ||||
| 	if s.Scopes == nil { | ||||
| 		s.Scopes = make(map[string]string) | ||||
| 	} | ||||
| 	s.Scopes[scope] = description | ||||
| } | ||||
| 
 | ||||
| // SecurityScheme allows the definition of a security scheme that can be used by the operations. | ||||
| // Supported schemes are basic authentication, an API key (either as a header or as a query parameter) | ||||
| // and OAuth2's common flows (implicit, password, application and access code). | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#securitySchemeObject | ||||
| type SecurityScheme struct { | ||||
| 	VendorExtensible | ||||
| 	SecuritySchemeProps | ||||
| } | ||||
| 
 | ||||
| // JSONLookup implements an interface to customize json pointer lookup | ||||
| func (s SecurityScheme) JSONLookup(token string) (interface{}, error) { | ||||
| 	if ex, ok := s.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 
 | ||||
| 	r, _, err := jsonpointer.GetForToken(s.SecuritySchemeProps, token) | ||||
| 	return r, err | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON marshal this to JSON | ||||
| func (s SecurityScheme) MarshalJSON() ([]byte, error) { | ||||
| 	var ( | ||||
| 		b1  []byte | ||||
| 		err error | ||||
| 	) | ||||
| 
 | ||||
| 	if s.Type == oauth2 && (s.Flow == "implicit" || s.Flow == "accessCode") { | ||||
| 		// when oauth2 for implicit or accessCode flows, empty AuthorizationURL is added as empty string | ||||
| 		b1, err = json.Marshal(s.SecuritySchemeProps) | ||||
| 	} else { | ||||
| 		// when not oauth2, empty AuthorizationURL should be omitted | ||||
| 		b1, err = json.Marshal(struct { | ||||
| 			Description      string            `json:"description,omitempty"` | ||||
| 			Type             string            `json:"type"` | ||||
| 			Name             string            `json:"name,omitempty"`             // api key | ||||
| 			In               string            `json:"in,omitempty"`               // api key | ||||
| 			Flow             string            `json:"flow,omitempty"`             // oauth2 | ||||
| 			AuthorizationURL string            `json:"authorizationUrl,omitempty"` // oauth2 | ||||
| 			TokenURL         string            `json:"tokenUrl,omitempty"`         // oauth2 | ||||
| 			Scopes           map[string]string `json:"scopes,omitempty"`           // oauth2 | ||||
| 		}{ | ||||
| 			Description:      s.Description, | ||||
| 			Type:             s.Type, | ||||
| 			Name:             s.Name, | ||||
| 			In:               s.In, | ||||
| 			Flow:             s.Flow, | ||||
| 			AuthorizationURL: s.AuthorizationURL, | ||||
| 			TokenURL:         s.TokenURL, | ||||
| 			Scopes:           s.Scopes, | ||||
| 		}) | ||||
| 	} | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	b2, err := json.Marshal(s.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return swag.ConcatJSON(b1, b2), nil | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON marshal this from JSON | ||||
| func (s *SecurityScheme) UnmarshalJSON(data []byte) error { | ||||
| 	if err := json.Unmarshal(data, &s.SecuritySchemeProps); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(data, &s.VendorExtensible) | ||||
| } | ||||
							
								
								
									
										78
									
								
								vendor/github.com/go-openapi/spec/spec.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										78
									
								
								vendor/github.com/go-openapi/spec/spec.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,78 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| ) | ||||
| 
 | ||||
| //go:generate curl -L --progress -o ./schemas/v2/schema.json http://swagger.io/v2/schema.json | ||||
| //go:generate curl -L --progress  -o ./schemas/jsonschema-draft-04.json http://json-schema.org/draft-04/schema | ||||
| //go:generate go-bindata -pkg=spec -prefix=./schemas -ignore=.*\.md ./schemas/... | ||||
| //go:generate perl -pi -e s,Json,JSON,g bindata.go | ||||
| 
 | ||||
| const ( | ||||
| 	// SwaggerSchemaURL the url for the swagger 2.0 schema to validate specs | ||||
| 	SwaggerSchemaURL = "http://swagger.io/v2/schema.json#" | ||||
| 	// JSONSchemaURL the url for the json schema schema | ||||
| 	JSONSchemaURL = "http://json-schema.org/draft-04/schema#" | ||||
| ) | ||||
| 
 | ||||
| // MustLoadJSONSchemaDraft04 panics when Swagger20Schema returns an error | ||||
| func MustLoadJSONSchemaDraft04() *Schema { | ||||
| 	d, e := JSONSchemaDraft04() | ||||
| 	if e != nil { | ||||
| 		panic(e) | ||||
| 	} | ||||
| 	return d | ||||
| } | ||||
| 
 | ||||
| // JSONSchemaDraft04 loads the json schema document for json shema draft04 | ||||
| func JSONSchemaDraft04() (*Schema, error) { | ||||
| 	b, err := Asset("jsonschema-draft-04.json") | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	schema := new(Schema) | ||||
| 	if err := json.Unmarshal(b, schema); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return schema, nil | ||||
| } | ||||
| 
 | ||||
| // MustLoadSwagger20Schema panics when Swagger20Schema returns an error | ||||
| func MustLoadSwagger20Schema() *Schema { | ||||
| 	d, e := Swagger20Schema() | ||||
| 	if e != nil { | ||||
| 		panic(e) | ||||
| 	} | ||||
| 	return d | ||||
| } | ||||
| 
 | ||||
| // Swagger20Schema loads the swagger 2.0 schema from the embedded assets | ||||
| func Swagger20Schema() (*Schema, error) { | ||||
| 
 | ||||
| 	b, err := Asset("v2/schema.json") | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 
 | ||||
| 	schema := new(Schema) | ||||
| 	if err := json.Unmarshal(b, schema); err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return schema, nil | ||||
| } | ||||
							
								
								
									
										448
									
								
								vendor/github.com/go-openapi/spec/swagger.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										448
									
								
								vendor/github.com/go-openapi/spec/swagger.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,448 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"encoding/gob" | ||||
| 	"encoding/json" | ||||
| 	"fmt" | ||||
| 	"strconv" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // Swagger this is the root document object for the API specification. | ||||
| // It combines what previously was the Resource Listing and API Declaration (version 1.2 and earlier) | ||||
| // together into one document. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#swagger-object- | ||||
| type Swagger struct { | ||||
| 	VendorExtensible | ||||
| 	SwaggerProps | ||||
| } | ||||
| 
 | ||||
| // JSONLookup look up a value by the json property name | ||||
| func (s Swagger) JSONLookup(token string) (interface{}, error) { | ||||
| 	if ex, ok := s.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 	r, _, err := jsonpointer.GetForToken(s.SwaggerProps, token) | ||||
| 	return r, err | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON marshals this swagger structure to json | ||||
| func (s Swagger) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(s.SwaggerProps) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b2, err := json.Marshal(s.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return swag.ConcatJSON(b1, b2), nil | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON unmarshals a swagger spec from json | ||||
| func (s *Swagger) UnmarshalJSON(data []byte) error { | ||||
| 	var sw Swagger | ||||
| 	if err := json.Unmarshal(data, &sw.SwaggerProps); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if err := json.Unmarshal(data, &sw.VendorExtensible); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	*s = sw | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // GobEncode provides a safe gob encoder for Swagger, including extensions | ||||
| func (s Swagger) GobEncode() ([]byte, error) { | ||||
| 	var b bytes.Buffer | ||||
| 	raw := struct { | ||||
| 		Props SwaggerProps | ||||
| 		Ext   VendorExtensible | ||||
| 	}{ | ||||
| 		Props: s.SwaggerProps, | ||||
| 		Ext:   s.VendorExtensible, | ||||
| 	} | ||||
| 	err := gob.NewEncoder(&b).Encode(raw) | ||||
| 	return b.Bytes(), err | ||||
| } | ||||
| 
 | ||||
| // GobDecode provides a safe gob decoder for Swagger, including extensions | ||||
| func (s *Swagger) GobDecode(b []byte) error { | ||||
| 	var raw struct { | ||||
| 		Props SwaggerProps | ||||
| 		Ext   VendorExtensible | ||||
| 	} | ||||
| 	buf := bytes.NewBuffer(b) | ||||
| 	err := gob.NewDecoder(buf).Decode(&raw) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	s.SwaggerProps = raw.Props | ||||
| 	s.VendorExtensible = raw.Ext | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // SwaggerProps captures the top-level properties of an Api specification | ||||
| // | ||||
| // NOTE: validation rules | ||||
| // - the scheme, when present must be from [http, https, ws, wss] | ||||
| // - BasePath must start with a leading "/" | ||||
| // - Paths is required | ||||
| type SwaggerProps struct { | ||||
| 	ID                  string                 `json:"id,omitempty"` | ||||
| 	Consumes            []string               `json:"consumes,omitempty"` | ||||
| 	Produces            []string               `json:"produces,omitempty"` | ||||
| 	Schemes             []string               `json:"schemes,omitempty"` | ||||
| 	Swagger             string                 `json:"swagger,omitempty"` | ||||
| 	Info                *Info                  `json:"info,omitempty"` | ||||
| 	Host                string                 `json:"host,omitempty"` | ||||
| 	BasePath            string                 `json:"basePath,omitempty"` | ||||
| 	Paths               *Paths                 `json:"paths"` | ||||
| 	Definitions         Definitions            `json:"definitions,omitempty"` | ||||
| 	Parameters          map[string]Parameter   `json:"parameters,omitempty"` | ||||
| 	Responses           map[string]Response    `json:"responses,omitempty"` | ||||
| 	SecurityDefinitions SecurityDefinitions    `json:"securityDefinitions,omitempty"` | ||||
| 	Security            []map[string][]string  `json:"security,omitempty"` | ||||
| 	Tags                []Tag                  `json:"tags,omitempty"` | ||||
| 	ExternalDocs        *ExternalDocumentation `json:"externalDocs,omitempty"` | ||||
| } | ||||
| 
 | ||||
| type swaggerPropsAlias SwaggerProps | ||||
| 
 | ||||
| type gobSwaggerPropsAlias struct { | ||||
| 	Security []map[string]struct { | ||||
| 		List []string | ||||
| 		Pad  bool | ||||
| 	} | ||||
| 	Alias           *swaggerPropsAlias | ||||
| 	SecurityIsEmpty bool | ||||
| } | ||||
| 
 | ||||
| // GobEncode provides a safe gob encoder for SwaggerProps, including empty security requirements | ||||
| func (o SwaggerProps) GobEncode() ([]byte, error) { | ||||
| 	raw := gobSwaggerPropsAlias{ | ||||
| 		Alias: (*swaggerPropsAlias)(&o), | ||||
| 	} | ||||
| 
 | ||||
| 	var b bytes.Buffer | ||||
| 	if o.Security == nil { | ||||
| 		// nil security requirement | ||||
| 		err := gob.NewEncoder(&b).Encode(raw) | ||||
| 		return b.Bytes(), err | ||||
| 	} | ||||
| 
 | ||||
| 	if len(o.Security) == 0 { | ||||
| 		// empty, but non-nil security requirement | ||||
| 		raw.SecurityIsEmpty = true | ||||
| 		raw.Alias.Security = nil | ||||
| 		err := gob.NewEncoder(&b).Encode(raw) | ||||
| 		return b.Bytes(), err | ||||
| 	} | ||||
| 
 | ||||
| 	raw.Security = make([]map[string]struct { | ||||
| 		List []string | ||||
| 		Pad  bool | ||||
| 	}, 0, len(o.Security)) | ||||
| 	for _, req := range o.Security { | ||||
| 		v := make(map[string]struct { | ||||
| 			List []string | ||||
| 			Pad  bool | ||||
| 		}, len(req)) | ||||
| 		for k, val := range req { | ||||
| 			v[k] = struct { | ||||
| 				List []string | ||||
| 				Pad  bool | ||||
| 			}{ | ||||
| 				List: val, | ||||
| 			} | ||||
| 		} | ||||
| 		raw.Security = append(raw.Security, v) | ||||
| 	} | ||||
| 
 | ||||
| 	err := gob.NewEncoder(&b).Encode(raw) | ||||
| 	return b.Bytes(), err | ||||
| } | ||||
| 
 | ||||
| // GobDecode provides a safe gob decoder for SwaggerProps, including empty security requirements | ||||
| func (o *SwaggerProps) GobDecode(b []byte) error { | ||||
| 	var raw gobSwaggerPropsAlias | ||||
| 
 | ||||
| 	buf := bytes.NewBuffer(b) | ||||
| 	err := gob.NewDecoder(buf).Decode(&raw) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if raw.Alias == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	switch { | ||||
| 	case raw.SecurityIsEmpty: | ||||
| 		// empty, but non-nil security requirement | ||||
| 		raw.Alias.Security = []map[string][]string{} | ||||
| 	case len(raw.Alias.Security) == 0: | ||||
| 		// nil security requirement | ||||
| 		raw.Alias.Security = nil | ||||
| 	default: | ||||
| 		raw.Alias.Security = make([]map[string][]string, 0, len(raw.Security)) | ||||
| 		for _, req := range raw.Security { | ||||
| 			v := make(map[string][]string, len(req)) | ||||
| 			for k, val := range req { | ||||
| 				v[k] = make([]string, 0, len(val.List)) | ||||
| 				v[k] = append(v[k], val.List...) | ||||
| 			} | ||||
| 			raw.Alias.Security = append(raw.Alias.Security, v) | ||||
| 		} | ||||
| 	} | ||||
| 
 | ||||
| 	*o = *(*SwaggerProps)(raw.Alias) | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // Dependencies represent a dependencies property | ||||
| type Dependencies map[string]SchemaOrStringArray | ||||
| 
 | ||||
| // SchemaOrBool represents a schema or boolean value, is biased towards true for the boolean property | ||||
| type SchemaOrBool struct { | ||||
| 	Allows bool | ||||
| 	Schema *Schema | ||||
| } | ||||
| 
 | ||||
| // JSONLookup implements an interface to customize json pointer lookup | ||||
| func (s SchemaOrBool) JSONLookup(token string) (interface{}, error) { | ||||
| 	if token == "allows" { | ||||
| 		return s.Allows, nil | ||||
| 	} | ||||
| 	r, _, err := jsonpointer.GetForToken(s.Schema, token) | ||||
| 	return r, err | ||||
| } | ||||
| 
 | ||||
| var jsTrue = []byte("true") | ||||
| var jsFalse = []byte("false") | ||||
| 
 | ||||
| // MarshalJSON convert this object to JSON | ||||
| func (s SchemaOrBool) MarshalJSON() ([]byte, error) { | ||||
| 	if s.Schema != nil { | ||||
| 		return json.Marshal(s.Schema) | ||||
| 	} | ||||
| 
 | ||||
| 	if s.Schema == nil && !s.Allows { | ||||
| 		return jsFalse, nil | ||||
| 	} | ||||
| 	return jsTrue, nil | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON converts this bool or schema object from a JSON structure | ||||
| func (s *SchemaOrBool) UnmarshalJSON(data []byte) error { | ||||
| 	var nw SchemaOrBool | ||||
| 	if len(data) >= 4 { | ||||
| 		if data[0] == '{' { | ||||
| 			var sch Schema | ||||
| 			if err := json.Unmarshal(data, &sch); err != nil { | ||||
| 				return err | ||||
| 			} | ||||
| 			nw.Schema = &sch | ||||
| 		} | ||||
| 		nw.Allows = !(data[0] == 'f' && data[1] == 'a' && data[2] == 'l' && data[3] == 's' && data[4] == 'e') | ||||
| 	} | ||||
| 	*s = nw | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // SchemaOrStringArray represents a schema or a string array | ||||
| type SchemaOrStringArray struct { | ||||
| 	Schema   *Schema | ||||
| 	Property []string | ||||
| } | ||||
| 
 | ||||
| // JSONLookup implements an interface to customize json pointer lookup | ||||
| func (s SchemaOrStringArray) JSONLookup(token string) (interface{}, error) { | ||||
| 	r, _, err := jsonpointer.GetForToken(s.Schema, token) | ||||
| 	return r, err | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON converts this schema object or array into JSON structure | ||||
| func (s SchemaOrStringArray) MarshalJSON() ([]byte, error) { | ||||
| 	if len(s.Property) > 0 { | ||||
| 		return json.Marshal(s.Property) | ||||
| 	} | ||||
| 	if s.Schema != nil { | ||||
| 		return json.Marshal(s.Schema) | ||||
| 	} | ||||
| 	return []byte("null"), nil | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON converts this schema object or array from a JSON structure | ||||
| func (s *SchemaOrStringArray) UnmarshalJSON(data []byte) error { | ||||
| 	var first byte | ||||
| 	if len(data) > 1 { | ||||
| 		first = data[0] | ||||
| 	} | ||||
| 	var nw SchemaOrStringArray | ||||
| 	if first == '{' { | ||||
| 		var sch Schema | ||||
| 		if err := json.Unmarshal(data, &sch); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		nw.Schema = &sch | ||||
| 	} | ||||
| 	if first == '[' { | ||||
| 		if err := json.Unmarshal(data, &nw.Property); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	*s = nw | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // Definitions contains the models explicitly defined in this spec | ||||
| // An object to hold data types that can be consumed and produced by operations. | ||||
| // These data types can be primitives, arrays or models. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#definitionsObject | ||||
| type Definitions map[string]Schema | ||||
| 
 | ||||
| // SecurityDefinitions a declaration of the security schemes available to be used in the specification. | ||||
| // This does not enforce the security schemes on the operations and only serves to provide | ||||
| // the relevant details for each scheme. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#securityDefinitionsObject | ||||
| type SecurityDefinitions map[string]*SecurityScheme | ||||
| 
 | ||||
| // StringOrArray represents a value that can either be a string | ||||
| // or an array of strings. Mainly here for serialization purposes | ||||
| type StringOrArray []string | ||||
| 
 | ||||
| // Contains returns true when the value is contained in the slice | ||||
| func (s StringOrArray) Contains(value string) bool { | ||||
| 	for _, str := range s { | ||||
| 		if str == value { | ||||
| 			return true | ||||
| 		} | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // JSONLookup implements an interface to customize json pointer lookup | ||||
| func (s SchemaOrArray) JSONLookup(token string) (interface{}, error) { | ||||
| 	if _, err := strconv.Atoi(token); err == nil { | ||||
| 		r, _, err := jsonpointer.GetForToken(s.Schemas, token) | ||||
| 		return r, err | ||||
| 	} | ||||
| 	r, _, err := jsonpointer.GetForToken(s.Schema, token) | ||||
| 	return r, err | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON unmarshals this string or array object from a JSON array or JSON string | ||||
| func (s *StringOrArray) UnmarshalJSON(data []byte) error { | ||||
| 	var first byte | ||||
| 	if len(data) > 1 { | ||||
| 		first = data[0] | ||||
| 	} | ||||
| 
 | ||||
| 	if first == '[' { | ||||
| 		var parsed []string | ||||
| 		if err := json.Unmarshal(data, &parsed); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		*s = StringOrArray(parsed) | ||||
| 		return nil | ||||
| 	} | ||||
| 
 | ||||
| 	var single interface{} | ||||
| 	if err := json.Unmarshal(data, &single); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	if single == nil { | ||||
| 		return nil | ||||
| 	} | ||||
| 	switch v := single.(type) { | ||||
| 	case string: | ||||
| 		*s = StringOrArray([]string{v}) | ||||
| 		return nil | ||||
| 	default: | ||||
| 		return fmt.Errorf("only string or array is allowed, not %T", single) | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON converts this string or array to a JSON array or JSON string | ||||
| func (s StringOrArray) MarshalJSON() ([]byte, error) { | ||||
| 	if len(s) == 1 { | ||||
| 		return json.Marshal([]string(s)[0]) | ||||
| 	} | ||||
| 	return json.Marshal([]string(s)) | ||||
| } | ||||
| 
 | ||||
| // SchemaOrArray represents a value that can either be a Schema | ||||
| // or an array of Schema. Mainly here for serialization purposes | ||||
| type SchemaOrArray struct { | ||||
| 	Schema  *Schema | ||||
| 	Schemas []Schema | ||||
| } | ||||
| 
 | ||||
| // Len returns the number of schemas in this property | ||||
| func (s SchemaOrArray) Len() int { | ||||
| 	if s.Schema != nil { | ||||
| 		return 1 | ||||
| 	} | ||||
| 	return len(s.Schemas) | ||||
| } | ||||
| 
 | ||||
| // ContainsType returns true when one of the schemas is of the specified type | ||||
| func (s *SchemaOrArray) ContainsType(name string) bool { | ||||
| 	if s.Schema != nil { | ||||
| 		return s.Schema.Type != nil && s.Schema.Type.Contains(name) | ||||
| 	} | ||||
| 	return false | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON converts this schema object or array into JSON structure | ||||
| func (s SchemaOrArray) MarshalJSON() ([]byte, error) { | ||||
| 	if len(s.Schemas) > 0 { | ||||
| 		return json.Marshal(s.Schemas) | ||||
| 	} | ||||
| 	return json.Marshal(s.Schema) | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON converts this schema object or array from a JSON structure | ||||
| func (s *SchemaOrArray) UnmarshalJSON(data []byte) error { | ||||
| 	var nw SchemaOrArray | ||||
| 	var first byte | ||||
| 	if len(data) > 1 { | ||||
| 		first = data[0] | ||||
| 	} | ||||
| 	if first == '{' { | ||||
| 		var sch Schema | ||||
| 		if err := json.Unmarshal(data, &sch); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 		nw.Schema = &sch | ||||
| 	} | ||||
| 	if first == '[' { | ||||
| 		if err := json.Unmarshal(data, &nw.Schemas); err != nil { | ||||
| 			return err | ||||
| 		} | ||||
| 	} | ||||
| 	*s = nw | ||||
| 	return nil | ||||
| } | ||||
| 
 | ||||
| // vim:set ft=go noet sts=2 sw=2 ts=2: | ||||
							
								
								
									
										75
									
								
								vendor/github.com/go-openapi/spec/tag.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								vendor/github.com/go-openapi/spec/tag.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,75 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 
 | ||||
| 	"github.com/go-openapi/jsonpointer" | ||||
| 	"github.com/go-openapi/swag" | ||||
| ) | ||||
| 
 | ||||
| // TagProps describe a tag entry in the top level tags section of a swagger spec | ||||
| type TagProps struct { | ||||
| 	Description  string                 `json:"description,omitempty"` | ||||
| 	Name         string                 `json:"name,omitempty"` | ||||
| 	ExternalDocs *ExternalDocumentation `json:"externalDocs,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // NewTag creates a new tag | ||||
| func NewTag(name, description string, externalDocs *ExternalDocumentation) Tag { | ||||
| 	return Tag{TagProps: TagProps{Description: description, Name: name, ExternalDocs: externalDocs}} | ||||
| } | ||||
| 
 | ||||
| // Tag allows adding meta data to a single tag that is used by the | ||||
| // [Operation Object](http://goo.gl/8us55a#operationObject). | ||||
| // It is not mandatory to have a Tag Object per tag used there. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#tagObject | ||||
| type Tag struct { | ||||
| 	VendorExtensible | ||||
| 	TagProps | ||||
| } | ||||
| 
 | ||||
| // JSONLookup implements an interface to customize json pointer lookup | ||||
| func (t Tag) JSONLookup(token string) (interface{}, error) { | ||||
| 	if ex, ok := t.Extensions[token]; ok { | ||||
| 		return &ex, nil | ||||
| 	} | ||||
| 
 | ||||
| 	r, _, err := jsonpointer.GetForToken(t.TagProps, token) | ||||
| 	return r, err | ||||
| } | ||||
| 
 | ||||
| // MarshalJSON marshal this to JSON | ||||
| func (t Tag) MarshalJSON() ([]byte, error) { | ||||
| 	b1, err := json.Marshal(t.TagProps) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	b2, err := json.Marshal(t.VendorExtensible) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
| 	return swag.ConcatJSON(b1, b2), nil | ||||
| } | ||||
| 
 | ||||
| // UnmarshalJSON marshal this from JSON | ||||
| func (t *Tag) UnmarshalJSON(data []byte) error { | ||||
| 	if err := json.Unmarshal(data, &t.TagProps); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	return json.Unmarshal(data, &t.VendorExtensible) | ||||
| } | ||||
							
								
								
									
										8
									
								
								vendor/github.com/go-openapi/spec/url_go18.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								vendor/github.com/go-openapi/spec/url_go18.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,8 @@ | |||
| //go:build !go1.19 | ||||
| // +build !go1.19 | ||||
| 
 | ||||
| package spec | ||||
| 
 | ||||
| import "net/url" | ||||
| 
 | ||||
| var parseURL = url.Parse | ||||
							
								
								
									
										14
									
								
								vendor/github.com/go-openapi/spec/url_go19.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								vendor/github.com/go-openapi/spec/url_go19.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,14 @@ | |||
| //go:build go1.19 | ||||
| // +build go1.19 | ||||
| 
 | ||||
| package spec | ||||
| 
 | ||||
| import "net/url" | ||||
| 
 | ||||
| func parseURL(s string) (*url.URL, error) { | ||||
| 	u, err := url.Parse(s) | ||||
| 	if err == nil { | ||||
| 		u.OmitHost = false | ||||
| 	} | ||||
| 	return u, err | ||||
| } | ||||
							
								
								
									
										215
									
								
								vendor/github.com/go-openapi/spec/validations.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								vendor/github.com/go-openapi/spec/validations.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,215 @@ | |||
| package spec | ||||
| 
 | ||||
| // CommonValidations describe common JSON-schema validations | ||||
| type CommonValidations struct { | ||||
| 	Maximum          *float64      `json:"maximum,omitempty"` | ||||
| 	ExclusiveMaximum bool          `json:"exclusiveMaximum,omitempty"` | ||||
| 	Minimum          *float64      `json:"minimum,omitempty"` | ||||
| 	ExclusiveMinimum bool          `json:"exclusiveMinimum,omitempty"` | ||||
| 	MaxLength        *int64        `json:"maxLength,omitempty"` | ||||
| 	MinLength        *int64        `json:"minLength,omitempty"` | ||||
| 	Pattern          string        `json:"pattern,omitempty"` | ||||
| 	MaxItems         *int64        `json:"maxItems,omitempty"` | ||||
| 	MinItems         *int64        `json:"minItems,omitempty"` | ||||
| 	UniqueItems      bool          `json:"uniqueItems,omitempty"` | ||||
| 	MultipleOf       *float64      `json:"multipleOf,omitempty"` | ||||
| 	Enum             []interface{} `json:"enum,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // SetValidations defines all validations for a simple schema. | ||||
| // | ||||
| // NOTE: the input is the larger set of validations available for schemas. | ||||
| // For simple schemas, MinProperties and MaxProperties are ignored. | ||||
| func (v *CommonValidations) SetValidations(val SchemaValidations) { | ||||
| 	v.Maximum = val.Maximum | ||||
| 	v.ExclusiveMaximum = val.ExclusiveMaximum | ||||
| 	v.Minimum = val.Minimum | ||||
| 	v.ExclusiveMinimum = val.ExclusiveMinimum | ||||
| 	v.MaxLength = val.MaxLength | ||||
| 	v.MinLength = val.MinLength | ||||
| 	v.Pattern = val.Pattern | ||||
| 	v.MaxItems = val.MaxItems | ||||
| 	v.MinItems = val.MinItems | ||||
| 	v.UniqueItems = val.UniqueItems | ||||
| 	v.MultipleOf = val.MultipleOf | ||||
| 	v.Enum = val.Enum | ||||
| } | ||||
| 
 | ||||
| type clearedValidation struct { | ||||
| 	Validation string | ||||
| 	Value      interface{} | ||||
| } | ||||
| 
 | ||||
| type clearedValidations []clearedValidation | ||||
| 
 | ||||
| func (c clearedValidations) apply(cbs []func(string, interface{})) { | ||||
| 	for _, cb := range cbs { | ||||
| 		for _, cleared := range c { | ||||
| 			cb(cleared.Validation, cleared.Value) | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // ClearNumberValidations clears all number validations. | ||||
| // | ||||
| // Some callbacks may be set by the caller to capture changed values. | ||||
| func (v *CommonValidations) ClearNumberValidations(cbs ...func(string, interface{})) { | ||||
| 	done := make(clearedValidations, 0, 5) | ||||
| 	defer func() { | ||||
| 		done.apply(cbs) | ||||
| 	}() | ||||
| 
 | ||||
| 	if v.Minimum != nil { | ||||
| 		done = append(done, clearedValidation{Validation: "minimum", Value: v.Minimum}) | ||||
| 		v.Minimum = nil | ||||
| 	} | ||||
| 	if v.Maximum != nil { | ||||
| 		done = append(done, clearedValidation{Validation: "maximum", Value: v.Maximum}) | ||||
| 		v.Maximum = nil | ||||
| 	} | ||||
| 	if v.ExclusiveMaximum { | ||||
| 		done = append(done, clearedValidation{Validation: "exclusiveMaximum", Value: v.ExclusiveMaximum}) | ||||
| 		v.ExclusiveMaximum = false | ||||
| 	} | ||||
| 	if v.ExclusiveMinimum { | ||||
| 		done = append(done, clearedValidation{Validation: "exclusiveMinimum", Value: v.ExclusiveMinimum}) | ||||
| 		v.ExclusiveMinimum = false | ||||
| 	} | ||||
| 	if v.MultipleOf != nil { | ||||
| 		done = append(done, clearedValidation{Validation: "multipleOf", Value: v.MultipleOf}) | ||||
| 		v.MultipleOf = nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // ClearStringValidations clears all string validations. | ||||
| // | ||||
| // Some callbacks may be set by the caller to capture changed values. | ||||
| func (v *CommonValidations) ClearStringValidations(cbs ...func(string, interface{})) { | ||||
| 	done := make(clearedValidations, 0, 3) | ||||
| 	defer func() { | ||||
| 		done.apply(cbs) | ||||
| 	}() | ||||
| 
 | ||||
| 	if v.Pattern != "" { | ||||
| 		done = append(done, clearedValidation{Validation: "pattern", Value: v.Pattern}) | ||||
| 		v.Pattern = "" | ||||
| 	} | ||||
| 	if v.MinLength != nil { | ||||
| 		done = append(done, clearedValidation{Validation: "minLength", Value: v.MinLength}) | ||||
| 		v.MinLength = nil | ||||
| 	} | ||||
| 	if v.MaxLength != nil { | ||||
| 		done = append(done, clearedValidation{Validation: "maxLength", Value: v.MaxLength}) | ||||
| 		v.MaxLength = nil | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // ClearArrayValidations clears all array validations. | ||||
| // | ||||
| // Some callbacks may be set by the caller to capture changed values. | ||||
| func (v *CommonValidations) ClearArrayValidations(cbs ...func(string, interface{})) { | ||||
| 	done := make(clearedValidations, 0, 3) | ||||
| 	defer func() { | ||||
| 		done.apply(cbs) | ||||
| 	}() | ||||
| 
 | ||||
| 	if v.MaxItems != nil { | ||||
| 		done = append(done, clearedValidation{Validation: "maxItems", Value: v.MaxItems}) | ||||
| 		v.MaxItems = nil | ||||
| 	} | ||||
| 	if v.MinItems != nil { | ||||
| 		done = append(done, clearedValidation{Validation: "minItems", Value: v.MinItems}) | ||||
| 		v.MinItems = nil | ||||
| 	} | ||||
| 	if v.UniqueItems { | ||||
| 		done = append(done, clearedValidation{Validation: "uniqueItems", Value: v.UniqueItems}) | ||||
| 		v.UniqueItems = false | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // Validations returns a clone of the validations for a simple schema. | ||||
| // | ||||
| // NOTE: in the context of simple schema objects, MinProperties, MaxProperties | ||||
| // and PatternProperties remain unset. | ||||
| func (v CommonValidations) Validations() SchemaValidations { | ||||
| 	return SchemaValidations{ | ||||
| 		CommonValidations: v, | ||||
| 	} | ||||
| } | ||||
| 
 | ||||
| // HasNumberValidations indicates if the validations are for numbers or integers | ||||
| func (v CommonValidations) HasNumberValidations() bool { | ||||
| 	return v.Maximum != nil || v.Minimum != nil || v.MultipleOf != nil | ||||
| } | ||||
| 
 | ||||
| // HasStringValidations indicates if the validations are for strings | ||||
| func (v CommonValidations) HasStringValidations() bool { | ||||
| 	return v.MaxLength != nil || v.MinLength != nil || v.Pattern != "" | ||||
| } | ||||
| 
 | ||||
| // HasArrayValidations indicates if the validations are for arrays | ||||
| func (v CommonValidations) HasArrayValidations() bool { | ||||
| 	return v.MaxItems != nil || v.MinItems != nil || v.UniqueItems | ||||
| } | ||||
| 
 | ||||
| // HasEnum indicates if the validation includes some enum constraint | ||||
| func (v CommonValidations) HasEnum() bool { | ||||
| 	return len(v.Enum) > 0 | ||||
| } | ||||
| 
 | ||||
| // SchemaValidations describes the validation properties of a schema | ||||
| // | ||||
| // NOTE: at this moment, this is not embedded in SchemaProps because this would induce a breaking change | ||||
| // in the exported members: all initializers using litterals would fail. | ||||
| type SchemaValidations struct { | ||||
| 	CommonValidations | ||||
| 
 | ||||
| 	PatternProperties SchemaProperties `json:"patternProperties,omitempty"` | ||||
| 	MaxProperties     *int64           `json:"maxProperties,omitempty"` | ||||
| 	MinProperties     *int64           `json:"minProperties,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // HasObjectValidations indicates if the validations are for objects | ||||
| func (v SchemaValidations) HasObjectValidations() bool { | ||||
| 	return v.MaxProperties != nil || v.MinProperties != nil || v.PatternProperties != nil | ||||
| } | ||||
| 
 | ||||
| // SetValidations for schema validations | ||||
| func (v *SchemaValidations) SetValidations(val SchemaValidations) { | ||||
| 	v.CommonValidations.SetValidations(val) | ||||
| 	v.PatternProperties = val.PatternProperties | ||||
| 	v.MaxProperties = val.MaxProperties | ||||
| 	v.MinProperties = val.MinProperties | ||||
| } | ||||
| 
 | ||||
| // Validations for a schema | ||||
| func (v SchemaValidations) Validations() SchemaValidations { | ||||
| 	val := v.CommonValidations.Validations() | ||||
| 	val.PatternProperties = v.PatternProperties | ||||
| 	val.MinProperties = v.MinProperties | ||||
| 	val.MaxProperties = v.MaxProperties | ||||
| 	return val | ||||
| } | ||||
| 
 | ||||
| // ClearObjectValidations returns a clone of the validations with all object validations cleared. | ||||
| // | ||||
| // Some callbacks may be set by the caller to capture changed values. | ||||
| func (v *SchemaValidations) ClearObjectValidations(cbs ...func(string, interface{})) { | ||||
| 	done := make(clearedValidations, 0, 3) | ||||
| 	defer func() { | ||||
| 		done.apply(cbs) | ||||
| 	}() | ||||
| 
 | ||||
| 	if v.MaxProperties != nil { | ||||
| 		done = append(done, clearedValidation{Validation: "maxProperties", Value: v.MaxProperties}) | ||||
| 		v.MaxProperties = nil | ||||
| 	} | ||||
| 	if v.MinProperties != nil { | ||||
| 		done = append(done, clearedValidation{Validation: "minProperties", Value: v.MinProperties}) | ||||
| 		v.MinProperties = nil | ||||
| 	} | ||||
| 	if v.PatternProperties != nil { | ||||
| 		done = append(done, clearedValidation{Validation: "patternProperties", Value: v.PatternProperties}) | ||||
| 		v.PatternProperties = nil | ||||
| 	} | ||||
| } | ||||
							
								
								
									
										68
									
								
								vendor/github.com/go-openapi/spec/xml_object.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								vendor/github.com/go-openapi/spec/xml_object.go
									
										
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							|  | @ -0,0 +1,68 @@ | |||
| // Copyright 2015 go-swagger maintainers | ||||
| // | ||||
| // 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 spec | ||||
| 
 | ||||
| // XMLObject a metadata object that allows for more fine-tuned XML model definitions. | ||||
| // | ||||
| // For more information: http://goo.gl/8us55a#xmlObject | ||||
| type XMLObject struct { | ||||
| 	Name      string `json:"name,omitempty"` | ||||
| 	Namespace string `json:"namespace,omitempty"` | ||||
| 	Prefix    string `json:"prefix,omitempty"` | ||||
| 	Attribute bool   `json:"attribute,omitempty"` | ||||
| 	Wrapped   bool   `json:"wrapped,omitempty"` | ||||
| } | ||||
| 
 | ||||
| // WithName sets the xml name for the object | ||||
| func (x *XMLObject) WithName(name string) *XMLObject { | ||||
| 	x.Name = name | ||||
| 	return x | ||||
| } | ||||
| 
 | ||||
| // WithNamespace sets the xml namespace for the object | ||||
| func (x *XMLObject) WithNamespace(namespace string) *XMLObject { | ||||
| 	x.Namespace = namespace | ||||
| 	return x | ||||
| } | ||||
| 
 | ||||
| // WithPrefix sets the xml prefix for the object | ||||
| func (x *XMLObject) WithPrefix(prefix string) *XMLObject { | ||||
| 	x.Prefix = prefix | ||||
| 	return x | ||||
| } | ||||
| 
 | ||||
| // AsAttribute flags this object as xml attribute | ||||
| func (x *XMLObject) AsAttribute() *XMLObject { | ||||
| 	x.Attribute = true | ||||
| 	return x | ||||
| } | ||||
| 
 | ||||
| // AsElement flags this object as an xml node | ||||
| func (x *XMLObject) AsElement() *XMLObject { | ||||
| 	x.Attribute = false | ||||
| 	return x | ||||
| } | ||||
| 
 | ||||
| // AsWrapped flags this object as wrapped, this is mostly useful for array types | ||||
| func (x *XMLObject) AsWrapped() *XMLObject { | ||||
| 	x.Wrapped = true | ||||
| 	return x | ||||
| } | ||||
| 
 | ||||
| // AsUnwrapped flags this object as an xml node | ||||
| func (x *XMLObject) AsUnwrapped() *XMLObject { | ||||
| 	x.Wrapped = false | ||||
| 	return x | ||||
| } | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue