planetscale 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.github/workflows/ci.yml +24 -0
- data/.github/workflows/gem-push.yml +38 -0
- data/.github/workflows/licensed.yml +43 -0
- data/.gitignore +10 -0
- data/.licensed.yml +9 -0
- data/.licenses/go/github.com/armon/circbuf.dep.yml +31 -0
- data/.licenses/go/github.com/gorilla/mux.dep.yml +41 -0
- data/.licenses/go/github.com/hashicorp/go-cleanhttp.dep.yml +375 -0
- data/.licenses/go/github.com/mitchellh/go-homedir.dep.yml +32 -0
- data/.licenses/go/github.com/pkg/errors.dep.yml +36 -0
- data/.licenses/go/github.com/planetscale/planetscale-go/planetscale.dep.yml +160 -0
- data/.licenses/go/github.com/planetscale/sql-proxy/proxy.dep.yml +180 -0
- data/.licenses/go/go.uber.org/atomic.dep.yml +31 -0
- data/.licenses/go/go.uber.org/multierr.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/buffer.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/internal/bufferpool.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/internal/color.dep.yml +30 -0
- data/.licenses/go/go.uber.org/zap/internal/exit.dep.yml +31 -0
- data/.licenses/go/go.uber.org/zap/zapcore.dep.yml +31 -0
- data/.licenses/go/golang.org/x/net/context/ctxhttp.dep.yml +63 -0
- data/.licenses/go/golang.org/x/oauth2.dep.yml +44 -0
- data/.licenses/go/golang.org/x/oauth2/internal.dep.yml +38 -0
- data/.ruby_version +1 -0
- data/Gemfile +8 -0
- data/LICENSE +201 -0
- data/README.md +88 -0
- data/Rakefile +10 -0
- data/bin/console +15 -0
- data/bin/setup +17 -0
- data/controller.go +255 -0
- data/go.mod +16 -0
- data/go.sum +428 -0
- data/lib/generators/planetscale/install_generator.rb +58 -0
- data/lib/planetscale.rb +137 -0
- data/lib/planetscale/version.rb +5 -0
- data/planetscale.gemspec +44 -0
- data/proxy.go +128 -0
- data/vendor/github.com/armon/circbuf/.gitignore +22 -0
- data/vendor/github.com/armon/circbuf/LICENSE +20 -0
- data/vendor/github.com/armon/circbuf/README.md +28 -0
- data/vendor/github.com/armon/circbuf/circbuf.go +92 -0
- data/vendor/github.com/armon/circbuf/go.mod +1 -0
- data/vendor/github.com/golang/protobuf/AUTHORS +3 -0
- data/vendor/github.com/golang/protobuf/CONTRIBUTORS +3 -0
- data/vendor/github.com/golang/protobuf/LICENSE +28 -0
- data/vendor/github.com/golang/protobuf/proto/buffer.go +324 -0
- data/vendor/github.com/golang/protobuf/proto/defaults.go +63 -0
- data/vendor/github.com/golang/protobuf/proto/deprecated.go +113 -0
- data/vendor/github.com/golang/protobuf/proto/discard.go +58 -0
- data/vendor/github.com/golang/protobuf/proto/extensions.go +356 -0
- data/vendor/github.com/golang/protobuf/proto/properties.go +306 -0
- data/vendor/github.com/golang/protobuf/proto/proto.go +167 -0
- data/vendor/github.com/golang/protobuf/proto/registry.go +317 -0
- data/vendor/github.com/golang/protobuf/proto/text_decode.go +801 -0
- data/vendor/github.com/golang/protobuf/proto/text_encode.go +560 -0
- data/vendor/github.com/golang/protobuf/proto/wire.go +78 -0
- data/vendor/github.com/golang/protobuf/proto/wrappers.go +34 -0
- data/vendor/github.com/gorilla/mux/AUTHORS +8 -0
- data/vendor/github.com/gorilla/mux/LICENSE +27 -0
- data/vendor/github.com/gorilla/mux/README.md +805 -0
- data/vendor/github.com/gorilla/mux/doc.go +306 -0
- data/vendor/github.com/gorilla/mux/go.mod +3 -0
- data/vendor/github.com/gorilla/mux/middleware.go +74 -0
- data/vendor/github.com/gorilla/mux/mux.go +606 -0
- data/vendor/github.com/gorilla/mux/regexp.go +388 -0
- data/vendor/github.com/gorilla/mux/route.go +736 -0
- data/vendor/github.com/gorilla/mux/test_helpers.go +19 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/LICENSE +363 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/README.md +30 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/cleanhttp.go +58 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/doc.go +20 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/go.mod +3 -0
- data/vendor/github.com/hashicorp/go-cleanhttp/handlers.go +48 -0
- data/vendor/github.com/mitchellh/go-homedir/LICENSE +21 -0
- data/vendor/github.com/mitchellh/go-homedir/README.md +14 -0
- data/vendor/github.com/mitchellh/go-homedir/go.mod +1 -0
- data/vendor/github.com/mitchellh/go-homedir/homedir.go +167 -0
- data/vendor/github.com/pkg/errors/.gitignore +24 -0
- data/vendor/github.com/pkg/errors/.travis.yml +10 -0
- data/vendor/github.com/pkg/errors/LICENSE +23 -0
- data/vendor/github.com/pkg/errors/Makefile +44 -0
- data/vendor/github.com/pkg/errors/README.md +59 -0
- data/vendor/github.com/pkg/errors/appveyor.yml +32 -0
- data/vendor/github.com/pkg/errors/errors.go +288 -0
- data/vendor/github.com/pkg/errors/go113.go +38 -0
- data/vendor/github.com/pkg/errors/stack.go +177 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/backups.go +139 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/branches.go +258 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/certs.go +142 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/client.go +305 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/databases.go +131 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/deploy_requests.go +368 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/organizations.go +78 -0
- data/vendor/github.com/planetscale/planetscale-go/planetscale/service_tokens.go +163 -0
- data/vendor/github.com/planetscale/sql-proxy/proxy/client.go +467 -0
- data/vendor/github.com/planetscale/sql-proxy/proxy/tls_cache.go +73 -0
- data/vendor/go.uber.org/atomic/.codecov.yml +19 -0
- data/vendor/go.uber.org/atomic/.gitignore +12 -0
- data/vendor/go.uber.org/atomic/.travis.yml +27 -0
- data/vendor/go.uber.org/atomic/CHANGELOG.md +76 -0
- data/vendor/go.uber.org/atomic/LICENSE.txt +19 -0
- data/vendor/go.uber.org/atomic/Makefile +78 -0
- data/vendor/go.uber.org/atomic/README.md +63 -0
- data/vendor/go.uber.org/atomic/bool.go +81 -0
- data/vendor/go.uber.org/atomic/bool_ext.go +53 -0
- data/vendor/go.uber.org/atomic/doc.go +23 -0
- data/vendor/go.uber.org/atomic/duration.go +82 -0
- data/vendor/go.uber.org/atomic/duration_ext.go +40 -0
- data/vendor/go.uber.org/atomic/error.go +51 -0
- data/vendor/go.uber.org/atomic/error_ext.go +39 -0
- data/vendor/go.uber.org/atomic/float64.go +76 -0
- data/vendor/go.uber.org/atomic/float64_ext.go +47 -0
- data/vendor/go.uber.org/atomic/gen.go +26 -0
- data/vendor/go.uber.org/atomic/go.mod +8 -0
- data/vendor/go.uber.org/atomic/go.sum +9 -0
- data/vendor/go.uber.org/atomic/int32.go +102 -0
- data/vendor/go.uber.org/atomic/int64.go +102 -0
- data/vendor/go.uber.org/atomic/nocmp.go +35 -0
- data/vendor/go.uber.org/atomic/string.go +54 -0
- data/vendor/go.uber.org/atomic/string_ext.go +43 -0
- data/vendor/go.uber.org/atomic/uint32.go +102 -0
- data/vendor/go.uber.org/atomic/uint64.go +102 -0
- data/vendor/go.uber.org/atomic/value.go +31 -0
- data/vendor/go.uber.org/multierr/.codecov.yml +15 -0
- data/vendor/go.uber.org/multierr/.gitignore +4 -0
- data/vendor/go.uber.org/multierr/.travis.yml +23 -0
- data/vendor/go.uber.org/multierr/CHANGELOG.md +60 -0
- data/vendor/go.uber.org/multierr/LICENSE.txt +19 -0
- data/vendor/go.uber.org/multierr/Makefile +42 -0
- data/vendor/go.uber.org/multierr/README.md +23 -0
- data/vendor/go.uber.org/multierr/error.go +449 -0
- data/vendor/go.uber.org/multierr/glide.yaml +8 -0
- data/vendor/go.uber.org/multierr/go.mod +8 -0
- data/vendor/go.uber.org/multierr/go.sum +11 -0
- data/vendor/go.uber.org/multierr/go113.go +52 -0
- data/vendor/go.uber.org/zap/.codecov.yml +17 -0
- data/vendor/go.uber.org/zap/.gitignore +32 -0
- data/vendor/go.uber.org/zap/.readme.tmpl +109 -0
- data/vendor/go.uber.org/zap/.travis.yml +23 -0
- data/vendor/go.uber.org/zap/CHANGELOG.md +432 -0
- data/vendor/go.uber.org/zap/CODE_OF_CONDUCT.md +75 -0
- data/vendor/go.uber.org/zap/CONTRIBUTING.md +81 -0
- data/vendor/go.uber.org/zap/FAQ.md +156 -0
- data/vendor/go.uber.org/zap/LICENSE.txt +19 -0
- data/vendor/go.uber.org/zap/Makefile +63 -0
- data/vendor/go.uber.org/zap/README.md +134 -0
- data/vendor/go.uber.org/zap/array.go +320 -0
- data/vendor/go.uber.org/zap/buffer/buffer.go +123 -0
- data/vendor/go.uber.org/zap/buffer/pool.go +49 -0
- data/vendor/go.uber.org/zap/checklicense.sh +17 -0
- data/vendor/go.uber.org/zap/config.go +264 -0
- data/vendor/go.uber.org/zap/doc.go +113 -0
- data/vendor/go.uber.org/zap/encoder.go +79 -0
- data/vendor/go.uber.org/zap/error.go +80 -0
- data/vendor/go.uber.org/zap/field.go +539 -0
- data/vendor/go.uber.org/zap/flag.go +39 -0
- data/vendor/go.uber.org/zap/glide.yaml +34 -0
- data/vendor/go.uber.org/zap/global.go +168 -0
- data/vendor/go.uber.org/zap/global_go112.go +26 -0
- data/vendor/go.uber.org/zap/global_prego112.go +26 -0
- data/vendor/go.uber.org/zap/go.mod +13 -0
- data/vendor/go.uber.org/zap/go.sum +56 -0
- data/vendor/go.uber.org/zap/http_handler.go +81 -0
- data/vendor/go.uber.org/zap/internal/bufferpool/bufferpool.go +31 -0
- data/vendor/go.uber.org/zap/internal/color/color.go +44 -0
- data/vendor/go.uber.org/zap/internal/exit/exit.go +64 -0
- data/vendor/go.uber.org/zap/level.go +132 -0
- data/vendor/go.uber.org/zap/logger.go +344 -0
- data/vendor/go.uber.org/zap/options.go +140 -0
- data/vendor/go.uber.org/zap/sink.go +161 -0
- data/vendor/go.uber.org/zap/stacktrace.go +85 -0
- data/vendor/go.uber.org/zap/sugar.go +304 -0
- data/vendor/go.uber.org/zap/time.go +27 -0
- data/vendor/go.uber.org/zap/writer.go +99 -0
- data/vendor/go.uber.org/zap/zapcore/console_encoder.go +161 -0
- data/vendor/go.uber.org/zap/zapcore/core.go +113 -0
- data/vendor/go.uber.org/zap/zapcore/doc.go +24 -0
- data/vendor/go.uber.org/zap/zapcore/encoder.go +443 -0
- data/vendor/go.uber.org/zap/zapcore/entry.go +264 -0
- data/vendor/go.uber.org/zap/zapcore/error.go +115 -0
- data/vendor/go.uber.org/zap/zapcore/field.go +227 -0
- data/vendor/go.uber.org/zap/zapcore/hook.go +68 -0
- data/vendor/go.uber.org/zap/zapcore/increase_level.go +66 -0
- data/vendor/go.uber.org/zap/zapcore/json_encoder.go +534 -0
- data/vendor/go.uber.org/zap/zapcore/level.go +175 -0
- data/vendor/go.uber.org/zap/zapcore/level_strings.go +46 -0
- data/vendor/go.uber.org/zap/zapcore/marshaler.go +61 -0
- data/vendor/go.uber.org/zap/zapcore/memory_encoder.go +179 -0
- data/vendor/go.uber.org/zap/zapcore/sampler.go +208 -0
- data/vendor/go.uber.org/zap/zapcore/tee.go +81 -0
- data/vendor/go.uber.org/zap/zapcore/write_syncer.go +123 -0
- data/vendor/golang.org/x/net/AUTHORS +3 -0
- data/vendor/golang.org/x/net/CONTRIBUTORS +3 -0
- data/vendor/golang.org/x/net/LICENSE +27 -0
- data/vendor/golang.org/x/net/PATENTS +22 -0
- data/vendor/golang.org/x/net/context/context.go +56 -0
- data/vendor/golang.org/x/net/context/ctxhttp/ctxhttp.go +71 -0
- data/vendor/golang.org/x/net/context/go17.go +73 -0
- data/vendor/golang.org/x/net/context/go19.go +21 -0
- data/vendor/golang.org/x/net/context/pre_go17.go +301 -0
- data/vendor/golang.org/x/net/context/pre_go19.go +110 -0
- data/vendor/golang.org/x/oauth2/.travis.yml +13 -0
- data/vendor/golang.org/x/oauth2/AUTHORS +3 -0
- data/vendor/golang.org/x/oauth2/CONTRIBUTING.md +26 -0
- data/vendor/golang.org/x/oauth2/CONTRIBUTORS +3 -0
- data/vendor/golang.org/x/oauth2/LICENSE +27 -0
- data/vendor/golang.org/x/oauth2/README.md +36 -0
- data/vendor/golang.org/x/oauth2/go.mod +9 -0
- data/vendor/golang.org/x/oauth2/go.sum +361 -0
- data/vendor/golang.org/x/oauth2/internal/client_appengine.go +14 -0
- data/vendor/golang.org/x/oauth2/internal/doc.go +6 -0
- data/vendor/golang.org/x/oauth2/internal/oauth2.go +37 -0
- data/vendor/golang.org/x/oauth2/internal/token.go +294 -0
- data/vendor/golang.org/x/oauth2/internal/transport.go +33 -0
- data/vendor/golang.org/x/oauth2/oauth2.go +381 -0
- data/vendor/golang.org/x/oauth2/token.go +178 -0
- data/vendor/golang.org/x/oauth2/transport.go +89 -0
- data/vendor/google.golang.org/appengine/LICENSE +202 -0
- data/vendor/google.golang.org/appengine/internal/api.go +678 -0
- data/vendor/google.golang.org/appengine/internal/api_classic.go +169 -0
- data/vendor/google.golang.org/appengine/internal/api_common.go +123 -0
- data/vendor/google.golang.org/appengine/internal/app_id.go +28 -0
- data/vendor/google.golang.org/appengine/internal/base/api_base.pb.go +308 -0
- data/vendor/google.golang.org/appengine/internal/base/api_base.proto +33 -0
- data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.pb.go +4367 -0
- data/vendor/google.golang.org/appengine/internal/datastore/datastore_v3.proto +551 -0
- data/vendor/google.golang.org/appengine/internal/identity.go +55 -0
- data/vendor/google.golang.org/appengine/internal/identity_classic.go +61 -0
- data/vendor/google.golang.org/appengine/internal/identity_flex.go +11 -0
- data/vendor/google.golang.org/appengine/internal/identity_vm.go +134 -0
- data/vendor/google.golang.org/appengine/internal/internal.go +110 -0
- data/vendor/google.golang.org/appengine/internal/log/log_service.pb.go +1313 -0
- data/vendor/google.golang.org/appengine/internal/log/log_service.proto +150 -0
- data/vendor/google.golang.org/appengine/internal/main.go +16 -0
- data/vendor/google.golang.org/appengine/internal/main_common.go +7 -0
- data/vendor/google.golang.org/appengine/internal/main_vm.go +69 -0
- data/vendor/google.golang.org/appengine/internal/metadata.go +60 -0
- data/vendor/google.golang.org/appengine/internal/net.go +56 -0
- data/vendor/google.golang.org/appengine/internal/regen.sh +40 -0
- data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.pb.go +361 -0
- data/vendor/google.golang.org/appengine/internal/remote_api/remote_api.proto +44 -0
- data/vendor/google.golang.org/appengine/internal/transaction.go +115 -0
- data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.pb.go +527 -0
- data/vendor/google.golang.org/appengine/internal/urlfetch/urlfetch_service.proto +64 -0
- data/vendor/google.golang.org/appengine/urlfetch/urlfetch.go +210 -0
- data/vendor/google.golang.org/protobuf/AUTHORS +3 -0
- data/vendor/google.golang.org/protobuf/CONTRIBUTORS +3 -0
- data/vendor/google.golang.org/protobuf/LICENSE +27 -0
- data/vendor/google.golang.org/protobuf/PATENTS +22 -0
- data/vendor/google.golang.org/protobuf/encoding/prototext/decode.go +773 -0
- data/vendor/google.golang.org/protobuf/encoding/prototext/doc.go +7 -0
- data/vendor/google.golang.org/protobuf/encoding/prototext/encode.go +371 -0
- data/vendor/google.golang.org/protobuf/encoding/protowire/wire.go +538 -0
- data/vendor/google.golang.org/protobuf/internal/descfmt/stringer.go +318 -0
- data/vendor/google.golang.org/protobuf/internal/descopts/options.go +29 -0
- data/vendor/google.golang.org/protobuf/internal/detrand/rand.go +69 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/defval/default.go +213 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/messageset/messageset.go +241 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/tag/tag.go +207 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode.go +665 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_number.go +190 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_string.go +161 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/decode_token.go +373 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/doc.go +29 -0
- data/vendor/google.golang.org/protobuf/internal/encoding/text/encode.go +265 -0
- data/vendor/google.golang.org/protobuf/internal/errors/errors.go +89 -0
- data/vendor/google.golang.org/protobuf/internal/errors/is_go112.go +39 -0
- data/vendor/google.golang.org/protobuf/internal/errors/is_go113.go +12 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/build.go +158 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc.go +631 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_init.go +471 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_lazy.go +704 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list.go +450 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/desc_list_gen.go +356 -0
- data/vendor/google.golang.org/protobuf/internal/filedesc/placeholder.go +107 -0
- data/vendor/google.golang.org/protobuf/internal/filetype/build.go +297 -0
- data/vendor/google.golang.org/protobuf/internal/flags/flags.go +24 -0
- data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_disable.go +9 -0
- data/vendor/google.golang.org/protobuf/internal/flags/proto_legacy_enable.go +9 -0
- data/vendor/google.golang.org/protobuf/internal/genid/any_gen.go +34 -0
- data/vendor/google.golang.org/protobuf/internal/genid/api_gen.go +106 -0
- data/vendor/google.golang.org/protobuf/internal/genid/descriptor_gen.go +829 -0
- data/vendor/google.golang.org/protobuf/internal/genid/doc.go +11 -0
- data/vendor/google.golang.org/protobuf/internal/genid/duration_gen.go +34 -0
- data/vendor/google.golang.org/protobuf/internal/genid/empty_gen.go +19 -0
- data/vendor/google.golang.org/protobuf/internal/genid/field_mask_gen.go +31 -0
- data/vendor/google.golang.org/protobuf/internal/genid/goname.go +25 -0
- data/vendor/google.golang.org/protobuf/internal/genid/map_entry.go +16 -0
- data/vendor/google.golang.org/protobuf/internal/genid/source_context_gen.go +31 -0
- data/vendor/google.golang.org/protobuf/internal/genid/struct_gen.go +116 -0
- data/vendor/google.golang.org/protobuf/internal/genid/timestamp_gen.go +34 -0
- data/vendor/google.golang.org/protobuf/internal/genid/type_gen.go +184 -0
- data/vendor/google.golang.org/protobuf/internal/genid/wrappers.go +13 -0
- data/vendor/google.golang.org/protobuf/internal/genid/wrappers_gen.go +175 -0
- data/vendor/google.golang.org/protobuf/internal/impl/api_export.go +177 -0
- data/vendor/google.golang.org/protobuf/internal/impl/checkinit.go +141 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_extension.go +223 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_field.go +830 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_gen.go +5637 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_map.go +388 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go111.go +37 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_map_go112.go +11 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_message.go +217 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_messageset.go +123 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_reflect.go +209 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_tables.go +557 -0
- data/vendor/google.golang.org/protobuf/internal/impl/codec_unsafe.go +17 -0
- data/vendor/google.golang.org/protobuf/internal/impl/convert.go +496 -0
- data/vendor/google.golang.org/protobuf/internal/impl/convert_list.go +141 -0
- data/vendor/google.golang.org/protobuf/internal/impl/convert_map.go +121 -0
- data/vendor/google.golang.org/protobuf/internal/impl/decode.go +276 -0
- data/vendor/google.golang.org/protobuf/internal/impl/encode.go +201 -0
- data/vendor/google.golang.org/protobuf/internal/impl/enum.go +21 -0
- data/vendor/google.golang.org/protobuf/internal/impl/extension.go +156 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_enum.go +219 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_export.go +92 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_extension.go +176 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_file.go +81 -0
- data/vendor/google.golang.org/protobuf/internal/impl/legacy_message.go +558 -0
- data/vendor/google.golang.org/protobuf/internal/impl/merge.go +176 -0
- data/vendor/google.golang.org/protobuf/internal/impl/merge_gen.go +209 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message.go +276 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message_reflect.go +465 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_field.go +543 -0
- data/vendor/google.golang.org/protobuf/internal/impl/message_reflect_gen.go +249 -0
- data/vendor/google.golang.org/protobuf/internal/impl/pointer_reflect.go +178 -0
- data/vendor/google.golang.org/protobuf/internal/impl/pointer_unsafe.go +174 -0
- data/vendor/google.golang.org/protobuf/internal/impl/validate.go +576 -0
- data/vendor/google.golang.org/protobuf/internal/impl/weak.go +74 -0
- data/vendor/google.golang.org/protobuf/internal/order/order.go +89 -0
- data/vendor/google.golang.org/protobuf/internal/order/range.go +115 -0
- data/vendor/google.golang.org/protobuf/internal/pragma/pragma.go +29 -0
- data/vendor/google.golang.org/protobuf/internal/set/ints.go +58 -0
- data/vendor/google.golang.org/protobuf/internal/strs/strings.go +196 -0
- data/vendor/google.golang.org/protobuf/internal/strs/strings_pure.go +27 -0
- data/vendor/google.golang.org/protobuf/internal/strs/strings_unsafe.go +94 -0
- data/vendor/google.golang.org/protobuf/internal/version/version.go +79 -0
- data/vendor/google.golang.org/protobuf/proto/checkinit.go +71 -0
- data/vendor/google.golang.org/protobuf/proto/decode.go +278 -0
- data/vendor/google.golang.org/protobuf/proto/decode_gen.go +603 -0
- data/vendor/google.golang.org/protobuf/proto/doc.go +94 -0
- data/vendor/google.golang.org/protobuf/proto/encode.go +319 -0
- data/vendor/google.golang.org/protobuf/proto/encode_gen.go +97 -0
- data/vendor/google.golang.org/protobuf/proto/equal.go +167 -0
- data/vendor/google.golang.org/protobuf/proto/extension.go +92 -0
- data/vendor/google.golang.org/protobuf/proto/merge.go +139 -0
- data/vendor/google.golang.org/protobuf/proto/messageset.go +93 -0
- data/vendor/google.golang.org/protobuf/proto/proto.go +43 -0
- data/vendor/google.golang.org/protobuf/proto/proto_methods.go +19 -0
- data/vendor/google.golang.org/protobuf/proto/proto_reflect.go +19 -0
- data/vendor/google.golang.org/protobuf/proto/reset.go +43 -0
- data/vendor/google.golang.org/protobuf/proto/size.go +97 -0
- data/vendor/google.golang.org/protobuf/proto/size_gen.go +55 -0
- data/vendor/google.golang.org/protobuf/proto/wrappers.go +29 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc.go +276 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_init.go +248 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_resolve.go +286 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/desc_validate.go +374 -0
- data/vendor/google.golang.org/protobuf/reflect/protodesc/proto.go +252 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/methods.go +77 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/proto.go +504 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/source.go +128 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/source_gen.go +461 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/type.go +665 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value.go +285 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_pure.go +59 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_union.go +411 -0
- data/vendor/google.golang.org/protobuf/reflect/protoreflect/value_unsafe.go +98 -0
- data/vendor/google.golang.org/protobuf/reflect/protoregistry/registry.go +869 -0
- data/vendor/google.golang.org/protobuf/runtime/protoiface/legacy.go +15 -0
- data/vendor/google.golang.org/protobuf/runtime/protoiface/methods.go +167 -0
- data/vendor/google.golang.org/protobuf/runtime/protoimpl/impl.go +44 -0
- data/vendor/google.golang.org/protobuf/runtime/protoimpl/version.go +56 -0
- data/vendor/google.golang.org/protobuf/types/descriptorpb/descriptor.pb.go +4039 -0
- data/vendor/modules.txt +79 -0
- 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
|
+
}
|