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,317 @@
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 proto
6
+
7
+ import (
8
+ "bytes"
9
+ "compress/gzip"
10
+ "fmt"
11
+ "io/ioutil"
12
+ "reflect"
13
+ "strings"
14
+ "sync"
15
+
16
+ "google.golang.org/protobuf/reflect/protodesc"
17
+ "google.golang.org/protobuf/reflect/protoreflect"
18
+ "google.golang.org/protobuf/reflect/protoregistry"
19
+ "google.golang.org/protobuf/runtime/protoimpl"
20
+ )
21
+
22
+ // filePath is the path to the proto source file.
23
+ type filePath = string // e.g., "google/protobuf/descriptor.proto"
24
+
25
+ // fileDescGZIP is the compressed contents of the encoded FileDescriptorProto.
26
+ type fileDescGZIP = []byte
27
+
28
+ var fileCache sync.Map // map[filePath]fileDescGZIP
29
+
30
+ // RegisterFile is called from generated code to register the compressed
31
+ // FileDescriptorProto with the file path for a proto source file.
32
+ //
33
+ // Deprecated: Use protoregistry.GlobalFiles.RegisterFile instead.
34
+ func RegisterFile(s filePath, d fileDescGZIP) {
35
+ // Decompress the descriptor.
36
+ zr, err := gzip.NewReader(bytes.NewReader(d))
37
+ if err != nil {
38
+ panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err))
39
+ }
40
+ b, err := ioutil.ReadAll(zr)
41
+ if err != nil {
42
+ panic(fmt.Sprintf("proto: invalid compressed file descriptor: %v", err))
43
+ }
44
+
45
+ // Construct a protoreflect.FileDescriptor from the raw descriptor.
46
+ // Note that DescBuilder.Build automatically registers the constructed
47
+ // file descriptor with the v2 registry.
48
+ protoimpl.DescBuilder{RawDescriptor: b}.Build()
49
+
50
+ // Locally cache the raw descriptor form for the file.
51
+ fileCache.Store(s, d)
52
+ }
53
+
54
+ // FileDescriptor returns the compressed FileDescriptorProto given the file path
55
+ // for a proto source file. It returns nil if not found.
56
+ //
57
+ // Deprecated: Use protoregistry.GlobalFiles.FindFileByPath instead.
58
+ func FileDescriptor(s filePath) fileDescGZIP {
59
+ if v, ok := fileCache.Load(s); ok {
60
+ return v.(fileDescGZIP)
61
+ }
62
+
63
+ // Find the descriptor in the v2 registry.
64
+ var b []byte
65
+ if fd, _ := protoregistry.GlobalFiles.FindFileByPath(s); fd != nil {
66
+ b, _ = Marshal(protodesc.ToFileDescriptorProto(fd))
67
+ }
68
+
69
+ // Locally cache the raw descriptor form for the file.
70
+ if len(b) > 0 {
71
+ v, _ := fileCache.LoadOrStore(s, protoimpl.X.CompressGZIP(b))
72
+ return v.(fileDescGZIP)
73
+ }
74
+ return nil
75
+ }
76
+
77
+ // enumName is the name of an enum. For historical reasons, the enum name is
78
+ // neither the full Go name nor the full protobuf name of the enum.
79
+ // The name is the dot-separated combination of just the proto package that the
80
+ // enum is declared within followed by the Go type name of the generated enum.
81
+ type enumName = string // e.g., "my.proto.package.GoMessage_GoEnum"
82
+
83
+ // enumsByName maps enum values by name to their numeric counterpart.
84
+ type enumsByName = map[string]int32
85
+
86
+ // enumsByNumber maps enum values by number to their name counterpart.
87
+ type enumsByNumber = map[int32]string
88
+
89
+ var enumCache sync.Map // map[enumName]enumsByName
90
+ var numFilesCache sync.Map // map[protoreflect.FullName]int
91
+
92
+ // RegisterEnum is called from the generated code to register the mapping of
93
+ // enum value names to enum numbers for the enum identified by s.
94
+ //
95
+ // Deprecated: Use protoregistry.GlobalTypes.RegisterEnum instead.
96
+ func RegisterEnum(s enumName, _ enumsByNumber, m enumsByName) {
97
+ if _, ok := enumCache.Load(s); ok {
98
+ panic("proto: duplicate enum registered: " + s)
99
+ }
100
+ enumCache.Store(s, m)
101
+
102
+ // This does not forward registration to the v2 registry since this API
103
+ // lacks sufficient information to construct a complete v2 enum descriptor.
104
+ }
105
+
106
+ // EnumValueMap returns the mapping from enum value names to enum numbers for
107
+ // the enum of the given name. It returns nil if not found.
108
+ //
109
+ // Deprecated: Use protoregistry.GlobalTypes.FindEnumByName instead.
110
+ func EnumValueMap(s enumName) enumsByName {
111
+ if v, ok := enumCache.Load(s); ok {
112
+ return v.(enumsByName)
113
+ }
114
+
115
+ // Check whether the cache is stale. If the number of files in the current
116
+ // package differs, then it means that some enums may have been recently
117
+ // registered upstream that we do not know about.
118
+ var protoPkg protoreflect.FullName
119
+ if i := strings.LastIndexByte(s, '.'); i >= 0 {
120
+ protoPkg = protoreflect.FullName(s[:i])
121
+ }
122
+ v, _ := numFilesCache.Load(protoPkg)
123
+ numFiles, _ := v.(int)
124
+ if protoregistry.GlobalFiles.NumFilesByPackage(protoPkg) == numFiles {
125
+ return nil // cache is up-to-date; was not found earlier
126
+ }
127
+
128
+ // Update the enum cache for all enums declared in the given proto package.
129
+ numFiles = 0
130
+ protoregistry.GlobalFiles.RangeFilesByPackage(protoPkg, func(fd protoreflect.FileDescriptor) bool {
131
+ walkEnums(fd, func(ed protoreflect.EnumDescriptor) {
132
+ name := protoimpl.X.LegacyEnumName(ed)
133
+ if _, ok := enumCache.Load(name); !ok {
134
+ m := make(enumsByName)
135
+ evs := ed.Values()
136
+ for i := evs.Len() - 1; i >= 0; i-- {
137
+ ev := evs.Get(i)
138
+ m[string(ev.Name())] = int32(ev.Number())
139
+ }
140
+ enumCache.LoadOrStore(name, m)
141
+ }
142
+ })
143
+ numFiles++
144
+ return true
145
+ })
146
+ numFilesCache.Store(protoPkg, numFiles)
147
+
148
+ // Check cache again for enum map.
149
+ if v, ok := enumCache.Load(s); ok {
150
+ return v.(enumsByName)
151
+ }
152
+ return nil
153
+ }
154
+
155
+ // walkEnums recursively walks all enums declared in d.
156
+ func walkEnums(d interface {
157
+ Enums() protoreflect.EnumDescriptors
158
+ Messages() protoreflect.MessageDescriptors
159
+ }, f func(protoreflect.EnumDescriptor)) {
160
+ eds := d.Enums()
161
+ for i := eds.Len() - 1; i >= 0; i-- {
162
+ f(eds.Get(i))
163
+ }
164
+ mds := d.Messages()
165
+ for i := mds.Len() - 1; i >= 0; i-- {
166
+ walkEnums(mds.Get(i), f)
167
+ }
168
+ }
169
+
170
+ // messageName is the full name of protobuf message.
171
+ type messageName = string
172
+
173
+ var messageTypeCache sync.Map // map[messageName]reflect.Type
174
+
175
+ // RegisterType is called from generated code to register the message Go type
176
+ // for a message of the given name.
177
+ //
178
+ // Deprecated: Use protoregistry.GlobalTypes.RegisterMessage instead.
179
+ func RegisterType(m Message, s messageName) {
180
+ mt := protoimpl.X.LegacyMessageTypeOf(m, protoreflect.FullName(s))
181
+ if err := protoregistry.GlobalTypes.RegisterMessage(mt); err != nil {
182
+ panic(err)
183
+ }
184
+ messageTypeCache.Store(s, reflect.TypeOf(m))
185
+ }
186
+
187
+ // RegisterMapType is called from generated code to register the Go map type
188
+ // for a protobuf message representing a map entry.
189
+ //
190
+ // Deprecated: Do not use.
191
+ func RegisterMapType(m interface{}, s messageName) {
192
+ t := reflect.TypeOf(m)
193
+ if t.Kind() != reflect.Map {
194
+ panic(fmt.Sprintf("invalid map kind: %v", t))
195
+ }
196
+ if _, ok := messageTypeCache.Load(s); ok {
197
+ panic(fmt.Errorf("proto: duplicate proto message registered: %s", s))
198
+ }
199
+ messageTypeCache.Store(s, t)
200
+ }
201
+
202
+ // MessageType returns the message type for a named message.
203
+ // It returns nil if not found.
204
+ //
205
+ // Deprecated: Use protoregistry.GlobalTypes.FindMessageByName instead.
206
+ func MessageType(s messageName) reflect.Type {
207
+ if v, ok := messageTypeCache.Load(s); ok {
208
+ return v.(reflect.Type)
209
+ }
210
+
211
+ // Derive the message type from the v2 registry.
212
+ var t reflect.Type
213
+ if mt, _ := protoregistry.GlobalTypes.FindMessageByName(protoreflect.FullName(s)); mt != nil {
214
+ t = messageGoType(mt)
215
+ }
216
+
217
+ // If we could not get a concrete type, it is possible that it is a
218
+ // pseudo-message for a map entry.
219
+ if t == nil {
220
+ d, _ := protoregistry.GlobalFiles.FindDescriptorByName(protoreflect.FullName(s))
221
+ if md, _ := d.(protoreflect.MessageDescriptor); md != nil && md.IsMapEntry() {
222
+ kt := goTypeForField(md.Fields().ByNumber(1))
223
+ vt := goTypeForField(md.Fields().ByNumber(2))
224
+ t = reflect.MapOf(kt, vt)
225
+ }
226
+ }
227
+
228
+ // Locally cache the message type for the given name.
229
+ if t != nil {
230
+ v, _ := messageTypeCache.LoadOrStore(s, t)
231
+ return v.(reflect.Type)
232
+ }
233
+ return nil
234
+ }
235
+
236
+ func goTypeForField(fd protoreflect.FieldDescriptor) reflect.Type {
237
+ switch k := fd.Kind(); k {
238
+ case protoreflect.EnumKind:
239
+ if et, _ := protoregistry.GlobalTypes.FindEnumByName(fd.Enum().FullName()); et != nil {
240
+ return enumGoType(et)
241
+ }
242
+ return reflect.TypeOf(protoreflect.EnumNumber(0))
243
+ case protoreflect.MessageKind, protoreflect.GroupKind:
244
+ if mt, _ := protoregistry.GlobalTypes.FindMessageByName(fd.Message().FullName()); mt != nil {
245
+ return messageGoType(mt)
246
+ }
247
+ return reflect.TypeOf((*protoreflect.Message)(nil)).Elem()
248
+ default:
249
+ return reflect.TypeOf(fd.Default().Interface())
250
+ }
251
+ }
252
+
253
+ func enumGoType(et protoreflect.EnumType) reflect.Type {
254
+ return reflect.TypeOf(et.New(0))
255
+ }
256
+
257
+ func messageGoType(mt protoreflect.MessageType) reflect.Type {
258
+ return reflect.TypeOf(MessageV1(mt.Zero().Interface()))
259
+ }
260
+
261
+ // MessageName returns the full protobuf name for the given message type.
262
+ //
263
+ // Deprecated: Use protoreflect.MessageDescriptor.FullName instead.
264
+ func MessageName(m Message) messageName {
265
+ if m == nil {
266
+ return ""
267
+ }
268
+ if m, ok := m.(interface{ XXX_MessageName() messageName }); ok {
269
+ return m.XXX_MessageName()
270
+ }
271
+ return messageName(protoimpl.X.MessageDescriptorOf(m).FullName())
272
+ }
273
+
274
+ // RegisterExtension is called from the generated code to register
275
+ // the extension descriptor.
276
+ //
277
+ // Deprecated: Use protoregistry.GlobalTypes.RegisterExtension instead.
278
+ func RegisterExtension(d *ExtensionDesc) {
279
+ if err := protoregistry.GlobalTypes.RegisterExtension(d); err != nil {
280
+ panic(err)
281
+ }
282
+ }
283
+
284
+ type extensionsByNumber = map[int32]*ExtensionDesc
285
+
286
+ var extensionCache sync.Map // map[messageName]extensionsByNumber
287
+
288
+ // RegisteredExtensions returns a map of the registered extensions for the
289
+ // provided protobuf message, indexed by the extension field number.
290
+ //
291
+ // Deprecated: Use protoregistry.GlobalTypes.RangeExtensionsByMessage instead.
292
+ func RegisteredExtensions(m Message) extensionsByNumber {
293
+ // Check whether the cache is stale. If the number of extensions for
294
+ // the given message differs, then it means that some extensions were
295
+ // recently registered upstream that we do not know about.
296
+ s := MessageName(m)
297
+ v, _ := extensionCache.Load(s)
298
+ xs, _ := v.(extensionsByNumber)
299
+ if protoregistry.GlobalTypes.NumExtensionsByMessage(protoreflect.FullName(s)) == len(xs) {
300
+ return xs // cache is up-to-date
301
+ }
302
+
303
+ // Cache is stale, re-compute the extensions map.
304
+ xs = make(extensionsByNumber)
305
+ protoregistry.GlobalTypes.RangeExtensionsByMessage(protoreflect.FullName(s), func(xt protoreflect.ExtensionType) bool {
306
+ if xd, ok := xt.(*ExtensionDesc); ok {
307
+ xs[int32(xt.TypeDescriptor().Number())] = xd
308
+ } else {
309
+ // TODO: This implies that the protoreflect.ExtensionType is a
310
+ // custom type not generated by protoc-gen-go. We could try and
311
+ // convert the type to an ExtensionDesc.
312
+ }
313
+ return true
314
+ })
315
+ extensionCache.Store(s, xs)
316
+ return xs
317
+ }
@@ -0,0 +1,801 @@
1
+ // Copyright 2010 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 proto
6
+
7
+ import (
8
+ "encoding"
9
+ "errors"
10
+ "fmt"
11
+ "reflect"
12
+ "strconv"
13
+ "strings"
14
+ "unicode/utf8"
15
+
16
+ "google.golang.org/protobuf/encoding/prototext"
17
+ protoV2 "google.golang.org/protobuf/proto"
18
+ "google.golang.org/protobuf/reflect/protoreflect"
19
+ "google.golang.org/protobuf/reflect/protoregistry"
20
+ )
21
+
22
+ const wrapTextUnmarshalV2 = false
23
+
24
+ // ParseError is returned by UnmarshalText.
25
+ type ParseError struct {
26
+ Message string
27
+
28
+ // Deprecated: Do not use.
29
+ Line, Offset int
30
+ }
31
+
32
+ func (e *ParseError) Error() string {
33
+ if wrapTextUnmarshalV2 {
34
+ return e.Message
35
+ }
36
+ if e.Line == 1 {
37
+ return fmt.Sprintf("line 1.%d: %v", e.Offset, e.Message)
38
+ }
39
+ return fmt.Sprintf("line %d: %v", e.Line, e.Message)
40
+ }
41
+
42
+ // UnmarshalText parses a proto text formatted string into m.
43
+ func UnmarshalText(s string, m Message) error {
44
+ if u, ok := m.(encoding.TextUnmarshaler); ok {
45
+ return u.UnmarshalText([]byte(s))
46
+ }
47
+
48
+ m.Reset()
49
+ mi := MessageV2(m)
50
+
51
+ if wrapTextUnmarshalV2 {
52
+ err := prototext.UnmarshalOptions{
53
+ AllowPartial: true,
54
+ }.Unmarshal([]byte(s), mi)
55
+ if err != nil {
56
+ return &ParseError{Message: err.Error()}
57
+ }
58
+ return checkRequiredNotSet(mi)
59
+ } else {
60
+ if err := newTextParser(s).unmarshalMessage(mi.ProtoReflect(), ""); err != nil {
61
+ return err
62
+ }
63
+ return checkRequiredNotSet(mi)
64
+ }
65
+ }
66
+
67
+ type textParser struct {
68
+ s string // remaining input
69
+ done bool // whether the parsing is finished (success or error)
70
+ backed bool // whether back() was called
71
+ offset, line int
72
+ cur token
73
+ }
74
+
75
+ type token struct {
76
+ value string
77
+ err *ParseError
78
+ line int // line number
79
+ offset int // byte number from start of input, not start of line
80
+ unquoted string // the unquoted version of value, if it was a quoted string
81
+ }
82
+
83
+ func newTextParser(s string) *textParser {
84
+ p := new(textParser)
85
+ p.s = s
86
+ p.line = 1
87
+ p.cur.line = 1
88
+ return p
89
+ }
90
+
91
+ func (p *textParser) unmarshalMessage(m protoreflect.Message, terminator string) (err error) {
92
+ md := m.Descriptor()
93
+ fds := md.Fields()
94
+
95
+ // A struct is a sequence of "name: value", terminated by one of
96
+ // '>' or '}', or the end of the input. A name may also be
97
+ // "[extension]" or "[type/url]".
98
+ //
99
+ // The whole struct can also be an expanded Any message, like:
100
+ // [type/url] < ... struct contents ... >
101
+ seen := make(map[protoreflect.FieldNumber]bool)
102
+ for {
103
+ tok := p.next()
104
+ if tok.err != nil {
105
+ return tok.err
106
+ }
107
+ if tok.value == terminator {
108
+ break
109
+ }
110
+ if tok.value == "[" {
111
+ if err := p.unmarshalExtensionOrAny(m, seen); err != nil {
112
+ return err
113
+ }
114
+ continue
115
+ }
116
+
117
+ // This is a normal, non-extension field.
118
+ name := protoreflect.Name(tok.value)
119
+ fd := fds.ByName(name)
120
+ switch {
121
+ case fd == nil:
122
+ gd := fds.ByName(protoreflect.Name(strings.ToLower(string(name))))
123
+ if gd != nil && gd.Kind() == protoreflect.GroupKind && gd.Message().Name() == name {
124
+ fd = gd
125
+ }
126
+ case fd.Kind() == protoreflect.GroupKind && fd.Message().Name() != name:
127
+ fd = nil
128
+ case fd.IsWeak() && fd.Message().IsPlaceholder():
129
+ fd = nil
130
+ }
131
+ if fd == nil {
132
+ typeName := string(md.FullName())
133
+ if m, ok := m.Interface().(Message); ok {
134
+ t := reflect.TypeOf(m)
135
+ if t.Kind() == reflect.Ptr {
136
+ typeName = t.Elem().String()
137
+ }
138
+ }
139
+ return p.errorf("unknown field name %q in %v", name, typeName)
140
+ }
141
+ if od := fd.ContainingOneof(); od != nil && m.WhichOneof(od) != nil {
142
+ return p.errorf("field '%s' would overwrite already parsed oneof '%s'", name, od.Name())
143
+ }
144
+ if fd.Cardinality() != protoreflect.Repeated && seen[fd.Number()] {
145
+ return p.errorf("non-repeated field %q was repeated", fd.Name())
146
+ }
147
+ seen[fd.Number()] = true
148
+
149
+ // Consume any colon.
150
+ if err := p.checkForColon(fd); err != nil {
151
+ return err
152
+ }
153
+
154
+ // Parse into the field.
155
+ v := m.Get(fd)
156
+ if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) {
157
+ v = m.Mutable(fd)
158
+ }
159
+ if v, err = p.unmarshalValue(v, fd); err != nil {
160
+ return err
161
+ }
162
+ m.Set(fd, v)
163
+
164
+ if err := p.consumeOptionalSeparator(); err != nil {
165
+ return err
166
+ }
167
+ }
168
+ return nil
169
+ }
170
+
171
+ func (p *textParser) unmarshalExtensionOrAny(m protoreflect.Message, seen map[protoreflect.FieldNumber]bool) error {
172
+ name, err := p.consumeExtensionOrAnyName()
173
+ if err != nil {
174
+ return err
175
+ }
176
+
177
+ // If it contains a slash, it's an Any type URL.
178
+ if slashIdx := strings.LastIndex(name, "/"); slashIdx >= 0 {
179
+ tok := p.next()
180
+ if tok.err != nil {
181
+ return tok.err
182
+ }
183
+ // consume an optional colon
184
+ if tok.value == ":" {
185
+ tok = p.next()
186
+ if tok.err != nil {
187
+ return tok.err
188
+ }
189
+ }
190
+
191
+ var terminator string
192
+ switch tok.value {
193
+ case "<":
194
+ terminator = ">"
195
+ case "{":
196
+ terminator = "}"
197
+ default:
198
+ return p.errorf("expected '{' or '<', found %q", tok.value)
199
+ }
200
+
201
+ mt, err := protoregistry.GlobalTypes.FindMessageByURL(name)
202
+ if err != nil {
203
+ return p.errorf("unrecognized message %q in google.protobuf.Any", name[slashIdx+len("/"):])
204
+ }
205
+ m2 := mt.New()
206
+ if err := p.unmarshalMessage(m2, terminator); err != nil {
207
+ return err
208
+ }
209
+ b, err := protoV2.Marshal(m2.Interface())
210
+ if err != nil {
211
+ return p.errorf("failed to marshal message of type %q: %v", name[slashIdx+len("/"):], err)
212
+ }
213
+
214
+ urlFD := m.Descriptor().Fields().ByName("type_url")
215
+ valFD := m.Descriptor().Fields().ByName("value")
216
+ if seen[urlFD.Number()] {
217
+ return p.errorf("Any message unpacked multiple times, or %q already set", urlFD.Name())
218
+ }
219
+ if seen[valFD.Number()] {
220
+ return p.errorf("Any message unpacked multiple times, or %q already set", valFD.Name())
221
+ }
222
+ m.Set(urlFD, protoreflect.ValueOfString(name))
223
+ m.Set(valFD, protoreflect.ValueOfBytes(b))
224
+ seen[urlFD.Number()] = true
225
+ seen[valFD.Number()] = true
226
+ return nil
227
+ }
228
+
229
+ xname := protoreflect.FullName(name)
230
+ xt, _ := protoregistry.GlobalTypes.FindExtensionByName(xname)
231
+ if xt == nil && isMessageSet(m.Descriptor()) {
232
+ xt, _ = protoregistry.GlobalTypes.FindExtensionByName(xname.Append("message_set_extension"))
233
+ }
234
+ if xt == nil {
235
+ return p.errorf("unrecognized extension %q", name)
236
+ }
237
+ fd := xt.TypeDescriptor()
238
+ if fd.ContainingMessage().FullName() != m.Descriptor().FullName() {
239
+ return p.errorf("extension field %q does not extend message %q", name, m.Descriptor().FullName())
240
+ }
241
+
242
+ if err := p.checkForColon(fd); err != nil {
243
+ return err
244
+ }
245
+
246
+ v := m.Get(fd)
247
+ if !m.Has(fd) && (fd.IsList() || fd.IsMap() || fd.Message() != nil) {
248
+ v = m.Mutable(fd)
249
+ }
250
+ v, err = p.unmarshalValue(v, fd)
251
+ if err != nil {
252
+ return err
253
+ }
254
+ m.Set(fd, v)
255
+ return p.consumeOptionalSeparator()
256
+ }
257
+
258
+ func (p *textParser) unmarshalValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) {
259
+ tok := p.next()
260
+ if tok.err != nil {
261
+ return v, tok.err
262
+ }
263
+ if tok.value == "" {
264
+ return v, p.errorf("unexpected EOF")
265
+ }
266
+
267
+ switch {
268
+ case fd.IsList():
269
+ lv := v.List()
270
+ var err error
271
+ if tok.value == "[" {
272
+ // Repeated field with list notation, like [1,2,3].
273
+ for {
274
+ vv := lv.NewElement()
275
+ vv, err = p.unmarshalSingularValue(vv, fd)
276
+ if err != nil {
277
+ return v, err
278
+ }
279
+ lv.Append(vv)
280
+
281
+ tok := p.next()
282
+ if tok.err != nil {
283
+ return v, tok.err
284
+ }
285
+ if tok.value == "]" {
286
+ break
287
+ }
288
+ if tok.value != "," {
289
+ return v, p.errorf("Expected ']' or ',' found %q", tok.value)
290
+ }
291
+ }
292
+ return v, nil
293
+ }
294
+
295
+ // One value of the repeated field.
296
+ p.back()
297
+ vv := lv.NewElement()
298
+ vv, err = p.unmarshalSingularValue(vv, fd)
299
+ if err != nil {
300
+ return v, err
301
+ }
302
+ lv.Append(vv)
303
+ return v, nil
304
+ case fd.IsMap():
305
+ // The map entry should be this sequence of tokens:
306
+ // < key : KEY value : VALUE >
307
+ // However, implementations may omit key or value, and technically
308
+ // we should support them in any order.
309
+ var terminator string
310
+ switch tok.value {
311
+ case "<":
312
+ terminator = ">"
313
+ case "{":
314
+ terminator = "}"
315
+ default:
316
+ return v, p.errorf("expected '{' or '<', found %q", tok.value)
317
+ }
318
+
319
+ keyFD := fd.MapKey()
320
+ valFD := fd.MapValue()
321
+
322
+ mv := v.Map()
323
+ kv := keyFD.Default()
324
+ vv := mv.NewValue()
325
+ for {
326
+ tok := p.next()
327
+ if tok.err != nil {
328
+ return v, tok.err
329
+ }
330
+ if tok.value == terminator {
331
+ break
332
+ }
333
+ var err error
334
+ switch tok.value {
335
+ case "key":
336
+ if err := p.consumeToken(":"); err != nil {
337
+ return v, err
338
+ }
339
+ if kv, err = p.unmarshalSingularValue(kv, keyFD); err != nil {
340
+ return v, err
341
+ }
342
+ if err := p.consumeOptionalSeparator(); err != nil {
343
+ return v, err
344
+ }
345
+ case "value":
346
+ if err := p.checkForColon(valFD); err != nil {
347
+ return v, err
348
+ }
349
+ if vv, err = p.unmarshalSingularValue(vv, valFD); err != nil {
350
+ return v, err
351
+ }
352
+ if err := p.consumeOptionalSeparator(); err != nil {
353
+ return v, err
354
+ }
355
+ default:
356
+ p.back()
357
+ return v, p.errorf(`expected "key", "value", or %q, found %q`, terminator, tok.value)
358
+ }
359
+ }
360
+ mv.Set(kv.MapKey(), vv)
361
+ return v, nil
362
+ default:
363
+ p.back()
364
+ return p.unmarshalSingularValue(v, fd)
365
+ }
366
+ }
367
+
368
+ func (p *textParser) unmarshalSingularValue(v protoreflect.Value, fd protoreflect.FieldDescriptor) (protoreflect.Value, error) {
369
+ tok := p.next()
370
+ if tok.err != nil {
371
+ return v, tok.err
372
+ }
373
+ if tok.value == "" {
374
+ return v, p.errorf("unexpected EOF")
375
+ }
376
+
377
+ switch fd.Kind() {
378
+ case protoreflect.BoolKind:
379
+ switch tok.value {
380
+ case "true", "1", "t", "True":
381
+ return protoreflect.ValueOfBool(true), nil
382
+ case "false", "0", "f", "False":
383
+ return protoreflect.ValueOfBool(false), nil
384
+ }
385
+ case protoreflect.Int32Kind, protoreflect.Sint32Kind, protoreflect.Sfixed32Kind:
386
+ if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil {
387
+ return protoreflect.ValueOfInt32(int32(x)), nil
388
+ }
389
+
390
+ // The C++ parser accepts large positive hex numbers that uses
391
+ // two's complement arithmetic to represent negative numbers.
392
+ // This feature is here for backwards compatibility with C++.
393
+ if strings.HasPrefix(tok.value, "0x") {
394
+ if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil {
395
+ return protoreflect.ValueOfInt32(int32(-(int64(^x) + 1))), nil
396
+ }
397
+ }
398
+ case protoreflect.Int64Kind, protoreflect.Sint64Kind, protoreflect.Sfixed64Kind:
399
+ if x, err := strconv.ParseInt(tok.value, 0, 64); err == nil {
400
+ return protoreflect.ValueOfInt64(int64(x)), nil
401
+ }
402
+
403
+ // The C++ parser accepts large positive hex numbers that uses
404
+ // two's complement arithmetic to represent negative numbers.
405
+ // This feature is here for backwards compatibility with C++.
406
+ if strings.HasPrefix(tok.value, "0x") {
407
+ if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil {
408
+ return protoreflect.ValueOfInt64(int64(-(int64(^x) + 1))), nil
409
+ }
410
+ }
411
+ case protoreflect.Uint32Kind, protoreflect.Fixed32Kind:
412
+ if x, err := strconv.ParseUint(tok.value, 0, 32); err == nil {
413
+ return protoreflect.ValueOfUint32(uint32(x)), nil
414
+ }
415
+ case protoreflect.Uint64Kind, protoreflect.Fixed64Kind:
416
+ if x, err := strconv.ParseUint(tok.value, 0, 64); err == nil {
417
+ return protoreflect.ValueOfUint64(uint64(x)), nil
418
+ }
419
+ case protoreflect.FloatKind:
420
+ // Ignore 'f' for compatibility with output generated by C++,
421
+ // but don't remove 'f' when the value is "-inf" or "inf".
422
+ v := tok.value
423
+ if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" {
424
+ v = v[:len(v)-len("f")]
425
+ }
426
+ if x, err := strconv.ParseFloat(v, 32); err == nil {
427
+ return protoreflect.ValueOfFloat32(float32(x)), nil
428
+ }
429
+ case protoreflect.DoubleKind:
430
+ // Ignore 'f' for compatibility with output generated by C++,
431
+ // but don't remove 'f' when the value is "-inf" or "inf".
432
+ v := tok.value
433
+ if strings.HasSuffix(v, "f") && v != "-inf" && v != "inf" {
434
+ v = v[:len(v)-len("f")]
435
+ }
436
+ if x, err := strconv.ParseFloat(v, 64); err == nil {
437
+ return protoreflect.ValueOfFloat64(float64(x)), nil
438
+ }
439
+ case protoreflect.StringKind:
440
+ if isQuote(tok.value[0]) {
441
+ return protoreflect.ValueOfString(tok.unquoted), nil
442
+ }
443
+ case protoreflect.BytesKind:
444
+ if isQuote(tok.value[0]) {
445
+ return protoreflect.ValueOfBytes([]byte(tok.unquoted)), nil
446
+ }
447
+ case protoreflect.EnumKind:
448
+ if x, err := strconv.ParseInt(tok.value, 0, 32); err == nil {
449
+ return protoreflect.ValueOfEnum(protoreflect.EnumNumber(x)), nil
450
+ }
451
+ vd := fd.Enum().Values().ByName(protoreflect.Name(tok.value))
452
+ if vd != nil {
453
+ return protoreflect.ValueOfEnum(vd.Number()), nil
454
+ }
455
+ case protoreflect.MessageKind, protoreflect.GroupKind:
456
+ var terminator string
457
+ switch tok.value {
458
+ case "{":
459
+ terminator = "}"
460
+ case "<":
461
+ terminator = ">"
462
+ default:
463
+ return v, p.errorf("expected '{' or '<', found %q", tok.value)
464
+ }
465
+ err := p.unmarshalMessage(v.Message(), terminator)
466
+ return v, err
467
+ default:
468
+ panic(fmt.Sprintf("invalid kind %v", fd.Kind()))
469
+ }
470
+ return v, p.errorf("invalid %v: %v", fd.Kind(), tok.value)
471
+ }
472
+
473
+ // Consume a ':' from the input stream (if the next token is a colon),
474
+ // returning an error if a colon is needed but not present.
475
+ func (p *textParser) checkForColon(fd protoreflect.FieldDescriptor) *ParseError {
476
+ tok := p.next()
477
+ if tok.err != nil {
478
+ return tok.err
479
+ }
480
+ if tok.value != ":" {
481
+ if fd.Message() == nil {
482
+ return p.errorf("expected ':', found %q", tok.value)
483
+ }
484
+ p.back()
485
+ }
486
+ return nil
487
+ }
488
+
489
+ // consumeExtensionOrAnyName consumes an extension name or an Any type URL and
490
+ // the following ']'. It returns the name or URL consumed.
491
+ func (p *textParser) consumeExtensionOrAnyName() (string, error) {
492
+ tok := p.next()
493
+ if tok.err != nil {
494
+ return "", tok.err
495
+ }
496
+
497
+ // If extension name or type url is quoted, it's a single token.
498
+ if len(tok.value) > 2 && isQuote(tok.value[0]) && tok.value[len(tok.value)-1] == tok.value[0] {
499
+ name, err := unquoteC(tok.value[1:len(tok.value)-1], rune(tok.value[0]))
500
+ if err != nil {
501
+ return "", err
502
+ }
503
+ return name, p.consumeToken("]")
504
+ }
505
+
506
+ // Consume everything up to "]"
507
+ var parts []string
508
+ for tok.value != "]" {
509
+ parts = append(parts, tok.value)
510
+ tok = p.next()
511
+ if tok.err != nil {
512
+ return "", p.errorf("unrecognized type_url or extension name: %s", tok.err)
513
+ }
514
+ if p.done && tok.value != "]" {
515
+ return "", p.errorf("unclosed type_url or extension name")
516
+ }
517
+ }
518
+ return strings.Join(parts, ""), nil
519
+ }
520
+
521
+ // consumeOptionalSeparator consumes an optional semicolon or comma.
522
+ // It is used in unmarshalMessage to provide backward compatibility.
523
+ func (p *textParser) consumeOptionalSeparator() error {
524
+ tok := p.next()
525
+ if tok.err != nil {
526
+ return tok.err
527
+ }
528
+ if tok.value != ";" && tok.value != "," {
529
+ p.back()
530
+ }
531
+ return nil
532
+ }
533
+
534
+ func (p *textParser) errorf(format string, a ...interface{}) *ParseError {
535
+ pe := &ParseError{fmt.Sprintf(format, a...), p.cur.line, p.cur.offset}
536
+ p.cur.err = pe
537
+ p.done = true
538
+ return pe
539
+ }
540
+
541
+ func (p *textParser) skipWhitespace() {
542
+ i := 0
543
+ for i < len(p.s) && (isWhitespace(p.s[i]) || p.s[i] == '#') {
544
+ if p.s[i] == '#' {
545
+ // comment; skip to end of line or input
546
+ for i < len(p.s) && p.s[i] != '\n' {
547
+ i++
548
+ }
549
+ if i == len(p.s) {
550
+ break
551
+ }
552
+ }
553
+ if p.s[i] == '\n' {
554
+ p.line++
555
+ }
556
+ i++
557
+ }
558
+ p.offset += i
559
+ p.s = p.s[i:len(p.s)]
560
+ if len(p.s) == 0 {
561
+ p.done = true
562
+ }
563
+ }
564
+
565
+ func (p *textParser) advance() {
566
+ // Skip whitespace
567
+ p.skipWhitespace()
568
+ if p.done {
569
+ return
570
+ }
571
+
572
+ // Start of non-whitespace
573
+ p.cur.err = nil
574
+ p.cur.offset, p.cur.line = p.offset, p.line
575
+ p.cur.unquoted = ""
576
+ switch p.s[0] {
577
+ case '<', '>', '{', '}', ':', '[', ']', ';', ',', '/':
578
+ // Single symbol
579
+ p.cur.value, p.s = p.s[0:1], p.s[1:len(p.s)]
580
+ case '"', '\'':
581
+ // Quoted string
582
+ i := 1
583
+ for i < len(p.s) && p.s[i] != p.s[0] && p.s[i] != '\n' {
584
+ if p.s[i] == '\\' && i+1 < len(p.s) {
585
+ // skip escaped char
586
+ i++
587
+ }
588
+ i++
589
+ }
590
+ if i >= len(p.s) || p.s[i] != p.s[0] {
591
+ p.errorf("unmatched quote")
592
+ return
593
+ }
594
+ unq, err := unquoteC(p.s[1:i], rune(p.s[0]))
595
+ if err != nil {
596
+ p.errorf("invalid quoted string %s: %v", p.s[0:i+1], err)
597
+ return
598
+ }
599
+ p.cur.value, p.s = p.s[0:i+1], p.s[i+1:len(p.s)]
600
+ p.cur.unquoted = unq
601
+ default:
602
+ i := 0
603
+ for i < len(p.s) && isIdentOrNumberChar(p.s[i]) {
604
+ i++
605
+ }
606
+ if i == 0 {
607
+ p.errorf("unexpected byte %#x", p.s[0])
608
+ return
609
+ }
610
+ p.cur.value, p.s = p.s[0:i], p.s[i:len(p.s)]
611
+ }
612
+ p.offset += len(p.cur.value)
613
+ }
614
+
615
+ // Back off the parser by one token. Can only be done between calls to next().
616
+ // It makes the next advance() a no-op.
617
+ func (p *textParser) back() { p.backed = true }
618
+
619
+ // Advances the parser and returns the new current token.
620
+ func (p *textParser) next() *token {
621
+ if p.backed || p.done {
622
+ p.backed = false
623
+ return &p.cur
624
+ }
625
+ p.advance()
626
+ if p.done {
627
+ p.cur.value = ""
628
+ } else if len(p.cur.value) > 0 && isQuote(p.cur.value[0]) {
629
+ // Look for multiple quoted strings separated by whitespace,
630
+ // and concatenate them.
631
+ cat := p.cur
632
+ for {
633
+ p.skipWhitespace()
634
+ if p.done || !isQuote(p.s[0]) {
635
+ break
636
+ }
637
+ p.advance()
638
+ if p.cur.err != nil {
639
+ return &p.cur
640
+ }
641
+ cat.value += " " + p.cur.value
642
+ cat.unquoted += p.cur.unquoted
643
+ }
644
+ p.done = false // parser may have seen EOF, but we want to return cat
645
+ p.cur = cat
646
+ }
647
+ return &p.cur
648
+ }
649
+
650
+ func (p *textParser) consumeToken(s string) error {
651
+ tok := p.next()
652
+ if tok.err != nil {
653
+ return tok.err
654
+ }
655
+ if tok.value != s {
656
+ p.back()
657
+ return p.errorf("expected %q, found %q", s, tok.value)
658
+ }
659
+ return nil
660
+ }
661
+
662
+ var errBadUTF8 = errors.New("proto: bad UTF-8")
663
+
664
+ func unquoteC(s string, quote rune) (string, error) {
665
+ // This is based on C++'s tokenizer.cc.
666
+ // Despite its name, this is *not* parsing C syntax.
667
+ // For instance, "\0" is an invalid quoted string.
668
+
669
+ // Avoid allocation in trivial cases.
670
+ simple := true
671
+ for _, r := range s {
672
+ if r == '\\' || r == quote {
673
+ simple = false
674
+ break
675
+ }
676
+ }
677
+ if simple {
678
+ return s, nil
679
+ }
680
+
681
+ buf := make([]byte, 0, 3*len(s)/2)
682
+ for len(s) > 0 {
683
+ r, n := utf8.DecodeRuneInString(s)
684
+ if r == utf8.RuneError && n == 1 {
685
+ return "", errBadUTF8
686
+ }
687
+ s = s[n:]
688
+ if r != '\\' {
689
+ if r < utf8.RuneSelf {
690
+ buf = append(buf, byte(r))
691
+ } else {
692
+ buf = append(buf, string(r)...)
693
+ }
694
+ continue
695
+ }
696
+
697
+ ch, tail, err := unescape(s)
698
+ if err != nil {
699
+ return "", err
700
+ }
701
+ buf = append(buf, ch...)
702
+ s = tail
703
+ }
704
+ return string(buf), nil
705
+ }
706
+
707
+ func unescape(s string) (ch string, tail string, err error) {
708
+ r, n := utf8.DecodeRuneInString(s)
709
+ if r == utf8.RuneError && n == 1 {
710
+ return "", "", errBadUTF8
711
+ }
712
+ s = s[n:]
713
+ switch r {
714
+ case 'a':
715
+ return "\a", s, nil
716
+ case 'b':
717
+ return "\b", s, nil
718
+ case 'f':
719
+ return "\f", s, nil
720
+ case 'n':
721
+ return "\n", s, nil
722
+ case 'r':
723
+ return "\r", s, nil
724
+ case 't':
725
+ return "\t", s, nil
726
+ case 'v':
727
+ return "\v", s, nil
728
+ case '?':
729
+ return "?", s, nil // trigraph workaround
730
+ case '\'', '"', '\\':
731
+ return string(r), s, nil
732
+ case '0', '1', '2', '3', '4', '5', '6', '7':
733
+ if len(s) < 2 {
734
+ return "", "", fmt.Errorf(`\%c requires 2 following digits`, r)
735
+ }
736
+ ss := string(r) + s[:2]
737
+ s = s[2:]
738
+ i, err := strconv.ParseUint(ss, 8, 8)
739
+ if err != nil {
740
+ return "", "", fmt.Errorf(`\%s contains non-octal digits`, ss)
741
+ }
742
+ return string([]byte{byte(i)}), s, nil
743
+ case 'x', 'X', 'u', 'U':
744
+ var n int
745
+ switch r {
746
+ case 'x', 'X':
747
+ n = 2
748
+ case 'u':
749
+ n = 4
750
+ case 'U':
751
+ n = 8
752
+ }
753
+ if len(s) < n {
754
+ return "", "", fmt.Errorf(`\%c requires %d following digits`, r, n)
755
+ }
756
+ ss := s[:n]
757
+ s = s[n:]
758
+ i, err := strconv.ParseUint(ss, 16, 64)
759
+ if err != nil {
760
+ return "", "", fmt.Errorf(`\%c%s contains non-hexadecimal digits`, r, ss)
761
+ }
762
+ if r == 'x' || r == 'X' {
763
+ return string([]byte{byte(i)}), s, nil
764
+ }
765
+ if i > utf8.MaxRune {
766
+ return "", "", fmt.Errorf(`\%c%s is not a valid Unicode code point`, r, ss)
767
+ }
768
+ return string(rune(i)), s, nil
769
+ }
770
+ return "", "", fmt.Errorf(`unknown escape \%c`, r)
771
+ }
772
+
773
+ func isIdentOrNumberChar(c byte) bool {
774
+ switch {
775
+ case 'A' <= c && c <= 'Z', 'a' <= c && c <= 'z':
776
+ return true
777
+ case '0' <= c && c <= '9':
778
+ return true
779
+ }
780
+ switch c {
781
+ case '-', '+', '.', '_':
782
+ return true
783
+ }
784
+ return false
785
+ }
786
+
787
+ func isWhitespace(c byte) bool {
788
+ switch c {
789
+ case ' ', '\t', '\n', '\r':
790
+ return true
791
+ }
792
+ return false
793
+ }
794
+
795
+ func isQuote(c byte) bool {
796
+ switch c {
797
+ case '"', '\'':
798
+ return true
799
+ }
800
+ return false
801
+ }