planetscale 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (378) hide show
  1. checksums.yaml +7 -0
  2. data/.github/workflows/ci.yml +24 -0
  3. data/.github/workflows/gem-push.yml +38 -0
  4. data/.github/workflows/licensed.yml +43 -0
  5. data/.gitignore +10 -0
  6. data/.licensed.yml +9 -0
  7. data/.licenses/go/github.com/armon/circbuf.dep.yml +31 -0
  8. data/.licenses/go/github.com/gorilla/mux.dep.yml +41 -0
  9. data/.licenses/go/github.com/hashicorp/go-cleanhttp.dep.yml +375 -0
  10. data/.licenses/go/github.com/mitchellh/go-homedir.dep.yml +32 -0
  11. data/.licenses/go/github.com/pkg/errors.dep.yml +36 -0
  12. data/.licenses/go/github.com/planetscale/planetscale-go/planetscale.dep.yml +160 -0
  13. data/.licenses/go/github.com/planetscale/sql-proxy/proxy.dep.yml +180 -0
  14. data/.licenses/go/go.uber.org/atomic.dep.yml +31 -0
  15. data/.licenses/go/go.uber.org/multierr.dep.yml +30 -0
  16. data/.licenses/go/go.uber.org/zap.dep.yml +30 -0
  17. data/.licenses/go/go.uber.org/zap/buffer.dep.yml +30 -0
  18. data/.licenses/go/go.uber.org/zap/internal/bufferpool.dep.yml +30 -0
  19. data/.licenses/go/go.uber.org/zap/internal/color.dep.yml +30 -0
  20. data/.licenses/go/go.uber.org/zap/internal/exit.dep.yml +31 -0
  21. data/.licenses/go/go.uber.org/zap/zapcore.dep.yml +31 -0
  22. data/.licenses/go/golang.org/x/net/context/ctxhttp.dep.yml +63 -0
  23. data/.licenses/go/golang.org/x/oauth2.dep.yml +44 -0
  24. data/.licenses/go/golang.org/x/oauth2/internal.dep.yml +38 -0
  25. data/.ruby_version +1 -0
  26. data/Gemfile +8 -0
  27. data/LICENSE +201 -0
  28. data/README.md +88 -0
  29. data/Rakefile +10 -0
  30. data/bin/console +15 -0
  31. data/bin/setup +17 -0
  32. data/controller.go +255 -0
  33. data/go.mod +16 -0
  34. data/go.sum +428 -0
  35. data/lib/generators/planetscale/install_generator.rb +58 -0
  36. data/lib/planetscale.rb +137 -0
  37. data/lib/planetscale/version.rb +5 -0
  38. data/planetscale.gemspec +44 -0
  39. data/proxy.go +128 -0
  40. data/vendor/github.com/armon/circbuf/.gitignore +22 -0
  41. data/vendor/github.com/armon/circbuf/LICENSE +20 -0
  42. data/vendor/github.com/armon/circbuf/README.md +28 -0
  43. data/vendor/github.com/armon/circbuf/circbuf.go +92 -0
  44. data/vendor/github.com/armon/circbuf/go.mod +1 -0
  45. data/vendor/github.com/golang/protobuf/AUTHORS +3 -0
  46. data/vendor/github.com/golang/protobuf/CONTRIBUTORS +3 -0
  47. data/vendor/github.com/golang/protobuf/LICENSE +28 -0
  48. data/vendor/github.com/golang/protobuf/proto/buffer.go +324 -0
  49. data/vendor/github.com/golang/protobuf/proto/defaults.go +63 -0
  50. data/vendor/github.com/golang/protobuf/proto/deprecated.go +113 -0
  51. data/vendor/github.com/golang/protobuf/proto/discard.go +58 -0
  52. data/vendor/github.com/golang/protobuf/proto/extensions.go +356 -0
  53. data/vendor/github.com/golang/protobuf/proto/properties.go +306 -0
  54. data/vendor/github.com/golang/protobuf/proto/proto.go +167 -0
  55. data/vendor/github.com/golang/protobuf/proto/registry.go +317 -0
  56. data/vendor/github.com/golang/protobuf/proto/text_decode.go +801 -0
  57. data/vendor/github.com/golang/protobuf/proto/text_encode.go +560 -0
  58. data/vendor/github.com/golang/protobuf/proto/wire.go +78 -0
  59. data/vendor/github.com/golang/protobuf/proto/wrappers.go +34 -0
  60. data/vendor/github.com/gorilla/mux/AUTHORS +8 -0
  61. data/vendor/github.com/gorilla/mux/LICENSE +27 -0
  62. data/vendor/github.com/gorilla/mux/README.md +805 -0
  63. data/vendor/github.com/gorilla/mux/doc.go +306 -0
  64. data/vendor/github.com/gorilla/mux/go.mod +3 -0
  65. data/vendor/github.com/gorilla/mux/middleware.go +74 -0
  66. data/vendor/github.com/gorilla/mux/mux.go +606 -0
  67. data/vendor/github.com/gorilla/mux/regexp.go +388 -0
  68. data/vendor/github.com/gorilla/mux/route.go +736 -0
  69. data/vendor/github.com/gorilla/mux/test_helpers.go +19 -0
  70. data/vendor/github.com/hashicorp/go-cleanhttp/LICENSE +363 -0
  71. data/vendor/github.com/hashicorp/go-cleanhttp/README.md +30 -0
  72. data/vendor/github.com/hashicorp/go-cleanhttp/cleanhttp.go +58 -0
  73. data/vendor/github.com/hashicorp/go-cleanhttp/doc.go +20 -0
  74. data/vendor/github.com/hashicorp/go-cleanhttp/go.mod +3 -0
  75. data/vendor/github.com/hashicorp/go-cleanhttp/handlers.go +48 -0
  76. data/vendor/github.com/mitchellh/go-homedir/LICENSE +21 -0
  77. data/vendor/github.com/mitchellh/go-homedir/README.md +14 -0
  78. data/vendor/github.com/mitchellh/go-homedir/go.mod +1 -0
  79. data/vendor/github.com/mitchellh/go-homedir/homedir.go +167 -0
  80. data/vendor/github.com/pkg/errors/.gitignore +24 -0
  81. data/vendor/github.com/pkg/errors/.travis.yml +10 -0
  82. data/vendor/github.com/pkg/errors/LICENSE +23 -0
  83. data/vendor/github.com/pkg/errors/Makefile +44 -0
  84. data/vendor/github.com/pkg/errors/README.md +59 -0
  85. data/vendor/github.com/pkg/errors/appveyor.yml +32 -0
  86. data/vendor/github.com/pkg/errors/errors.go +288 -0
  87. data/vendor/github.com/pkg/errors/go113.go +38 -0
  88. data/vendor/github.com/pkg/errors/stack.go +177 -0
  89. data/vendor/github.com/planetscale/planetscale-go/planetscale/backups.go +139 -0
  90. data/vendor/github.com/planetscale/planetscale-go/planetscale/branches.go +258 -0
  91. data/vendor/github.com/planetscale/planetscale-go/planetscale/certs.go +142 -0
  92. data/vendor/github.com/planetscale/planetscale-go/planetscale/client.go +305 -0
  93. data/vendor/github.com/planetscale/planetscale-go/planetscale/databases.go +131 -0
  94. data/vendor/github.com/planetscale/planetscale-go/planetscale/deploy_requests.go +368 -0
  95. data/vendor/github.com/planetscale/planetscale-go/planetscale/organizations.go +78 -0
  96. data/vendor/github.com/planetscale/planetscale-go/planetscale/service_tokens.go +163 -0
  97. data/vendor/github.com/planetscale/sql-proxy/proxy/client.go +467 -0
  98. data/vendor/github.com/planetscale/sql-proxy/proxy/tls_cache.go +73 -0
  99. data/vendor/go.uber.org/atomic/.codecov.yml +19 -0
  100. data/vendor/go.uber.org/atomic/.gitignore +12 -0
  101. data/vendor/go.uber.org/atomic/.travis.yml +27 -0
  102. data/vendor/go.uber.org/atomic/CHANGELOG.md +76 -0
  103. data/vendor/go.uber.org/atomic/LICENSE.txt +19 -0
  104. data/vendor/go.uber.org/atomic/Makefile +78 -0
  105. data/vendor/go.uber.org/atomic/README.md +63 -0
  106. data/vendor/go.uber.org/atomic/bool.go +81 -0
  107. data/vendor/go.uber.org/atomic/bool_ext.go +53 -0
  108. data/vendor/go.uber.org/atomic/doc.go +23 -0
  109. data/vendor/go.uber.org/atomic/duration.go +82 -0
  110. data/vendor/go.uber.org/atomic/duration_ext.go +40 -0
  111. data/vendor/go.uber.org/atomic/error.go +51 -0
  112. data/vendor/go.uber.org/atomic/error_ext.go +39 -0
  113. data/vendor/go.uber.org/atomic/float64.go +76 -0
  114. data/vendor/go.uber.org/atomic/float64_ext.go +47 -0
  115. data/vendor/go.uber.org/atomic/gen.go +26 -0
  116. data/vendor/go.uber.org/atomic/go.mod +8 -0
  117. data/vendor/go.uber.org/atomic/go.sum +9 -0
  118. data/vendor/go.uber.org/atomic/int32.go +102 -0
  119. data/vendor/go.uber.org/atomic/int64.go +102 -0
  120. data/vendor/go.uber.org/atomic/nocmp.go +35 -0
  121. data/vendor/go.uber.org/atomic/string.go +54 -0
  122. data/vendor/go.uber.org/atomic/string_ext.go +43 -0
  123. data/vendor/go.uber.org/atomic/uint32.go +102 -0
  124. data/vendor/go.uber.org/atomic/uint64.go +102 -0
  125. data/vendor/go.uber.org/atomic/value.go +31 -0
  126. data/vendor/go.uber.org/multierr/.codecov.yml +15 -0
  127. data/vendor/go.uber.org/multierr/.gitignore +4 -0
  128. data/vendor/go.uber.org/multierr/.travis.yml +23 -0
  129. data/vendor/go.uber.org/multierr/CHANGELOG.md +60 -0
  130. data/vendor/go.uber.org/multierr/LICENSE.txt +19 -0
  131. data/vendor/go.uber.org/multierr/Makefile +42 -0
  132. data/vendor/go.uber.org/multierr/README.md +23 -0
  133. data/vendor/go.uber.org/multierr/error.go +449 -0
  134. data/vendor/go.uber.org/multierr/glide.yaml +8 -0
  135. data/vendor/go.uber.org/multierr/go.mod +8 -0
  136. data/vendor/go.uber.org/multierr/go.sum +11 -0
  137. data/vendor/go.uber.org/multierr/go113.go +52 -0
  138. data/vendor/go.uber.org/zap/.codecov.yml +17 -0
  139. data/vendor/go.uber.org/zap/.gitignore +32 -0
  140. data/vendor/go.uber.org/zap/.readme.tmpl +109 -0
  141. data/vendor/go.uber.org/zap/.travis.yml +23 -0
  142. data/vendor/go.uber.org/zap/CHANGELOG.md +432 -0
  143. data/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md +75 -0
  144. data/vendor/go.uber.org/zap/CONTRIBUTING.md +81 -0
  145. data/vendor/go.uber.org/zap/FAQ.md +156 -0
  146. data/vendor/go.uber.org/zap/LICENSE.txt +19 -0
  147. data/vendor/go.uber.org/zap/Makefile +63 -0
  148. data/vendor/go.uber.org/zap/README.md +134 -0
  149. data/vendor/go.uber.org/zap/array.go +320 -0
  150. data/vendor/go.uber.org/zap/buffer/buffer.go +123 -0
  151. data/vendor/go.uber.org/zap/buffer/pool.go +49 -0
  152. data/vendor/go.uber.org/zap/checklicense.sh +17 -0
  153. data/vendor/go.uber.org/zap/config.go +264 -0
  154. data/vendor/go.uber.org/zap/doc.go +113 -0
  155. data/vendor/go.uber.org/zap/encoder.go +79 -0
  156. data/vendor/go.uber.org/zap/error.go +80 -0
  157. data/vendor/go.uber.org/zap/field.go +539 -0
  158. data/vendor/go.uber.org/zap/flag.go +39 -0
  159. data/vendor/go.uber.org/zap/glide.yaml +34 -0
  160. data/vendor/go.uber.org/zap/global.go +168 -0
  161. data/vendor/go.uber.org/zap/global_go112.go +26 -0
  162. data/vendor/go.uber.org/zap/global_prego112.go +26 -0
  163. data/vendor/go.uber.org/zap/go.mod +13 -0
  164. data/vendor/go.uber.org/zap/go.sum +56 -0
  165. data/vendor/go.uber.org/zap/http_handler.go +81 -0
  166. data/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go +31 -0
  167. data/vendor/go.uber.org/zap/internal/color/color.go +44 -0
  168. data/vendor/go.uber.org/zap/internal/exit/exit.go +64 -0
  169. data/vendor/go.uber.org/zap/level.go +132 -0
  170. data/vendor/go.uber.org/zap/logger.go +344 -0
  171. data/vendor/go.uber.org/zap/options.go +140 -0
  172. data/vendor/go.uber.org/zap/sink.go +161 -0
  173. data/vendor/go.uber.org/zap/stacktrace.go +85 -0
  174. data/vendor/go.uber.org/zap/sugar.go +304 -0
  175. data/vendor/go.uber.org/zap/time.go +27 -0
  176. data/vendor/go.uber.org/zap/writer.go +99 -0
  177. data/vendor/go.uber.org/zap/zapcore/console_encoder.go +161 -0
  178. data/vendor/go.uber.org/zap/zapcore/core.go +113 -0
  179. data/vendor/go.uber.org/zap/zapcore/doc.go +24 -0
  180. data/vendor/go.uber.org/zap/zapcore/encoder.go +443 -0
  181. data/vendor/go.uber.org/zap/zapcore/entry.go +264 -0
  182. data/vendor/go.uber.org/zap/zapcore/error.go +115 -0
  183. data/vendor/go.uber.org/zap/zapcore/field.go +227 -0
  184. data/vendor/go.uber.org/zap/zapcore/hook.go +68 -0
  185. data/vendor/go.uber.org/zap/zapcore/increase_level.go +66 -0
  186. data/vendor/go.uber.org/zap/zapcore/json_encoder.go +534 -0
  187. data/vendor/go.uber.org/zap/zapcore/level.go +175 -0
  188. data/vendor/go.uber.org/zap/zapcore/level_strings.go +46 -0
  189. data/vendor/go.uber.org/zap/zapcore/marshaler.go +61 -0
  190. data/vendor/go.uber.org/zap/zapcore/memory_encoder.go +179 -0
  191. data/vendor/go.uber.org/zap/zapcore/sampler.go +208 -0
  192. data/vendor/go.uber.org/zap/zapcore/tee.go +81 -0
  193. data/vendor/go.uber.org/zap/zapcore/write_syncer.go +123 -0
  194. data/vendor/golang.org/x/net/AUTHORS +3 -0
  195. data/vendor/golang.org/x/net/CONTRIBUTORS +3 -0
  196. data/vendor/golang.org/x/net/LICENSE +27 -0
  197. data/vendor/golang.org/x/net/PATENTS +22 -0
  198. data/vendor/golang.org/x/net/context/context.go +56 -0
  199. data/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go +71 -0
  200. data/vendor/golang.org/x/net/context/go17.go +73 -0
  201. data/vendor/golang.org/x/net/context/go19.go +21 -0
  202. data/vendor/golang.org/x/net/context/pre_go17.go +301 -0
  203. data/vendor/golang.org/x/net/context/pre_go19.go +110 -0
  204. data/vendor/golang.org/x/oauth2/.travis.yml +13 -0
  205. data/vendor/golang.org/x/oauth2/AUTHORS +3 -0
  206. data/vendor/golang.org/x/oauth2/CONTRIBUTING.md +26 -0
  207. data/vendor/golang.org/x/oauth2/CONTRIBUTORS +3 -0
  208. data/vendor/golang.org/x/oauth2/LICENSE +27 -0
  209. data/vendor/golang.org/x/oauth2/README.md +36 -0
  210. data/vendor/golang.org/x/oauth2/go.mod +9 -0
  211. data/vendor/golang.org/x/oauth2/go.sum +361 -0
  212. data/vendor/golang.org/x/oauth2/internal/client_appengine.go +14 -0
  213. data/vendor/golang.org/x/oauth2/internal/doc.go +6 -0
  214. data/vendor/golang.org/x/oauth2/internal/oauth2.go +37 -0
  215. data/vendor/golang.org/x/oauth2/internal/token.go +294 -0
  216. data/vendor/golang.org/x/oauth2/internal/transport.go +33 -0
  217. data/vendor/golang.org/x/oauth2/oauth2.go +381 -0
  218. data/vendor/golang.org/x/oauth2/token.go +178 -0
  219. data/vendor/golang.org/x/oauth2/transport.go +89 -0
  220. data/vendor/google.golang.org/appengine/LICENSE +202 -0
  221. data/vendor/google.golang.org/appengine/internal/api.go +678 -0
  222. data/vendor/google.golang.org/appengine/internal/api_classic.go +169 -0
  223. data/vendor/google.golang.org/appengine/internal/api_common.go +123 -0
  224. data/vendor/google.golang.org/appengine/internal/app_id.go +28 -0
  225. data/vendor/google.golang.org/appengine/internal/base/api_base.pb.go +308 -0
  226. data/vendor/google.golang.org/appengine/internal/base/api_base.proto +33 -0
  227. data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go +4367 -0
  228. data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto +551 -0
  229. data/vendor/google.golang.org/appengine/internal/identity.go +55 -0
  230. data/vendor/google.golang.org/appengine/internal/identity_classic.go +61 -0
  231. data/vendor/google.golang.org/appengine/internal/identity_flex.go +11 -0
  232. data/vendor/google.golang.org/appengine/internal/identity_vm.go +134 -0
  233. data/vendor/google.golang.org/appengine/internal/internal.go +110 -0
  234. data/vendor/google.golang.org/appengine/internal/log/log_service.pb.go +1313 -0
  235. data/vendor/google.golang.org/appengine/internal/log/log_service.proto +150 -0
  236. data/vendor/google.golang.org/appengine/internal/main.go +16 -0
  237. data/vendor/google.golang.org/appengine/internal/main_common.go +7 -0
  238. data/vendor/google.golang.org/appengine/internal/main_vm.go +69 -0
  239. data/vendor/google.golang.org/appengine/internal/metadata.go +60 -0
  240. data/vendor/google.golang.org/appengine/internal/net.go +56 -0
  241. data/vendor/google.golang.org/appengine/internal/regen.sh +40 -0
  242. data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go +361 -0
  243. data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto +44 -0
  244. data/vendor/google.golang.org/appengine/internal/transaction.go +115 -0
  245. data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go +527 -0
  246. data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +64 -0
  247. data/vendor/google.golang.org/appengine/urlfetch/urlfetch.go +210 -0
  248. data/vendor/google.golang.org/protobuf/AUTHORS +3 -0
  249. data/vendor/google.golang.org/protobuf/CONTRIBUTORS +3 -0
  250. data/vendor/google.golang.org/protobuf/LICENSE +27 -0
  251. data/vendor/google.golang.org/protobuf/PATENTS +22 -0
  252. data/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +773 -0
  253. data/vendor/google.golang.org/protobuf/encoding/prototext/doc.go +7 -0
  254. data/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +371 -0
  255. data/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +538 -0
  256. data/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go +318 -0
  257. data/vendor/google.golang.org/protobuf/internal/descopts/options.go +29 -0
  258. data/vendor/google.golang.org/protobuf/internal/detrand/rand.go +69 -0
  259. data/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go +213 -0
  260. data/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go +241 -0
  261. data/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go +207 -0
  262. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go +665 -0
  263. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go +190 -0
  264. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go +161 -0
  265. data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go +373 -0
  266. data/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go +29 -0
  267. data/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go +265 -0
  268. data/vendor/google.golang.org/protobuf/internal/errors/errors.go +89 -0
  269. data/vendor/google.golang.org/protobuf/internal/errors/is_go112.go +39 -0
  270. data/vendor/google.golang.org/protobuf/internal/errors/is_go113.go +12 -0
  271. data/vendor/google.golang.org/protobuf/internal/filedesc/build.go +158 -0
  272. data/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +631 -0
  273. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go +471 -0
  274. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +704 -0
  275. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go +450 -0
  276. data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go +356 -0
  277. data/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go +107 -0
  278. data/vendor/google.golang.org/protobuf/internal/filetype/build.go +297 -0
  279. data/vendor/google.golang.org/protobuf/internal/flags/flags.go +24 -0
  280. data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go +9 -0
  281. data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go +9 -0
  282. data/vendor/google.golang.org/protobuf/internal/genid/any_gen.go +34 -0
  283. data/vendor/google.golang.org/protobuf/internal/genid/api_gen.go +106 -0
  284. data/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +829 -0
  285. data/vendor/google.golang.org/protobuf/internal/genid/doc.go +11 -0
  286. data/vendor/google.golang.org/protobuf/internal/genid/duration_gen.go +34 -0
  287. data/vendor/google.golang.org/protobuf/internal/genid/empty_gen.go +19 -0
  288. data/vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go +31 -0
  289. data/vendor/google.golang.org/protobuf/internal/genid/goname.go +25 -0
  290. data/vendor/google.golang.org/protobuf/internal/genid/map_entry.go +16 -0
  291. data/vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go +31 -0
  292. data/vendor/google.golang.org/protobuf/internal/genid/struct_gen.go +116 -0
  293. data/vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go +34 -0
  294. data/vendor/google.golang.org/protobuf/internal/genid/type_gen.go +184 -0
  295. data/vendor/google.golang.org/protobuf/internal/genid/wrappers.go +13 -0
  296. data/vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go +175 -0
  297. data/vendor/google.golang.org/protobuf/internal/impl/api_export.go +177 -0
  298. data/vendor/google.golang.org/protobuf/internal/impl/checkinit.go +141 -0
  299. data/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go +223 -0
  300. data/vendor/google.golang.org/protobuf/internal/impl/codec_field.go +830 -0
  301. data/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go +5637 -0
  302. data/vendor/google.golang.org/protobuf/internal/impl/codec_map.go +388 -0
  303. data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go +37 -0
  304. data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go +11 -0
  305. data/vendor/google.golang.org/protobuf/internal/impl/codec_message.go +217 -0
  306. data/vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go +123 -0
  307. data/vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go +209 -0
  308. data/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go +557 -0
  309. data/vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go +17 -0
  310. data/vendor/google.golang.org/protobuf/internal/impl/convert.go +496 -0
  311. data/vendor/google.golang.org/protobuf/internal/impl/convert_list.go +141 -0
  312. data/vendor/google.golang.org/protobuf/internal/impl/convert_map.go +121 -0
  313. data/vendor/google.golang.org/protobuf/internal/impl/decode.go +276 -0
  314. data/vendor/google.golang.org/protobuf/internal/impl/encode.go +201 -0
  315. data/vendor/google.golang.org/protobuf/internal/impl/enum.go +21 -0
  316. data/vendor/google.golang.org/protobuf/internal/impl/extension.go +156 -0
  317. data/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go +219 -0
  318. data/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go +92 -0
  319. data/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go +176 -0
  320. data/vendor/google.golang.org/protobuf/internal/impl/legacy_file.go +81 -0
  321. data/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go +558 -0
  322. data/vendor/google.golang.org/protobuf/internal/impl/merge.go +176 -0
  323. data/vendor/google.golang.org/protobuf/internal/impl/merge_gen.go +209 -0
  324. data/vendor/google.golang.org/protobuf/internal/impl/message.go +276 -0
  325. data/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go +465 -0
  326. data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go +543 -0
  327. data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go +249 -0
  328. data/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go +178 -0
  329. data/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go +174 -0
  330. data/vendor/google.golang.org/protobuf/internal/impl/validate.go +576 -0
  331. data/vendor/google.golang.org/protobuf/internal/impl/weak.go +74 -0
  332. data/vendor/google.golang.org/protobuf/internal/order/order.go +89 -0
  333. data/vendor/google.golang.org/protobuf/internal/order/range.go +115 -0
  334. data/vendor/google.golang.org/protobuf/internal/pragma/pragma.go +29 -0
  335. data/vendor/google.golang.org/protobuf/internal/set/ints.go +58 -0
  336. data/vendor/google.golang.org/protobuf/internal/strs/strings.go +196 -0
  337. data/vendor/google.golang.org/protobuf/internal/strs/strings_pure.go +27 -0
  338. data/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go +94 -0
  339. data/vendor/google.golang.org/protobuf/internal/version/version.go +79 -0
  340. data/vendor/google.golang.org/protobuf/proto/checkinit.go +71 -0
  341. data/vendor/google.golang.org/protobuf/proto/decode.go +278 -0
  342. data/vendor/google.golang.org/protobuf/proto/decode_gen.go +603 -0
  343. data/vendor/google.golang.org/protobuf/proto/doc.go +94 -0
  344. data/vendor/google.golang.org/protobuf/proto/encode.go +319 -0
  345. data/vendor/google.golang.org/protobuf/proto/encode_gen.go +97 -0
  346. data/vendor/google.golang.org/protobuf/proto/equal.go +167 -0
  347. data/vendor/google.golang.org/protobuf/proto/extension.go +92 -0
  348. data/vendor/google.golang.org/protobuf/proto/merge.go +139 -0
  349. data/vendor/google.golang.org/protobuf/proto/messageset.go +93 -0
  350. data/vendor/google.golang.org/protobuf/proto/proto.go +43 -0
  351. data/vendor/google.golang.org/protobuf/proto/proto_methods.go +19 -0
  352. data/vendor/google.golang.org/protobuf/proto/proto_reflect.go +19 -0
  353. data/vendor/google.golang.org/protobuf/proto/reset.go +43 -0
  354. data/vendor/google.golang.org/protobuf/proto/size.go +97 -0
  355. data/vendor/google.golang.org/protobuf/proto/size_gen.go +55 -0
  356. data/vendor/google.golang.org/protobuf/proto/wrappers.go +29 -0
  357. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +276 -0
  358. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go +248 -0
  359. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go +286 -0
  360. data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go +374 -0
  361. data/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go +252 -0
  362. data/vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go +77 -0
  363. data/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go +504 -0
  364. data/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go +128 -0
  365. data/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +461 -0
  366. data/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go +665 -0
  367. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go +285 -0
  368. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_pure.go +59 -0
  369. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +411 -0
  370. data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go +98 -0
  371. data/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +869 -0
  372. data/vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go +15 -0
  373. data/vendor/google.golang.org/protobuf/runtime/protoiface/methods.go +167 -0
  374. data/vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go +44 -0
  375. data/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go +56 -0
  376. data/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +4039 -0
  377. data/vendor/modules.txt +79 -0
  378. metadata +495 -0
@@ -0,0 +1,241 @@
1
+ // Copyright 2019 The Go Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style
3
+ // license that can be found in the LICENSE file.
4
+
5
+ // Package messageset encodes and decodes the obsolete MessageSet wire format.
6
+ package messageset
7
+
8
+ import (
9
+ "math"
10
+
11
+ "google.golang.org/protobuf/encoding/protowire"
12
+ "google.golang.org/protobuf/internal/errors"
13
+ pref "google.golang.org/protobuf/reflect/protoreflect"
14
+ )
15
+
16
+ // The MessageSet wire format is equivalent to a message defined as follows,
17
+ // where each Item defines an extension field with a field number of 'type_id'
18
+ // and content of 'message'. MessageSet extensions must be non-repeated message
19
+ // fields.
20
+ //
21
+ // message MessageSet {
22
+ // repeated group Item = 1 {
23
+ // required int32 type_id = 2;
24
+ // required string message = 3;
25
+ // }
26
+ // }
27
+ const (
28
+ FieldItem = protowire.Number(1)
29
+ FieldTypeID = protowire.Number(2)
30
+ FieldMessage = protowire.Number(3)
31
+ )
32
+
33
+ // ExtensionName is the field name for extensions of MessageSet.
34
+ //
35
+ // A valid MessageSet extension must be of the form:
36
+ // message MyMessage {
37
+ // extend proto2.bridge.MessageSet {
38
+ // optional MyMessage message_set_extension = 1234;
39
+ // }
40
+ // ...
41
+ // }
42
+ const ExtensionName = "message_set_extension"
43
+
44
+ // IsMessageSet returns whether the message uses the MessageSet wire format.
45
+ func IsMessageSet(md pref.MessageDescriptor) bool {
46
+ xmd, ok := md.(interface{ IsMessageSet() bool })
47
+ return ok && xmd.IsMessageSet()
48
+ }
49
+
50
+ // IsMessageSetExtension reports this field properly extends a MessageSet.
51
+ func IsMessageSetExtension(fd pref.FieldDescriptor) bool {
52
+ switch {
53
+ case fd.Name() != ExtensionName:
54
+ return false
55
+ case !IsMessageSet(fd.ContainingMessage()):
56
+ return false
57
+ case fd.FullName().Parent() != fd.Message().FullName():
58
+ return false
59
+ }
60
+ return true
61
+ }
62
+
63
+ // SizeField returns the size of a MessageSet item field containing an extension
64
+ // with the given field number, not counting the contents of the message subfield.
65
+ func SizeField(num protowire.Number) int {
66
+ return 2*protowire.SizeTag(FieldItem) + protowire.SizeTag(FieldTypeID) + protowire.SizeVarint(uint64(num))
67
+ }
68
+
69
+ // Unmarshal parses a MessageSet.
70
+ //
71
+ // It calls fn with the type ID and value of each item in the MessageSet.
72
+ // Unknown fields are discarded.
73
+ //
74
+ // If wantLen is true, the item values include the varint length prefix.
75
+ // This is ugly, but simplifies the fast-path decoder in internal/impl.
76
+ func Unmarshal(b []byte, wantLen bool, fn func(typeID protowire.Number, value []byte) error) error {
77
+ for len(b) > 0 {
78
+ num, wtyp, n := protowire.ConsumeTag(b)
79
+ if n < 0 {
80
+ return protowire.ParseError(n)
81
+ }
82
+ b = b[n:]
83
+ if num != FieldItem || wtyp != protowire.StartGroupType {
84
+ n := protowire.ConsumeFieldValue(num, wtyp, b)
85
+ if n < 0 {
86
+ return protowire.ParseError(n)
87
+ }
88
+ b = b[n:]
89
+ continue
90
+ }
91
+ typeID, value, n, err := ConsumeFieldValue(b, wantLen)
92
+ if err != nil {
93
+ return err
94
+ }
95
+ b = b[n:]
96
+ if typeID == 0 {
97
+ continue
98
+ }
99
+ if err := fn(typeID, value); err != nil {
100
+ return err
101
+ }
102
+ }
103
+ return nil
104
+ }
105
+
106
+ // ConsumeFieldValue parses b as a MessageSet item field value until and including
107
+ // the trailing end group marker. It assumes the start group tag has already been parsed.
108
+ // It returns the contents of the type_id and message subfields and the total
109
+ // item length.
110
+ //
111
+ // If wantLen is true, the returned message value includes the length prefix.
112
+ func ConsumeFieldValue(b []byte, wantLen bool) (typeid protowire.Number, message []byte, n int, err error) {
113
+ ilen := len(b)
114
+ for {
115
+ num, wtyp, n := protowire.ConsumeTag(b)
116
+ if n < 0 {
117
+ return 0, nil, 0, protowire.ParseError(n)
118
+ }
119
+ b = b[n:]
120
+ switch {
121
+ case num == FieldItem && wtyp == protowire.EndGroupType:
122
+ if wantLen && len(message) == 0 {
123
+ // The message field was missing, which should never happen.
124
+ // Be prepared for this case anyway.
125
+ message = protowire.AppendVarint(message, 0)
126
+ }
127
+ return typeid, message, ilen - len(b), nil
128
+ case num == FieldTypeID && wtyp == protowire.VarintType:
129
+ v, n := protowire.ConsumeVarint(b)
130
+ if n < 0 {
131
+ return 0, nil, 0, protowire.ParseError(n)
132
+ }
133
+ b = b[n:]
134
+ if v < 1 || v > math.MaxInt32 {
135
+ return 0, nil, 0, errors.New("invalid type_id in message set")
136
+ }
137
+ typeid = protowire.Number(v)
138
+ case num == FieldMessage && wtyp == protowire.BytesType:
139
+ m, n := protowire.ConsumeBytes(b)
140
+ if n < 0 {
141
+ return 0, nil, 0, protowire.ParseError(n)
142
+ }
143
+ if message == nil {
144
+ if wantLen {
145
+ message = b[:n:n]
146
+ } else {
147
+ message = m[:len(m):len(m)]
148
+ }
149
+ } else {
150
+ // This case should never happen in practice, but handle it for
151
+ // correctness: The MessageSet item contains multiple message
152
+ // fields, which need to be merged.
153
+ //
154
+ // In the case where we're returning the length, this becomes
155
+ // quite inefficient since we need to strip the length off
156
+ // the existing data and reconstruct it with the combined length.
157
+ if wantLen {
158
+ _, nn := protowire.ConsumeVarint(message)
159
+ m0 := message[nn:]
160
+ message = nil
161
+ message = protowire.AppendVarint(message, uint64(len(m0)+len(m)))
162
+ message = append(message, m0...)
163
+ message = append(message, m...)
164
+ } else {
165
+ message = append(message, m...)
166
+ }
167
+ }
168
+ b = b[n:]
169
+ default:
170
+ // We have no place to put it, so we just ignore unknown fields.
171
+ n := protowire.ConsumeFieldValue(num, wtyp, b)
172
+ if n < 0 {
173
+ return 0, nil, 0, protowire.ParseError(n)
174
+ }
175
+ b = b[n:]
176
+ }
177
+ }
178
+ }
179
+
180
+ // AppendFieldStart appends the start of a MessageSet item field containing
181
+ // an extension with the given number. The caller must add the message
182
+ // subfield (including the tag).
183
+ func AppendFieldStart(b []byte, num protowire.Number) []byte {
184
+ b = protowire.AppendTag(b, FieldItem, protowire.StartGroupType)
185
+ b = protowire.AppendTag(b, FieldTypeID, protowire.VarintType)
186
+ b = protowire.AppendVarint(b, uint64(num))
187
+ return b
188
+ }
189
+
190
+ // AppendFieldEnd appends the trailing end group marker for a MessageSet item field.
191
+ func AppendFieldEnd(b []byte) []byte {
192
+ return protowire.AppendTag(b, FieldItem, protowire.EndGroupType)
193
+ }
194
+
195
+ // SizeUnknown returns the size of an unknown fields section in MessageSet format.
196
+ //
197
+ // See AppendUnknown.
198
+ func SizeUnknown(unknown []byte) (size int) {
199
+ for len(unknown) > 0 {
200
+ num, typ, n := protowire.ConsumeTag(unknown)
201
+ if n < 0 || typ != protowire.BytesType {
202
+ return 0
203
+ }
204
+ unknown = unknown[n:]
205
+ _, n = protowire.ConsumeBytes(unknown)
206
+ if n < 0 {
207
+ return 0
208
+ }
209
+ unknown = unknown[n:]
210
+ size += SizeField(num) + protowire.SizeTag(FieldMessage) + n
211
+ }
212
+ return size
213
+ }
214
+
215
+ // AppendUnknown appends unknown fields to b in MessageSet format.
216
+ //
217
+ // For historic reasons, unresolved items in a MessageSet are stored in a
218
+ // message's unknown fields section in non-MessageSet format. That is, an
219
+ // unknown item with typeID T and value V appears in the unknown fields as
220
+ // a field with number T and value V.
221
+ //
222
+ // This function converts the unknown fields back into MessageSet form.
223
+ func AppendUnknown(b, unknown []byte) ([]byte, error) {
224
+ for len(unknown) > 0 {
225
+ num, typ, n := protowire.ConsumeTag(unknown)
226
+ if n < 0 || typ != protowire.BytesType {
227
+ return nil, errors.New("invalid data in message set unknown fields")
228
+ }
229
+ unknown = unknown[n:]
230
+ _, n = protowire.ConsumeBytes(unknown)
231
+ if n < 0 {
232
+ return nil, errors.New("invalid data in message set unknown fields")
233
+ }
234
+ b = AppendFieldStart(b, num)
235
+ b = protowire.AppendTag(b, FieldMessage, protowire.BytesType)
236
+ b = append(b, unknown[:n]...)
237
+ b = AppendFieldEnd(b)
238
+ unknown = unknown[n:]
239
+ }
240
+ return b, nil
241
+ }
@@ -0,0 +1,207 @@
1
+ // Copyright 2018 The Go Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style
3
+ // license that can be found in the LICENSE file.
4
+
5
+ // Package tag marshals and unmarshals the legacy struct tags as generated
6
+ // by historical versions of protoc-gen-go.
7
+ package tag
8
+
9
+ import (
10
+ "reflect"
11
+ "strconv"
12
+ "strings"
13
+
14
+ defval "google.golang.org/protobuf/internal/encoding/defval"
15
+ fdesc "google.golang.org/protobuf/internal/filedesc"
16
+ "google.golang.org/protobuf/internal/strs"
17
+ pref "google.golang.org/protobuf/reflect/protoreflect"
18
+ )
19
+
20
+ var byteType = reflect.TypeOf(byte(0))
21
+
22
+ // Unmarshal decodes the tag into a prototype.Field.
23
+ //
24
+ // The goType is needed to determine the original protoreflect.Kind since the
25
+ // tag does not record sufficient information to determine that.
26
+ // The type is the underlying field type (e.g., a repeated field may be
27
+ // represented by []T, but the Go type passed in is just T).
28
+ // A list of enum value descriptors must be provided for enum fields.
29
+ // This does not populate the Enum or Message (except for weak message).
30
+ //
31
+ // This function is a best effort attempt; parsing errors are ignored.
32
+ func Unmarshal(tag string, goType reflect.Type, evs pref.EnumValueDescriptors) pref.FieldDescriptor {
33
+ f := new(fdesc.Field)
34
+ f.L0.ParentFile = fdesc.SurrogateProto2
35
+ for len(tag) > 0 {
36
+ i := strings.IndexByte(tag, ',')
37
+ if i < 0 {
38
+ i = len(tag)
39
+ }
40
+ switch s := tag[:i]; {
41
+ case strings.HasPrefix(s, "name="):
42
+ f.L0.FullName = pref.FullName(s[len("name="):])
43
+ case strings.Trim(s, "0123456789") == "":
44
+ n, _ := strconv.ParseUint(s, 10, 32)
45
+ f.L1.Number = pref.FieldNumber(n)
46
+ case s == "opt":
47
+ f.L1.Cardinality = pref.Optional
48
+ case s == "req":
49
+ f.L1.Cardinality = pref.Required
50
+ case s == "rep":
51
+ f.L1.Cardinality = pref.Repeated
52
+ case s == "varint":
53
+ switch goType.Kind() {
54
+ case reflect.Bool:
55
+ f.L1.Kind = pref.BoolKind
56
+ case reflect.Int32:
57
+ f.L1.Kind = pref.Int32Kind
58
+ case reflect.Int64:
59
+ f.L1.Kind = pref.Int64Kind
60
+ case reflect.Uint32:
61
+ f.L1.Kind = pref.Uint32Kind
62
+ case reflect.Uint64:
63
+ f.L1.Kind = pref.Uint64Kind
64
+ }
65
+ case s == "zigzag32":
66
+ if goType.Kind() == reflect.Int32 {
67
+ f.L1.Kind = pref.Sint32Kind
68
+ }
69
+ case s == "zigzag64":
70
+ if goType.Kind() == reflect.Int64 {
71
+ f.L1.Kind = pref.Sint64Kind
72
+ }
73
+ case s == "fixed32":
74
+ switch goType.Kind() {
75
+ case reflect.Int32:
76
+ f.L1.Kind = pref.Sfixed32Kind
77
+ case reflect.Uint32:
78
+ f.L1.Kind = pref.Fixed32Kind
79
+ case reflect.Float32:
80
+ f.L1.Kind = pref.FloatKind
81
+ }
82
+ case s == "fixed64":
83
+ switch goType.Kind() {
84
+ case reflect.Int64:
85
+ f.L1.Kind = pref.Sfixed64Kind
86
+ case reflect.Uint64:
87
+ f.L1.Kind = pref.Fixed64Kind
88
+ case reflect.Float64:
89
+ f.L1.Kind = pref.DoubleKind
90
+ }
91
+ case s == "bytes":
92
+ switch {
93
+ case goType.Kind() == reflect.String:
94
+ f.L1.Kind = pref.StringKind
95
+ case goType.Kind() == reflect.Slice && goType.Elem() == byteType:
96
+ f.L1.Kind = pref.BytesKind
97
+ default:
98
+ f.L1.Kind = pref.MessageKind
99
+ }
100
+ case s == "group":
101
+ f.L1.Kind = pref.GroupKind
102
+ case strings.HasPrefix(s, "enum="):
103
+ f.L1.Kind = pref.EnumKind
104
+ case strings.HasPrefix(s, "json="):
105
+ jsonName := s[len("json="):]
106
+ if jsonName != strs.JSONCamelCase(string(f.L0.FullName.Name())) {
107
+ f.L1.StringName.InitJSON(jsonName)
108
+ }
109
+ case s == "packed":
110
+ f.L1.HasPacked = true
111
+ f.L1.IsPacked = true
112
+ case strings.HasPrefix(s, "weak="):
113
+ f.L1.IsWeak = true
114
+ f.L1.Message = fdesc.PlaceholderMessage(pref.FullName(s[len("weak="):]))
115
+ case strings.HasPrefix(s, "def="):
116
+ // The default tag is special in that everything afterwards is the
117
+ // default regardless of the presence of commas.
118
+ s, i = tag[len("def="):], len(tag)
119
+ v, ev, _ := defval.Unmarshal(s, f.L1.Kind, evs, defval.GoTag)
120
+ f.L1.Default = fdesc.DefaultValue(v, ev)
121
+ case s == "proto3":
122
+ f.L0.ParentFile = fdesc.SurrogateProto3
123
+ }
124
+ tag = strings.TrimPrefix(tag[i:], ",")
125
+ }
126
+
127
+ // The generator uses the group message name instead of the field name.
128
+ // We obtain the real field name by lowercasing the group name.
129
+ if f.L1.Kind == pref.GroupKind {
130
+ f.L0.FullName = pref.FullName(strings.ToLower(string(f.L0.FullName)))
131
+ }
132
+ return f
133
+ }
134
+
135
+ // Marshal encodes the protoreflect.FieldDescriptor as a tag.
136
+ //
137
+ // The enumName must be provided if the kind is an enum.
138
+ // Historically, the formulation of the enum "name" was the proto package
139
+ // dot-concatenated with the generated Go identifier for the enum type.
140
+ // Depending on the context on how Marshal is called, there are different ways
141
+ // through which that information is determined. As such it is the caller's
142
+ // responsibility to provide a function to obtain that information.
143
+ func Marshal(fd pref.FieldDescriptor, enumName string) string {
144
+ var tag []string
145
+ switch fd.Kind() {
146
+ case pref.BoolKind, pref.EnumKind, pref.Int32Kind, pref.Uint32Kind, pref.Int64Kind, pref.Uint64Kind:
147
+ tag = append(tag, "varint")
148
+ case pref.Sint32Kind:
149
+ tag = append(tag, "zigzag32")
150
+ case pref.Sint64Kind:
151
+ tag = append(tag, "zigzag64")
152
+ case pref.Sfixed32Kind, pref.Fixed32Kind, pref.FloatKind:
153
+ tag = append(tag, "fixed32")
154
+ case pref.Sfixed64Kind, pref.Fixed64Kind, pref.DoubleKind:
155
+ tag = append(tag, "fixed64")
156
+ case pref.StringKind, pref.BytesKind, pref.MessageKind:
157
+ tag = append(tag, "bytes")
158
+ case pref.GroupKind:
159
+ tag = append(tag, "group")
160
+ }
161
+ tag = append(tag, strconv.Itoa(int(fd.Number())))
162
+ switch fd.Cardinality() {
163
+ case pref.Optional:
164
+ tag = append(tag, "opt")
165
+ case pref.Required:
166
+ tag = append(tag, "req")
167
+ case pref.Repeated:
168
+ tag = append(tag, "rep")
169
+ }
170
+ if fd.IsPacked() {
171
+ tag = append(tag, "packed")
172
+ }
173
+ name := string(fd.Name())
174
+ if fd.Kind() == pref.GroupKind {
175
+ // The name of the FieldDescriptor for a group field is
176
+ // lowercased. To find the original capitalization, we
177
+ // look in the field's MessageType.
178
+ name = string(fd.Message().Name())
179
+ }
180
+ tag = append(tag, "name="+name)
181
+ if jsonName := fd.JSONName(); jsonName != "" && jsonName != name && !fd.IsExtension() {
182
+ // NOTE: The jsonName != name condition is suspect, but it preserve
183
+ // the exact same semantics from the previous generator.
184
+ tag = append(tag, "json="+jsonName)
185
+ }
186
+ if fd.IsWeak() {
187
+ tag = append(tag, "weak="+string(fd.Message().FullName()))
188
+ }
189
+ // The previous implementation does not tag extension fields as proto3,
190
+ // even when the field is defined in a proto3 file. Match that behavior
191
+ // for consistency.
192
+ if fd.Syntax() == pref.Proto3 && !fd.IsExtension() {
193
+ tag = append(tag, "proto3")
194
+ }
195
+ if fd.Kind() == pref.EnumKind && enumName != "" {
196
+ tag = append(tag, "enum="+enumName)
197
+ }
198
+ if fd.ContainingOneof() != nil {
199
+ tag = append(tag, "oneof")
200
+ }
201
+ // This must appear last in the tag, since commas in strings aren't escaped.
202
+ if fd.HasDefault() {
203
+ def, _ := defval.Marshal(fd.Default(), fd.DefaultEnumValue(), fd.Kind(), defval.GoTag)
204
+ tag = append(tag, "def="+def)
205
+ }
206
+ return strings.Join(tag, ",")
207
+ }
@@ -0,0 +1,665 @@
1
+ // Copyright 2018 The Go Authors. All rights reserved.
2
+ // Use of this source code is governed by a BSD-style
3
+ // license that can be found in the LICENSE file.
4
+
5
+ package text
6
+
7
+ import (
8
+ "bytes"
9
+ "fmt"
10
+ "io"
11
+ "regexp"
12
+ "strconv"
13
+ "unicode/utf8"
14
+
15
+ "google.golang.org/protobuf/internal/errors"
16
+ )
17
+
18
+ // Decoder is a token-based textproto decoder.
19
+ type Decoder struct {
20
+ // lastCall is last method called, either readCall or peekCall.
21
+ // Initial value is readCall.
22
+ lastCall call
23
+
24
+ // lastToken contains the last read token.
25
+ lastToken Token
26
+
27
+ // lastErr contains the last read error.
28
+ lastErr error
29
+
30
+ // openStack is a stack containing the byte characters for MessageOpen and
31
+ // ListOpen kinds. The top of stack represents the message or the list that
32
+ // the current token is nested in. An empty stack means the current token is
33
+ // at the top level message. The characters '{' and '<' both represent the
34
+ // MessageOpen kind.
35
+ openStack []byte
36
+
37
+ // orig is used in reporting line and column.
38
+ orig []byte
39
+ // in contains the unconsumed input.
40
+ in []byte
41
+ }
42
+
43
+ // NewDecoder returns a Decoder to read the given []byte.
44
+ func NewDecoder(b []byte) *Decoder {
45
+ return &Decoder{orig: b, in: b}
46
+ }
47
+
48
+ // ErrUnexpectedEOF means that EOF was encountered in the middle of the input.
49
+ var ErrUnexpectedEOF = errors.New("%v", io.ErrUnexpectedEOF)
50
+
51
+ // call specifies which Decoder method was invoked.
52
+ type call uint8
53
+
54
+ const (
55
+ readCall call = iota
56
+ peekCall
57
+ )
58
+
59
+ // Peek looks ahead and returns the next token and error without advancing a read.
60
+ func (d *Decoder) Peek() (Token, error) {
61
+ defer func() { d.lastCall = peekCall }()
62
+ if d.lastCall == readCall {
63
+ d.lastToken, d.lastErr = d.Read()
64
+ }
65
+ return d.lastToken, d.lastErr
66
+ }
67
+
68
+ // Read returns the next token.
69
+ // It will return an error if there is no valid token.
70
+ func (d *Decoder) Read() (Token, error) {
71
+ defer func() { d.lastCall = readCall }()
72
+ if d.lastCall == peekCall {
73
+ return d.lastToken, d.lastErr
74
+ }
75
+
76
+ tok, err := d.parseNext(d.lastToken.kind)
77
+ if err != nil {
78
+ return Token{}, err
79
+ }
80
+
81
+ switch tok.kind {
82
+ case comma, semicolon:
83
+ tok, err = d.parseNext(tok.kind)
84
+ if err != nil {
85
+ return Token{}, err
86
+ }
87
+ }
88
+ d.lastToken = tok
89
+ return tok, nil
90
+ }
91
+
92
+ const (
93
+ mismatchedFmt = "mismatched close character %q"
94
+ unexpectedFmt = "unexpected character %q"
95
+ )
96
+
97
+ // parseNext parses the next Token based on given last kind.
98
+ func (d *Decoder) parseNext(lastKind Kind) (Token, error) {
99
+ // Trim leading spaces.
100
+ d.consume(0)
101
+ isEOF := false
102
+ if len(d.in) == 0 {
103
+ isEOF = true
104
+ }
105
+
106
+ switch lastKind {
107
+ case EOF:
108
+ return d.consumeToken(EOF, 0, 0), nil
109
+
110
+ case bof:
111
+ // Start of top level message. Next token can be EOF or Name.
112
+ if isEOF {
113
+ return d.consumeToken(EOF, 0, 0), nil
114
+ }
115
+ return d.parseFieldName()
116
+
117
+ case Name:
118
+ // Next token can be MessageOpen, ListOpen or Scalar.
119
+ if isEOF {
120
+ return Token{}, ErrUnexpectedEOF
121
+ }
122
+ switch ch := d.in[0]; ch {
123
+ case '{', '<':
124
+ d.pushOpenStack(ch)
125
+ return d.consumeToken(MessageOpen, 1, 0), nil
126
+ case '[':
127
+ d.pushOpenStack(ch)
128
+ return d.consumeToken(ListOpen, 1, 0), nil
129
+ default:
130
+ return d.parseScalar()
131
+ }
132
+
133
+ case Scalar:
134
+ openKind, closeCh := d.currentOpenKind()
135
+ switch openKind {
136
+ case bof:
137
+ // Top level message.
138
+ // Next token can be EOF, comma, semicolon or Name.
139
+ if isEOF {
140
+ return d.consumeToken(EOF, 0, 0), nil
141
+ }
142
+ switch d.in[0] {
143
+ case ',':
144
+ return d.consumeToken(comma, 1, 0), nil
145
+ case ';':
146
+ return d.consumeToken(semicolon, 1, 0), nil
147
+ default:
148
+ return d.parseFieldName()
149
+ }
150
+
151
+ case MessageOpen:
152
+ // Next token can be MessageClose, comma, semicolon or Name.
153
+ if isEOF {
154
+ return Token{}, ErrUnexpectedEOF
155
+ }
156
+ switch ch := d.in[0]; ch {
157
+ case closeCh:
158
+ d.popOpenStack()
159
+ return d.consumeToken(MessageClose, 1, 0), nil
160
+ case otherCloseChar[closeCh]:
161
+ return Token{}, d.newSyntaxError(mismatchedFmt, ch)
162
+ case ',':
163
+ return d.consumeToken(comma, 1, 0), nil
164
+ case ';':
165
+ return d.consumeToken(semicolon, 1, 0), nil
166
+ default:
167
+ return d.parseFieldName()
168
+ }
169
+
170
+ case ListOpen:
171
+ // Next token can be ListClose or comma.
172
+ if isEOF {
173
+ return Token{}, ErrUnexpectedEOF
174
+ }
175
+ switch ch := d.in[0]; ch {
176
+ case ']':
177
+ d.popOpenStack()
178
+ return d.consumeToken(ListClose, 1, 0), nil
179
+ case ',':
180
+ return d.consumeToken(comma, 1, 0), nil
181
+ default:
182
+ return Token{}, d.newSyntaxError(unexpectedFmt, ch)
183
+ }
184
+ }
185
+
186
+ case MessageOpen:
187
+ // Next token can be MessageClose or Name.
188
+ if isEOF {
189
+ return Token{}, ErrUnexpectedEOF
190
+ }
191
+ _, closeCh := d.currentOpenKind()
192
+ switch ch := d.in[0]; ch {
193
+ case closeCh:
194
+ d.popOpenStack()
195
+ return d.consumeToken(MessageClose, 1, 0), nil
196
+ case otherCloseChar[closeCh]:
197
+ return Token{}, d.newSyntaxError(mismatchedFmt, ch)
198
+ default:
199
+ return d.parseFieldName()
200
+ }
201
+
202
+ case MessageClose:
203
+ openKind, closeCh := d.currentOpenKind()
204
+ switch openKind {
205
+ case bof:
206
+ // Top level message.
207
+ // Next token can be EOF, comma, semicolon or Name.
208
+ if isEOF {
209
+ return d.consumeToken(EOF, 0, 0), nil
210
+ }
211
+ switch ch := d.in[0]; ch {
212
+ case ',':
213
+ return d.consumeToken(comma, 1, 0), nil
214
+ case ';':
215
+ return d.consumeToken(semicolon, 1, 0), nil
216
+ default:
217
+ return d.parseFieldName()
218
+ }
219
+
220
+ case MessageOpen:
221
+ // Next token can be MessageClose, comma, semicolon or Name.
222
+ if isEOF {
223
+ return Token{}, ErrUnexpectedEOF
224
+ }
225
+ switch ch := d.in[0]; ch {
226
+ case closeCh:
227
+ d.popOpenStack()
228
+ return d.consumeToken(MessageClose, 1, 0), nil
229
+ case otherCloseChar[closeCh]:
230
+ return Token{}, d.newSyntaxError(mismatchedFmt, ch)
231
+ case ',':
232
+ return d.consumeToken(comma, 1, 0), nil
233
+ case ';':
234
+ return d.consumeToken(semicolon, 1, 0), nil
235
+ default:
236
+ return d.parseFieldName()
237
+ }
238
+
239
+ case ListOpen:
240
+ // Next token can be ListClose or comma
241
+ if isEOF {
242
+ return Token{}, ErrUnexpectedEOF
243
+ }
244
+ switch ch := d.in[0]; ch {
245
+ case closeCh:
246
+ d.popOpenStack()
247
+ return d.consumeToken(ListClose, 1, 0), nil
248
+ case ',':
249
+ return d.consumeToken(comma, 1, 0), nil
250
+ default:
251
+ return Token{}, d.newSyntaxError(unexpectedFmt, ch)
252
+ }
253
+ }
254
+
255
+ case ListOpen:
256
+ // Next token can be ListClose, MessageStart or Scalar.
257
+ if isEOF {
258
+ return Token{}, ErrUnexpectedEOF
259
+ }
260
+ switch ch := d.in[0]; ch {
261
+ case ']':
262
+ d.popOpenStack()
263
+ return d.consumeToken(ListClose, 1, 0), nil
264
+ case '{', '<':
265
+ d.pushOpenStack(ch)
266
+ return d.consumeToken(MessageOpen, 1, 0), nil
267
+ default:
268
+ return d.parseScalar()
269
+ }
270
+
271
+ case ListClose:
272
+ openKind, closeCh := d.currentOpenKind()
273
+ switch openKind {
274
+ case bof:
275
+ // Top level message.
276
+ // Next token can be EOF, comma, semicolon or Name.
277
+ if isEOF {
278
+ return d.consumeToken(EOF, 0, 0), nil
279
+ }
280
+ switch ch := d.in[0]; ch {
281
+ case ',':
282
+ return d.consumeToken(comma, 1, 0), nil
283
+ case ';':
284
+ return d.consumeToken(semicolon, 1, 0), nil
285
+ default:
286
+ return d.parseFieldName()
287
+ }
288
+
289
+ case MessageOpen:
290
+ // Next token can be MessageClose, comma, semicolon or Name.
291
+ if isEOF {
292
+ return Token{}, ErrUnexpectedEOF
293
+ }
294
+ switch ch := d.in[0]; ch {
295
+ case closeCh:
296
+ d.popOpenStack()
297
+ return d.consumeToken(MessageClose, 1, 0), nil
298
+ case otherCloseChar[closeCh]:
299
+ return Token{}, d.newSyntaxError(mismatchedFmt, ch)
300
+ case ',':
301
+ return d.consumeToken(comma, 1, 0), nil
302
+ case ';':
303
+ return d.consumeToken(semicolon, 1, 0), nil
304
+ default:
305
+ return d.parseFieldName()
306
+ }
307
+
308
+ default:
309
+ // It is not possible to have this case. Let it panic below.
310
+ }
311
+
312
+ case comma, semicolon:
313
+ openKind, closeCh := d.currentOpenKind()
314
+ switch openKind {
315
+ case bof:
316
+ // Top level message. Next token can be EOF or Name.
317
+ if isEOF {
318
+ return d.consumeToken(EOF, 0, 0), nil
319
+ }
320
+ return d.parseFieldName()
321
+
322
+ case MessageOpen:
323
+ // Next token can be MessageClose or Name.
324
+ if isEOF {
325
+ return Token{}, ErrUnexpectedEOF
326
+ }
327
+ switch ch := d.in[0]; ch {
328
+ case closeCh:
329
+ d.popOpenStack()
330
+ return d.consumeToken(MessageClose, 1, 0), nil
331
+ case otherCloseChar[closeCh]:
332
+ return Token{}, d.newSyntaxError(mismatchedFmt, ch)
333
+ default:
334
+ return d.parseFieldName()
335
+ }
336
+
337
+ case ListOpen:
338
+ if lastKind == semicolon {
339
+ // It is not be possible to have this case as logic here
340
+ // should not have produced a semicolon Token when inside a
341
+ // list. Let it panic below.
342
+ break
343
+ }
344
+ // Next token can be MessageOpen or Scalar.
345
+ if isEOF {
346
+ return Token{}, ErrUnexpectedEOF
347
+ }
348
+ switch ch := d.in[0]; ch {
349
+ case '{', '<':
350
+ d.pushOpenStack(ch)
351
+ return d.consumeToken(MessageOpen, 1, 0), nil
352
+ default:
353
+ return d.parseScalar()
354
+ }
355
+ }
356
+ }
357
+
358
+ line, column := d.Position(len(d.orig) - len(d.in))
359
+ panic(fmt.Sprintf("Decoder.parseNext: bug at handling line %d:%d with lastKind=%v", line, column, lastKind))
360
+ }
361
+
362
+ var otherCloseChar = map[byte]byte{
363
+ '}': '>',
364
+ '>': '}',
365
+ }
366
+
367
+ // currentOpenKind indicates whether current position is inside a message, list
368
+ // or top-level message by returning MessageOpen, ListOpen or bof respectively.
369
+ // If the returned kind is either a MessageOpen or ListOpen, it also returns the
370
+ // corresponding closing character.
371
+ func (d *Decoder) currentOpenKind() (Kind, byte) {
372
+ if len(d.openStack) == 0 {
373
+ return bof, 0
374
+ }
375
+ openCh := d.openStack[len(d.openStack)-1]
376
+ switch openCh {
377
+ case '{':
378
+ return MessageOpen, '}'
379
+ case '<':
380
+ return MessageOpen, '>'
381
+ case '[':
382
+ return ListOpen, ']'
383
+ }
384
+ panic(fmt.Sprintf("Decoder: openStack contains invalid byte %s", string(openCh)))
385
+ }
386
+
387
+ func (d *Decoder) pushOpenStack(ch byte) {
388
+ d.openStack = append(d.openStack, ch)
389
+ }
390
+
391
+ func (d *Decoder) popOpenStack() {
392
+ d.openStack = d.openStack[:len(d.openStack)-1]
393
+ }
394
+
395
+ // parseFieldName parses field name and separator.
396
+ func (d *Decoder) parseFieldName() (tok Token, err error) {
397
+ defer func() {
398
+ if err == nil && d.tryConsumeChar(':') {
399
+ tok.attrs |= hasSeparator
400
+ }
401
+ }()
402
+
403
+ // Extension or Any type URL.
404
+ if d.in[0] == '[' {
405
+ return d.parseTypeName()
406
+ }
407
+
408
+ // Identifier.
409
+ if size := parseIdent(d.in, false); size > 0 {
410
+ return d.consumeToken(Name, size, uint8(IdentName)), nil
411
+ }
412
+
413
+ // Field number. Identify if input is a valid number that is not negative
414
+ // and is decimal integer within 32-bit range.
415
+ if num := parseNumber(d.in); num.size > 0 {
416
+ if !num.neg && num.kind == numDec {
417
+ if _, err := strconv.ParseInt(string(d.in[:num.size]), 10, 32); err == nil {
418
+ return d.consumeToken(Name, num.size, uint8(FieldNumber)), nil
419
+ }
420
+ }
421
+ return Token{}, d.newSyntaxError("invalid field number: %s", d.in[:num.size])
422
+ }
423
+
424
+ return Token{}, d.newSyntaxError("invalid field name: %s", errRegexp.Find(d.in))
425
+ }
426
+
427
+ // parseTypeName parses Any type URL or extension field name. The name is
428
+ // enclosed in [ and ] characters. The C++ parser does not handle many legal URL
429
+ // strings. This implementation is more liberal and allows for the pattern
430
+ // ^[-_a-zA-Z0-9]+([./][-_a-zA-Z0-9]+)*`). Whitespaces and comments are allowed
431
+ // in between [ ], '.', '/' and the sub names.
432
+ func (d *Decoder) parseTypeName() (Token, error) {
433
+ startPos := len(d.orig) - len(d.in)
434
+ // Use alias s to advance first in order to use d.in for error handling.
435
+ // Caller already checks for [ as first character.
436
+ s := consume(d.in[1:], 0)
437
+ if len(s) == 0 {
438
+ return Token{}, ErrUnexpectedEOF
439
+ }
440
+
441
+ var name []byte
442
+ for len(s) > 0 && isTypeNameChar(s[0]) {
443
+ name = append(name, s[0])
444
+ s = s[1:]
445
+ }
446
+ s = consume(s, 0)
447
+
448
+ var closed bool
449
+ for len(s) > 0 && !closed {
450
+ switch {
451
+ case s[0] == ']':
452
+ s = s[1:]
453
+ closed = true
454
+
455
+ case s[0] == '/', s[0] == '.':
456
+ if len(name) > 0 && (name[len(name)-1] == '/' || name[len(name)-1] == '.') {
457
+ return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s",
458
+ d.orig[startPos:len(d.orig)-len(s)+1])
459
+ }
460
+ name = append(name, s[0])
461
+ s = s[1:]
462
+ s = consume(s, 0)
463
+ for len(s) > 0 && isTypeNameChar(s[0]) {
464
+ name = append(name, s[0])
465
+ s = s[1:]
466
+ }
467
+ s = consume(s, 0)
468
+
469
+ default:
470
+ return Token{}, d.newSyntaxError(
471
+ "invalid type URL/extension field name: %s", d.orig[startPos:len(d.orig)-len(s)+1])
472
+ }
473
+ }
474
+
475
+ if !closed {
476
+ return Token{}, ErrUnexpectedEOF
477
+ }
478
+
479
+ // First character cannot be '.'. Last character cannot be '.' or '/'.
480
+ size := len(name)
481
+ if size == 0 || name[0] == '.' || name[size-1] == '.' || name[size-1] == '/' {
482
+ return Token{}, d.newSyntaxError("invalid type URL/extension field name: %s",
483
+ d.orig[startPos:len(d.orig)-len(s)])
484
+ }
485
+
486
+ d.in = s
487
+ endPos := len(d.orig) - len(d.in)
488
+ d.consume(0)
489
+
490
+ return Token{
491
+ kind: Name,
492
+ attrs: uint8(TypeName),
493
+ pos: startPos,
494
+ raw: d.orig[startPos:endPos],
495
+ str: string(name),
496
+ }, nil
497
+ }
498
+
499
+ func isTypeNameChar(b byte) bool {
500
+ return (b == '-' || b == '_' ||
501
+ ('0' <= b && b <= '9') ||
502
+ ('a' <= b && b <= 'z') ||
503
+ ('A' <= b && b <= 'Z'))
504
+ }
505
+
506
+ func isWhiteSpace(b byte) bool {
507
+ switch b {
508
+ case ' ', '\n', '\r', '\t':
509
+ return true
510
+ default:
511
+ return false
512
+ }
513
+ }
514
+
515
+ // parseIdent parses an unquoted proto identifier and returns size.
516
+ // If allowNeg is true, it allows '-' to be the first character in the
517
+ // identifier. This is used when parsing literal values like -infinity, etc.
518
+ // Regular expression matches an identifier: `^[_a-zA-Z][_a-zA-Z0-9]*`
519
+ func parseIdent(input []byte, allowNeg bool) int {
520
+ var size int
521
+
522
+ s := input
523
+ if len(s) == 0 {
524
+ return 0
525
+ }
526
+
527
+ if allowNeg && s[0] == '-' {
528
+ s = s[1:]
529
+ size++
530
+ if len(s) == 0 {
531
+ return 0
532
+ }
533
+ }
534
+
535
+ switch {
536
+ case s[0] == '_',
537
+ 'a' <= s[0] && s[0] <= 'z',
538
+ 'A' <= s[0] && s[0] <= 'Z':
539
+ s = s[1:]
540
+ size++
541
+ default:
542
+ return 0
543
+ }
544
+
545
+ for len(s) > 0 && (s[0] == '_' ||
546
+ 'a' <= s[0] && s[0] <= 'z' ||
547
+ 'A' <= s[0] && s[0] <= 'Z' ||
548
+ '0' <= s[0] && s[0] <= '9') {
549
+ s = s[1:]
550
+ size++
551
+ }
552
+
553
+ if len(s) > 0 && !isDelim(s[0]) {
554
+ return 0
555
+ }
556
+
557
+ return size
558
+ }
559
+
560
+ // parseScalar parses for a string, literal or number value.
561
+ func (d *Decoder) parseScalar() (Token, error) {
562
+ if d.in[0] == '"' || d.in[0] == '\'' {
563
+ return d.parseStringValue()
564
+ }
565
+
566
+ if tok, ok := d.parseLiteralValue(); ok {
567
+ return tok, nil
568
+ }
569
+
570
+ if tok, ok := d.parseNumberValue(); ok {
571
+ return tok, nil
572
+ }
573
+
574
+ return Token{}, d.newSyntaxError("invalid scalar value: %s", errRegexp.Find(d.in))
575
+ }
576
+
577
+ // parseLiteralValue parses a literal value. A literal value is used for
578
+ // bools, special floats and enums. This function simply identifies that the
579
+ // field value is a literal.
580
+ func (d *Decoder) parseLiteralValue() (Token, bool) {
581
+ size := parseIdent(d.in, true)
582
+ if size == 0 {
583
+ return Token{}, false
584
+ }
585
+ return d.consumeToken(Scalar, size, literalValue), true
586
+ }
587
+
588
+ // consumeToken constructs a Token for given Kind from d.in and consumes given
589
+ // size-length from it.
590
+ func (d *Decoder) consumeToken(kind Kind, size int, attrs uint8) Token {
591
+ // Important to compute raw and pos before consuming.
592
+ tok := Token{
593
+ kind: kind,
594
+ attrs: attrs,
595
+ pos: len(d.orig) - len(d.in),
596
+ raw: d.in[:size],
597
+ }
598
+ d.consume(size)
599
+ return tok
600
+ }
601
+
602
+ // newSyntaxError returns a syntax error with line and column information for
603
+ // current position.
604
+ func (d *Decoder) newSyntaxError(f string, x ...interface{}) error {
605
+ e := errors.New(f, x...)
606
+ line, column := d.Position(len(d.orig) - len(d.in))
607
+ return errors.New("syntax error (line %d:%d): %v", line, column, e)
608
+ }
609
+
610
+ // Position returns line and column number of given index of the original input.
611
+ // It will panic if index is out of range.
612
+ func (d *Decoder) Position(idx int) (line int, column int) {
613
+ b := d.orig[:idx]
614
+ line = bytes.Count(b, []byte("\n")) + 1
615
+ if i := bytes.LastIndexByte(b, '\n'); i >= 0 {
616
+ b = b[i+1:]
617
+ }
618
+ column = utf8.RuneCount(b) + 1 // ignore multi-rune characters
619
+ return line, column
620
+ }
621
+
622
+ func (d *Decoder) tryConsumeChar(c byte) bool {
623
+ if len(d.in) > 0 && d.in[0] == c {
624
+ d.consume(1)
625
+ return true
626
+ }
627
+ return false
628
+ }
629
+
630
+ // consume consumes n bytes of input and any subsequent whitespace or comments.
631
+ func (d *Decoder) consume(n int) {
632
+ d.in = consume(d.in, n)
633
+ return
634
+ }
635
+
636
+ // consume consumes n bytes of input and any subsequent whitespace or comments.
637
+ func consume(b []byte, n int) []byte {
638
+ b = b[n:]
639
+ for len(b) > 0 {
640
+ switch b[0] {
641
+ case ' ', '\n', '\r', '\t':
642
+ b = b[1:]
643
+ case '#':
644
+ if i := bytes.IndexByte(b, '\n'); i >= 0 {
645
+ b = b[i+len("\n"):]
646
+ } else {
647
+ b = nil
648
+ }
649
+ default:
650
+ return b
651
+ }
652
+ }
653
+ return b
654
+ }
655
+
656
+ // Any sequence that looks like a non-delimiter (for error reporting).
657
+ var errRegexp = regexp.MustCompile(`^([-+._a-zA-Z0-9\/]+|.)`)
658
+
659
+ // isDelim returns true if given byte is a delimiter character.
660
+ func isDelim(c byte) bool {
661
+ return !(c == '-' || c == '+' || c == '.' || c == '_' ||
662
+ ('a' <= c && c <= 'z') ||
663
+ ('A' <= c && c <= 'Z') ||
664
+ ('0' <= c && c <= '9'))
665
+ }